f2fs: reduce covered region of sbi->cp_rwsem in f2fs_map_blocks
authorChao Yu <chao2.yu@samsung.com>
Wed, 23 Dec 2015 09:11:43 +0000 (17:11 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 30 Dec 2015 18:14:08 +0000 (10:14 -0800)
Only cover sbi->cp_rwsem on one dnode page's allocation and modification
instead of multiple's in f2fs_map_blocks, it can reduce the covered region
of cp_rwsem, then we can avoid potential long time delay for concurrent
checkpointer.

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

index a7a9a05d012a6b03d4ebb5803ce39e4bc630053f..82ecaa30fd772411e226de3780c984b678faed9c 100644 (file)
@@ -590,7 +590,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
        }
 
        if (create)
-               f2fs_lock_op(F2FS_I_SB(inode));
+               f2fs_lock_op(sbi);
 
        /* When reading holes, we need its node page */
        set_new_dnode(&dn, inode, NULL, NULL, 0);
@@ -647,6 +647,11 @@ get_next:
                allocated = false;
                f2fs_put_dnode(&dn);
 
+               if (create) {
+                       f2fs_unlock_op(sbi);
+                       f2fs_lock_op(sbi);
+               }
+
                set_new_dnode(&dn, inode, NULL, NULL, 0);
                err = get_dnode_of_data(&dn, pgofs, mode);
                if (err) {
@@ -702,7 +707,7 @@ put_out:
        f2fs_put_dnode(&dn);
 unlock_out:
        if (create)
-               f2fs_unlock_op(F2FS_I_SB(inode));
+               f2fs_unlock_op(sbi);
 out:
        trace_f2fs_map_blocks(inode, map, err);
        return err;