basebuilder_pel7x64builder0
3 years ago
65 changed files with 2943 additions and 432 deletions
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
From a82d88ea99d3c5c21bf538b886da0482bf143fd5 Mon Sep 17 00:00:00 2001 |
||||
From: "Darrick J. Wong" <darrick.wong@oracle.com> |
||||
Date: Thu, 24 Jul 2014 21:03:54 -0400 |
||||
Subject: [PATCH] e2fsck: free ctx->fs, not fs, at the end of fsck |
||||
|
||||
When we call ext2fs_close_free at the end of main(), we need to supply |
||||
the address of ctx->fs, because the subsequent e2fsck_free_context |
||||
call will try to access ctx->fs (which is now set to a freed block) to |
||||
see if it should free the directory block list. This is clearly not |
||||
desirable, so fix the problem. |
||||
|
||||
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/unix.c | 2 +- |
||||
1 file changed, 1 insertion(+), 1 deletion(-) |
||||
|
||||
diff --git a/e2fsck/unix.c b/e2fsck/unix.c |
||||
index 8d1bdf3e..fc05bdee 100644 |
||||
--- a/e2fsck/unix.c |
||||
+++ b/e2fsck/unix.c |
||||
@@ -1774,7 +1774,7 @@ no_journal: |
||||
io_channel_flush(ctx->fs->io); |
||||
print_resource_track(ctx, NULL, &ctx->global_rtrack, ctx->fs->io); |
||||
|
||||
- ext2fs_close_free(&fs); |
||||
+ ext2fs_close_free(&ctx->fs); |
||||
free(ctx->journal_name); |
||||
|
||||
e2fsck_free_context(ctx); |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
From 72f9ce9c2e6b7b41963c36096d3955e010df9033 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sun, 23 Jul 2017 18:51:22 -0400 |
||||
Subject: [PATCH 1/2] Clarify how the description of the dir_nlink feature in |
||||
the ext4 man page |
||||
|
||||
commit 7d8f358cdce948df57b1001b9c278f33519afa86 |
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
misc/ext4.5.in | 7 ++++++- |
||||
1 file changed, 6 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/misc/ext4.5.in b/misc/ext4.5.in |
||||
index dcef6c08..366916d8 100644 |
||||
--- a/misc/ext4.5.in |
||||
+++ b/misc/ext4.5.in |
||||
@@ -68,7 +68,12 @@ ext2 file systems. |
||||
.TP |
||||
.B dir_nlink |
||||
.br |
||||
-This ext4 feature allows more than 65000 subdirectories per directory. |
||||
+Normally ext4 allows an inode to have no more than 65,000 hard links. |
||||
+This applies to files as well as directories, which means that there can |
||||
+be no more than 64,998 subdirectories in a directory (because each of |
||||
+the '..' entries counts as a hard link). This feature lifts this limit |
||||
+by causing ext4 to use a links count of 1 to indicate that the number of |
||||
+hard links to a directory is not known. |
||||
.TP |
||||
.B extent |
||||
.br |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
From a2a3247ba03bcb37f80b04b473112079968b9513 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sat, 11 Aug 2018 20:47:08 -0400 |
||||
Subject: [PATCH 10/16] e2fsck: fix fd leak in reserve_stdio_fds |
||||
|
||||
commit ac5936d78d520b9edac15994728bb8b0364814e6 |
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
Reviewed-by: Lukas Czerner <lczerner@redhat.com> |
||||
--- |
||||
e2fsck/unix.c | 3 ++- |
||||
1 file changed, 2 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/e2fsck/unix.c b/e2fsck/unix.c |
||||
index 5fcc9d99..a434f1e6 100644 |
||||
--- a/e2fsck/unix.c |
||||
+++ b/e2fsck/unix.c |
||||
@@ -604,9 +604,10 @@ static void reserve_stdio_fds(void) |
||||
fprintf(stderr, _("ERROR: Couldn't open " |
||||
"/dev/null (%s)\n"), |
||||
strerror(errno)); |
||||
- break; |
||||
+ return; |
||||
} |
||||
} |
||||
+ (void) close(fd); |
||||
} |
||||
|
||||
#ifdef HAVE_SIGNAL_H |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
From 6efb6613deeca55b8e5673c77644890e7f5e4738 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Wed, 8 Oct 2014 11:18:41 -0400 |
||||
Subject: [PATCH 13/16] e2fsck: fix free pointer dereferences |
||||
|
||||
commit ebdf895b43a1ce499e4d2556a201e2a753fc422f |
||||
|
||||
Commit 47fee2ef6a23a introduces some free pointer dereference bugs by |
||||
not clearing ctx->fs after calling ext2fs_close_free(). |
||||
|
||||
Reported-by: Matthias Andree <mandree@FreeBSD.org> |
||||
Cc: Lukas Czerner <lczerner@redhat.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/unix.c | 6 +++--- |
||||
1 file changed, 3 insertions(+), 3 deletions(-) |
||||
|
||||
diff --git a/e2fsck/unix.c b/e2fsck/unix.c |
||||
index 84b9a454..bbf65d90 100644 |
||||
--- a/e2fsck/unix.c |
||||
+++ b/e2fsck/unix.c |
||||
@@ -458,7 +458,7 @@ static void check_if_skip(e2fsck_t ctx) |
||||
} |
||||
log_out(ctx, "\n"); |
||||
skip: |
||||
- ext2fs_close_free(&fs); |
||||
+ ext2fs_close_free(&ctx->fs); |
||||
e2fsck_free_context(ctx); |
||||
exit(FSCK_OK); |
||||
} |
||||
@@ -1461,7 +1461,7 @@ failure: |
||||
/* |
||||
* Restart in order to reopen fs but this time start mmp. |
||||
*/ |
||||
- ext2fs_close_free(&fs); |
||||
+ ext2fs_close_free(&ctx->fs); |
||||
flags &= ~EXT2_FLAG_SKIP_MMP; |
||||
goto restart; |
||||
} |
||||
@@ -1690,7 +1690,7 @@ no_journal: |
||||
_("while resetting context")); |
||||
fatal_error(ctx, 0); |
||||
} |
||||
- ext2fs_close_free(&fs); |
||||
+ ext2fs_close_free(&ctx->fs); |
||||
goto restart; |
||||
} |
||||
if (run_result & E2F_FLAG_CANCEL) { |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
From 0d70bb1ca641ac31c84130e2d701ea296bc059fb Mon Sep 17 00:00:00 2001 |
||||
From: Jan Kara <jack@suse.cz> |
||||
Date: Fri, 4 Jul 2014 16:24:18 -0400 |
||||
Subject: [PATCH 15/16] e2fsck: fix last mount time and last write time in |
||||
preen mode |
||||
|
||||
commit 87aca2ad028b9841d3ec32edd858ccc91d96ab4c |
||||
|
||||
Fixing last mount time and last write time is safe - there's no risk of |
||||
loosing any important information or making corruption significantly |
||||
worse even if we get it wrong. So let's just fix these times in preen |
||||
mode. This allows initrd to automatically check and mount root |
||||
filesystem in case system clock is wrong without having to manually set |
||||
broken_system_clock variable (openSUSE uses broken_system_clock by default |
||||
to avoid these problems during boot but this disables time-based checks |
||||
even on systems where clock is fine so that's not ideal either). |
||||
|
||||
Signed-off-by: Jan Kara <jack@suse.cz> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/problem.c | 4 ++-- |
||||
1 file changed, 2 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/e2fsck/problem.c b/e2fsck/problem.c |
||||
index a01b2560..1aac7851 100644 |
||||
--- a/e2fsck/problem.c |
||||
+++ b/e2fsck/problem.c |
||||
@@ -336,12 +336,12 @@ static struct e2fsck_problem problem_table[] = { |
||||
/* Last mount time is in the future */ |
||||
{ PR_0_FUTURE_SB_LAST_MOUNT, |
||||
N_("@S last mount time (%t,\n\tnow = %T) is in the future.\n"), |
||||
- PROMPT_FIX, PR_NO_OK }, |
||||
+ PROMPT_FIX, PR_PREEN_OK | PR_NO_OK }, |
||||
|
||||
/* Last write time is in the future */ |
||||
{ PR_0_FUTURE_SB_LAST_WRITE, |
||||
N_("@S last write time (%t,\n\tnow = %T) is in the future.\n"), |
||||
- PROMPT_FIX, PR_NO_OK }, |
||||
+ PROMPT_FIX, PR_PREEN_OK | PR_NO_OK }, |
||||
|
||||
{ PR_0_EXTERNAL_JOURNAL_HINT, |
||||
N_("@S hint for external superblock @s %X. "), |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
From 2ab3543e3b3330317769adcbe4bdb2f3c0b855e9 Mon Sep 17 00:00:00 2001 |
||||
From: "Darrick J. Wong" <darrick.wong@oracle.com> |
||||
Date: Thu, 24 Jul 2014 22:19:27 -0400 |
||||
Subject: [PATCH 14/16] e2fsck: fix off-by-one bounds check on group number |
||||
|
||||
commit b4f724c8a90987d4785fd1accfe69c125567be39 |
||||
|
||||
Since fs->group_desc_count is the number of block groups, the number |
||||
of the last group is always one less than this count. Fix the bounds |
||||
check to reflect that. |
||||
|
||||
This flaw shouldn't have any user-visible side effects, since the |
||||
block bitmap test based on last_grp later on can handle overbig block |
||||
numbers. |
||||
|
||||
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/pass1.c | 4 ++-- |
||||
1 file changed, 2 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c |
||||
index 71b3000a..b58a0ca7 100644 |
||||
--- a/e2fsck/pass1.c |
||||
+++ b/e2fsck/pass1.c |
||||
@@ -2599,8 +2599,8 @@ static void new_table_block(e2fsck_t ctx, blk64_t first_block, dgrp_t group, |
||||
first_block = ext2fs_group_first_block2(fs, |
||||
flexbg_size * flexbg); |
||||
last_grp = group | (flexbg_size - 1); |
||||
- if (last_grp > fs->group_desc_count) |
||||
- last_grp = fs->group_desc_count; |
||||
+ if (last_grp >= fs->group_desc_count) |
||||
+ last_grp = fs->group_desc_count - 1; |
||||
last_block = ext2fs_group_last_block2(fs, last_grp); |
||||
} else |
||||
last_block = ext2fs_group_last_block2(fs, group); |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
|
||||
From 63eafe15eb224f1130d7e359db088fd620187ba6 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Tue, 12 Dec 2017 21:46:36 -0500 |
||||
Subject: [PATCH 11/16] e2fsck: fix potential Floating Point Exception in |
||||
show_stats() |
||||
|
||||
commit 53600d306dbb0eb901a04d76a4a97f45777d39c8 |
||||
|
||||
If the free inodes count in the superblock is equal to the inodes |
||||
count in the superblock (which is not possible with a valid file |
||||
system and will be fixed by e2fsck unless it is prevented by, for |
||||
example, e2fsck -n), it is possible for e2fsck to crash due to a |
||||
divide by zero error. |
||||
|
||||
Fix this potential bug. |
||||
|
||||
Addresses-Debian-Bug: #879220 |
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/unix.c | 20 +++++++++++--------- |
||||
1 file changed, 11 insertions(+), 9 deletions(-) |
||||
|
||||
diff --git a/e2fsck/unix.c b/e2fsck/unix.c |
||||
index a434f1e6..84b9a454 100644 |
||||
--- a/e2fsck/unix.c |
||||
+++ b/e2fsck/unix.c |
||||
@@ -103,7 +103,7 @@ static void show_stats(e2fsck_t ctx) |
||||
unsigned int dir_links; |
||||
unsigned int num_files, num_links; |
||||
__u32 *mask, m; |
||||
- int frag_percent_file, frag_percent_dir, frag_percent_total; |
||||
+ int frag_percent_file = 0, frag_percent_dir = 0, frag_percent_total = 0; |
||||
int i, j, printed = 0; |
||||
|
||||
dir_links = 2 * ctx->fs_directory_count - 1; |
||||
@@ -116,16 +116,18 @@ static void show_stats(e2fsck_t ctx) |
||||
blocks_used = (ext2fs_blocks_count(fs->super) - |
||||
ext2fs_free_blocks_count(fs->super)); |
||||
|
||||
- frag_percent_file = (10000 * ctx->fs_fragmented) / inodes_used; |
||||
- frag_percent_file = (frag_percent_file + 5) / 10; |
||||
+ if (inodes_used > 0) { |
||||
+ frag_percent_file = (10000 * ctx->fs_fragmented) / inodes_used; |
||||
+ frag_percent_file = (frag_percent_file + 5) / 10; |
||||
|
||||
- frag_percent_dir = (10000 * ctx->fs_fragmented_dir) / inodes_used; |
||||
- frag_percent_dir = (frag_percent_dir + 5) / 10; |
||||
+ frag_percent_dir = (10000 * ctx->fs_fragmented_dir) / inodes_used; |
||||
+ frag_percent_dir = (frag_percent_dir + 5) / 10; |
||||
|
||||
- frag_percent_total = ((10000 * (ctx->fs_fragmented + |
||||
- ctx->fs_fragmented_dir)) |
||||
- / inodes_used); |
||||
- frag_percent_total = (frag_percent_total + 5) / 10; |
||||
+ frag_percent_total = ((10000 * (ctx->fs_fragmented + |
||||
+ ctx->fs_fragmented_dir)) |
||||
+ / inodes_used); |
||||
+ frag_percent_total = (frag_percent_total + 5) / 10; |
||||
+ } |
||||
|
||||
if (!verbose) { |
||||
log_out(ctx, _("%s: %u/%u files (%0d.%d%% non-contiguous), " |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,64 @@
@@ -0,0 +1,64 @@
|
||||
From 775ecc1dd6624fe9bb4c4769cbd4d2cf7f49ca64 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sat, 26 Apr 2014 23:14:47 -0400 |
||||
Subject: [PATCH 16/16] e2fsck: if any problems are fixed in pass 0, check the |
||||
whole file system |
||||
|
||||
commit 7664c7538a11ca03d569008e6c999d525b6ea8ed |
||||
|
||||
If there are any PREEN_OK problems fixed in check_super_block(), don't |
||||
skip checking the full file system. |
||||
|
||||
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
||||
--- |
||||
e2fsck/e2fsck.h | 3 ++- |
||||
e2fsck/problem.c | 3 +++ |
||||
e2fsck/unix.c | 3 +++ |
||||
3 files changed, 8 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h |
||||
index 913a596a..8fc99932 100644 |
||||
--- a/e2fsck/e2fsck.h |
||||
+++ b/e2fsck/e2fsck.h |
||||
@@ -189,8 +189,9 @@ struct resource_track { |
||||
#define E2F_FLAG_GOT_DEVSIZE 0x0800 /* Device size has been fetched */ |
||||
#define E2F_FLAG_EXITING 0x1000 /* E2fsck exiting due to errors */ |
||||
#define E2F_FLAG_TIME_INSANE 0x2000 /* Time is insane */ |
||||
+#define E2F_FLAG_PROBLEMS_FIXED 0x4000 /* At least one problem was fixed */ |
||||
|
||||
-#define E2F_RESET_FLAGS (E2F_FLAG_TIME_INSANE) |
||||
+#define E2F_RESET_FLAGS (E2F_FLAG_TIME_INSANE | E2F_FLAG_PROBLEMS_FIXED) |
||||
|
||||
/* |
||||
* Defines for indicating the e2fsck pass number |
||||
diff --git a/e2fsck/problem.c b/e2fsck/problem.c |
||||
index 1aac7851..c3ba631b 100644 |
||||
--- a/e2fsck/problem.c |
||||
+++ b/e2fsck/problem.c |
||||
@@ -1976,6 +1976,9 @@ int fix_problem(e2fsck_t ctx, problem_t code, struct problem_context *pctx) |
||||
if (ptr->flags & PR_AFTER_CODE) |
||||
answer = fix_problem(ctx, ptr->second_code, pctx); |
||||
|
||||
+ if (answer && (ptr->prompt != PROMPT_NONE)) |
||||
+ ctx->flags |= E2F_FLAG_PROBLEMS_FIXED; |
||||
+ |
||||
return answer; |
||||
} |
||||
|
||||
diff --git a/e2fsck/unix.c b/e2fsck/unix.c |
||||
index bbf65d90..813fb8c5 100644 |
||||
--- a/e2fsck/unix.c |
||||
+++ b/e2fsck/unix.c |
||||
@@ -339,6 +339,9 @@ static void check_if_skip(e2fsck_t ctx) |
||||
int broken_system_clock; |
||||
time_t lastcheck; |
||||
|
||||
+ if (ctx->flags & E2F_FLAG_PROBLEMS_FIXED) |
||||
+ return; |
||||
+ |
||||
profile_get_boolean(ctx->profile, "options", "broken_system_clock", |
||||
0, 0, &broken_system_clock); |
||||
if (ctx->flags & E2F_FLAG_TIME_INSANE) |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
From e9d972c483d98b6b6fc9251166a1f5c2ca37ac5e Mon Sep 17 00:00:00 2001 |
||||
From: Lukas Czerner <lczerner@redhat.com> |
||||
Date: Wed, 8 Aug 2018 13:52:56 +0200 |
||||
Subject: [PATCH 06/16] e2fsck: remove resize inode if both resize_inode and |
||||
meta_bg are enabled |
||||
|
||||
commit 74848259f0dd42bd478f0541c94f31ccd68eac3c |
||||
|
||||
Previous e2fsprogs versions allowed to create a file system with both |
||||
resize_inode and meta_bg enabled. This was fixed by upstream commit |
||||
42e77d5d ("libext2fs: don't create filesystems with meta_bg and resize_inode") |
||||
|
||||
However e2fsck still does not recognize the conflict and will attempt to |
||||
clear and recreate resize_inode if it's corrupted due to this incompatible |
||||
feature combination, though it will create it in the same wrong layout. |
||||
|
||||
Fix it by teaching e2fsck to recognize resize_inode and meta_bg |
||||
conflict and fixing it by disabling and clearing resize inode. |
||||
|
||||
Signed-off-by: Lukas Czerner <lczerner@redhat.com> |
||||
Reviewed-by: Andreas Dilger <adilger@dilger.ca> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/problem.c | 6 ++++++ |
||||
e2fsck/problem.h | 3 +++ |
||||
e2fsck/super.c | 8 ++++++++ |
||||
3 files changed, 17 insertions(+) |
||||
|
||||
diff --git a/e2fsck/problem.c b/e2fsck/problem.c |
||||
index 83584a08..a01b2560 100644 |
||||
--- a/e2fsck/problem.c |
||||
+++ b/e2fsck/problem.c |
||||
@@ -438,6 +438,12 @@ static struct e2fsck_problem problem_table[] = { |
||||
N_("@S 64bit filesystems needs extents to access the whole disk. "), |
||||
PROMPT_FIX, PR_PREEN_OK | PR_NO_OK}, |
||||
|
||||
+ /* Meta_bg and resize_inode are not compatible, disable resize_inode*/ |
||||
+ { PR_0_DISABLE_RESIZE_INODE, |
||||
+ N_("Resize_@i and meta_bg features are enabled. Those features are\n" |
||||
+ "not compatible. Resize @i should be disabled. "), |
||||
+ PROMPT_FIX, 0 }, |
||||
+ |
||||
/* Pass 1 errors */ |
||||
|
||||
/* Pass 1: Checking inodes, blocks, and sizes */ |
||||
diff --git a/e2fsck/problem.h b/e2fsck/problem.h |
||||
index 6cb09cfb..cf2df8ce 100644 |
||||
--- a/e2fsck/problem.h |
||||
+++ b/e2fsck/problem.h |
||||
@@ -252,6 +252,9 @@ struct problem_context { |
||||
/* 64bit is set but extents are not set. */ |
||||
#define PR_0_64BIT_WITHOUT_EXTENTS 0x000048 |
||||
|
||||
+/* Meta_bg and resize_inode are not compatible, remove resize_inode*/ |
||||
+#define PR_0_DISABLE_RESIZE_INODE 0x000051 |
||||
+ |
||||
/* |
||||
* Pass 1 errors |
||||
*/ |
||||
diff --git a/e2fsck/super.c b/e2fsck/super.c |
||||
index a6be3c69..7e2c2e4f 100644 |
||||
--- a/e2fsck/super.c |
||||
+++ b/e2fsck/super.c |
||||
@@ -326,6 +326,14 @@ void check_resize_inode(e2fsck_t ctx) |
||||
|
||||
clear_problem_context(&pctx); |
||||
|
||||
+ if (fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE && |
||||
+ fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG && |
||||
+ fix_problem(ctx, PR_0_DISABLE_RESIZE_INODE, &pctx)) { |
||||
+ fs->super->s_feature_compat &= ~EXT2_FEATURE_COMPAT_RESIZE_INODE; |
||||
+ fs->super->s_reserved_gdt_blocks = 0; |
||||
+ ext2fs_mark_super_dirty(fs); |
||||
+ } |
||||
+ |
||||
/* |
||||
* If the resize inode feature isn't set, then |
||||
* s_reserved_gdt_blocks must be zero. |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,101 @@
@@ -0,0 +1,101 @@
|
||||
From 458939e5d9441448f87d3a6d45c84e041ee14786 Mon Sep 17 00:00:00 2001 |
||||
From: Andreas Dilger <adilger@dilger.ca> |
||||
Date: Fri, 22 Jun 2018 18:08:54 -0400 |
||||
Subject: [PATCH 2/2] e2fsck: set dir_nlink feature if large dir exists |
||||
|
||||
commit 1a8015773a9316ee90f713c275fb3a38731735e4 |
||||
|
||||
If there is a directory with more than EXT2_LINK_MAX (65000) |
||||
subdirectories, but the DIR_NLINK feature is not set in the |
||||
superblock, the feature should be set before continuing on |
||||
to change the on-disk directory link count to 1. |
||||
|
||||
While most filesystems should have DIR_NLINK set (it was set |
||||
by default for all ext4 filesystems, and all kernels between |
||||
2.6.23 and 4.12 automatically set it if the directory link |
||||
count grew too large), it is possible that this flag is lost |
||||
due to disk corruption or for an upgraded filesystem. We no |
||||
longer want kernels to automatically enable features. |
||||
|
||||
Addresses: https://bugzilla.kernel.org/show_bug.cgi?id=196405 |
||||
Signed-off-by: Andreas Dilger <adilger@dilger.ca> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/pass4.c | 14 +++++++++++++- |
||||
e2fsck/problem.c | 5 +++++ |
||||
e2fsck/problem.h | 3 +++ |
||||
3 files changed, 21 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/e2fsck/pass4.c b/e2fsck/pass4.c |
||||
index 21d93f0c..ad95227c 100644 |
||||
--- a/e2fsck/pass4.c |
||||
+++ b/e2fsck/pass4.c |
||||
@@ -98,6 +98,7 @@ void e2fsck_pass4(e2fsck_t ctx) |
||||
#endif |
||||
struct problem_context pctx; |
||||
__u16 link_count, link_counted; |
||||
+ int dir_nlink_fs; |
||||
char *buf = 0; |
||||
dgrp_t group, maxgroup; |
||||
|
||||
@@ -112,6 +113,9 @@ void e2fsck_pass4(e2fsck_t ctx) |
||||
if (!(ctx->options & E2F_OPT_PREEN)) |
||||
fix_problem(ctx, PR_4_PASS_HEADER, &pctx); |
||||
|
||||
+ dir_nlink_fs = EXT2_HAS_RO_COMPAT_FEATURE(fs->super, |
||||
+ EXT4_FEATURE_RO_COMPAT_DIR_NLINK); |
||||
+ |
||||
group = 0; |
||||
maxgroup = fs->group_desc_count; |
||||
if (ctx->progress) |
||||
@@ -158,8 +162,16 @@ void e2fsck_pass4(e2fsck_t ctx) |
||||
&link_counted); |
||||
} |
||||
isdir = ext2fs_test_inode_bitmap2(ctx->inode_dir_map, i); |
||||
- if (isdir && (link_counted > EXT2_LINK_MAX)) |
||||
+ if (isdir && (link_counted > EXT2_LINK_MAX)) { |
||||
+ if (!dir_nlink_fs && |
||||
+ fix_problem(ctx, PR_4_DIR_NLINK_FEATURE, &pctx)) { |
||||
+ fs->super->s_feature_ro_compat |= |
||||
+ EXT4_FEATURE_RO_COMPAT_DIR_NLINK; |
||||
+ ext2fs_mark_super_dirty(fs); |
||||
+ dir_nlink_fs = 1; |
||||
+ } |
||||
link_counted = 1; |
||||
+ } |
||||
if (link_counted != link_count) { |
||||
e2fsck_read_inode(ctx, i, inode, "pass4"); |
||||
pctx.ino = i; |
||||
diff --git a/e2fsck/problem.c b/e2fsck/problem.c |
||||
index c3ba631b..0210ff8f 100644 |
||||
--- a/e2fsck/problem.c |
||||
+++ b/e2fsck/problem.c |
||||
@@ -1576,6 +1576,11 @@ static struct e2fsck_problem problem_table[] = { |
||||
"They @s the same!\n"), |
||||
PROMPT_NONE, 0 }, |
||||
|
||||
+ /* directory exceeds max links, but no DIR_NLINK feature in superblock*/ |
||||
+ { PR_4_DIR_NLINK_FEATURE, |
||||
+ N_("@d exceeds max links, but no DIR_NLINK feature in @S.\n"), |
||||
+ PROMPT_FIX, 0 }, |
||||
+ |
||||
/* Pass 5 errors */ |
||||
|
||||
/* Pass 5: Checking group summary information */ |
||||
diff --git a/e2fsck/problem.h b/e2fsck/problem.h |
||||
index cf2df8ce..5712de59 100644 |
||||
--- a/e2fsck/problem.h |
||||
+++ b/e2fsck/problem.h |
||||
@@ -1040,6 +1040,9 @@ struct problem_context { |
||||
/* Update quota information if it is inconsistent */ |
||||
#define PR_6_UPDATE_QUOTAS 0x060002 |
||||
|
||||
+/* directory exceeds max links, but no DIR_NLINK feature in superblock */ |
||||
+#define PR_4_DIR_NLINK_FEATURE 0x040006 |
||||
+ |
||||
/* |
||||
* Function declarations |
||||
*/ |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,439 @@
@@ -0,0 +1,439 @@
|
||||
From 868d26ab9b54545a67150ba59a5aa9d47cb4e2d8 Mon Sep 17 00:00:00 2001 |
||||
From: Lukas Czerner <lczerner@redhat.com> |
||||
Date: Thu, 20 Feb 2014 16:02:29 +0100 |
||||
Subject: [PATCH 01/16] e2fsprogs: introduce ext2fs_close_free() helper |
||||
|
||||
commit 47fee2ef6a23ae06f680336ffde57caa64604a4c |
||||
|
||||
Currently there are many uses of ext2fs_close() which might be wrong. |
||||
First of all ext2fs_close() does not set the ext2_filsys pointer to NULL |
||||
so the caller is responsible for clearing it, however there are some |
||||
cases there we do not do it. |
||||
|
||||
Second of all very small number of users of ext2fs_close() actually |
||||
check the return value. If there is a problem in ext2fs_close() it will |
||||
not even free the ext2_filsys structure, but majority of users expect it |
||||
to do so. |
||||
|
||||
To fix both problems this commit introduces a new helper |
||||
ext2fs_close_free() which will not only check for the return value and |
||||
free the ext2_filsys structure if the call to ext2fs_close2() failed, |
||||
but it will also set the ext2_filsys pointer to NULL. |
||||
|
||||
Replace every use of ext2fs_close() in e2fsprogs tools with |
||||
ext2fs_close_free() - there is no real reason to keep using |
||||
ext2fs_close(). |
||||
|
||||
Signed-off-by: Lukas Czerner <lczerner@redhat.com> |
||||
--- |
||||
debugfs/debugfs.c | 6 ++---- |
||||
e2fsck/scantest.c | 2 +- |
||||
e2fsck/unix.c | 20 ++++++++------------ |
||||
e2fsck/util.c | 2 +- |
||||
lib/ext2fs/closefs.c | 12 ++++++++++++ |
||||
lib/ext2fs/ext2fs.h | 1 + |
||||
lib/ext2fs/mkjournal.c | 2 +- |
||||
lib/ext2fs/tst_bitmaps.c | 12 ++++-------- |
||||
misc/dumpe2fs.c | 6 +++--- |
||||
misc/e2freefrag.c | 2 +- |
||||
misc/e2image.c | 4 ++-- |
||||
misc/e4defrag.c | 2 +- |
||||
misc/mke2fs.c | 8 ++++---- |
||||
misc/tune2fs.c | 6 +++--- |
||||
resize/main.c | 2 +- |
||||
resize/resize2fs.c | 2 +- |
||||
16 files changed, 46 insertions(+), 43 deletions(-) |
||||
|
||||
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c |
||||
index cf7670bc..2082309b 100644 |
||||
--- a/debugfs/debugfs.c |
||||
+++ b/debugfs/debugfs.c |
||||
@@ -131,10 +131,9 @@ static void open_filesystem(char *device, int open_flags, blk64_t superblock, |
||||
return; |
||||
|
||||
errout: |
||||
- retval = ext2fs_close(current_fs); |
||||
+ retval = ext2fs_close_free(¤t_fs); |
||||
if (retval) |
||||
com_err(device, retval, "while trying to close filesystem"); |
||||
- current_fs = NULL; |
||||
} |
||||
|
||||
void do_open_filesys(int argc, char **argv) |
||||
@@ -237,10 +236,9 @@ static void close_filesystem(NOARGS) |
||||
if (retval) |
||||
com_err("ext2fs_write_block_bitmap", retval, 0); |
||||
} |
||||
- retval = ext2fs_close(current_fs); |
||||
+ retval = ext2fs_close_free(¤t_fs); |
||||
if (retval) |
||||
com_err("ext2fs_close", retval, 0); |
||||
- current_fs = NULL; |
||||
return; |
||||
} |
||||
|
||||
diff --git a/e2fsck/scantest.c b/e2fsck/scantest.c |
||||
index 16380b31..61311410 100644 |
||||
--- a/e2fsck/scantest.c |
||||
+++ b/e2fsck/scantest.c |
||||
@@ -133,7 +133,7 @@ int main (int argc, char *argv[]) |
||||
} |
||||
|
||||
|
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
|
||||
print_resource_track(&global_rtrack); |
||||
|
||||
diff --git a/e2fsck/unix.c b/e2fsck/unix.c |
||||
index d94d5dcd..5fcc9d99 100644 |
||||
--- a/e2fsck/unix.c |
||||
+++ b/e2fsck/unix.c |
||||
@@ -456,8 +456,7 @@ static void check_if_skip(e2fsck_t ctx) |
||||
} |
||||
log_out(ctx, "\n"); |
||||
skip: |
||||
- ext2fs_close(fs); |
||||
- ctx->fs = NULL; |
||||
+ ext2fs_close_free(&fs); |
||||
e2fsck_free_context(ctx); |
||||
exit(FSCK_OK); |
||||
} |
||||
@@ -1303,12 +1302,12 @@ restart: |
||||
orig_superblock = ctx->superblock; |
||||
get_backup_sb(ctx, fs, ctx->filesystem_name, io_ptr); |
||||
if (fs) |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
orig_retval = retval; |
||||
retval = try_open_fs(ctx, flags, io_ptr, &fs); |
||||
if ((orig_retval == 0) && retval != 0) { |
||||
if (fs) |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
log_out(ctx, _("%s: %s while using the " |
||||
"backup blocks"), |
||||
ctx->program_name, |
||||
@@ -1402,7 +1401,7 @@ failure: |
||||
* reopen the filesystem after we get the device size. |
||||
*/ |
||||
if (pctx.errcode == EBUSY) { |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
need_restart++; |
||||
pctx.errcode = |
||||
ext2fs_get_device_size2(ctx->filesystem_name, |
||||
@@ -1459,8 +1458,7 @@ failure: |
||||
/* |
||||
* Restart in order to reopen fs but this time start mmp. |
||||
*/ |
||||
- ext2fs_close(fs); |
||||
- ctx->fs = NULL; |
||||
+ ext2fs_close_free(&fs); |
||||
flags &= ~EXT2_FLAG_SKIP_MMP; |
||||
goto restart; |
||||
} |
||||
@@ -1510,8 +1508,7 @@ failure: |
||||
ctx->device_name); |
||||
fatal_error(ctx, 0); |
||||
} |
||||
- ext2fs_close(ctx->fs); |
||||
- ctx->fs = 0; |
||||
+ ext2fs_close_free(&ctx->fs); |
||||
ctx->flags |= E2F_FLAG_RESTARTED; |
||||
goto restart; |
||||
} |
||||
@@ -1690,7 +1687,7 @@ no_journal: |
||||
_("while resetting context")); |
||||
fatal_error(ctx, 0); |
||||
} |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
goto restart; |
||||
} |
||||
if (run_result & E2F_FLAG_CANCEL) { |
||||
@@ -1772,8 +1769,7 @@ no_journal: |
||||
io_channel_flush(ctx->fs->io); |
||||
print_resource_track(ctx, NULL, &ctx->global_rtrack, ctx->fs->io); |
||||
|
||||
- ext2fs_close(fs); |
||||
- ctx->fs = NULL; |
||||
+ ext2fs_close_free(&fs); |
||||
free(ctx->journal_name); |
||||
|
||||
e2fsck_free_context(ctx); |
||||
diff --git a/e2fsck/util.c b/e2fsck/util.c |
||||
index 9f920b2c..14c9ad48 100644 |
||||
--- a/e2fsck/util.c |
||||
+++ b/e2fsck/util.c |
||||
@@ -319,7 +319,7 @@ void preenhalt(e2fsck_t ctx) |
||||
if (fs != NULL) { |
||||
fs->super->s_state |= EXT2_ERROR_FS; |
||||
ext2fs_mark_super_dirty(fs); |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
} |
||||
exit(FSCK_UNCORRECTED); |
||||
} |
||||
diff --git a/lib/ext2fs/closefs.c b/lib/ext2fs/closefs.c |
||||
index 000ebd87..4db9e194 100644 |
||||
--- a/lib/ext2fs/closefs.c |
||||
+++ b/lib/ext2fs/closefs.c |
||||
@@ -437,6 +437,18 @@ errout: |
||||
return retval; |
||||
} |
||||
|
||||
+errcode_t ext2fs_close_free(ext2_filsys *fs_ptr) |
||||
+{ |
||||
+ errcode_t ret; |
||||
+ ext2_filsys fs = *fs_ptr; |
||||
+ |
||||
+ ret = ext2fs_close2(fs, 0); |
||||
+ if (ret) |
||||
+ ext2fs_free(fs); |
||||
+ *fs_ptr = NULL; |
||||
+ return ret; |
||||
+} |
||||
+ |
||||
errcode_t ext2fs_close(ext2_filsys fs) |
||||
{ |
||||
return ext2fs_close2(fs, 0); |
||||
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h |
||||
index 380608b2..643b66c0 100644 |
||||
--- a/lib/ext2fs/ext2fs.h |
||||
+++ b/lib/ext2fs/ext2fs.h |
||||
@@ -925,6 +925,7 @@ extern errcode_t ext2fs_check_desc(ext2_filsys fs); |
||||
/* closefs.c */ |
||||
extern errcode_t ext2fs_close(ext2_filsys fs); |
||||
extern errcode_t ext2fs_close2(ext2_filsys fs, int flags); |
||||
+extern errcode_t ext2fs_close_free(ext2_filsys *fs); |
||||
extern errcode_t ext2fs_flush(ext2_filsys fs); |
||||
extern errcode_t ext2fs_flush2(ext2_filsys fs, int flags); |
||||
extern int ext2fs_bg_has_super(ext2_filsys fs, dgrp_t group_block); |
||||
diff --git a/lib/ext2fs/mkjournal.c b/lib/ext2fs/mkjournal.c |
||||
index d09c4589..52dc99be 100644 |
||||
--- a/lib/ext2fs/mkjournal.c |
||||
+++ b/lib/ext2fs/mkjournal.c |
||||
@@ -630,7 +630,7 @@ main(int argc, char **argv) |
||||
if (retval) { |
||||
printf("Warning, had trouble writing out superblocks.\n"); |
||||
} |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
exit(0); |
||||
|
||||
} |
||||
diff --git a/lib/ext2fs/tst_bitmaps.c b/lib/ext2fs/tst_bitmaps.c |
||||
index 57bfd6c8..3a6d1bdc 100644 |
||||
--- a/lib/ext2fs/tst_bitmaps.c |
||||
+++ b/lib/ext2fs/tst_bitmaps.c |
||||
@@ -187,8 +187,7 @@ static void setup_filesystem(const char *name, |
||||
return; |
||||
|
||||
errout: |
||||
- ext2fs_close(test_fs); |
||||
- test_fs = 0; |
||||
+ ext2fs_close_free(&test_fs); |
||||
} |
||||
|
||||
void setup_cmd(int argc, char **argv) |
||||
@@ -199,10 +198,8 @@ void setup_cmd(int argc, char **argv) |
||||
unsigned int type = EXT2FS_BMAP64_BITARRAY; |
||||
int flags = EXT2_FLAG_64BITS; |
||||
|
||||
- if (test_fs) { |
||||
- ext2fs_close(test_fs); |
||||
- test_fs = 0; |
||||
- } |
||||
+ if (test_fs) |
||||
+ ext2fs_close_free(&test_fs); |
||||
|
||||
reset_getopt(); |
||||
while ((c = getopt(argc, argv, "b:i:lt:")) != EOF) { |
||||
@@ -242,8 +239,7 @@ void close_cmd(int argc, char **argv) |
||||
if (check_fs_open(argv[0])) |
||||
return; |
||||
|
||||
- ext2fs_close(test_fs); |
||||
- test_fs = 0; |
||||
+ ext2fs_close_free(&test_fs); |
||||
} |
||||
|
||||
|
||||
diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c |
||||
index d4bde8e5..cc18ad83 100644 |
||||
--- a/misc/dumpe2fs.c |
||||
+++ b/misc/dumpe2fs.c |
||||
@@ -614,7 +614,7 @@ int main (int argc, char ** argv) |
||||
if (fs->super->s_feature_incompat & |
||||
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { |
||||
print_journal_information(fs); |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
exit(0); |
||||
} |
||||
if ((fs->super->s_feature_compat & |
||||
@@ -623,7 +623,7 @@ int main (int argc, char ** argv) |
||||
print_inline_journal_information(fs); |
||||
list_bad_blocks(fs, 0); |
||||
if (header_only) { |
||||
- ext2fs_close (fs); |
||||
+ ext2fs_close_free(&fs); |
||||
exit (0); |
||||
} |
||||
retval = ext2fs_read_bitmaps (fs); |
||||
@@ -634,7 +634,7 @@ int main (int argc, char ** argv) |
||||
error_message(retval)); |
||||
} |
||||
} |
||||
- ext2fs_close (fs); |
||||
+ ext2fs_close_free(&fs); |
||||
remove_error_table(&et_ext2_error_table); |
||||
exit (0); |
||||
} |
||||
diff --git a/misc/e2freefrag.c b/misc/e2freefrag.c |
||||
index 612ca445..bb72c70d 100644 |
||||
--- a/misc/e2freefrag.c |
||||
+++ b/misc/e2freefrag.c |
||||
@@ -215,7 +215,7 @@ static errcode_t get_chunk_info(ext2_filsys fs, struct chunk_info *info, |
||||
|
||||
static void close_device(char *device_name, ext2_filsys fs) |
||||
{ |
||||
- int retval = ext2fs_close(fs); |
||||
+ int retval = ext2fs_close_free(&fs); |
||||
|
||||
if (retval) |
||||
com_err(device_name, retval, "while closing the filesystem.\n"); |
||||
diff --git a/misc/e2image.c b/misc/e2image.c |
||||
index 0537b0d8..98dafa3d 100644 |
||||
--- a/misc/e2image.c |
||||
+++ b/misc/e2image.c |
||||
@@ -1415,7 +1415,7 @@ static void install_image(char *device, char *image_fn, int type) |
||||
} |
||||
|
||||
close(fd); |
||||
- ext2fs_close (fs); |
||||
+ ext2fs_close_free(&fs); |
||||
} |
||||
|
||||
static struct ext2_qcow2_hdr *check_qcow2_image(int *fd, char *name) |
||||
@@ -1648,7 +1648,7 @@ skip_device: |
||||
else |
||||
write_image_file(fs, fd); |
||||
|
||||
- ext2fs_close (fs); |
||||
+ ext2fs_close_free(&fs); |
||||
if (check) |
||||
printf(_("%d blocks already contained the data to be copied.\n"), |
||||
skipped_blocks); |
||||
diff --git a/misc/e4defrag.c b/misc/e4defrag.c |
||||
index 1ba3c53a..2c2034cf 100644 |
||||
--- a/misc/e4defrag.c |
||||
+++ b/misc/e4defrag.c |
||||
@@ -1863,7 +1863,7 @@ int main(int argc, char *argv[]) |
||||
feature_incompat = fs->super->s_feature_incompat; |
||||
log_groups_per_flex = fs->super->s_log_groups_per_flex; |
||||
|
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
} |
||||
|
||||
switch (arg_type) { |
||||
diff --git a/misc/mke2fs.c b/misc/mke2fs.c |
||||
index 8952a5fe..2787a127 100644 |
||||
--- a/misc/mke2fs.c |
||||
+++ b/misc/mke2fs.c |
||||
@@ -1662,7 +1662,7 @@ profile_error: |
||||
printf(_("Using journal device's blocksize: %d\n"), blocksize); |
||||
fs_param.s_log_block_size = |
||||
int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE); |
||||
- ext2fs_close(jfs); |
||||
+ ext2fs_close_free(&jfs); |
||||
} |
||||
|
||||
if (optind < argc) { |
||||
@@ -2585,7 +2585,7 @@ int main (int argc, char *argv[]) |
||||
if (fs->super->s_feature_incompat & |
||||
EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { |
||||
create_journal_dev(fs); |
||||
- exit(ext2fs_close(fs) ? 1 : 0); |
||||
+ exit(ext2fs_close_free(&fs) ? 1 : 0); |
||||
} |
||||
|
||||
if (bad_blocks_filename) |
||||
@@ -2702,7 +2702,7 @@ int main (int argc, char *argv[]) |
||||
} |
||||
if (!quiet) |
||||
printf("%s", _("done\n")); |
||||
- ext2fs_close(jfs); |
||||
+ ext2fs_close_free(&jfs); |
||||
free(journal_device); |
||||
} else if ((journal_size) || |
||||
(fs_param.s_feature_compat & |
||||
@@ -2761,7 +2761,7 @@ no_journal: |
||||
"filesystem accounting information: ")); |
||||
checkinterval = fs->super->s_checkinterval; |
||||
max_mnt_count = fs->super->s_max_mnt_count; |
||||
- retval = ext2fs_close(fs); |
||||
+ retval = ext2fs_close_free(&fs); |
||||
if (retval) { |
||||
fprintf(stderr, "%s", |
||||
_("\nWarning, had trouble writing out superblocks.\n")); |
||||
diff --git a/misc/tune2fs.c b/misc/tune2fs.c |
||||
index d2aa125d..1bedca20 100644 |
||||
--- a/misc/tune2fs.c |
||||
+++ b/misc/tune2fs.c |
||||
@@ -682,7 +682,7 @@ static int add_journal(ext2_filsys fs) |
||||
fflush(stdout); |
||||
|
||||
retval = ext2fs_add_journal_device(fs, jfs); |
||||
- ext2fs_close(jfs); |
||||
+ ext2fs_close_free(&jfs); |
||||
if (retval) { |
||||
com_err(program_name, retval, |
||||
_("while adding filesystem to journal on %s"), |
||||
@@ -1987,7 +1987,7 @@ retry_open: |
||||
goto closefs; |
||||
} |
||||
if (io_ptr != io_ptr_orig) { |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
goto retry_open; |
||||
} |
||||
} |
||||
@@ -2267,5 +2267,5 @@ closefs: |
||||
exit(1); |
||||
} |
||||
|
||||
- return (ext2fs_close(fs) ? 1 : 0); |
||||
+ return (ext2fs_close_free(&fs) ? 1 : 0); |
||||
} |
||||
diff --git a/resize/main.c b/resize/main.c |
||||
index 80903b22..3951b091 100644 |
||||
--- a/resize/main.c |
||||
+++ b/resize/main.c |
||||
@@ -484,7 +484,7 @@ int main (int argc, char ** argv) |
||||
_("Please run 'e2fsck -fy %s' to fix the filesystem\n" |
||||
"after the aborted resize operation.\n"), |
||||
device_name); |
||||
- ext2fs_close(fs); |
||||
+ ext2fs_close_free(&fs); |
||||
exit(1); |
||||
} |
||||
printf(_("The filesystem on %s is now %llu blocks long.\n\n"), |
||||
diff --git a/resize/resize2fs.c b/resize/resize2fs.c |
||||
index d6fc5337..a73390de 100644 |
||||
--- a/resize/resize2fs.c |
||||
+++ b/resize/resize2fs.c |
||||
@@ -195,7 +195,7 @@ errcode_t resize_fs(ext2_filsys fs, blk64_t *new_size, int flags, |
||||
rfs->new_fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY; |
||||
|
||||
print_resource_track(rfs, &overall_track, fs->io); |
||||
- retval = ext2fs_close(rfs->new_fs); |
||||
+ retval = ext2fs_close_free(&rfs->new_fs); |
||||
if (retval) |
||||
goto errout; |
||||
|
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,31 @@
@@ -0,0 +1,31 @@
|
||||
From c7dcdc70473f524caa4d758233155df79bb1195d Mon Sep 17 00:00:00 2001 |
||||
From: Lukas Czerner <lczerner@redhat.com> |
||||
Date: Thu, 21 Jun 2018 15:19:56 +0200 |
||||
Subject: [PATCH 08/16] filefrag: don't ignore fsync errors |
||||
|
||||
commit a691f8d844faca28524b7c55780873244a070be7 |
||||
|
||||
Signed-off-by: Lukas Czerner <lczerner@redhat.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
misc/filefrag.c | 4 ++-- |
||||
1 file changed, 2 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/misc/filefrag.c b/misc/filefrag.c |
||||
index a050a226..1c16a2ef 100644 |
||||
--- a/misc/filefrag.c |
||||
+++ b/misc/filefrag.c |
||||
@@ -274,8 +274,8 @@ static int filefrag_fibmap(int fd, int blk_shift, int *num_extents, |
||||
fm_ext.fe_flags = FIEMAP_EXTENT_MERGED; |
||||
} |
||||
|
||||
- if (sync_file) |
||||
- fsync(fd); |
||||
+ if (sync_file && fsync(fd) != 0) |
||||
+ return -errno; |
||||
|
||||
for (i = 0, logical = 0, *num_extents = 0, count = last_block = 0; |
||||
i < numblocks; |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,37 @@
@@ -0,0 +1,37 @@
|
||||
From 4198ce4de86d2144ce127bba0d263a005926acf2 Mon Sep 17 00:00:00 2001 |
||||
From: "Darrick J. Wong" <darrick.wong@oracle.com> |
||||
Date: Sat, 24 Oct 2015 00:30:02 -0400 |
||||
Subject: [PATCH 03/16] libext2fs: automatically enable meta_bg to avoid |
||||
filling up BG 0 |
||||
|
||||
commit 03940aac5492879ef365b07e69105a98f4dbabf9 |
||||
|
||||
If during formatting we'd lose more than 75% a block group to group |
||||
descriptors and other metadata, enable the meta_bg feature. This |
||||
enables us to create >500T filesystems with default options. |
||||
|
||||
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
lib/ext2fs/initialize.c | 5 +++++ |
||||
1 file changed, 5 insertions(+) |
||||
|
||||
diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c |
||||
index 3548c56c..0b8355d8 100644 |
||||
--- a/lib/ext2fs/initialize.c |
||||
+++ b/lib/ext2fs/initialize.c |
||||
@@ -379,6 +379,11 @@ ipg_retry: |
||||
overhead = (int) (3 + fs->inode_blocks_per_group + |
||||
super->s_reserved_gdt_blocks); |
||||
|
||||
+ /* Enable meta_bg if we'd lose more than 3/4 of a BG to GDT blocks. */ |
||||
+ if (super->s_reserved_gdt_blocks + fs->desc_blocks > |
||||
+ super->s_blocks_per_group * 3 / 4) |
||||
+ fs->super->s_feature_incompat |= EXT2_FEATURE_INCOMPAT_META_BG; |
||||
+ |
||||
if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) |
||||
overhead++; |
||||
else |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
From 1654b25737d2a4538964b290a75e251131fbf3c0 Mon Sep 17 00:00:00 2001 |
||||
From: Jan Kara <jack@suse.cz> |
||||
Date: Tue, 19 Jun 2018 10:45:16 -0400 |
||||
Subject: [PATCH 04/16] libext2fs: don't create filesystems with meta_bg and |
||||
resize_inode |
||||
|
||||
commit 42e77d5db53e3ec09b5dc507169d15de219799e3 |
||||
|
||||
ext2fs_initialize() may end up enabling meta_bg feature for filesystem |
||||
which have resize_inode. Such combination is invalid to make sure we |
||||
disable resize_inode when enabling meta_bg. |
||||
|
||||
Reviewed-by: Andreas Dilger <adilger@dilger.ca> |
||||
Signed-off-by: Jan Kara <jack@suse.cz> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
lib/ext2fs/initialize.c | 12 +++++++----- |
||||
1 file changed, 7 insertions(+), 5 deletions(-) |
||||
|
||||
diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c |
||||
index 0b8355d8..8f0af1fb 100644 |
||||
--- a/lib/ext2fs/initialize.c |
||||
+++ b/lib/ext2fs/initialize.c |
||||
@@ -369,6 +369,13 @@ ipg_retry: |
||||
retval = EXT2_ET_RES_GDT_BLOCKS; |
||||
goto cleanup; |
||||
} |
||||
+ /* Enable meta_bg if we'd lose more than 3/4 of a BG to GDT blocks. */ |
||||
+ if (super->s_reserved_gdt_blocks + fs->desc_blocks > |
||||
+ super->s_blocks_per_group * 3 / 4) { |
||||
+ fs->super->s_feature_incompat |= EXT2_FEATURE_INCOMPAT_META_BG; |
||||
+ fs->super->s_feature_compat &= ~EXT2_FEATURE_COMPAT_RESIZE_INODE; |
||||
+ set_field(s_reserved_gdt_blocks, 0); |
||||
+ } |
||||
|
||||
/* |
||||
* Calculate the maximum number of bookkeeping blocks per |
||||
@@ -379,11 +386,6 @@ ipg_retry: |
||||
overhead = (int) (3 + fs->inode_blocks_per_group + |
||||
super->s_reserved_gdt_blocks); |
||||
|
||||
- /* Enable meta_bg if we'd lose more than 3/4 of a BG to GDT blocks. */ |
||||
- if (super->s_reserved_gdt_blocks + fs->desc_blocks > |
||||
- super->s_blocks_per_group * 3 / 4) |
||||
- fs->super->s_feature_incompat |= EXT2_FEATURE_INCOMPAT_META_BG; |
||||
- |
||||
if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) |
||||
overhead++; |
||||
else |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
From fc9ed72f64b0e6689eaed1faa33e3a333b995bf7 Mon Sep 17 00:00:00 2001 |
||||
From: Kazuya Mio <k-mio@sx.jp.nec.com> |
||||
Date: Sat, 17 Mar 2018 14:56:15 -0400 |
||||
Subject: [PATCH 05/16] libext2fs: fix ext2fs_open2() error for meta_bg image |
||||
file |
||||
|
||||
commit 8b061a641dff1a0becf645f8e6002de79b997b95 |
||||
|
||||
dumpe2fs/debugfs can examine the image file by using the -i option. |
||||
However, if meta_bg feature is enabled, dumpe2fs/debugfs cannot open |
||||
the image file. |
||||
|
||||
$ dumpe2fs -i test.img |
||||
dumpe2fs: Attempt to read block from filesystem resulted in short read while trying to open test.img |
||||
Couldn't find valid filesystem superblock. |
||||
|
||||
In case of specifying an image file, the location of block group descriptors |
||||
is the same as the case of default filesystem regardless of meta_bg feature. |
||||
So if EXT2_FLAG_IMAGE_FILE flag is set in ext2fs_open2(), |
||||
don't use the meta_bg handling. |
||||
|
||||
Signed-off-by: Kazuya Mio <k-mio@sx.jp.nec.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
lib/ext2fs/openfs.c | 3 ++- |
||||
1 file changed, 2 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c |
||||
index ba501e6a..200f7815 100644 |
||||
--- a/lib/ext2fs/openfs.c |
||||
+++ b/lib/ext2fs/openfs.c |
||||
@@ -378,7 +378,8 @@ errcode_t ext2fs_open2(const char *name, const char *io_options, |
||||
#ifdef WORDS_BIGENDIAN |
||||
groups_per_block = EXT2_DESC_PER_BLOCK(fs->super); |
||||
#endif |
||||
- if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) { |
||||
+ if ((fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) && |
||||
+ !(flags & EXT2_FLAG_IMAGE_FILE)) { |
||||
first_meta_bg = fs->super->s_first_meta_bg; |
||||
if (first_meta_bg > fs->desc_blocks) |
||||
first_meta_bg = fs->desc_blocks; |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,42 @@
@@ -0,0 +1,42 @@
|
||||
From 80f665e8365607a9885ca6a136cdeffacf9860d6 Mon Sep 17 00:00:00 2001 |
||||
From: "Darrick J. Wong" <darrick.wong@oracle.com> |
||||
Date: Sat, 24 Oct 2015 00:24:57 -0400 |
||||
Subject: [PATCH 02/16] libext2fs: fix maximum bg overhead calculation with |
||||
meta_bg enabled |
||||
|
||||
commit 1abdd04eb1d19488493022f81c03f5b80aa7fcc7 |
||||
|
||||
When meta_bg is enabled at mkfs time, we put at most one group |
||||
descriptor block in each blockgroup. Unfortunately, the calculation |
||||
of max overhead per bg doesn't know this, so mkfs fails when it isn't |
||||
strictly necessary. Fix it, since Dave reported that he couldn't |
||||
create a 500TB ext4 filesystem. |
||||
|
||||
Reported-by: Dave Chinner <david@fromorbit.com> |
||||
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
lib/ext2fs/initialize.c | 7 ++++++- |
||||
1 file changed, 6 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c |
||||
index 2db8b3c2..3548c56c 100644 |
||||
--- a/lib/ext2fs/initialize.c |
||||
+++ b/lib/ext2fs/initialize.c |
||||
@@ -377,7 +377,12 @@ ipg_retry: |
||||
* table, and the reserved gdt blocks. |
||||
*/ |
||||
overhead = (int) (3 + fs->inode_blocks_per_group + |
||||
- fs->desc_blocks + super->s_reserved_gdt_blocks); |
||||
+ super->s_reserved_gdt_blocks); |
||||
+ |
||||
+ if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) |
||||
+ overhead++; |
||||
+ else |
||||
+ overhead += fs->desc_blocks; |
||||
|
||||
/* This can only happen if the user requested too many inodes */ |
||||
if (overhead > super->s_blocks_per_group) { |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,100 @@
@@ -0,0 +1,100 @@
|
||||
From df9c49cb287a9cd79ee2589ddfa3db0bc1a9d97b Mon Sep 17 00:00:00 2001 |
||||
From: "Darrick J. Wong" <darrick.wong@oracle.com> |
||||
Date: Sat, 16 May 2015 18:32:33 -0400 |
||||
Subject: [PATCH 12/16] misc: fix Coverity bugs |
||||
|
||||
commit 63cd76d6ac3bb7f90c583f240fc75e657610f2ea |
||||
|
||||
Fix Coverity bugs 1297093, 1297096, 1297489, 1297491, 1297493, |
||||
1297506, 1297507, 1297514, 1297516, and 1297517. |
||||
|
||||
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
debugfs/util.c | 2 +- |
||||
lib/e2p/feature.c | 4 ++-- |
||||
lib/e2p/mntopts.c | 2 +- |
||||
misc/e4defrag.c | 4 +++- |
||||
misc/logsave.c | 2 +- |
||||
5 files changed, 8 insertions(+), 6 deletions(-) |
||||
|
||||
diff --git a/debugfs/util.c b/debugfs/util.c |
||||
index aafbc567..b355e5cd 100644 |
||||
--- a/debugfs/util.c |
||||
+++ b/debugfs/util.c |
||||
@@ -373,7 +373,7 @@ int common_block_args_process(int argc, char *argv[], |
||||
return 1; |
||||
if (*block == 0) { |
||||
com_err(argv[0], 0, "Invalid block number 0"); |
||||
- err = 1; |
||||
+ return 1; |
||||
} |
||||
|
||||
if (argc > 2) { |
||||
diff --git a/lib/e2p/feature.c b/lib/e2p/feature.c |
||||
index 96912638..d4f1bf1a 100644 |
||||
--- a/lib/e2p/feature.c |
||||
+++ b/lib/e2p/feature.c |
||||
@@ -177,7 +177,7 @@ int e2p_string2feature(char *string, int *compat_type, unsigned int *mask) |
||||
if (string[9] == 0) |
||||
return 1; |
||||
num = strtol(string+9, &eptr, 10); |
||||
- if (num > 32 || num < 0) |
||||
+ if (num > 31 || num < 0) |
||||
return 1; |
||||
if (*eptr) |
||||
return 1; |
||||
@@ -251,7 +251,7 @@ int e2p_jrnl_string2feature(char *string, int *compat_type, unsigned int *mask) |
||||
if (string[9] == 0) |
||||
return 1; |
||||
num = strtol(string+9, &eptr, 10); |
||||
- if (num > 32 || num < 0) |
||||
+ if (num > 31 || num < 0) |
||||
return 1; |
||||
if (*eptr) |
||||
return 1; |
||||
diff --git a/lib/e2p/mntopts.c b/lib/e2p/mntopts.c |
||||
index d56cc527..ff2e5de9 100644 |
||||
--- a/lib/e2p/mntopts.c |
||||
+++ b/lib/e2p/mntopts.c |
||||
@@ -72,7 +72,7 @@ int e2p_string2mntopt(char *string, unsigned int *mask) |
||||
if (string[8] == 0) |
||||
return 1; |
||||
num = strtol(string+8, &eptr, 10); |
||||
- if (num > 32 || num < 0) |
||||
+ if (num > 31 || num < 0) |
||||
return 1; |
||||
if (*eptr) |
||||
return 1; |
||||
diff --git a/misc/e4defrag.c b/misc/e4defrag.c |
||||
index 2c2034cf..99baeb7b 100644 |
||||
--- a/misc/e4defrag.c |
||||
+++ b/misc/e4defrag.c |
||||
@@ -440,8 +440,10 @@ static int page_in_core(int fd, struct move_extent defrag_data, |
||||
*page_num = 0; |
||||
*page_num = (length + pagesize - 1) / pagesize; |
||||
*vec = (unsigned char *)calloc(*page_num, 1); |
||||
- if (*vec == NULL) |
||||
+ if (*vec == NULL) { |
||||
+ munmap(page, length); |
||||
return -1; |
||||
+ } |
||||
|
||||
/* Get information on whether pages are in core */ |
||||
if (mincore(page, (size_t)length, *vec) == -1 || |
||||
diff --git a/misc/logsave.c b/misc/logsave.c |
||||
index 8612edfb..cd6037dd 100644 |
||||
--- a/misc/logsave.c |
||||
+++ b/misc/logsave.c |
||||
@@ -219,7 +219,7 @@ static int run_program(char **argv) |
||||
sprintf(buffer, "died with signal %d\n", |
||||
WTERMSIG(status)); |
||||
send_output(buffer, 0, SEND_BOTH); |
||||
- rc = 1; |
||||
+ return 1; |
||||
} |
||||
rc = 0; |
||||
} |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
From f7da56758e5d15416339d640f79d6eee875d22a9 Mon Sep 17 00:00:00 2001 |
||||
From: Jan Kara <jack@suse.cz> |
||||
Date: Tue, 25 Oct 2016 14:08:59 -0400 |
||||
Subject: [PATCH 09/16] mke2fs: Avoid crashes / infinite loops for absurdly |
||||
large devices |
||||
|
||||
commit 101ef2e93c253ae62320628e8958067d2d2a4e2a |
||||
|
||||
When a device reports absurdly high size, some arithmetics in mke2fs can |
||||
overflow (e.g. number of block descriptors) and we end in an infinite |
||||
loop. Fix that by checking and refusing insanely large devices. |
||||
|
||||
Signed-off-by: Jan Kara <jack@suse.cz> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
misc/mke2fs.c | 12 ++++++++++++ |
||||
1 file changed, 12 insertions(+) |
||||
|
||||
diff --git a/misc/mke2fs.c b/misc/mke2fs.c |
||||
index 2787a127..7cea0330 100644 |
||||
--- a/misc/mke2fs.c |
||||
+++ b/misc/mke2fs.c |
||||
@@ -1858,6 +1858,18 @@ profile_error: |
||||
EXT2_BLOCK_SIZE(&fs_param)); |
||||
exit(1); |
||||
} |
||||
+ /* |
||||
+ * Guard against group descriptor count overflowing... Mostly to avoid |
||||
+ * strange results for absurdly large devices. |
||||
+ */ |
||||
+ if (fs_blocks_count > ((1ULL << (fs_param.s_log_block_size + 3 + 32)) - 1)) { |
||||
+ fprintf(stderr, _("%s: Size of device (0x%llx blocks) %s " |
||||
+ "too big to create\n\t" |
||||
+ "a filesystem using a blocksize of %d.\n"), |
||||
+ program_name, fs_blocks_count, device_name, |
||||
+ EXT2_BLOCK_SIZE(&fs_param)); |
||||
+ exit(1); |
||||
+ } |
||||
|
||||
ext2fs_blocks_count_set(&fs_param, fs_blocks_count); |
||||
|
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
From e8e0b3e9e8318064e38e4be108bc625f9258fb45 Mon Sep 17 00:00:00 2001 |
||||
From: Lukas Czerner <lczerner@redhat.com> |
||||
Date: Thu, 19 Jul 2018 10:39:38 +0200 |
||||
Subject: [PATCH 07/16] resize2fs: Remove the real kilobytes rant from man page |
||||
|
||||
commit 94f20cd51522dd718bc4a459ea65d72a722d1874 |
||||
|
||||
Remove the rant about the "real" kilobytes from the man page and just |
||||
make it more clear that the suffixed units are representing power-of-two |
||||
units as we do in mke2fs man page. Also add terabytes to the list. |
||||
|
||||
Signed-off-by: Lukas Czerner <lczerner@redhat.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
resize/resize2fs.8.in | 16 ++++------------ |
||||
1 file changed, 4 insertions(+), 12 deletions(-) |
||||
|
||||
diff --git a/resize/resize2fs.8.in b/resize/resize2fs.8.in |
||||
index a1f3099b..78cb1212 100644 |
||||
--- a/resize/resize2fs.8.in |
||||
+++ b/resize/resize2fs.8.in |
||||
@@ -41,24 +41,16 @@ If no units are specified, the units of the |
||||
parameter shall be the filesystem blocksize of the filesystem. |
||||
Optionally, the |
||||
.I size |
||||
-parameter may be suffixed by one of the following the units |
||||
-designators: 's', 'K', 'M', or 'G', |
||||
-for 512 byte sectors, kilobytes, megabytes, or gigabytes, respectively. |
||||
-The |
||||
+parameter may be suffixed by one of the following units |
||||
+designators: 'K', 'M', 'G', 'T' (either upper-case or lower-case) or 's' |
||||
+for power-of-two kilobytes, megabytes, gigabytes, terabytes or 512 byte |
||||
+sectors respectively. The |
||||
.I size |
||||
of the filesystem may never be larger than the size of the partition. |
||||
If |
||||
.I size |
||||
parameter is not specified, it will default to the size of the partition. |
||||
.PP |
||||
-Note: when kilobytes is used above, I mean |
||||
-.IR real , |
||||
-power-of-2 kilobytes, (i.e., 1024 bytes), which some politically correct |
||||
-folks insist should be the stupid-sounding ``kibibytes''. The same |
||||
-holds true for megabytes, also sometimes known as ``mebibytes'', or |
||||
-gigabytes, as the amazingly silly ``gibibytes''. Makes you want to |
||||
-gibber, doesn't it? |
||||
-.PP |
||||
The |
||||
.B resize2fs |
||||
program does not manipulate the size of partitions. If you wish to enlarge |
||||
-- |
||||
2.20.1 |
||||
|
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
From beed1a9f0e8357de209c2c1418ca7db5d18a14f4 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Wed, 9 Sep 2015 10:53:49 -0400 |
||||
Subject: [PATCH 5/7] Fix typo in the ext4(5) man page |
||||
|
||||
Addresses-Debian-Bug: #798425 |
||||
|
||||
RHBZ: 1720130 |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
misc/ext4.5.in | 2 +- |
||||
1 file changed, 1 insertion(+), 1 deletion(-) |
||||
|
||||
diff --git a/misc/ext4.5.in b/misc/ext4.5.in |
||||
index 366916d8..b73046ca 100644 |
||||
--- a/misc/ext4.5.in |
||||
+++ b/misc/ext4.5.in |
||||
@@ -6,7 +6,7 @@ |
||||
.SH NAME |
||||
ext2 \- the second extended file system |
||||
.br |
||||
-ext2 \- the third extended file system |
||||
+ext3 \- the third extended file system |
||||
.br |
||||
ext4 \- the fourth extended file system |
||||
.SH DESCRIPTION |
||||
-- |
||||
2.21.1 |
||||
|
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
From bd2ce466bd00d2fcdbc5154754fc4711f3348a18 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Thu, 19 Dec 2019 19:37:34 -0500 |
||||
Subject: [PATCH 1/7] e2fsck: abort if there is a corrupted directory block |
||||
when rehashing |
||||
|
||||
In e2fsck pass 3a, when we are rehashing directories, at least in |
||||
theory, all of the directories should have had corruptions with |
||||
respect to directory entry structure fixed. However, it's possible |
||||
(for example, if the user declined a fix) that we can reach this stage |
||||
of processing with a corrupted directory entries. |
||||
|
||||
So check for that case and don't try to process a corrupted directory |
||||
block so we don't run into trouble in mutate_name() if there is a |
||||
zero-length file name. |
||||
|
||||
RHBZ: 1797731 |
||||
Addresses: TALOS-2019-0973 |
||||
Addresses: CVE-2019-5188 |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/rehash.c | 9 +++++++++ |
||||
1 file changed, 9 insertions(+) |
||||
|
||||
diff --git a/e2fsck/rehash.c b/e2fsck/rehash.c |
||||
index 3aafbb12..fbc4e558 100644 |
||||
--- a/e2fsck/rehash.c |
||||
+++ b/e2fsck/rehash.c |
||||
@@ -129,6 +129,10 @@ static int fill_dir_block(ext2_filsys fs, |
||||
dir_offset += rec_len; |
||||
if (dirent->inode == 0) |
||||
continue; |
||||
+ if ((dirent->name_len & 0xFF) == 0) { |
||||
+ fd->err = EXT2_ET_DIR_CORRUPTED; |
||||
+ return BLOCK_ABORT; |
||||
+ } |
||||
if (!fd->compress && ((dirent->name_len&0xFF) == 1) && |
||||
(dirent->name[0] == '.')) |
||||
continue; |
||||
@@ -367,6 +371,11 @@ static int duplicate_search_and_fix(e2fsck_t ctx, ext2_filsys fs, |
||||
} |
||||
memcpy(new_name, ent->dir->name, ent->dir->name_len & 0xFF); |
||||
new_len = ent->dir->name_len; |
||||
+ if ((new_len & 0xFF) == 0) { |
||||
+ /* should never happen */ |
||||
+ ext2fs_unmark_valid(fs); |
||||
+ continue; |
||||
+ } |
||||
mutate_name(new_name, &new_len); |
||||
for (j=0; j < fd->num_array; j++) { |
||||
if ((i==j) || |
||||
-- |
||||
2.21.1 |
||||
|
@ -0,0 +1,97 @@
@@ -0,0 +1,97 @@
|
||||
From 334cc898f177771a5f1ca14c181d6df775cc55ec Mon Sep 17 00:00:00 2001 |
||||
From: Jan Kara <jack@suse.cz> |
||||
Date: Thu, 13 Feb 2020 11:15:56 +0100 |
||||
Subject: [PATCH 7/7] e2fsck: clarify overflow link count error message |
||||
|
||||
When directory link count is set to overflow value (1) but during pass 4 |
||||
we find out the exact link count would fit, we either silently fix this |
||||
(which is not great because e2fsck then reports the fs was modified but |
||||
output doesn't indicate why in any way), or we report that link count is |
||||
wrong and ask whether we should fix it (in case -n option was |
||||
specified). The second case is even more misleading because it suggests |
||||
non-trivial fs corruption which then gets silently fixed on the next |
||||
run. Similarly to how we fix up other non-problems, just create a new |
||||
error message for the case directory link count is not overflown anymore |
||||
and always report it to clarify what is going on. |
||||
|
||||
RHBZ: 1820048 |
||||
Reviewed-by: Andreas Dilger <adilger@dilger.ca> |
||||
Signed-off-by: Jan Kara <jack@suse.cz> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
(cherry picked from commit 4ebce13292f54c96f43dcb1bd1d5b8df5dc8749d) |
||||
--- |
||||
e2fsck/pass4.c | 19 +++++++++++++++---- |
||||
e2fsck/problem.c | 5 +++++ |
||||
e2fsck/problem.h | 3 +++ |
||||
3 files changed, 23 insertions(+), 4 deletions(-) |
||||
|
||||
diff --git a/e2fsck/pass4.c b/e2fsck/pass4.c |
||||
index ad95227c..c9586dfb 100644 |
||||
--- a/e2fsck/pass4.c |
||||
+++ b/e2fsck/pass4.c |
||||
@@ -173,6 +173,7 @@ void e2fsck_pass4(e2fsck_t ctx) |
||||
link_counted = 1; |
||||
} |
||||
if (link_counted != link_count) { |
||||
+ int fix_nlink = 0; |
||||
e2fsck_read_inode(ctx, i, inode, "pass4"); |
||||
pctx.ino = i; |
||||
pctx.inode = inode; |
||||
@@ -185,10 +186,20 @@ void e2fsck_pass4(e2fsck_t ctx) |
||||
pctx.num = link_counted; |
||||
/* i_link_count was previously exceeded, but no longer |
||||
* is, fix this but don't consider it an error */ |
||||
- if ((isdir && link_counted > 1 && |
||||
- (inode->i_flags & EXT2_INDEX_FL) && |
||||
- link_count == 1 && !(ctx->options & E2F_OPT_NO)) || |
||||
- fix_problem(ctx, PR_4_BAD_REF_COUNT, &pctx)) { |
||||
+ if (isdir && link_counted > 1 && |
||||
+ (inode->i_flags & EXT2_INDEX_FL) && |
||||
+ link_count == 1) { |
||||
+ if ((ctx->options & E2F_OPT_READONLY) == 0) { |
||||
+ fix_nlink = |
||||
+ fix_problem(ctx, |
||||
+ PR_4_DIR_OVERFLOW_REF_COUNT, |
||||
+ &pctx); |
||||
+ } |
||||
+ } else { |
||||
+ fix_nlink = fix_problem(ctx, PR_4_BAD_REF_COUNT, |
||||
+ &pctx); |
||||
+ } |
||||
+ if (fix_nlink) { |
||||
inode->i_links_count = link_counted; |
||||
e2fsck_write_inode(ctx, i, inode, "pass4"); |
||||
} |
||||
diff --git a/e2fsck/problem.c b/e2fsck/problem.c |
||||
index 0210ff8f..2e41bb2e 100644 |
||||
--- a/e2fsck/problem.c |
||||
+++ b/e2fsck/problem.c |
||||
@@ -1581,6 +1581,11 @@ static struct e2fsck_problem problem_table[] = { |
||||
N_("@d exceeds max links, but no DIR_NLINK feature in @S.\n"), |
||||
PROMPT_FIX, 0 }, |
||||
|
||||
+ /* Directory inode ref count set to overflow but could be exact value */ |
||||
+ { PR_4_DIR_OVERFLOW_REF_COUNT, |
||||
+ N_("@d @i %i ref count set to overflow but could be exact value %N. "), |
||||
+ PROMPT_FIX, PR_PREEN_OK, 0, 0, 0 }, |
||||
+ |
||||
/* Pass 5 errors */ |
||||
|
||||
/* Pass 5: Checking group summary information */ |
||||
diff --git a/e2fsck/problem.h b/e2fsck/problem.h |
||||
index 5712de59..a591974e 100644 |
||||
--- a/e2fsck/problem.h |
||||
+++ b/e2fsck/problem.h |
||||
@@ -948,6 +948,9 @@ struct problem_context { |
||||
/* Inconsistent inode count information cached */ |
||||
#define PR_4_INCONSISTENT_COUNT 0x040004 |
||||
|
||||
+/* Directory ref count set to overflow but it doesn't have to be */ |
||||
+#define PR_4_DIR_OVERFLOW_REF_COUNT 0x040007 |
||||
+ |
||||
/* |
||||
* Pass 5 errors |
||||
*/ |
||||
-- |
||||
2.21.1 |
||||
|
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
From 16c22d11ac511d6b228db36b62c1567e9578f290 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Thu, 19 Dec 2019 19:45:06 -0500 |
||||
Subject: [PATCH 2/7] e2fsck: don't try to rehash a deleted directory |
||||
|
||||
If directory has been deleted in pass1[bcd] processing, then we |
||||
shouldn't try to rehash the directory in pass 3a when we try to |
||||
rehash/reoptimize directories. |
||||
|
||||
RHBZ: 1797731 |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/pass1b.c | 4 ++++ |
||||
e2fsck/rehash.c | 3 +++ |
||||
2 files changed, 7 insertions(+) |
||||
|
||||
diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c |
||||
index 13bd9e98..0e6c29ef 100644 |
||||
--- a/e2fsck/pass1b.c |
||||
+++ b/e2fsck/pass1b.c |
||||
@@ -643,6 +643,10 @@ static void delete_file(e2fsck_t ctx, ext2_ino_t ino, |
||||
fix_problem(ctx, PR_1B_BLOCK_ITERATE, &pctx); |
||||
if (ctx->inode_bad_map) |
||||
ext2fs_unmark_inode_bitmap2(ctx->inode_bad_map, ino); |
||||
+ if (ctx->inode_reg_map) |
||||
+ ext2fs_unmark_inode_bitmap2(ctx->inode_reg_map, ino); |
||||
+ ext2fs_unmark_inode_bitmap2(ctx->inode_dir_map, ino); |
||||
+ ext2fs_unmark_inode_bitmap2(ctx->inode_used_map, ino); |
||||
ext2fs_inode_alloc_stats2(fs, ino, -1, LINUX_S_ISDIR(dp->inode.i_mode)); |
||||
quota_data_sub(ctx->qctx, &dp->inode, ino, |
||||
pb.dup_blocks * fs->blocksize); |
||||
diff --git a/e2fsck/rehash.c b/e2fsck/rehash.c |
||||
index fbc4e558..6f65edf3 100644 |
||||
--- a/e2fsck/rehash.c |
||||
+++ b/e2fsck/rehash.c |
||||
@@ -882,6 +882,9 @@ void e2fsck_rehash_directories(e2fsck_t ctx) |
||||
} |
||||
if (ino == ctx->lost_and_found) |
||||
continue; |
||||
+ if (!ext2fs_test_inode_bitmap2(ctx->inode_dir_map, ino)) |
||||
+ continue; |
||||
+ |
||||
pctx.dir = ino; |
||||
if (first) { |
||||
fix_problem(ctx, PR_3A_PASS_HEADER, &pctx); |
||||
-- |
||||
2.21.1 |
||||
|
@ -0,0 +1,228 @@
@@ -0,0 +1,228 @@
|
||||
From 8f575d0b2c297f09491093b9e7ba6b914639be71 Mon Sep 17 00:00:00 2001 |
||||
From: Lukas Czerner <lczerner@redhat.com> |
||||
Date: Mon, 9 Apr 2018 11:58:15 -0400 |
||||
Subject: [PATCH 4/7] e2image: fix metadata image handling on big endian |
||||
systems |
||||
|
||||
Currently e2image metadata image handling and creating is completely |
||||
broken on big endian systems. It just does not care about endianness at |
||||
all. This was uncovered With addition of i_bitmaps test, which is the |
||||
first test that actually tests e2image metadata image. |
||||
|
||||
Fix it by making sure that all on-disk metadata that we write and read |
||||
to/from the metadata image is properly converted. |
||||
|
||||
RHBZ: 1711880 |
||||
Signed-off-by: Lukas Czerner <lczerner@redhat.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
lib/ext2fs/imager.c | 41 +++++++++++++++++++++++++++++++++++++++++ |
||||
lib/ext2fs/inode.c | 2 +- |
||||
lib/ext2fs/openfs.c | 4 ++-- |
||||
lib/ext2fs/rw_bitmaps.c | 4 ++-- |
||||
misc/e2image.c | 22 +++++++++++----------- |
||||
5 files changed, 57 insertions(+), 16 deletions(-) |
||||
|
||||
diff --git a/lib/ext2fs/imager.c b/lib/ext2fs/imager.c |
||||
index b643cc6f..6caca65b 100644 |
||||
--- a/lib/ext2fs/imager.c |
||||
+++ b/lib/ext2fs/imager.c |
||||
@@ -194,6 +194,11 @@ errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, |
||||
char *buf, *cp; |
||||
ssize_t actual; |
||||
errcode_t retval; |
||||
+#ifdef WORDS_BIGENDIAN |
||||
+ unsigned int groups_per_block; |
||||
+ struct ext2_group_desc *gdp; |
||||
+ int j; |
||||
+#endif |
||||
|
||||
buf = malloc(fs->blocksize); |
||||
if (!buf) |
||||
@@ -203,7 +208,17 @@ errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, |
||||
* Write out the superblock |
||||
*/ |
||||
memset(buf, 0, fs->blocksize); |
||||
+#ifdef WORDS_BIGENDIAN |
||||
+ /* |
||||
+ * We're writing out superblock so let's convert |
||||
+ * it to little endian and then back if needed |
||||
+ */ |
||||
+ ext2fs_swap_super(fs->super); |
||||
memcpy(buf, fs->super, SUPERBLOCK_SIZE); |
||||
+ ext2fs_swap_super(fs->super); |
||||
+#else |
||||
+ memcpy(buf, fs->super, SUPERBLOCK_SIZE); |
||||
+#endif |
||||
actual = write(fd, buf, fs->blocksize); |
||||
if (actual == -1) { |
||||
retval = errno; |
||||
@@ -217,8 +232,34 @@ errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, |
||||
/* |
||||
* Now write out the block group descriptors |
||||
*/ |
||||
+ |
||||
cp = (char *) fs->group_desc; |
||||
+ |
||||
+#ifdef WORDS_BIGENDIAN |
||||
+ /* |
||||
+ * Convert group descriptors to little endian and back |
||||
+ * if needed |
||||
+ */ |
||||
+ groups_per_block = EXT2_DESC_PER_BLOCK(fs->super); |
||||
+ gdp = (struct ext2_group_desc *) cp; |
||||
+ for (j=0; j < groups_per_block*fs->desc_blocks; j++) { |
||||
+ gdp = ext2fs_group_desc(fs, fs->group_desc, j); |
||||
+ ext2fs_swap_group_desc2(fs, gdp); |
||||
+ } |
||||
+#endif |
||||
+ |
||||
actual = write(fd, cp, fs->blocksize * fs->desc_blocks); |
||||
+ |
||||
+ |
||||
+#ifdef WORDS_BIGENDIAN |
||||
+ groups_per_block = EXT2_DESC_PER_BLOCK(fs->super); |
||||
+ gdp = (struct ext2_group_desc *) cp; |
||||
+ for (j=0; j < groups_per_block*fs->desc_blocks; j++) { |
||||
+ gdp = ext2fs_group_desc(fs, fs->group_desc, j); |
||||
+ ext2fs_swap_group_desc2(fs, gdp); |
||||
+ } |
||||
+#endif |
||||
+ |
||||
if (actual == -1) { |
||||
retval = errno; |
||||
goto errout; |
||||
diff --git a/lib/ext2fs/inode.c b/lib/ext2fs/inode.c |
||||
index 573a8fa5..4297ec12 100644 |
||||
--- a/lib/ext2fs/inode.c |
||||
+++ b/lib/ext2fs/inode.c |
||||
@@ -560,7 +560,7 @@ errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino, |
||||
} |
||||
if (fs->flags & EXT2_FLAG_IMAGE_FILE) { |
||||
inodes_per_block = fs->blocksize / EXT2_INODE_SIZE(fs->super); |
||||
- block_nr = fs->image_header->offset_inode / fs->blocksize; |
||||
+ block_nr = ext2fs_le32_to_cpu(fs->image_header->offset_inode) / fs->blocksize; |
||||
block_nr += (ino - 1) / inodes_per_block; |
||||
offset = ((ino - 1) % inodes_per_block) * |
||||
EXT2_INODE_SIZE(fs->super); |
||||
diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c |
||||
index 200f7815..384dbf0f 100644 |
||||
--- a/lib/ext2fs/openfs.c |
||||
+++ b/lib/ext2fs/openfs.c |
||||
@@ -177,10 +177,10 @@ errcode_t ext2fs_open2(const char *name, const char *io_options, |
||||
fs->image_header); |
||||
if (retval) |
||||
goto cleanup; |
||||
- if (fs->image_header->magic_number != EXT2_ET_MAGIC_E2IMAGE) |
||||
+ if (ext2fs_le32_to_cpu(fs->image_header->magic_number) != EXT2_ET_MAGIC_E2IMAGE) |
||||
return EXT2_ET_MAGIC_E2IMAGE; |
||||
superblock = 1; |
||||
- block_size = fs->image_header->fs_blocksize; |
||||
+ block_size = ext2fs_le32_to_cpu(fs->image_header->fs_blocksize); |
||||
} |
||||
|
||||
/* |
||||
diff --git a/lib/ext2fs/rw_bitmaps.c b/lib/ext2fs/rw_bitmaps.c |
||||
index ad1d8c80..0e7986b0 100644 |
||||
--- a/lib/ext2fs/rw_bitmaps.c |
||||
+++ b/lib/ext2fs/rw_bitmaps.c |
||||
@@ -205,7 +205,7 @@ static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block) |
||||
ext2fs_free_mem(&buf); |
||||
|
||||
if (fs->flags & EXT2_FLAG_IMAGE_FILE) { |
||||
- blk = (fs->image_header->offset_inodemap / fs->blocksize); |
||||
+ blk = (ext2fs_le32_to_cpu(fs->image_header->offset_inodemap) / fs->blocksize); |
||||
ino_cnt = fs->super->s_inodes_count; |
||||
while (inode_nbytes > 0) { |
||||
retval = io_channel_read_blk64(fs->image_io, blk++, |
||||
@@ -223,7 +223,7 @@ static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block) |
||||
ino_cnt -= fs->blocksize << 3; |
||||
inode_nbytes -= fs->blocksize; |
||||
} |
||||
- blk = (fs->image_header->offset_blockmap / |
||||
+ blk = (ext2fs_le32_to_cpu(fs->image_header->offset_blockmap) / |
||||
fs->blocksize); |
||||
blk_cnt = EXT2_GROUPS_TO_CLUSTERS(fs->super, |
||||
fs->group_desc_count); |
||||
diff --git a/misc/e2image.c b/misc/e2image.c |
||||
index 98dafa3d..41e54636 100644 |
||||
--- a/misc/e2image.c |
||||
+++ b/misc/e2image.c |
||||
@@ -232,7 +232,7 @@ static void write_image_file(ext2_filsys fs, int fd) |
||||
write_header(fd, NULL, sizeof(struct ext2_image_hdr), fs->blocksize); |
||||
memset(&hdr, 0, sizeof(struct ext2_image_hdr)); |
||||
|
||||
- hdr.offset_super = seek_relative(fd, 0); |
||||
+ hdr.offset_super = ext2fs_cpu_to_le32(seek_relative(fd, 0)); |
||||
retval = ext2fs_image_super_write(fs, fd, 0); |
||||
if (retval) { |
||||
com_err(program_name, retval, "%s", |
||||
@@ -240,7 +240,7 @@ static void write_image_file(ext2_filsys fs, int fd) |
||||
exit(1); |
||||
} |
||||
|
||||
- hdr.offset_inode = seek_relative(fd, 0); |
||||
+ hdr.offset_inode = ext2fs_cpu_to_le32(seek_relative(fd, 0)); |
||||
retval = ext2fs_image_inode_write(fs, fd, |
||||
(fd != 1) ? IMAGER_FLAG_SPARSEWRITE : 0); |
||||
if (retval) { |
||||
@@ -249,7 +249,7 @@ static void write_image_file(ext2_filsys fs, int fd) |
||||
exit(1); |
||||
} |
||||
|
||||
- hdr.offset_blockmap = seek_relative(fd, 0); |
||||
+ hdr.offset_blockmap = ext2fs_cpu_to_le32(seek_relative(fd, 0)); |
||||
retval = ext2fs_image_bitmap_write(fs, fd, 0); |
||||
if (retval) { |
||||
com_err(program_name, retval, "%s", |
||||
@@ -257,7 +257,7 @@ static void write_image_file(ext2_filsys fs, int fd) |
||||
exit(1); |
||||
} |
||||
|
||||
- hdr.offset_inodemap = seek_relative(fd, 0); |
||||
+ hdr.offset_inodemap = ext2fs_cpu_to_le32(seek_relative(fd, 0)); |
||||
retval = ext2fs_image_bitmap_write(fs, fd, IMAGER_FLAG_INODEMAP); |
||||
if (retval) { |
||||
com_err(program_name, retval, "%s", |
||||
@@ -265,23 +265,23 @@ static void write_image_file(ext2_filsys fs, int fd) |
||||
exit(1); |
||||
} |
||||
|
||||
- hdr.magic_number = EXT2_ET_MAGIC_E2IMAGE; |
||||
+ hdr.magic_number = ext2fs_cpu_to_le32(EXT2_ET_MAGIC_E2IMAGE); |
||||
strcpy(hdr.magic_descriptor, "Ext2 Image 1.0"); |
||||
gethostname(hdr.fs_hostname, sizeof(hdr.fs_hostname)); |
||||
strncpy(hdr.fs_device_name, device_name, sizeof(hdr.fs_device_name)-1); |
||||
hdr.fs_device_name[sizeof(hdr.fs_device_name) - 1] = 0; |
||||
- hdr.fs_blocksize = fs->blocksize; |
||||
+ hdr.fs_blocksize = ext2fs_cpu_to_le32(fs->blocksize); |
||||
|
||||
if (stat(device_name, &st) == 0) |
||||
- hdr.fs_device = st.st_rdev; |
||||
+ hdr.fs_device = ext2fs_cpu_to_le32(st.st_rdev); |
||||
|
||||
if (fstat(fd, &st) == 0) { |
||||
- hdr.image_device = st.st_dev; |
||||
- hdr.image_inode = st.st_ino; |
||||
+ hdr.image_device = ext2fs_cpu_to_le32(st.st_dev); |
||||
+ hdr.image_inode = ext2fs_cpu_to_le32(st.st_ino); |
||||
} |
||||
memcpy(hdr.fs_uuid, fs->super->s_uuid, sizeof(hdr.fs_uuid)); |
||||
|
||||
- hdr.image_time = time(0); |
||||
+ hdr.image_time = ext2fs_cpu_to_le32(time(0)); |
||||
write_header(fd, &hdr, sizeof(struct ext2_image_hdr), fs->blocksize); |
||||
} |
||||
|
||||
@@ -1406,7 +1406,7 @@ static void install_image(char *device, char *image_fn, int type) |
||||
|
||||
ext2fs_rewrite_to_io(fs, io); |
||||
|
||||
- seek_set(fd, fs->image_header->offset_inode); |
||||
+ seek_set(fd, ext2fs_le32_to_cpu(fs->image_header->offset_inode)); |
||||
|
||||
retval = ext2fs_image_inode_read(fs, fd, 0); |
||||
if (retval) { |
||||
-- |
||||
2.21.1 |
||||
|
@ -0,0 +1,212 @@
@@ -0,0 +1,212 @@
|
||||
From 94020540808683e648b56c795f1621cc6362054e Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sun, 1 Sep 2019 00:59:16 -0400 |
||||
Subject: [PATCH 3/7] libsupport: add checks to prevent buffer overrun bugs in |
||||
quota code |
||||
|
||||
A maliciously corrupted file systems can trigger buffer overruns in |
||||
the quota code used by e2fsck. To fix this, add sanity checks to the |
||||
quota header fields as well as to block number references in the quota |
||||
tree. |
||||
|
||||
RHBZ: 1768710 |
||||
Addresses: CVE-2019-5094 |
||||
Addresses: TALOS-2019-0887 |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
lib/quota/mkquota.c | 1 + |
||||
lib/quota/quotaio_tree.c | 70 +++++++++++++++++++++++++++------------- |
||||
lib/quota/quotaio_v2.c | 28 ++++++++++++++++ |
||||
3 files changed, 76 insertions(+), 23 deletions(-) |
||||
|
||||
diff --git a/lib/quota/mkquota.c b/lib/quota/mkquota.c |
||||
index 3aa81003..f1fc64a0 100644 |
||||
--- a/lib/quota/mkquota.c |
||||
+++ b/lib/quota/mkquota.c |
||||
@@ -552,6 +552,7 @@ errcode_t quota_compare_and_update(quota_ctx_t qctx, int qtype, |
||||
err = qh.qh_ops->scan_dquots(&qh, scan_dquots_callback, &scan_data); |
||||
if (err) { |
||||
log_err("Error scanning dquots"); |
||||
+ *usage_inconsistent = 1; |
||||
goto out; |
||||
} |
||||
*usage_inconsistent = scan_data.usage_is_inconsistent; |
||||
diff --git a/lib/quota/quotaio_tree.c b/lib/quota/quotaio_tree.c |
||||
index c1653a39..2579450e 100644 |
||||
--- a/lib/quota/quotaio_tree.c |
||||
+++ b/lib/quota/quotaio_tree.c |
||||
@@ -534,6 +534,17 @@ struct dquot *qtree_read_dquot(struct quota_handle *h, qid_t id) |
||||
return dquot; |
||||
} |
||||
|
||||
+static int check_reference(struct quota_handle *h, unsigned int blk) |
||||
+{ |
||||
+ if (blk >= h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks) { |
||||
+ log_err("Illegal reference (%u >= %u) in %s quota file", |
||||
+ blk, h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks, |
||||
+ type2name(h->qh_type)); |
||||
+ return -1; |
||||
+ } |
||||
+ return 0; |
||||
+} |
||||
+ |
||||
/* |
||||
* Scan all dquots in file and call callback on each |
||||
*/ |
||||
@@ -552,7 +563,7 @@ static int report_block(struct dquot *dquot, uint blk, char *bitmap, |
||||
int entries, i; |
||||
|
||||
if (!buf) |
||||
- return 0; |
||||
+ return -1; |
||||
|
||||
set_bit(bitmap, blk); |
||||
read_blk(dquot->dq_h, blk, buf); |
||||
@@ -574,22 +585,12 @@ static int report_block(struct dquot *dquot, uint blk, char *bitmap, |
||||
return entries; |
||||
} |
||||
|
||||
-static void check_reference(struct quota_handle *h, uint blk) |
||||
-{ |
||||
- if (blk >= h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks) |
||||
- log_err("Illegal reference (%u >= %u) in %s quota file. " |
||||
- "Quota file is probably corrupted.\n" |
||||
- "Please run e2fsck (8) to fix it.", |
||||
- blk, |
||||
- h->qh_info.u.v2_mdqi.dqi_qtree.dqi_blocks, |
||||
- type2name(h->qh_type)); |
||||
-} |
||||
|
||||
static int report_tree(struct dquot *dquot, uint blk, int depth, char *bitmap, |
||||
int (*process_dquot) (struct dquot *, void *), |
||||
void *data) |
||||
{ |
||||
- int entries = 0, i; |
||||
+ int entries = 0, ret, i; |
||||
dqbuf_t buf = getdqbuf(); |
||||
u_int32_t *ref = (u_int32_t *) buf; |
||||
|
||||
@@ -600,22 +601,40 @@ static int report_tree(struct dquot *dquot, uint blk, int depth, char *bitmap, |
||||
if (depth == QT_TREEDEPTH - 1) { |
||||
for (i = 0; i < QT_BLKSIZE >> 2; i++) { |
||||
blk = ext2fs_le32_to_cpu(ref[i]); |
||||
- check_reference(dquot->dq_h, blk); |
||||
- if (blk && !get_bit(bitmap, blk)) |
||||
- entries += report_block(dquot, blk, bitmap, |
||||
- process_dquot, data); |
||||
+ if (check_reference(dquot->dq_h, blk)) { |
||||
+ entries = -1; |
||||
+ goto errout; |
||||
+ } |
||||
+ if (blk && !get_bit(bitmap, blk)) { |
||||
+ ret = report_block(dquot, blk, bitmap, |
||||
+ process_dquot, data); |
||||
+ if (ret < 0) { |
||||
+ entries = ret; |
||||
+ goto errout; |
||||
+ } |
||||
+ entries += ret; |
||||
+ } |
||||
} |
||||
} else { |
||||
for (i = 0; i < QT_BLKSIZE >> 2; i++) { |
||||
blk = ext2fs_le32_to_cpu(ref[i]); |
||||
if (blk) { |
||||
- check_reference(dquot->dq_h, blk); |
||||
- entries += report_tree(dquot, blk, depth + 1, |
||||
- bitmap, process_dquot, |
||||
- data); |
||||
+ if (check_reference(dquot->dq_h, blk)) { |
||||
+ entries = -1; |
||||
+ goto errout; |
||||
+ } |
||||
+ ret = report_tree(dquot, blk, depth + 1, |
||||
+ bitmap, process_dquot, |
||||
+ data); |
||||
+ if (ret < 0) { |
||||
+ entries = ret; |
||||
+ goto errout; |
||||
+ } |
||||
+ entries += ret; |
||||
} |
||||
} |
||||
} |
||||
+errout: |
||||
freedqbuf(buf); |
||||
return entries; |
||||
} |
||||
@@ -634,6 +653,7 @@ int qtree_scan_dquots(struct quota_handle *h, |
||||
int (*process_dquot) (struct dquot *, void *), |
||||
void *data) |
||||
{ |
||||
+ int ret; |
||||
char *bitmap; |
||||
struct v2_mem_dqinfo *v2info = &h->qh_info.u.v2_mdqi; |
||||
struct qtree_mem_dqinfo *info = &v2info->dqi_qtree; |
||||
@@ -647,10 +667,14 @@ int qtree_scan_dquots(struct quota_handle *h, |
||||
ext2fs_free_mem(&dquot); |
||||
return -1; |
||||
} |
||||
- v2info->dqi_used_entries = report_tree(dquot, QT_TREEOFF, 0, bitmap, |
||||
- process_dquot, data); |
||||
+ ret = report_tree(dquot, QT_TREEOFF, 0, bitmap, process_dquot, data); |
||||
+ if (ret < 0) |
||||
+ goto errout; |
||||
+ v2info->dqi_used_entries = ret; |
||||
v2info->dqi_data_blocks = find_set_bits(bitmap, info->dqi_blocks); |
||||
+ ret = 0; |
||||
+errout: |
||||
ext2fs_free_mem(&bitmap); |
||||
ext2fs_free_mem(&dquot); |
||||
- return 0; |
||||
+ return ret; |
||||
} |
||||
diff --git a/lib/quota/quotaio_v2.c b/lib/quota/quotaio_v2.c |
||||
index e7bf29c3..8957d487 100644 |
||||
--- a/lib/quota/quotaio_v2.c |
||||
+++ b/lib/quota/quotaio_v2.c |
||||
@@ -174,6 +174,8 @@ static int v2_check_file(struct quota_handle *h, int type, int fmt) |
||||
static int v2_init_io(struct quota_handle *h) |
||||
{ |
||||
struct v2_disk_dqinfo ddqinfo; |
||||
+ struct v2_mem_dqinfo *info; |
||||
+ __u64 filesize; |
||||
|
||||
h->qh_info.u.v2_mdqi.dqi_qtree.dqi_entry_size = |
||||
sizeof(struct v2r1_disk_dqblk); |
||||
@@ -184,6 +186,32 @@ static int v2_init_io(struct quota_handle *h) |
||||
sizeof(ddqinfo)) != sizeof(ddqinfo)) |
||||
return -1; |
||||
v2_disk2memdqinfo(&h->qh_info, &ddqinfo); |
||||
+ |
||||
+ /* Check to make sure quota file info is sane */ |
||||
+ info = &h->qh_info.u.v2_mdqi; |
||||
+ if (ext2fs_file_get_lsize(h->qh_qf.e2_file, &filesize)) |
||||
+ return -1; |
||||
+ if ((filesize > (1U << 31)) || |
||||
+ (info->dqi_qtree.dqi_blocks > |
||||
+ (filesize + QT_BLKSIZE - 1) >> QT_BLKSIZE_BITS)) { |
||||
+ log_err("Quota inode %u corrupted: file size %llu; " |
||||
+ "dqi_blocks %u", h->qh_qf.ino, |
||||
+ filesize, info->dqi_qtree.dqi_blocks); |
||||
+ return -1; |
||||
+ } |
||||
+ if (info->dqi_qtree.dqi_free_blk >= info->dqi_qtree.dqi_blocks) { |
||||
+ log_err("Quota inode %u corrupted: free_blk %u; dqi_blocks %u", |
||||
+ h->qh_qf.ino, info->dqi_qtree.dqi_free_blk, |
||||
+ info->dqi_qtree.dqi_blocks); |
||||
+ return -1; |
||||
+ } |
||||
+ if (info->dqi_qtree.dqi_free_entry >= info->dqi_qtree.dqi_blocks) { |
||||
+ log_err("Quota inode %u corrupted: free_entry %u; " |
||||
+ "dqi_blocks %u", h->qh_qf.ino, |
||||
+ info->dqi_qtree.dqi_free_entry, |
||||
+ info->dqi_qtree.dqi_blocks); |
||||
+ return -1; |
||||
+ } |
||||
return 0; |
||||
} |
||||
|
||||
-- |
||||
2.21.1 |
||||
|
@ -0,0 +1,31 @@
@@ -0,0 +1,31 @@
|
||||
From d01edcbdb6e151d425ecb1631e10a207e54e1fe5 Mon Sep 17 00:00:00 2001 |
||||
From: Lukas Czerner <lczerner@redhat.com> |
||||
Date: Mon, 4 May 2020 14:44:49 +0200 |
||||
Subject: [PATCH 6/7] mke2fs.conf: Introduce rhel6 fs_type |
||||
|
||||
RHBZ: 1780277 |
||||
Signed-off-by: Lukas Czerner <lczerner@redhat.com> |
||||
--- |
||||
misc/mke2fs.conf.in | 6 ++++++ |
||||
1 file changed, 6 insertions(+) |
||||
|
||||
diff --git a/misc/mke2fs.conf.in b/misc/mke2fs.conf.in |
||||
index 667800c8..e074fd58 100644 |
||||
--- a/misc/mke2fs.conf.in |
||||
+++ b/misc/mke2fs.conf.in |
||||
@@ -19,6 +19,12 @@ |
||||
inode_size = 256 |
||||
options = test_fs=1 |
||||
} |
||||
+ rhel6_ext4 = { |
||||
+ features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize |
||||
+ inode_size = 256 |
||||
+ enable_periodic_fsck = 1 |
||||
+ default_mntopts = "" |
||||
+ } |
||||
small = { |
||||
blocksize = 1024 |
||||
inode_size = 128 |
||||
-- |
||||
2.21.1 |
||||
|
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
From c94aec3123293ed2288bd0bf5536d9bf16ecd07b Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Tue, 25 Oct 2016 13:18:14 -0400 |
||||
Subject: [PATCH] resize2fs: fix resizing large file systems when block size != |
||||
page size |
||||
|
||||
Reported by: Jerry Lee <jerrylee@qnap.com> |
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
resize/main.c | 2 +- |
||||
1 file changed, 1 insertion(+), 1 deletion(-) |
||||
|
||||
diff --git a/resize/main.c b/resize/main.c |
||||
index 3951b09..cf86a23 100644 |
||||
--- a/resize/main.c |
||||
+++ b/resize/main.c |
||||
@@ -406,7 +406,7 @@ int main (int argc, char ** argv) |
||||
new_size = max_size; |
||||
/* Round down to an even multiple of a pagesize */ |
||||
if (sys_page_size > fs->blocksize) |
||||
- new_size &= ~((sys_page_size / fs->blocksize)-1); |
||||
+ new_size &= ~((blk64_t)((sys_page_size / fs->blocksize)-1)); |
||||
} |
||||
if (!EXT2_HAS_INCOMPAT_FEATURE(fs->super, |
||||
EXT4_FEATURE_INCOMPAT_64BIT)) { |
||||
-- |
||||
2.21.0 |
||||
|
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
From 06b155bff995fe13d68cc2829121d0d719e6fde7 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sat, 9 Aug 2014 12:31:04 -0400 |
||||
Subject: [PATCH 1/5] e2fsck: fix file systems with an overly large |
||||
s_first_meta_bg |
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
e2fsck/problem.c | 5 +++++ |
||||
e2fsck/problem.h | 3 +++ |
||||
e2fsck/super.c | 12 ++++++++++++ |
||||
3 files changed, 20 insertions(+) |
||||
|
||||
diff --git a/e2fsck/problem.c b/e2fsck/problem.c |
||||
index 2e41bb2e..6c7f514e 100644 |
||||
--- a/e2fsck/problem.c |
||||
+++ b/e2fsck/problem.c |
||||
@@ -438,6 +438,11 @@ static struct e2fsck_problem problem_table[] = { |
||||
N_("@S 64bit filesystems needs extents to access the whole disk. "), |
||||
PROMPT_FIX, PR_PREEN_OK | PR_NO_OK}, |
||||
|
||||
+ /* The first_meta_bg is too big */ |
||||
+ { PR_0_FIRST_META_BG_TOO_BIG, |
||||
+ N_("First_meta_bg is too big. (%N, max value %g). "), |
||||
+ PROMPT_CLEAR, 0 }, |
||||
+ |
||||
/* Meta_bg and resize_inode are not compatible, disable resize_inode*/ |
||||
{ PR_0_DISABLE_RESIZE_INODE, |
||||
N_("Resize_@i and meta_bg features are enabled. Those features are\n" |
||||
diff --git a/e2fsck/problem.h b/e2fsck/problem.h |
||||
index a591974e..2fc9be05 100644 |
||||
--- a/e2fsck/problem.h |
||||
+++ b/e2fsck/problem.h |
||||
@@ -252,6 +252,9 @@ struct problem_context { |
||||
/* 64bit is set but extents are not set. */ |
||||
#define PR_0_64BIT_WITHOUT_EXTENTS 0x000048 |
||||
|
||||
+/* The first_meta_bg is too big */ |
||||
+#define PR_0_FIRST_META_BG_TOO_BIG 0x000049 |
||||
+ |
||||
/* Meta_bg and resize_inode are not compatible, remove resize_inode*/ |
||||
#define PR_0_DISABLE_RESIZE_INODE 0x000051 |
||||
|
||||
diff --git a/e2fsck/super.c b/e2fsck/super.c |
||||
index 7e2c2e4f..7439d9d4 100644 |
||||
--- a/e2fsck/super.c |
||||
+++ b/e2fsck/super.c |
||||
@@ -599,6 +599,18 @@ void check_super_block(e2fsck_t ctx) |
||||
ext2fs_mark_super_dirty(fs); |
||||
} |
||||
|
||||
+ if ((fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) && |
||||
+ (fs->super->s_first_meta_bg > fs->desc_blocks)) { |
||||
+ pctx.group = fs->desc_blocks; |
||||
+ pctx.num = fs->super->s_first_meta_bg; |
||||
+ if (fix_problem(ctx, PR_0_FIRST_META_BG_TOO_BIG, &pctx)) { |
||||
+ fs->super->s_feature_incompat &= |
||||
+ ~EXT2_FEATURE_INCOMPAT_META_BG; |
||||
+ fs->super->s_first_meta_bg = 0; |
||||
+ ext2fs_mark_super_dirty(fs); |
||||
+ } |
||||
+ } |
||||
+ |
||||
/* |
||||
* Verify the group descriptors.... |
||||
*/ |
||||
-- |
||||
2.21.3 |
||||
|
@ -0,0 +1,60 @@
@@ -0,0 +1,60 @@
|
||||
From 92bd5b69d7e7096fffc8cab08cc6886fe22df77d Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sat, 9 Aug 2014 12:33:11 -0400 |
||||
Subject: [PATCH 2/5] resize2fs: disable the meta_bg feature if necessary |
||||
|
||||
When shrinking a file system, if the number block groups drops below |
||||
the point where we started using the meta_bg layout, disable the |
||||
meta_bg feature and set s_first_meta_bg to zero. This is necessary to |
||||
avoid creating an invalid/corrupted file system after the shrink. |
||||
|
||||
Addresses-Debian-Bug: #756922 |
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
Reported-by: Marcin Wolcendorf <antymat+debian@chelmska.waw.pl> |
||||
Tested-by: Marcin Wolcendorf <antymat+debian@chelmska.waw.pl> |
||||
--- |
||||
resize/resize2fs.c | 17 +++++++++++++---- |
||||
1 file changed, 13 insertions(+), 4 deletions(-) |
||||
|
||||
diff --git a/resize/resize2fs.c b/resize/resize2fs.c |
||||
index a73390de..a2ff29ad 100644 |
||||
--- a/resize/resize2fs.c |
||||
+++ b/resize/resize2fs.c |
||||
@@ -461,6 +461,13 @@ retry: |
||||
fs->super->s_reserved_gdt_blocks = new; |
||||
} |
||||
|
||||
+ if ((fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) && |
||||
+ (fs->super->s_first_meta_bg > fs->desc_blocks)) { |
||||
+ fs->super->s_feature_incompat &= |
||||
+ ~EXT2_FEATURE_INCOMPAT_META_BG; |
||||
+ fs->super->s_first_meta_bg = 0; |
||||
+ } |
||||
+ |
||||
/* |
||||
* If we are shrinking the number of block groups, we're done |
||||
* and can exit now. |
||||
@@ -946,13 +953,15 @@ static errcode_t blocks_to_move(ext2_resize_t rfs) |
||||
ext2fs_mark_block_bitmap2(rfs->reserve_blocks, blk); |
||||
} |
||||
|
||||
- if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) { |
||||
+ if (old_fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) |
||||
old_blocks = old_fs->super->s_first_meta_bg; |
||||
+ else |
||||
+ old_blocks = old_fs->desc_blocks + |
||||
+ old_fs->super->s_reserved_gdt_blocks; |
||||
+ if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) |
||||
new_blocks = fs->super->s_first_meta_bg; |
||||
- } else { |
||||
- old_blocks = old_fs->desc_blocks + old_fs->super->s_reserved_gdt_blocks; |
||||
+ else |
||||
new_blocks = fs->desc_blocks + fs->super->s_reserved_gdt_blocks; |
||||
- } |
||||
|
||||
if (old_blocks == new_blocks) { |
||||
retval = 0; |
||||
-- |
||||
2.21.3 |
||||
|
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
From 821c525c50d0fd704a3f189d8bdab2b97b65d887 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sat, 9 Aug 2014 13:03:43 -0400 |
||||
Subject: [PATCH] tests: add f_first_meta_bg_too_big test |
||||
|
||||
The test verifies that e2fsck can properly fix a file system where the |
||||
value of s_first_meta_bg in the superblock is larger than the number |
||||
of block group descriptors in the file system. E2fsck will fix this |
||||
by clearing the meta_bg feature. |
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
tests/f_first_meta_bg_too_big/expect.1 | 20 ++++++++++++++++++++ |
||||
tests/f_first_meta_bg_too_big/expect.2 | 7 +++++++ |
||||
tests/f_first_meta_bg_too_big/name | 1 + |
||||
3 files changed, 28 insertions(+) |
||||
create mode 100644 tests/f_first_meta_bg_too_big/expect.1 |
||||
create mode 100644 tests/f_first_meta_bg_too_big/expect.2 |
||||
create mode 100644 tests/f_first_meta_bg_too_big/name |
||||
|
||||
diff --git a/tests/f_first_meta_bg_too_big/expect.1 b/tests/f_first_meta_bg_too_big/expect.1 |
||||
new file mode 100644 |
||||
index 00000000..85786bda |
||||
--- /dev/null |
||||
+++ b/tests/f_first_meta_bg_too_big/expect.1 |
||||
@@ -0,0 +1,20 @@ |
||||
+First_meta_bg is too big. (2, max value 1). Clear? 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 |
||||
+Block bitmap differences: -3 |
||||
+Fix? yes |
||||
+ |
||||
+Free blocks count wrong for group #0 (79, counted=80). |
||||
+Fix? yes |
||||
+ |
||||
+Free blocks count wrong (79, counted=80). |
||||
+Fix? yes |
||||
+ |
||||
+ |
||||
+test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** |
||||
+test_filesys: 11/16 files (0.0% non-contiguous), 20/100 blocks |
||||
+Exit status is 1 |
||||
diff --git a/tests/f_first_meta_bg_too_big/expect.2 b/tests/f_first_meta_bg_too_big/expect.2 |
||||
new file mode 100644 |
||||
index 00000000..44bff624 |
||||
--- /dev/null |
||||
+++ b/tests/f_first_meta_bg_too_big/expect.2 |
||||
@@ -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: 11/16 files (0.0% non-contiguous), 20/100 blocks |
||||
+Exit status is 0 |
||||
diff --git a/tests/f_first_meta_bg_too_big/name b/tests/f_first_meta_bg_too_big/name |
||||
new file mode 100644 |
||||
index 00000000..47ec96db |
||||
--- /dev/null |
||||
+++ b/tests/f_first_meta_bg_too_big/name |
||||
@@ -0,0 +1 @@ |
||||
+s_first_meta_bg is too large |
||||
-- |
||||
2.21.3 |
||||
|
@ -0,0 +1,59 @@
@@ -0,0 +1,59 @@
|
||||
From c4e61a30629918fded02c728a2000d195db7ebe6 Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sat, 9 Aug 2014 13:05:21 -0400 |
||||
Subject: [PATCH 5/5] tests: add the r_meta_bg_shrink test |
||||
|
||||
This test checks to make sure resize2fs can properly handle a file |
||||
system which started life as a normal ext4 file system and then was |
||||
grown to a size where meta_bg was enabled, and then shrunk back below |
||||
the point where the meta_bg format is still needed. |
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
tests/r_meta_bg_shrink/script | 34 ++++++++++++++++++++++++++++++++++ |
||||
1 file changed, 34 insertions(+) |
||||
create mode 100644 tests/r_meta_bg_shrink/script |
||||
|
||||
diff --git a/tests/r_meta_bg_shrink/script b/tests/r_meta_bg_shrink/script |
||||
new file mode 100644 |
||||
index 00000000..de777775 |
||||
--- /dev/null |
||||
+++ b/tests/r_meta_bg_shrink/script |
||||
@@ -0,0 +1,34 @@ |
||||
+if test -x $RESIZE2FS_EXE -a -x $DEBUGFS_EXE; then |
||||
+ |
||||
+test_description="meta_bg shrink" |
||||
+FEATURES="-t ext4 -O 64bit,meta_bg,^resize_inode -b 1024" |
||||
+SIZE_1=1G |
||||
+SIZE_2=48M |
||||
+LOG=$test_name.log |
||||
+E2FSCK=../e2fsck/e2fsck |
||||
+RESIZE2FS_OPTS=-f |
||||
+ |
||||
+. $cmd_dir/scripts/resize_test |
||||
+ |
||||
+export MKE2FS_FIRST_META_BG=2 |
||||
+resize_test |
||||
+unset MKE2FS_FIRST_META_BG |
||||
+ |
||||
+RC=$? |
||||
+if [ $RC -eq 0 ]; then |
||||
+ echo "$test_name: $test_description: ok" |
||||
+ touch $test_name.ok |
||||
+elif [ $RC -eq 111 ]; then |
||||
+ echo "$test_name: $test_description: skipped" |
||||
+ touch $test_name.ok |
||||
+else |
||||
+ echo "$test_name: $test_description: failed" |
||||
+ ln $LOG $test_name.failed |
||||
+fi |
||||
+ |
||||
+unset FEATURES SIZE_1 SIZE_2 LOG E2FSCK |
||||
+ |
||||
+else #if test -x $RESIZE2FS_EXE -a -x $DEBUGFS_EXE; then |
||||
+ echo "$test_name: $test_description: skipped" |
||||
+fi |
||||
+ |
||||
-- |
||||
2.21.3 |
||||
|
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
From 00b5f688f0d5df5913ea25e3481946c8191d826d Mon Sep 17 00:00:00 2001 |
||||
From: Theodore Ts'o <tytso@mit.edu> |
||||
Date: Sat, 9 Aug 2014 13:02:36 -0400 |
||||
Subject: [PATCH 3/5] tests: make sure MKE2FS_FIRST_META_BG is unset while |
||||
running tests |
||||
|
||||
If the developer has set the MKE2FS_FIRST_META_BG environment |
||||
variable, this can cause test failures. |
||||
|
||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
||||
--- |
||||
tests/test_config | 1 + |
||||
1 file changed, 1 insertion(+) |
||||
|
||||
diff --git a/tests/test_config b/tests/test_config |
||||
index 67896562..1872e5c8 100644 |
||||
--- a/tests/test_config |
||||
+++ b/tests/test_config |
||||
@@ -32,6 +32,7 @@ E2FSCK_CONFIG=/dev/null |
||||
export E2FSCK_CONFIG |
||||
MKE2FS_CONFIG=./mke2fs.conf |
||||
export MKE2FS_CONFIG |
||||
+unset MKE2FS_FIRST_META_BG |
||||
E2FSPROGS_SKIP_PROGRESS=yes |
||||
export E2FSPROGS_SKIP_PROGRESS |
||||
EXT2FS_NO_MTAB_OK=yes |
||||
-- |
||||
2.21.3 |
||||
|
Binary file not shown.
Loading…
Reference in new issue