f2fs: declare nested quota_sem and remove unnecessary sems
authorJaegeuk Kim <jaegeuk@kernel.org>
Wed, 4 Dec 2019 01:31:00 +0000 (17:31 -0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 15 Jan 2020 21:43:49 +0000 (13:43 -0800)
1.
f2fs_quota_sync
 -> down_read(&sbi->quota_sem)
 -> dquot_writeback_dquots
  -> f2fs_dquot_commit
   -> down_read(&sbi->quota_sem)

2.
f2fs_quota_sync
 -> down_read(&sbi->quota_sem)
  -> f2fs_write_data_pages
   -> f2fs_write_single_data_page
    -> down_write(&F2FS_I(inode)->i_sem)

f2fs_mkdir
 -> f2fs_do_add_link
   -> down_write(&F2FS_I(inode)->i_sem)
   -> f2fs_init_inode_metadata
    -> f2fs_new_node_page
     -> dquot_alloc_inode
      -> f2fs_dquot_mark_dquot_dirty
       -> down_read(&sbi->quota_sem)

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/super.c

index 9e85894..e6fb4b5 100644 (file)
@@ -2158,7 +2158,7 @@ static int f2fs_dquot_commit(struct dquot *dquot)
        struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
        int ret;
 
-       down_read(&sbi->quota_sem);
+       down_read_nested(&sbi->quota_sem, SINGLE_DEPTH_NESTING);
        ret = dquot_commit(dquot);
        if (ret < 0)
                set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
@@ -2182,13 +2182,10 @@ static int f2fs_dquot_acquire(struct dquot *dquot)
 static int f2fs_dquot_release(struct dquot *dquot)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
-       int ret;
+       int ret = dquot_release(dquot);
 
-       down_read(&sbi->quota_sem);
-       ret = dquot_release(dquot);
        if (ret < 0)
                set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
-       up_read(&sbi->quota_sem);
        return ret;
 }
 
@@ -2196,29 +2193,22 @@ static int f2fs_dquot_mark_dquot_dirty(struct dquot *dquot)
 {
        struct super_block *sb = dquot->dq_sb;
        struct f2fs_sb_info *sbi = F2FS_SB(sb);
-       int ret;
-
-       down_read(&sbi->quota_sem);
-       ret = dquot_mark_dquot_dirty(dquot);
+       int ret = dquot_mark_dquot_dirty(dquot);
 
        /* if we are using journalled quota */
        if (is_journalled_quota(sbi))
                set_sbi_flag(sbi, SBI_QUOTA_NEED_FLUSH);
 
-       up_read(&sbi->quota_sem);
        return ret;
 }
 
 static int f2fs_dquot_commit_info(struct super_block *sb, int type)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(sb);
-       int ret;
+       int ret = dquot_commit_info(sb, type);
 
-       down_read(&sbi->quota_sem);
-       ret = dquot_commit_info(sb, type);
        if (ret < 0)
                set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
-       up_read(&sbi->quota_sem);
        return ret;
 }