Merge tag 'devicetree-for-6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/robh...
[linux-2.6-microblaze.git] / fs / quota / quota_v2.c
index 48e0d61..c48c233 100644 (file)
@@ -121,7 +121,7 @@ static int v2_read_file_info(struct super_block *sb, int type)
                        ret = -EIO;
                goto out;
        }
-       info->dqi_priv = kmalloc(sizeof(struct qtree_mem_dqinfo), GFP_NOFS);
+       info->dqi_priv = kmalloc(sizeof(struct qtree_mem_dqinfo), GFP_KERNEL);
        if (!info->dqi_priv) {
                ret = -ENOMEM;
                goto out;
@@ -168,14 +168,17 @@ static int v2_read_file_info(struct super_block *sb, int type)
                    i_size_read(sb_dqopt(sb)->files[type]));
                goto out_free;
        }
-       if (qinfo->dqi_free_blk >= qinfo->dqi_blocks) {
-               quota_error(sb, "Free block number too big (%u >= %u).",
-                           qinfo->dqi_free_blk, qinfo->dqi_blocks);
+       if (qinfo->dqi_free_blk && (qinfo->dqi_free_blk <= QT_TREEOFF ||
+           qinfo->dqi_free_blk >= qinfo->dqi_blocks)) {
+               quota_error(sb, "Free block number %u out of range (%u, %u).",
+                           qinfo->dqi_free_blk, QT_TREEOFF, qinfo->dqi_blocks);
                goto out_free;
        }
-       if (qinfo->dqi_free_entry >= qinfo->dqi_blocks) {
-               quota_error(sb, "Block with free entry too big (%u >= %u).",
-                           qinfo->dqi_free_entry, qinfo->dqi_blocks);
+       if (qinfo->dqi_free_entry && (qinfo->dqi_free_entry <= QT_TREEOFF ||
+           qinfo->dqi_free_entry >= qinfo->dqi_blocks)) {
+               quota_error(sb, "Block with free entry %u out of range (%u, %u).",
+                           qinfo->dqi_free_entry, QT_TREEOFF,
+                           qinfo->dqi_blocks);
                goto out_free;
        }
        ret = 0;