f2fs: fix to avoid double unlock
authorChao Yu <yuchao0@huawei.com>
Tue, 24 Mar 2020 06:20:57 +0000 (14:20 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 31 Mar 2020 03:46:25 +0000 (20:46 -0700)
On image that has verity and compression feature, if compressed pages
and non-compressed pages are mixed in one bio, we may double unlock
non-compressed page in below flow:

- f2fs_post_read_work
 - f2fs_decompress_work
  - f2fs_decompress_bio
   - __read_end_io
    - unlock_page
 - fsverity_enqueue_verify_work
  - f2fs_verity_work
   - f2fs_verify_bio
    - unlock_page

So it should skip handling non-compressed page in f2fs_decompress_work()
if verity is on.

Besides, add missing dec_page_count() in f2fs_verify_bio().

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

index 0197b7b..2464368 100644 (file)
@@ -139,6 +139,8 @@ static void __read_end_io(struct bio *bio, bool compr, bool verity)
                        f2fs_decompress_pages(bio, page, verity);
                        continue;
                }
+               if (verity)
+                       continue;
 #endif
 
                /* PG_error was set if any post_read step failed */
@@ -216,6 +218,7 @@ clear_uptodate:
                ClearPageUptodate(page);
                ClearPageError(page);
 unlock:
+               dec_page_count(F2FS_P_SB(page), __read_io_type(page));
                unlock_page(page);
        }
 }