diff options
-rw-r--r-- | fs/f2fs/data.c | 6 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 1 |
2 files changed, 6 insertions, 1 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index e984a42eabf4..32d5a3b38a3f 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -1357,6 +1357,8 @@ retry_encrypt: | |||
1357 | !is_cold_data(page) && | 1357 | !is_cold_data(page) && |
1358 | !IS_ATOMIC_WRITTEN_PAGE(page) && | 1358 | !IS_ATOMIC_WRITTEN_PAGE(page) && |
1359 | need_inplace_update(inode))) { | 1359 | need_inplace_update(inode))) { |
1360 | f2fs_unlock_op(F2FS_I_SB(inode)); | ||
1361 | fio->cp_rwsem_locked = false; | ||
1360 | err = rewrite_data_page(fio); | 1362 | err = rewrite_data_page(fio); |
1361 | set_inode_flag(inode, FI_UPDATE_WRITE); | 1363 | set_inode_flag(inode, FI_UPDATE_WRITE); |
1362 | trace_f2fs_do_write_data_page(page, IPU); | 1364 | trace_f2fs_do_write_data_page(page, IPU); |
@@ -1392,6 +1394,7 @@ static int __write_data_page(struct page *page, bool *submitted, | |||
1392 | .page = page, | 1394 | .page = page, |
1393 | .encrypted_page = NULL, | 1395 | .encrypted_page = NULL, |
1394 | .submitted = false, | 1396 | .submitted = false, |
1397 | .cp_rwsem_locked = true, | ||
1395 | }; | 1398 | }; |
1396 | 1399 | ||
1397 | trace_f2fs_writepage(page, DATA); | 1400 | trace_f2fs_writepage(page, DATA); |
@@ -1449,7 +1452,8 @@ write: | |||
1449 | err = do_write_data_page(&fio); | 1452 | err = do_write_data_page(&fio); |
1450 | if (F2FS_I(inode)->last_disk_size < psize) | 1453 | if (F2FS_I(inode)->last_disk_size < psize) |
1451 | F2FS_I(inode)->last_disk_size = psize; | 1454 | F2FS_I(inode)->last_disk_size = psize; |
1452 | f2fs_unlock_op(sbi); | 1455 | if (fio.cp_rwsem_locked) |
1456 | f2fs_unlock_op(sbi); | ||
1453 | done: | 1457 | done: |
1454 | if (err && err != -ENOENT) | 1458 | if (err && err != -ENOENT) |
1455 | goto redirty_out; | 1459 | goto redirty_out; |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 252569141b69..37911ef7223d 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -793,6 +793,7 @@ struct f2fs_io_info { | |||
793 | struct page *page; /* page to be written */ | 793 | struct page *page; /* page to be written */ |
794 | struct page *encrypted_page; /* encrypted page */ | 794 | struct page *encrypted_page; /* encrypted page */ |
795 | bool submitted; /* indicate IO submission */ | 795 | bool submitted; /* indicate IO submission */ |
796 | bool cp_rwsem_locked; /* indicate cp_rwsem is held */ | ||
796 | }; | 797 | }; |
797 | 798 | ||
798 | #define is_read_io(rw) ((rw) == READ) | 799 | #define is_read_io(rw) ((rw) == READ) |