ext4: online defrag -- Add the EXT4_IOC_SUPER_INFO ioctl From: Akira Fujita EXT4_IOC_SUPER_INFO gets super block information on disk. Super block information is necessary for relevant (-r) and force (-f) defrag. Non-root user can't get this information by opening the block device directly, so implement this ioctl newly. Signed-off-by: Akira Fujita Signed-off-by: Takashi Sato --- fs/ext4/ext4.h | 1 + fs/ext4/ioctl.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 0 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index ccea421..94c4186 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -303,6 +303,7 @@ struct ext4_new_group_data { #define EXT4_IOC_MIGRATE _IO('f', 9) /* note ioctl 11 reserved for filesystem-independent FIEMAP ioctl */ #define EXT4_IOC_DEFRAG _IOW('f', 15, struct ext4_ext_defrag_data) +#define EXT4_IOC_SUPER_INFO _IOR('f', 16, struct ext4_super_block) /* * ioctl commands in 32 bit emulation diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index d5e1fe7..f8ce89b 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c @@ -246,6 +246,16 @@ setversion_out: return err; } + case EXT4_IOC_SUPER_INFO: { + struct ext4_super_block es; + + if (copy_to_user((struct ext4_super_block __user *)arg, + EXT4_SB(inode->i_sb)->s_es, sizeof(es))) + return -EFAULT; + else + return 0; + } + case EXT4_IOC_GROUP_ADD: { struct ext4_new_group_data input; struct super_block *sb = inode->i_sb;