f2fs: unlock cp_rwsem early for IPU writes
authorChao Yu <yuchao0@huawei.com>
Tue, 18 Apr 2017 11:23:39 +0000 (19:23 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 19 Apr 2017 18:00:44 +0000 (11:00 -0700)
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>
fs/f2fs/data.c
fs/f2fs/f2fs.h

index e984a42..32d5a3b 100644 (file)
@@ -1357,6 +1357,8 @@ retry_encrypt:
                        !is_cold_data(page) &&
                        !IS_ATOMIC_WRITTEN_PAGE(page) &&
                        need_inplace_update(inode))) {
+               f2fs_unlock_op(F2FS_I_SB(inode));
+               fio->cp_rwsem_locked = false;
                err = rewrite_data_page(fio);
                set_inode_flag(inode, FI_UPDATE_WRITE);
                trace_f2fs_do_write_data_page(page, IPU);
@@ -1392,6 +1394,7 @@ static int __write_data_page(struct page *page, bool *submitted,
                .page = page,
                .encrypted_page = NULL,
                .submitted = false,
+               .cp_rwsem_locked = true,
        };
 
        trace_f2fs_writepage(page, DATA);
@@ -1449,7 +1452,8 @@ write:
                err = do_write_data_page(&fio);
        if (F2FS_I(inode)->last_disk_size < psize)
                F2FS_I(inode)->last_disk_size = psize;
-       f2fs_unlock_op(sbi);
+       if (fio.cp_rwsem_locked)
+               f2fs_unlock_op(sbi);
 done:
        if (err && err != -ENOENT)
                goto redirty_out;
index 2525691..37911ef 100644 (file)
@@ -793,6 +793,7 @@ struct f2fs_io_info {
        struct page *page;      /* page to be written */
        struct page *encrypted_page;    /* encrypted page */
        bool submitted;         /* indicate IO submission */
+       bool cp_rwsem_locked;   /* indicate cp_rwsem is held */
 };
 
 #define is_read_io(rw) ((rw) == READ)