summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2017-06-08 09:06:28 -0400
committerJan Kara <jack@suse.cz>2017-08-17 12:59:04 -0400
commitd6ab3661020cbf8a8909b49a8e1408d5ae434001 (patch)
tree5607206d8306bd409efa27212911b99fedeb188c
parent0cff9151d3fa27574c2201377a080e1b9b87b8ba (diff)
quota: Acquire dqio_sem for reading in vfs_load_quota_inode()
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>
-rw-r--r--fs/ocfs2/quota_local.c6
-rw-r--r--fs/quota/dquot.c6
2 files changed, 6 insertions, 6 deletions
diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c
index 1311eff1c050..1829f6a45d46 100644
--- a/fs/ocfs2/quota_local.c
+++ b/fs/ocfs2/quota_local.c
@@ -693,7 +693,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
693 693
694 /* We don't need the lock and we have to acquire quota file locks 694 /* We don't need the lock and we have to acquire quota file locks
695 * which will later depend on this lock */ 695 * which will later depend on this lock */
696 up_write(&sb_dqopt(sb)->dqio_sem); 696 up_read(&sb_dqopt(sb)->dqio_sem);
697 info->dqi_max_spc_limit = 0x7fffffffffffffffLL; 697 info->dqi_max_spc_limit = 0x7fffffffffffffffLL;
698 info->dqi_max_ino_limit = 0x7fffffffffffffffLL; 698 info->dqi_max_ino_limit = 0x7fffffffffffffffLL;
699 oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS); 699 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)
772 goto out_err; 772 goto out_err;
773 } 773 }
774 774
775 down_write(&sb_dqopt(sb)->dqio_sem); 775 down_read(&sb_dqopt(sb)->dqio_sem);
776 return 0; 776 return 0;
777out_err: 777out_err:
778 if (oinfo) { 778 if (oinfo) {
@@ -786,7 +786,7 @@ out_err:
786 kfree(oinfo); 786 kfree(oinfo);
787 } 787 }
788 brelse(bh); 788 brelse(bh);
789 down_write(&sb_dqopt(sb)->dqio_sem); 789 down_read(&sb_dqopt(sb)->dqio_sem);
790 return -1; 790 return -1;
791} 791}
792 792
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 8d5ccad3bf3e..3852a3c79ac9 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -2331,15 +2331,15 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
2331 dqopt->info[type].dqi_format = fmt; 2331 dqopt->info[type].dqi_format = fmt;
2332 dqopt->info[type].dqi_fmt_id = format_id; 2332 dqopt->info[type].dqi_fmt_id = format_id;
2333 INIT_LIST_HEAD(&dqopt->info[type].dqi_dirty_list); 2333 INIT_LIST_HEAD(&dqopt->info[type].dqi_dirty_list);
2334 down_write(&dqopt->dqio_sem); 2334 down_read(&dqopt->dqio_sem);
2335 error = dqopt->ops[type]->read_file_info(sb, type); 2335 error = dqopt->ops[type]->read_file_info(sb, type);
2336 if (error < 0) { 2336 if (error < 0) {
2337 up_write(&dqopt->dqio_sem); 2337 up_read(&dqopt->dqio_sem);
2338 goto out_file_init; 2338 goto out_file_init;
2339 } 2339 }
2340 if (dqopt->flags & DQUOT_QUOTA_SYS_FILE) 2340 if (dqopt->flags & DQUOT_QUOTA_SYS_FILE)
2341 dqopt->info[type].dqi_flags |= DQF_SYS_FILE; 2341 dqopt->info[type].dqi_flags |= DQF_SYS_FILE;
2342 up_write(&dqopt->dqio_sem); 2342 up_read(&dqopt->dqio_sem);
2343 spin_lock(&dq_state_lock); 2343 spin_lock(&dq_state_lock);
2344 dqopt->flags |= dquot_state_flag(flags, type); 2344 dqopt->flags |= dquot_state_flag(flags, type);
2345 spin_unlock(&dq_state_lock); 2345 spin_unlock(&dq_state_lock);