quota: Acquire dqio_sem for reading in vfs_load_quota_inode()
authorJan Kara <jack@suse.cz>
Thu, 8 Jun 2017 13:06:28 +0000 (15:06 +0200)
committerJan Kara <jack@suse.cz>
Thu, 17 Aug 2017 16:59:04 +0000 (18:59 +0200)
vfs_load_quota_inode() needs dqio_sem only for reading. In fact dqio_sem
is not needed there at all since the function can be called only during
quota on when quota file cannot be modified but let's leave the
protection there since it is logical and the path is in no way
performance critical.

Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/ocfs2/quota_local.c
fs/quota/dquot.c

index 1311eff1c0506b539cccde4c9438bd8e56233aef..1829f6a45d46a488edbb66d450328a48e504cc78 100644 (file)
@@ -693,7 +693,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
 
        /* We don't need the lock and we have to acquire quota file locks
         * which will later depend on this lock */
-       up_write(&sb_dqopt(sb)->dqio_sem);
+       up_read(&sb_dqopt(sb)->dqio_sem);
        info->dqi_max_spc_limit = 0x7fffffffffffffffLL;
        info->dqi_max_ino_limit = 0x7fffffffffffffffLL;
        oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS);
@@ -772,7 +772,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
                goto out_err;
        }
 
-       down_write(&sb_dqopt(sb)->dqio_sem);
+       down_read(&sb_dqopt(sb)->dqio_sem);
        return 0;
 out_err:
        if (oinfo) {
@@ -786,7 +786,7 @@ out_err:
                kfree(oinfo);
        }
        brelse(bh);
-       down_write(&sb_dqopt(sb)->dqio_sem);
+       down_read(&sb_dqopt(sb)->dqio_sem);
        return -1;
 }
 
index 8d5ccad3bf3ea502e55ba759377cd391c1b87586..3852a3c79ac90291b8ae2a185636e858989d33ac 100644 (file)
@@ -2331,15 +2331,15 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
        dqopt->info[type].dqi_format = fmt;
        dqopt->info[type].dqi_fmt_id = format_id;
        INIT_LIST_HEAD(&dqopt->info[type].dqi_dirty_list);
-       down_write(&dqopt->dqio_sem);
+       down_read(&dqopt->dqio_sem);
        error = dqopt->ops[type]->read_file_info(sb, type);
        if (error < 0) {
-               up_write(&dqopt->dqio_sem);
+               up_read(&dqopt->dqio_sem);
                goto out_file_init;
        }
        if (dqopt->flags & DQUOT_QUOTA_SYS_FILE)
                dqopt->info[type].dqi_flags |= DQF_SYS_FILE;
-       up_write(&dqopt->dqio_sem);
+       up_read(&dqopt->dqio_sem);
        spin_lock(&dq_state_lock);
        dqopt->flags |= dquot_state_flag(flags, type);
        spin_unlock(&dq_state_lock);