f2fs: add F2FS_IOC_GET_COMPRESS_OPTION ioctl
authorDaeho Jeong <daehojeong@google.com>
Fri, 30 Oct 2020 04:10:34 +0000 (13:10 +0900)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 3 Nov 2020 01:34:00 +0000 (17:34 -0800)
Added a new F2FS_IOC_GET_COMPRESS_OPTION ioctl to get file compression
option of a file.

struct f2fs_comp_option {
    u8 algorithm;         => compression algorithm
                          => 0:lzo, 1:lz4, 2:zstd, 3:lzorle
    u8 log_cluster_size;  => log scale cluster size
                          => 2 ~ 8
};

struct f2fs_comp_option option;

ioctl(fd, F2FS_IOC_GET_COMPRESS_OPTION, &option);

Signed-off-by: Daeho Jeong <daehojeong@google.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c
include/uapi/linux/f2fs.h

index 89c451f..c747f5d 100644 (file)
@@ -3945,6 +3945,33 @@ err:
        return ret;
 }
 
+static int f2fs_ioc_get_compress_option(struct file *filp, unsigned long arg)
+{
+       struct inode *inode = file_inode(filp);
+       struct f2fs_comp_option option;
+
+       if (!f2fs_sb_has_compression(F2FS_I_SB(inode)))
+               return -EOPNOTSUPP;
+
+       inode_lock_shared(inode);
+
+       if (!f2fs_compressed_file(inode)) {
+               inode_unlock_shared(inode);
+               return -ENODATA;
+       }
+
+       option.algorithm = F2FS_I(inode)->i_compress_algorithm;
+       option.log_cluster_size = F2FS_I(inode)->i_log_cluster_size;
+
+       inode_unlock_shared(inode);
+
+       if (copy_to_user((struct f2fs_comp_option __user *)arg, &option,
+                               sizeof(option)))
+               return -EFAULT;
+
+       return 0;
+}
+
 long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
        if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp)))))
@@ -4033,6 +4060,8 @@ long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
                return f2fs_reserve_compress_blocks(filp, arg);
        case F2FS_IOC_SEC_TRIM_FILE:
                return f2fs_sec_trim_file(filp, arg);
+       case F2FS_IOC_GET_COMPRESS_OPTION:
+               return f2fs_ioc_get_compress_option(filp, arg);
        default:
                return -ENOTTY;
        }
@@ -4203,6 +4232,7 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        case F2FS_IOC_RELEASE_COMPRESS_BLOCKS:
        case F2FS_IOC_RESERVE_COMPRESS_BLOCKS:
        case F2FS_IOC_SEC_TRIM_FILE:
+       case F2FS_IOC_GET_COMPRESS_OPTION:
                break;
        default:
                return -ENOIOCTLCMD;
index 28bcfe8..872e61d 100644 (file)
@@ -36,6 +36,8 @@
                                        _IOR(F2FS_IOCTL_MAGIC, 19, __u64)
 #define F2FS_IOC_SEC_TRIM_FILE         _IOW(F2FS_IOCTL_MAGIC, 20,      \
                                                struct f2fs_sectrim_range)
+#define F2FS_IOC_GET_COMPRESS_OPTION   _IOR(F2FS_IOCTL_MAGIC, 21,      \
+                                               struct f2fs_comp_option)
 
 /*
  * should be same as XFS_IOC_GOINGDOWN.
@@ -84,4 +86,9 @@ struct f2fs_sectrim_range {
        __u64 flags;
 };
 
+struct f2fs_comp_option {
+       __u8 algorithm;
+       __u8 log_cluster_size;
+};
+
 #endif /* _UAPI_LINUX_F2FS_H */