]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
f2fs: fix to avoid GC/mmap race with f2fs_truncate()
authorChao Yu <yuchao0@huawei.com>
Thu, 1 Apr 2021 03:01:53 +0000 (11:01 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 6 Apr 2021 14:16:22 +0000 (07:16 -0700)
It missed to hold i_gc_rwsem and i_map_sem around f2fs_truncate()
in f2fs_file_write_iter() to avoid racing with background GC and
mmap, fix it.

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

index dc79694e512ce89fd7108e0a384e71c12baebdea..f3ca63b558437eaf2d7a10369e50f1798a06222d 100644 (file)
@@ -4443,8 +4443,13 @@ write:
                clear_inode_flag(inode, FI_NO_PREALLOC);
 
                /* if we couldn't write data, we should deallocate blocks. */
-               if (preallocated && i_size_read(inode) < target_size)
+               if (preallocated && i_size_read(inode) < target_size) {
+                       down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
+                       down_write(&F2FS_I(inode)->i_mmap_sem);
                        f2fs_truncate(inode);
+                       up_write(&F2FS_I(inode)->i_mmap_sem);
+                       up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
+               }
 
                if (ret > 0)
                        f2fs_update_iostat(F2FS_I_SB(inode), APP_WRITE_IO, ret);