quota: Convert dqio_mutex to rwsem
Convert dqio_mutex to rwsem and call it dqio_sem. No functional changes yet. Signed-off-by: Jan Kara <jack@suse.cz>
这个提交包含在:
@@ -120,7 +120,7 @@
|
||||
* spinlock to internal buffers before writing.
|
||||
*
|
||||
* Lock ordering (including related VFS locks) is the following:
|
||||
* s_umount > i_mutex > journal_lock > dquot->dq_lock > dqio_mutex
|
||||
* s_umount > i_mutex > journal_lock > dquot->dq_lock > dqio_sem
|
||||
*/
|
||||
|
||||
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_list_lock);
|
||||
@@ -406,7 +406,7 @@ int dquot_acquire(struct dquot *dquot)
|
||||
struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
|
||||
|
||||
mutex_lock(&dquot->dq_lock);
|
||||
mutex_lock(&dqopt->dqio_mutex);
|
||||
down_write(&dqopt->dqio_sem);
|
||||
if (!test_bit(DQ_READ_B, &dquot->dq_flags))
|
||||
ret = dqopt->ops[dquot->dq_id.type]->read_dqblk(dquot);
|
||||
if (ret < 0)
|
||||
@@ -436,7 +436,7 @@ int dquot_acquire(struct dquot *dquot)
|
||||
smp_mb__before_atomic();
|
||||
set_bit(DQ_ACTIVE_B, &dquot->dq_flags);
|
||||
out_iolock:
|
||||
mutex_unlock(&dqopt->dqio_mutex);
|
||||
up_write(&dqopt->dqio_sem);
|
||||
mutex_unlock(&dquot->dq_lock);
|
||||
return ret;
|
||||
}
|
||||
@@ -450,7 +450,7 @@ int dquot_commit(struct dquot *dquot)
|
||||
int ret = 0;
|
||||
struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
|
||||
|
||||
mutex_lock(&dqopt->dqio_mutex);
|
||||
down_write(&dqopt->dqio_sem);
|
||||
spin_lock(&dq_list_lock);
|
||||
if (!clear_dquot_dirty(dquot)) {
|
||||
spin_unlock(&dq_list_lock);
|
||||
@@ -464,7 +464,7 @@ int dquot_commit(struct dquot *dquot)
|
||||
else
|
||||
ret = -EIO;
|
||||
out_sem:
|
||||
mutex_unlock(&dqopt->dqio_mutex);
|
||||
up_write(&dqopt->dqio_sem);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dquot_commit);
|
||||
@@ -481,7 +481,7 @@ int dquot_release(struct dquot *dquot)
|
||||
/* Check whether we are not racing with some other dqget() */
|
||||
if (atomic_read(&dquot->dq_count) > 1)
|
||||
goto out_dqlock;
|
||||
mutex_lock(&dqopt->dqio_mutex);
|
||||
down_write(&dqopt->dqio_sem);
|
||||
if (dqopt->ops[dquot->dq_id.type]->release_dqblk) {
|
||||
ret = dqopt->ops[dquot->dq_id.type]->release_dqblk(dquot);
|
||||
/* Write the info */
|
||||
@@ -493,7 +493,7 @@ int dquot_release(struct dquot *dquot)
|
||||
ret = ret2;
|
||||
}
|
||||
clear_bit(DQ_ACTIVE_B, &dquot->dq_flags);
|
||||
mutex_unlock(&dqopt->dqio_mutex);
|
||||
up_write(&dqopt->dqio_sem);
|
||||
out_dqlock:
|
||||
mutex_unlock(&dquot->dq_lock);
|
||||
return ret;
|
||||
@@ -2060,9 +2060,9 @@ int dquot_commit_info(struct super_block *sb, int type)
|
||||
int ret;
|
||||
struct quota_info *dqopt = sb_dqopt(sb);
|
||||
|
||||
mutex_lock(&dqopt->dqio_mutex);
|
||||
down_write(&dqopt->dqio_sem);
|
||||
ret = dqopt->ops[type]->write_file_info(sb, type);
|
||||
mutex_unlock(&dqopt->dqio_mutex);
|
||||
up_write(&dqopt->dqio_sem);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dquot_commit_info);
|
||||
@@ -2076,9 +2076,9 @@ int dquot_get_next_id(struct super_block *sb, struct kqid *qid)
|
||||
return -ESRCH;
|
||||
if (!dqopt->ops[qid->type]->get_next_id)
|
||||
return -ENOSYS;
|
||||
mutex_lock(&dqopt->dqio_mutex);
|
||||
down_write(&dqopt->dqio_sem);
|
||||
err = dqopt->ops[qid->type]->get_next_id(sb, qid);
|
||||
mutex_unlock(&dqopt->dqio_mutex);
|
||||
up_write(&dqopt->dqio_sem);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(dquot_get_next_id);
|
||||
@@ -2328,15 +2328,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);
|
||||
mutex_lock(&dqopt->dqio_mutex);
|
||||
down_write(&dqopt->dqio_sem);
|
||||
error = dqopt->ops[type]->read_file_info(sb, type);
|
||||
if (error < 0) {
|
||||
mutex_unlock(&dqopt->dqio_mutex);
|
||||
up_write(&dqopt->dqio_sem);
|
||||
goto out_file_init;
|
||||
}
|
||||
if (dqopt->flags & DQUOT_QUOTA_SYS_FILE)
|
||||
dqopt->info[type].dqi_flags |= DQF_SYS_FILE;
|
||||
mutex_unlock(&dqopt->dqio_mutex);
|
||||
up_write(&dqopt->dqio_sem);
|
||||
spin_lock(&dq_state_lock);
|
||||
dqopt->flags |= dquot_state_flag(flags, type);
|
||||
spin_unlock(&dq_state_lock);
|
||||
|
在新工单中引用
屏蔽一个用户