OSDN Git Service

f2fs: add ioctl to expose current features
authorJaegeuk Kim <jaegeuk@kernel.org>
Fri, 21 Jul 2017 19:58:59 +0000 (12:58 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 31 Jul 2017 23:48:28 +0000 (16:48 -0700)
This patch adds an ioctl to provide feature information to user.
For exapmle, SQLite can use this ioctl to detect whether f2fs support atomic
write or not.

Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/f2fs.h
fs/f2fs/file.c

index 859ff42..f293798 100644 (file)
@@ -112,6 +112,7 @@ struct f2fs_mount_info {
 
 #define F2FS_FEATURE_ENCRYPT   0x0001
 #define F2FS_FEATURE_BLKZONED  0x0002
+#define F2FS_FEATURE_ATOMIC_WRITE 0x0004
 
 #define F2FS_HAS_FEATURE(sb, mask)                                     \
        ((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0)
@@ -308,6 +309,7 @@ static inline bool __has_cursum_space(struct f2fs_journal *journal,
                                                struct f2fs_flush_device)
 #define F2FS_IOC_GARBAGE_COLLECT_RANGE _IOW(F2FS_IOCTL_MAGIC, 11,      \
                                                struct f2fs_gc_range)
+#define F2FS_IOC_GET_FEATURES          _IOR(F2FS_IOCTL_MAGIC, 12, __u32)
 
 #define F2FS_IOC_SET_ENCRYPTION_POLICY FS_IOC_SET_ENCRYPTION_POLICY
 #define F2FS_IOC_GET_ENCRYPTION_POLICY FS_IOC_GET_ENCRYPTION_POLICY
index 75b3fda..0a5faf2 100644 (file)
@@ -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;