67 lines
2.4 KiB
Diff
67 lines
2.4 KiB
Diff
From b31d5b582b4189a0ed27bced22276dd3f68c50a7 Mon Sep 17 00:00:00 2001
|
|
From: Eric Whitney <enwlinux@gmail.com>
|
|
Date: Fri, 21 Jul 2023 14:55:06 -0400
|
|
Subject: [PATCH] e2fsprogs: modify dumpe2fs to report free block ranges for
|
|
bigalloc
|
|
|
|
dumpe2fs has never been modified to correctly report block ranges
|
|
corresponding to free clusters in block allocation bitmaps from bigalloc
|
|
file systems. Rather than reporting block ranges covering all the
|
|
blocks in free clusters found in a block bitmap, it either reports just
|
|
the first block number in a cluster for a single free cluster, or a
|
|
range beginning with the first block number in the first cluster in a
|
|
series of free clusters, and ending with the first block number in the
|
|
last cluster in that series.
|
|
|
|
This behavior causes xfstest shared/298 to fail when run on a bigalloc
|
|
file system with a 1k block size. The test uses dumpe2fs to collect
|
|
a list of the blocks freed when files are deleted from a file system.
|
|
When the test deletes a file containing blocks located after the first
|
|
block in the last cluster in a series of clusters, dumpe2fs does not
|
|
report those blocks as free per the test's expectations.
|
|
|
|
Modify dumpe2fs to report full block ranges for free clusters. At the
|
|
same time, fix a small bug causing unnecessary !in_use() retests while
|
|
iterating over a block bitmap.
|
|
|
|
Signed-off-by: Eric Whitney <enwlinux@gmail.com>
|
|
Link: https://lore.kernel.org/r/20230721185506.1020225-1-enwlinux@gmail.com
|
|
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
|
|
---
|
|
misc/dumpe2fs.c | 12 ++++++------
|
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c
|
|
index 7c080ed9f..d2d57fb0a 100644
|
|
--- a/misc/dumpe2fs.c
|
|
+++ b/misc/dumpe2fs.c
|
|
@@ -84,8 +84,7 @@ static void print_free(unsigned long group, char * bitmap,
|
|
unsigned long num, unsigned long offset, int ratio)
|
|
{
|
|
int p = 0;
|
|
- unsigned long i;
|
|
- unsigned long j;
|
|
+ unsigned long i, j;
|
|
|
|
offset /= ratio;
|
|
offset += group * num;
|
|
@@ -95,13 +94,14 @@ static void print_free(unsigned long group, char * bitmap,
|
|
if (p)
|
|
printf (", ");
|
|
print_number((i + offset) * ratio);
|
|
- for (j = i; j < num && !in_use (bitmap, j); j++)
|
|
+ for (j = i + 1; j < num && !in_use(bitmap, j); j++)
|
|
;
|
|
- if (--j != i) {
|
|
+ if (j != i + 1 || ratio > 1) {
|
|
fputc('-', stdout);
|
|
- print_number((j + offset) * ratio);
|
|
- i = j;
|
|
+ print_number(((j - 1 + offset) * ratio) +
|
|
+ ratio - 1);
|
|
}
|
|
+ i = j;
|
|
p = 1;
|
|
}
|
|
}
|