mirror of https://github.com/vitalif/e2fsprogs
Cleanup changes to Andreas' symlink patch. Remove use of EXT2_LINK_DIR
Also cleaned up the symlink handling code to make it a bit more compact and to test for a bad symlink block earlier.bitmap-optimize
parent
67052a8aee
commit
d007cb4cbb
|
@ -1,3 +1,18 @@
|
||||||
|
2001-08-04 Theodore Tso <tytso@valinux.com>
|
||||||
|
|
||||||
|
* problem.c (PR_2_SYMLINK_SIZE): Change description to make it
|
||||||
|
more clear (and remove %s expansion). Also add missing
|
||||||
|
periods to the end of a number of problem descriptions.
|
||||||
|
|
||||||
|
* pass2.c (e2fsck_process_bad_inode): Remove unneeded problem
|
||||||
|
context string set now that the problem description for
|
||||||
|
PR_2_SYMLINK_SIZE has been changed.
|
||||||
|
|
||||||
|
* pass1.c (e2fsck_pass1_check_symlink): Consolidate some checks,
|
||||||
|
and check the validity of the symlink block here (so that
|
||||||
|
we detect this case here instead of later). Also use
|
||||||
|
sizeof(inode->i_block) instead EXT2_LINK_DIR.
|
||||||
|
|
||||||
2001-07-30 Theodore Tso <tytso@valinux.com>
|
2001-07-30 Theodore Tso <tytso@valinux.com>
|
||||||
|
|
||||||
* unix.c (check_mount): Remove the code which tested for the root
|
* unix.c (check_mount): Remove the code which tested for the root
|
||||||
|
|
|
@ -152,35 +152,31 @@ int e2fsck_pass1_check_device_inode(struct ext2_inode *inode)
|
||||||
*/
|
*/
|
||||||
int e2fsck_pass1_check_symlink(ext2_filsys fs, struct ext2_inode *inode)
|
int e2fsck_pass1_check_symlink(ext2_filsys fs, struct ext2_inode *inode)
|
||||||
{
|
{
|
||||||
if (inode->i_size_high || inode->i_size == 0)
|
int i;
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (inode->i_flags & (EXT2_IMMUTABLE_FL |EXT2_APPEND_FL |EXT2_INDEX_FL))
|
if ((inode->i_size_high || inode->i_size == 0) ||
|
||||||
|
(inode->i_flags & (EXT2_IMMUTABLE_FL | EXT2_APPEND_FL |
|
||||||
|
EXT2_INDEX_FL)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (inode->i_blocks) {
|
if (inode->i_blocks) {
|
||||||
int i;
|
if ((inode->i_size > fs->blocksize) ||
|
||||||
|
(inode->i_blocks != fs->blocksize >> 9) ||
|
||||||
if (inode->i_blocks > fs->blocksize >> 9)
|
(inode->i_block[0] < fs->super->s_first_data_block) ||
|
||||||
|
(inode->i_block[0] >= fs->super->s_blocks_count))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 1; i < EXT2_N_BLOCKS; i++)
|
for (i = 1; i < EXT2_N_BLOCKS; i++)
|
||||||
if (inode->i_block[i])
|
if (inode->i_block[i])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (inode->i_size > fs->blocksize)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Defer check of i_size until block number validated */
|
|
||||||
} else {
|
} else {
|
||||||
if (inode->i_size > EXT2_LINK_DIR - 1)
|
if (inode->i_size > sizeof(inode->i_block) - 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (inode->i_size !=
|
if (inode->i_size !=
|
||||||
strnlen((char *)inode->i_block, EXT2_LINK_DIR))
|
strnlen((char *)inode->i_block, sizeof(inode->i_block)))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1261,8 +1257,6 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
|
||||||
pctx->num = pb.num_blocks;
|
pctx->num = pb.num_blocks;
|
||||||
if (fix_problem(ctx, PR_1_BAD_I_BLOCKS, pctx)) {
|
if (fix_problem(ctx, PR_1_BAD_I_BLOCKS, pctx)) {
|
||||||
inode->i_blocks = pb.num_blocks;
|
inode->i_blocks = pb.num_blocks;
|
||||||
if (LINUX_S_ISLNK(inode->i_mode))
|
|
||||||
mark_inode_bad(ctx, ino);
|
|
||||||
e2fsck_write_inode(ctx, ino, inode, "check_blocks");
|
e2fsck_write_inode(ctx, ino, inode, "check_blocks");
|
||||||
}
|
}
|
||||||
pctx->num = 0;
|
pctx->num = 0;
|
||||||
|
|
|
@ -700,7 +700,6 @@ extern int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir,
|
||||||
problem = PR_2_BAD_SOCKET;
|
problem = PR_2_BAD_SOCKET;
|
||||||
else if (LINUX_S_ISLNK(inode.i_mode)
|
else if (LINUX_S_ISLNK(inode.i_mode)
|
||||||
&& !e2fsck_pass1_check_symlink(fs, &inode)) {
|
&& !e2fsck_pass1_check_symlink(fs, &inode)) {
|
||||||
pctx.str = inode.i_blocks ? "" : "fast ";
|
|
||||||
problem = PR_2_SYMLINK_SIZE;
|
problem = PR_2_SYMLINK_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -913,22 +913,22 @@ static const struct e2fsck_problem problem_table[] = {
|
||||||
|
|
||||||
/* Directory filetype incorrect */
|
/* Directory filetype incorrect */
|
||||||
{ PR_2_BAD_FILETYPE,
|
{ PR_2_BAD_FILETYPE,
|
||||||
N_("@E has an incorrect filetype (was %dt, should be %N)\n"),
|
N_("@E has an incorrect filetype (was %dt, should be %N).\n"),
|
||||||
PROMPT_FIX, 0 },
|
PROMPT_FIX, 0 },
|
||||||
|
|
||||||
/* Directory filetype set on filesystem */
|
/* Directory filetype set on filesystem */
|
||||||
{ PR_2_CLEAR_FILETYPE,
|
{ PR_2_CLEAR_FILETYPE,
|
||||||
N_("@E has filetype set\n"),
|
N_("@E has filetype set.\n"),
|
||||||
PROMPT_CLEAR, PR_PREEN_OK },
|
PROMPT_CLEAR, PR_PREEN_OK },
|
||||||
|
|
||||||
/* Directory filename is null */
|
/* Directory filename is null */
|
||||||
{ PR_2_NULL_NAME,
|
{ PR_2_NULL_NAME,
|
||||||
N_("@E has a zero-length name\n"),
|
N_("@E has a zero-length name.\n"),
|
||||||
PROMPT_CLEAR, 0 },
|
PROMPT_CLEAR, 0 },
|
||||||
|
|
||||||
/* Invalid fast symlink size */
|
/* Invalid fast symlink size */
|
||||||
{ PR_2_SYMLINK_SIZE,
|
{ PR_2_SYMLINK_SIZE,
|
||||||
N_("@i %i (%Q) is a %ssymlink with a bad size (%Is)\n"),
|
N_("Symlink %Q (@i #%i) has an invalid size (%Is).\n"),
|
||||||
PROMPT_CLEAR, 0 },
|
PROMPT_CLEAR, 0 },
|
||||||
|
|
||||||
/* i_file_acl (extended attribute block) is bad */
|
/* i_file_acl (extended attribute block) is bad */
|
||||||
|
@ -970,7 +970,7 @@ static const struct e2fsck_problem problem_table[] = {
|
||||||
|
|
||||||
/* Bad or non-existent /lost+found. Cannot reconnect */
|
/* Bad or non-existent /lost+found. Cannot reconnect */
|
||||||
{ PR_3_NO_LPF,
|
{ PR_3_NO_LPF,
|
||||||
N_("Bad or non-existent /@l. Cannot reconnect\n"),
|
N_("Bad or non-existent /@l. Cannot reconnect.\n"),
|
||||||
PROMPT_NONE, 0 },
|
PROMPT_NONE, 0 },
|
||||||
|
|
||||||
/* Could not expand /lost+found */
|
/* Could not expand /lost+found */
|
||||||
|
|
|
@ -169,8 +169,6 @@ struct ext2_group_desc
|
||||||
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
|
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
|
||||||
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
|
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
|
||||||
|
|
||||||
#define EXT2_LINK_DIR (EXT2_N_BLOCKS * 4)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Inode flags
|
* Inode flags
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue