Currently dq_list_lock is responsible for quota format protection which is counter productive. Introduce dedicated lock. Signed-off-by: Dmitry Monakhov <dmonakhov@xxxxxxxxxx> --- fs/quota/dquot.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index a1efacd..f719a6f 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -82,7 +82,6 @@ /* * There are three quota SMP locks. dq_list_lock protects all lists with quotas - * and quota formats. * dq_data_lock protects data from dq_dqb and also mem_dqinfo structures and * also guards consistency of dquot->dq_dqb with inode->i_blocks, i_bytes. * i_blocks and i_bytes updates itself are guarded by i_lock acquired directly @@ -125,6 +124,7 @@ */ static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_list_lock); +static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_fmt_lock); __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_data_lock); EXPORT_SYMBOL(dq_data_lock); @@ -155,10 +155,10 @@ static struct kmem_cache *dquot_cachep; int register_quota_format(struct quota_format_type *fmt) { - spin_lock(&dq_list_lock); + spin_lock(&dq_fmt_lock); fmt->qf_next = quota_formats; quota_formats = fmt; - spin_unlock(&dq_list_lock); + spin_unlock(&dq_fmt_lock); return 0; } EXPORT_SYMBOL(register_quota_format); @@ -167,13 +167,13 @@ void unregister_quota_format(struct quota_format_type *fmt) { struct quota_format_type **actqf; - spin_lock(&dq_list_lock); + spin_lock(&dq_fmt_lock); for (actqf = "a_formats; *actqf && *actqf != fmt; actqf = &(*actqf)->qf_next) ; if (*actqf) *actqf = (*actqf)->qf_next; - spin_unlock(&dq_list_lock); + spin_unlock(&dq_fmt_lock); } EXPORT_SYMBOL(unregister_quota_format); @@ -181,14 +181,14 @@ static struct quota_format_type *find_quota_format(int id) { struct quota_format_type *actqf; - spin_lock(&dq_list_lock); + spin_lock(&dq_fmt_lock); for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id; actqf = actqf->qf_next) ; if (!actqf || !try_module_get(actqf->qf_owner)) { int qm; - spin_unlock(&dq_list_lock); + spin_unlock(&dq_fmt_lock); for (qm = 0; module_names[qm].qm_fmt_id && module_names[qm].qm_fmt_id != id; qm++) @@ -197,14 +197,14 @@ static struct quota_format_type *find_quota_format(int id) request_module(module_names[qm].qm_mod_name)) return NULL; - spin_lock(&dq_list_lock); + spin_lock(&dq_fmt_lock); for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id; actqf = actqf->qf_next) ; if (actqf && !try_module_get(actqf->qf_owner)) actqf = NULL; } - spin_unlock(&dq_list_lock); + spin_unlock(&dq_fmt_lock); return actqf; } -- 1.6.5.2 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html