quota: protect Q_GETFMT by dqonoff_mutex
authorNiu Yawei <yawei.niu@gmail.com>
Wed, 4 Jun 2014 04:19:12 +0000 (12:19 +0800)
committerJan Kara <jack@suse.cz>
Tue, 15 Jul 2014 20:40:20 +0000 (22:40 +0200)
dqptr_sem will go away. Protect Q_GETFMT quotactl by
dqonoff_mutex instead. This is also enough to make sure
quota info will not go away while we are looking at it.

Signed-off-by: Lai Siyao <lai.siyao@intel.com>
Signed-off-by: Niu Yawei <yawei.niu@intel.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/quota/quota.c

index ff3f0b3cfdb31b97183d09e8d1428cd55fd61a12..75621649dbd76dd997aa96462d5d2b6c2124e5a9 100644 (file)
@@ -79,13 +79,13 @@ static int quota_getfmt(struct super_block *sb, int type, void __user *addr)
 {
        __u32 fmt;
 
-       down_read(&sb_dqopt(sb)->dqptr_sem);
+       mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
        if (!sb_has_quota_active(sb, type)) {
-               up_read(&sb_dqopt(sb)->dqptr_sem);
+               mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
                return -ESRCH;
        }
        fmt = sb_dqopt(sb)->info[type].dqi_format->qf_fmt_id;
-       up_read(&sb_dqopt(sb)->dqptr_sem);
+       mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
        if (copy_to_user(addr, &fmt, sizeof(fmt)))
                return -EFAULT;
        return 0;