/* quota.c */
extern void e2fsck_hide_quota(e2fsck_t ctx);
+extern void e2fsck_validate_quota_inodes(e2fsck_t ctx);
/* pass1.c */
extern errcode_t e2fsck_setup_icount(e2fsck_t ctx, const char *icount_name,
N_("Bad desired extra isize in @S (%N). "),
PROMPT_FIX, 0 },
+ /* Invalid quota inode number */
+ { PR_0_INVALID_QUOTA_INO,
+ N_("Invalid %U @q @i %i. "),
+ PROMPT_FIX, 0 },
+
/* Pass 1 errors */
/* Pass 1: Checking inodes, blocks, and sizes */
/* Bad desired extra isize in superblock */
#define PR_0_BAD_WANT_EXTRA_ISIZE 0x00004E
+/* Invalid quota inode number */
+#define PR_0_INVALID_QUOTA_INO 0x00004F
+
/*
* Pass 1 errors
fix_problem(ctx, PR_0_HIDE_QUOTA, &pctx)) {
move_quota_inode(fs, pctx.ino, quota_ino, qtype);
*quota_sb_inump(sb, qtype) = quota_ino;
+ ext2fs_mark_super_dirty(fs);
}
}
return;
}
+
+void e2fsck_validate_quota_inodes(e2fsck_t ctx)
+{
+ struct ext2_super_block *sb = ctx->fs->super;
+ struct problem_context pctx;
+ ext2_filsys fs = ctx->fs;
+ enum quota_type qtype;
+ ext2_ino_t quota_ino;
+
+ clear_problem_context(&pctx);
+
+ for (qtype = 0; qtype < MAXQUOTAS; qtype++) {
+ pctx.ino = *quota_sb_inump(sb, qtype);
+ pctx.num = qtype;
+ if (pctx.ino &&
+ ((pctx.ino == EXT2_BAD_INO) ||
+ (pctx.ino == EXT2_ROOT_INO) ||
+ (pctx.ino == EXT2_BOOT_LOADER_INO) ||
+ (pctx.ino == EXT2_UNDEL_DIR_INO) ||
+ (pctx.ino == EXT2_RESIZE_INO) ||
+ (pctx.ino == EXT2_JOURNAL_INO) ||
+ (pctx.ino == EXT2_EXCLUDE_INO) ||
+ (pctx.ino == EXT4_REPLICA_INO) ||
+ (pctx.ino > fs->super->s_inodes_count)) &&
+ fix_problem(ctx, PR_0_INVALID_QUOTA_INO, &pctx)) {
+ *quota_sb_inump(sb, qtype) = 0;
+ ext2fs_mark_super_dirty(fs);
+ }
+ }
+}
}
}
+ e2fsck_validate_quota_inodes(ctx);
+
/*
* Move the ext3 journal file, if necessary.
*/
--- /dev/null
+Invalid user quota inode 808464432. Fix? yes
+
+Invalid group quota inode 808464432. Fix? yes
+
+Invalid group quota inode 808464432. Fix? yes
+
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+
+test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
+test_filesys: 11/16 files (0.0% non-contiguous), 21/100 blocks
+Exit status is 1
--- /dev/null
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+test_filesys: 11/16 files (0.0% non-contiguous), 21/100 blocks
+Exit status is 0
--- /dev/null
+invalid quota inode numbers