|
@@ -2401,6 +2401,16 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int f2fs_ioc_get_features(struct file *filp, unsigned long arg)
|
|
|
+{
|
|
|
+ struct inode *inode = file_inode(filp);
|
|
|
+ u32 sb_feature = le32_to_cpu(F2FS_I_SB(inode)->raw_super->feature);
|
|
|
+
|
|
|
+ /* Must validate to set it with SQLite behavior in Android. */
|
|
|
+ sb_feature |= F2FS_FEATURE_ATOMIC_WRITE;
|
|
|
+
|
|
|
+ return put_user(sb_feature, (u32 __user *)arg);
|
|
|
+}
|
|
|
|
|
|
long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
@@ -2443,6 +2453,8 @@ long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
|
return f2fs_ioc_move_range(filp, arg);
|
|
|
case F2FS_IOC_FLUSH_DEVICE:
|
|
|
return f2fs_ioc_flush_device(filp, arg);
|
|
|
+ case F2FS_IOC_GET_FEATURES:
|
|
|
+ return f2fs_ioc_get_features(filp, arg);
|
|
|
default:
|
|
|
return -ENOTTY;
|
|
|
}
|
|
@@ -2508,6 +2520,7 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|
|
case F2FS_IOC_DEFRAGMENT:
|
|
|
case F2FS_IOC_MOVE_RANGE:
|
|
|
case F2FS_IOC_FLUSH_DEVICE:
|
|
|
+ case F2FS_IOC_GET_FEATURES:
|
|
|
break;
|
|
|
default:
|
|
|
return -ENOIOCTLCMD;
|