f2fs: fix to keep consistent i_gc_rwsem lock order
authorChao Yu <chao@kernel.org>
Mon, 10 Apr 2023 02:11:40 +0000 (10:11 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 13 Apr 2023 03:00:34 +0000 (20:00 -0700)
i_gc_rwsem[WRITE] and i_gc_rwsem[READ] lock order is reversed
in gc_data_segment() and f2fs_dio_write_iter(), fix to keep
consistent lock order as below:
1. lock i_gc_rwsem[WRITE]
2. lock i_gc_rwsem[READ]

Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/gc.c

index 56c53db..c748cdf 100644 (file)
@@ -1616,14 +1616,14 @@ next_step:
                        int err;
 
                        if (S_ISREG(inode->i_mode)) {
-                               if (!f2fs_down_write_trylock(&fi->i_gc_rwsem[READ])) {
+                               if (!f2fs_down_write_trylock(&fi->i_gc_rwsem[WRITE])) {
                                        sbi->skipped_gc_rwsem++;
                                        continue;
                                }
                                if (!f2fs_down_write_trylock(
-                                               &fi->i_gc_rwsem[WRITE])) {
+                                               &fi->i_gc_rwsem[READ])) {
                                        sbi->skipped_gc_rwsem++;
-                                       f2fs_up_write(&fi->i_gc_rwsem[READ]);
+                                       f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
                                        continue;
                                }
                                locked = true;
@@ -1646,8 +1646,8 @@ next_step:
                                submitted++;
 
                        if (locked) {
-                               f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
                                f2fs_up_write(&fi->i_gc_rwsem[READ]);
+                               f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
                        }
 
                        stat_inc_data_blk_count(sbi, 1, gc_type);