f2fs: add ioctl to expose current features
Subsystems (2)
Jaegeuk Kim
maintainerPATCH 1/1 f2fs: add ioctl to expose current features
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.
--- fs/f2fs/f2fs.h | 2 ++ fs/f2fs/file.c | 13 +++++++++++++ 2 files changed, 15 insertions(+)
fs/f2fs/f2fs.h +2 -0
@@ -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
fs/f2fs/file.c +13 -0
@@ -2384,6 +2384,16 @@ static int f2fs_ioc_flush_device(struct file *filp, unsigned long arg)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) {
@@ -2426,6 +2436,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 ; }
@@ -2491,6 +2503,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 ;
Signature · 1 line
2.13.0.rc1.294.g07d810a77f-goog
Quoted 5 lines · Jaegeuk Kim
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.
Just for reference, ext4 exposes functionality that the kernel supports via a file in /sys/fs/ext4/features/{feature_name} so that it is possible to check [ -e /sys/fs/ext4/features/lazy_itable_init ] in a shell script also.
There are also per-filesystem tunables in /sys/fs/ext4/{device}/ and it wouldn't be a bad idea to expose per-filesystem features something like /sys/fs/{fstype}/{device}/features/{feature_name} so that it is easily checked by userspace tools using [ -e $feature ] in bash or access() in programs rather than an ioctl.
Cheers, Andreas
Quoted 66 lines
Signed-off-by Jaegeuk Kim <[email protected]>---
fs/f2fs/f2fs.h| 2 ++fs/f2fs/file.c| 13 +++++++++++++2 files changed, 15 insertions(+)fs/f2fs/f2fs.h +2
-0@@ -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_POLICYfs/f2fs/file.c +13
-1@@ -2384,6 +2384,16 @@ static int f2fs_ioc_flush_device(struct file *filp, unsigned long arg)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) {@@ -2426,6 +2436,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 ; }@@ -2491,6 +2503,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 ; --
Quoted 2 lines
2.13.0.rc1.294.g07d810a77f-goog
Cheers, Andreas
Jaegeuk Kim
maintainerQuoted 9 lines · Andreas Dilger
Quoted 5 lines · Jaegeuk Kim
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.
Just for reference, ext4 exposes functionality that the kernel supports via a file in
/sys/fs/ext4/features/{feature_name}so that it is possible to check [ -e/sys/fs/ext4/features/lazy_itable_init] in a shell script also.
Thank you for the info. I'll write a patch to expose sysfs entries as well. :) For sqlite in Android, I think ioctl would be a simpler interface to check the feature flag rather than to open another sysfs files, regarding to latency and additional selinux changes.
Quoted 6 lines
There are also per-filesystem tunables in
/sys/fs/ext4/{device}/and it wouldn't be a bad idea to expose per-filesystem features something like/sys/fs/{fstype}/{device}/features/{feature_name}so that it is easily checked by userspace tools using [ -e $feature ] in bash oraccess()in programs rather than an ioctl.
Yeah, agreed.
Thanks,
Quoted 79 lines
Cheers, Andreas
Quoted 66 lines
Signed-off-by Jaegeuk Kim <[email protected]>---
fs/f2fs/f2fs.h| 2 ++fs/f2fs/file.c| 13 +++++++++++++2 files changed, 15 insertions(+)fs/f2fs/f2fs.h +2
-0@@ -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_POLICYfs/f2fs/file.c +13
-1@@ -2384,6 +2384,16 @@ static int f2fs_ioc_flush_device(struct file *filp, unsigned long arg)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) {@@ -2426,6 +2436,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 ; }@@ -2491,6 +2503,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 ; --Quoted 2 lines
2.13.0.rc1.294.g07d810a77f-goog
Cheers, Andreas
Quoted 5 lines · Jaegeuk Kim
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.
Signed-off-by Jaegeuk Kim <[email protected]>
Thanks,
Quoted 64 lines
--- fs/f2fs/f2fs.h | 2 ++ fs/f2fs/file.c | 13 +++++++++++++ 2 files changed, 15 insertions(+)fs/f2fs/f2fs.h +2
-0@@ -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_POLICYfs/f2fs/file.c +13
-0@@ -2384,6 +2384,16 @@ static int f2fs_ioc_flush_device(struct file *filp, unsigned long arg)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) {@@ -2426,6 +2436,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 ; }@@ -2491,6 +2503,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 ;
Hi Jaegeuk,
I noted that the patch ("f2fs: give a try to do atomic write in -ENOMEM case") hasn't been sent to mailing list before been merged.
Could you please send it out, and please add:
Thanks,
Quoted 69 lines · Jaegeuk Kim
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.
Signed-off-by Jaegeuk Kim <[email protected]>--- fs/f2fs/f2fs.h | 2 ++ fs/f2fs/file.c | 13 +++++++++++++ 2 files changed, 15 insertions(+)fs/f2fs/f2fs.h +2
-0@@ -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_POLICYfs/f2fs/file.c +13
-0@@ -2384,6 +2384,16 @@ static int f2fs_ioc_flush_device(struct file *filp, unsigned long arg)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) {@@ -2426,6 +2436,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 ; }@@ -2491,6 +2503,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 ;