]> xenbits.xensource.com Git - people/aperard/linux.git/commitdiff
f2fs: compress: fix to check compress flag w/ .i_sem lock
authorChao Yu <chao@kernel.org>
Mon, 19 Feb 2024 02:28:44 +0000 (10:28 +0800)
committerSasha Levin <sashal@kernel.org>
Tue, 26 Mar 2024 22:20:56 +0000 (18:20 -0400)
[ Upstream commit ea59b12ac69774c08aa95cd5b6100700ea0cce97 ]

It needs to check compress flag w/ .i_sem lock, otherwise, compressed
inode may be disabled after the check condition, it's not needed to
set compress option on non-compress inode.

Fixes: e1e8debec656 ("f2fs: add F2FS_IOC_SET_COMPRESS_OPTION ioctl")
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/f2fs/file.c

index 96b59c87f30c7dfadcc87115556318a420fc2b21..be4cab941d299059a6708f904bebeaf5299d5576 100644 (file)
@@ -3967,16 +3967,20 @@ static int f2fs_ioc_set_compress_option(struct file *filp, unsigned long arg)
                                sizeof(option)))
                return -EFAULT;
 
-       if (!f2fs_compressed_file(inode) ||
-                       option.log_cluster_size < MIN_COMPRESS_LOG_SIZE ||
-                       option.log_cluster_size > MAX_COMPRESS_LOG_SIZE ||
-                       option.algorithm >= COMPRESS_MAX)
+       if (option.log_cluster_size < MIN_COMPRESS_LOG_SIZE ||
+               option.log_cluster_size > MAX_COMPRESS_LOG_SIZE ||
+               option.algorithm >= COMPRESS_MAX)
                return -EINVAL;
 
        file_start_write(filp);
        inode_lock(inode);
 
        f2fs_down_write(&F2FS_I(inode)->i_sem);
+       if (!f2fs_compressed_file(inode)) {
+               ret = -EINVAL;
+               goto out;
+       }
+
        if (f2fs_is_mmap_file(inode) || get_dirty_pages(inode)) {
                ret = -EBUSY;
                goto out;