You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.4 KiB
97 lines
3.4 KiB
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 |
|
|
|
|