]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ext4: add helper to check quota inums
authorBaokun Li <libaokun1@huawei.com>
Wed, 26 Oct 2022 04:23:08 +0000 (12:23 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 9 Dec 2022 02:49:23 +0000 (21:49 -0500)
Before quota is enabled, a check on the preset quota inums in
ext4_super_block is added to prevent wrong quota inodes from being loaded.
In addition, when the quota fails to be enabled, the quota type and quota
inum are printed to facilitate fault locating.

Signed-off-by: Baokun Li <libaokun1@huawei.com>
Reviewed-by: Jason Yan <yanaijie@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20221026042310.3839669-3-libaokun1@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@kernel.org
fs/ext4/super.c

index 0f71542cf45355a84bdf3178c8a95d10525ce50f..6f944f5e4b3fcdc44839e5b83ec7003ddb4e87c1 100644 (file)
@@ -6886,6 +6886,20 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,
        return err;
 }
 
+static inline bool ext4_check_quota_inum(int type, unsigned long qf_inum)
+{
+       switch (type) {
+       case USRQUOTA:
+               return qf_inum == EXT4_USR_QUOTA_INO;
+       case GRPQUOTA:
+               return qf_inum == EXT4_GRP_QUOTA_INO;
+       case PRJQUOTA:
+               return qf_inum >= EXT4_GOOD_OLD_FIRST_INO;
+       default:
+               BUG();
+       }
+}
+
 static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
                             unsigned int flags)
 {
@@ -6902,9 +6916,16 @@ static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
        if (!qf_inums[type])
                return -EPERM;
 
+       if (!ext4_check_quota_inum(type, qf_inums[type])) {
+               ext4_error(sb, "Bad quota inum: %lu, type: %d",
+                               qf_inums[type], type);
+               return -EUCLEAN;
+       }
+
        qf_inode = ext4_iget(sb, qf_inums[type], EXT4_IGET_SPECIAL);
        if (IS_ERR(qf_inode)) {
-               ext4_error(sb, "Bad quota inode # %lu", qf_inums[type]);
+               ext4_error(sb, "Bad quota inode: %lu, type: %d",
+                               qf_inums[type], type);
                return PTR_ERR(qf_inode);
        }
 
@@ -6943,8 +6964,9 @@ int ext4_enable_quotas(struct super_block *sb)
                        if (err) {
                                ext4_warning(sb,
                                        "Failed to enable quota tracking "
-                                       "(type=%d, err=%d). Please run "
-                                       "e2fsck to fix.", type, err);
+                                       "(type=%d, err=%d, ino=%lu). "
+                                       "Please run e2fsck to fix.", type,
+                                       err, qf_inums[type]);
                                for (type--; type >= 0; type--) {
                                        struct inode *inode;