mirror of https://github.com/vitalif/e2fsprogs
Fix e2fsck to not delete symlinks that contain an extended attribute after
the ext_attr feature flag has been cleared. (Addresses Red Hat Bugzilla #146284)bitmap-optimize
parent
06a6cbd2c8
commit
6c313fd473
|
@ -1,3 +1,12 @@
|
||||||
|
2005-01-27 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
|
||||||
|
* pass2.c (e2fsck_process_bad_inode): Offer to clear i_file_acl
|
||||||
|
before checking to see if an invalid inode should be
|
||||||
|
removed, since otherwise the fast symlink detection code
|
||||||
|
can get confused. Also clear the inode's entry in
|
||||||
|
inode_bad_map if the inode has been completely fixed.
|
||||||
|
(Addresses Red Hat Bugzilla #146284)
|
||||||
|
|
||||||
2005-01-25 Theodore Ts'o <tytso@mit.edu>
|
2005-01-25 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
|
||||||
* unix.c (main, check_if_skip): Set the valid flag earlier, and if
|
* unix.c (main, check_if_skip): Set the valid flag earlier, and if
|
||||||
|
|
|
@ -1178,6 +1178,7 @@ extern int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir,
|
||||||
ext2_filsys fs = ctx->fs;
|
ext2_filsys fs = ctx->fs;
|
||||||
struct ext2_inode inode;
|
struct ext2_inode inode;
|
||||||
int inode_modified = 0;
|
int inode_modified = 0;
|
||||||
|
int not_fixed = 0;
|
||||||
unsigned char *frag, *fsize;
|
unsigned char *frag, *fsize;
|
||||||
struct problem_context pctx;
|
struct problem_context pctx;
|
||||||
int problem = 0;
|
int problem = 0;
|
||||||
|
@ -1189,6 +1190,14 @@ extern int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir,
|
||||||
pctx.dir = dir;
|
pctx.dir = dir;
|
||||||
pctx.inode = &inode;
|
pctx.inode = &inode;
|
||||||
|
|
||||||
|
if (inode.i_file_acl &&
|
||||||
|
!(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_EXT_ATTR) &&
|
||||||
|
fix_problem(ctx, PR_2_FILE_ACL_ZERO, &pctx)) {
|
||||||
|
inode.i_file_acl = 0;
|
||||||
|
inode_modified++;
|
||||||
|
} else
|
||||||
|
not_fixed++;
|
||||||
|
|
||||||
if (!LINUX_S_ISDIR(inode.i_mode) && !LINUX_S_ISREG(inode.i_mode) &&
|
if (!LINUX_S_ISDIR(inode.i_mode) && !LINUX_S_ISREG(inode.i_mode) &&
|
||||||
!LINUX_S_ISCHR(inode.i_mode) && !LINUX_S_ISBLK(inode.i_mode) &&
|
!LINUX_S_ISCHR(inode.i_mode) && !LINUX_S_ISBLK(inode.i_mode) &&
|
||||||
!LINUX_S_ISLNK(inode.i_mode) && !LINUX_S_ISFIFO(inode.i_mode) &&
|
!LINUX_S_ISLNK(inode.i_mode) && !LINUX_S_ISFIFO(inode.i_mode) &&
|
||||||
|
@ -1217,14 +1226,17 @@ extern int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir,
|
||||||
if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
|
if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else
|
||||||
|
not_fixed++;
|
||||||
problem = 0;
|
problem = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inode.i_faddr &&
|
if (inode.i_faddr) {
|
||||||
fix_problem(ctx, PR_2_FADDR_ZERO, &pctx)) {
|
if (fix_problem(ctx, PR_2_FADDR_ZERO, &pctx)) {
|
||||||
inode.i_faddr = 0;
|
inode.i_faddr = 0;
|
||||||
inode_modified++;
|
inode_modified++;
|
||||||
|
} else
|
||||||
|
not_fixed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (fs->super->s_creator_os) {
|
switch (fs->super->s_creator_os) {
|
||||||
|
@ -1256,31 +1268,33 @@ extern int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir,
|
||||||
if (fix_problem(ctx, PR_2_FSIZE_ZERO, &pctx)) {
|
if (fix_problem(ctx, PR_2_FSIZE_ZERO, &pctx)) {
|
||||||
*fsize = 0;
|
*fsize = 0;
|
||||||
inode_modified++;
|
inode_modified++;
|
||||||
}
|
} else
|
||||||
|
not_fixed++;
|
||||||
pctx.num = 0;
|
pctx.num = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inode.i_file_acl &&
|
|
||||||
!(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_EXT_ATTR) &&
|
|
||||||
fix_problem(ctx, PR_2_FILE_ACL_ZERO, &pctx)) {
|
|
||||||
inode.i_file_acl = 0;
|
|
||||||
inode_modified++;
|
|
||||||
}
|
|
||||||
if (inode.i_file_acl &&
|
if (inode.i_file_acl &&
|
||||||
((inode.i_file_acl < fs->super->s_first_data_block) ||
|
((inode.i_file_acl < fs->super->s_first_data_block) ||
|
||||||
(inode.i_file_acl >= fs->super->s_blocks_count)) &&
|
(inode.i_file_acl >= fs->super->s_blocks_count))) {
|
||||||
fix_problem(ctx, PR_2_FILE_ACL_BAD, &pctx)) {
|
if (fix_problem(ctx, PR_2_FILE_ACL_BAD, &pctx)) {
|
||||||
inode.i_file_acl = 0;
|
inode.i_file_acl = 0;
|
||||||
inode_modified++;
|
inode_modified++;
|
||||||
|
} else
|
||||||
|
not_fixed++;
|
||||||
}
|
}
|
||||||
if (inode.i_dir_acl &&
|
if (inode.i_dir_acl &&
|
||||||
LINUX_S_ISDIR(inode.i_mode) &&
|
LINUX_S_ISDIR(inode.i_mode)) {
|
||||||
fix_problem(ctx, PR_2_DIR_ACL_ZERO, &pctx)) {
|
if (fix_problem(ctx, PR_2_DIR_ACL_ZERO, &pctx)) {
|
||||||
inode.i_dir_acl = 0;
|
inode.i_dir_acl = 0;
|
||||||
inode_modified++;
|
inode_modified++;
|
||||||
|
} else
|
||||||
|
not_fixed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inode_modified)
|
if (inode_modified)
|
||||||
e2fsck_write_inode(ctx, ino, &inode, "process_bad_inode");
|
e2fsck_write_inode(ctx, ino, &inode, "process_bad_inode");
|
||||||
|
if (!not_fixed)
|
||||||
|
ext2fs_unmark_inode_bitmap(ctx->inode_bad_map, ino);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2005-01-27 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
|
||||||
|
* f_clear_xattr: New test case
|
||||||
|
|
||||||
2005-01-25 Theodore Ts'o <tytso@mit.edu>
|
2005-01-25 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
|
||||||
* f_summary_counts: New test case
|
* f_summary_counts: New test case
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
Pass 1: Checking inodes, blocks, and sizes
|
||||||
|
Inode 14, i_blocks is 2, should be 0. Fix? yes
|
||||||
|
|
||||||
|
Inode 12, i_blocks is 4, should be 2. Fix? yes
|
||||||
|
|
||||||
|
Inode 13, i_blocks is 2, should be 0. Fix? yes
|
||||||
|
|
||||||
|
Inode 15, i_blocks is 4, should be 2. Fix? yes
|
||||||
|
|
||||||
|
Pass 2: Checking directory structure
|
||||||
|
i_file_acl for inode 12 (/dir) is 22, should be zero.
|
||||||
|
Clear? yes
|
||||||
|
|
||||||
|
i_file_acl for inode 13 (/file) is 22, should be zero.
|
||||||
|
Clear? yes
|
||||||
|
|
||||||
|
i_file_acl for inode 14 (/symlink) is 22, should be zero.
|
||||||
|
Clear? yes
|
||||||
|
|
||||||
|
i_file_acl for inode 15 (/long-symlink) is 23, should be zero.
|
||||||
|
Clear? yes
|
||||||
|
|
||||||
|
Pass 3: Checking directory connectivity
|
||||||
|
Pass 4: Checking reference counts
|
||||||
|
Pass 5: Checking group summary information
|
||||||
|
Block bitmap differences: -(22--23)
|
||||||
|
Fix? yes
|
||||||
|
|
||||||
|
Free blocks count wrong for group #0 (76, counted=78).
|
||||||
|
Fix? yes
|
||||||
|
|
||||||
|
Free blocks count wrong (76, counted=78).
|
||||||
|
Fix? yes
|
||||||
|
|
||||||
|
|
||||||
|
test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
|
||||||
|
test_filesys: 15/16 files (0.0% non-contiguous), 22/100 blocks
|
||||||
|
Exit status is 1
|
|
@ -0,0 +1,7 @@
|
||||||
|
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: 15/16 files (0.0% non-contiguous), 22/100 blocks
|
||||||
|
Exit status is 0
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
clearing i_file_acl when !ext_attr feature
|
Loading…
Reference in New Issue