quota: check quota type in early stage
authorChengguang Xu <cgxu519@mykernel.net>
Tue, 8 Oct 2019 14:50:59 +0000 (22:50 +0800)
committerJan Kara <jack@suse.cz>
Tue, 8 Oct 2019 15:26:18 +0000 (17:26 +0200)
Check quota type in early stage so we can avoid many
unncessary operations when the type is wrong.

Link: https://lore.kernel.org/r/20191008145059.21402-1-cgxu519@mykernel.net
Signed-off-by: Chengguang Xu <cgxu519@mykernel.net>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/quota/quota.c

index cb13fb76dbee5416c0185f2d4e1038138be0784b..5444d3c4d93f37e52827fb895db162848ea6c8cb 100644 (file)
@@ -60,8 +60,6 @@ static int quota_sync_all(int type)
 {
        int ret;
 
-       if (type >= MAXQUOTAS)
-               return -EINVAL;
        ret = security_quotactl(Q_SYNC, type, 0, NULL);
        if (!ret)
                iterate_supers(quota_sync_one, &type);
@@ -686,8 +684,6 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
 {
        int ret;
 
-       if (type >= MAXQUOTAS)
-               return -EINVAL;
        type = array_index_nospec(type, MAXQUOTAS);
        /*
         * Quota not supported on this fs? Check this before s_quota_types
@@ -831,6 +827,9 @@ int kernel_quotactl(unsigned int cmd, const char __user *special,
        cmds = cmd >> SUBCMDSHIFT;
        type = cmd & SUBCMDMASK;
 
+       if (type >= MAXQUOTAS)
+               return -EINVAL;
+
        /*
         * As a special case Q_SYNC can be called without a specific device.
         * It will iterate all superblocks that have quota enabled and call