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.
98 lines
3.4 KiB
98 lines
3.4 KiB
4 years ago
|
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
|
||
|
|