e2fsck: allow extent tree optimization to be disabled

Add an extended option, -E no_optimize_extents, as well as a
e2fsck.conf profile option, to disable extent tree optimization.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
Theodore Ts'o 2017-04-15 09:22:27 -04:00
parent f91b451c26
commit 0b76d709f4
5 changed files with 20 additions and 0 deletions

View File

@ -226,6 +226,10 @@ option may prevent you from further manual data recovery.
Do not attempt to discard free blocks and unused inode blocks. This option is
exactly the opposite of discard option. This is set as default.
.TP
.BI no_optimize_extents
Do not offer to optimize the extent tree by eliminating unnecessary
width or depth.
.TP
.BI readahead_kb
Use this many KiB of memory to pre-fetch metadata in the hopes of reducing
e2fsck runtime. By default, this is set to the size of two block groups' inode

View File

@ -205,6 +205,10 @@ of that type are squelched. This can be useful if the console is slow
(i.e., connected to a serial port) and so a large amount of output could
end up delaying the boot process for a long time (potentially hours).
.TP
.I no_optimize_extents
Do not offer to optimize the extent tree by eliminating unnecessary
width or depth.
.TP
.I readahead_mem_pct
Use this percentage of memory to try to read in metadata blocks ahead of the
main e2fsck thread. This should reduce run times, depending on the speed of

View File

@ -169,6 +169,7 @@ struct resource_track {
#define E2F_OPT_DISCARD 0x2000
#define E2F_OPT_CONVERT_BMAP 0x4000 /* convert blockmap to extent */
#define E2F_OPT_FIXES_ONLY 0x8000 /* skip all optimizations */
#define E2F_OPT_NOOPT_EXTENTS 0x10000 /* don't optimize extents */
/*
* E2fsck flags

View File

@ -521,6 +521,9 @@ errcode_t e2fsck_should_rebuild_extents(e2fsck_t ctx,
if (eti->force_rebuild)
goto rebuild;
if (ctx->options & E2F_OPT_NOOPT_EXTENTS)
return 0;
extents_per_block = (ctx->fs->blocksize -
sizeof(struct ext3_extent_header)) /
sizeof(struct ext3_extent);

View File

@ -709,6 +709,9 @@ static void parse_extended_opts(e2fsck_t ctx, const char *opts)
} else if (strcmp(token, "nodiscard") == 0) {
ctx->options &= ~E2F_OPT_DISCARD;
continue;
} else if (strcmp(token, "no_optimize_extents") == 0) {
ctx->options |= E2F_OPT_NOOPT_EXTENTS;
continue;
} else if (strcmp(token, "log_filename") == 0) {
if (!arg)
extended_usage++;
@ -1007,6 +1010,11 @@ static errcode_t PRS(int argc, char *argv[], e2fsck_t *ret_ctx)
if (c)
verbose = 1;
profile_get_boolean(ctx->profile, "options", "no_optimize_extents",
0, 0, &c);
if (c)
ctx->options |= E2F_OPT_NOOPT_EXTENTS;
if (ctx->readahead_kb == ~0ULL) {
profile_get_integer(ctx->profile, "options",
"readahead_mem_pct", 0, -1, &c);