Skip to contentSkip to conversation

e2fsprogs: modify dumpe2fs to report free block ranges for bigalloc

PATCH Applied Eric Whitney 2 participants 2 messages Jul 21, 2023 – Aug 17, 2023

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

---
 misc/dumpe2fs.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
misc/dumpe2fs.c +6 -6
index 7c080ed9..d2d57fb0 100644
@@ -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;
 		}
 }
Signature · 1 line
2.30.2
#1 lore raw
Quoted 10 lines · Eric Whitney

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.

[...]

Applied, thanks!

[1/1] e2fsprogs: modify dumpe2fs to report free block ranges for bigalloc

      commit: b9df2bcb4d8a4d2f3985f3d2f9d85292b826cc8b

Best regards,

Signature · 1 line
Theodore Ts'o <[email protected]>