aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChao Yu <yuchao0@huawei.com>2017-04-18 07:23:39 -0400
committerJaegeuk Kim <jaegeuk@kernel.org>2017-04-19 14:00:44 -0400
commit001c584cca6fce8e91f19eca88781b8c16d1ea42 (patch)
treed5c7df8a2797882c41b95e3ffeebd0ee3c496fae
parentdf0f6b44dd59cd07aa3ff583dee04b3b563648d0 (diff)
f2fs: unlock cp_rwsem early for IPU writes
For IPU writes, there won't be any udpates in dnode page since we will reuse old block address instead of allocating new one, so we don't need to lock cp_rwsem during IPU IO submitting. Signed-off-by: Chao Yu <yuchao0@huawei.com>
-rw-r--r--fs/f2fs/data.c6
-rw-r--r--fs/f2fs/f2fs.h1
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);
1453done: 1457done:
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)