cdown / rpms / util-linux

Forked from rpms/util-linux 2 years ago
Clone

Blame SOURCES/0025-libblkid-add-FSLASTBLOCK-implementation-for-xfs-ext-.patch

d8d8bc
From 9c7f3317fc66fe971a331dd71e76aff7ae091ab2 Mon Sep 17 00:00:00 2001
d8d8bc
From: Andrey Albershteyn <aalbersh@redhat.com>
d8d8bc
Date: Wed, 27 Apr 2022 14:46:33 +0200
d8d8bc
Subject: libblkid: add FSLASTBLOCK implementation for xfs, ext and btrfs
d8d8bc
d8d8bc
Implementation of FSLASTBLOCK for most common filesystems. Most of
d8d8bc
the fs store total number of reserved blocks in superblock.
d8d8bc
d8d8bc
Upstream: http://github.com/util-linux/util-linux/commit/5f995b3f1
d8d8bc
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2064810
d8d8bc
Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
d8d8bc
---
d8d8bc
 libblkid/src/superblocks/btrfs.c |  5 +++++
d8d8bc
 libblkid/src/superblocks/ext.c   | 10 ++++++++--
d8d8bc
 libblkid/src/superblocks/xfs.c   |  1 +
d8d8bc
 3 files changed, 14 insertions(+), 2 deletions(-)
d8d8bc
d8d8bc
diff --git a/libblkid/src/superblocks/btrfs.c b/libblkid/src/superblocks/btrfs.c
d8d8bc
index f0fde700d..9708f2e28 100644
d8d8bc
--- a/libblkid/src/superblocks/btrfs.c
d8d8bc
+++ b/libblkid/src/superblocks/btrfs.c
d8d8bc
@@ -76,6 +76,11 @@ static int probe_btrfs(blkid_probe pr, const struct blkid_idmag *mag)
d8d8bc
 	blkid_probe_set_uuid_as(pr, bfs->dev_item.uuid, "UUID_SUB");
d8d8bc
 	blkid_probe_set_block_size(pr, le32_to_cpu(bfs->sectorsize));
d8d8bc
 
d8d8bc
+	uint32_t sectorsize_log = 31 -
d8d8bc
+		__builtin_clz(le32_to_cpu(bfs->sectorsize));
d8d8bc
+	blkid_probe_set_fslastblock(pr,
d8d8bc
+			le64_to_cpu(bfs->total_bytes) >> sectorsize_log);
d8d8bc
+
d8d8bc
 	return 0;
d8d8bc
 }
d8d8bc
 
d8d8bc
diff --git a/libblkid/src/superblocks/ext.c b/libblkid/src/superblocks/ext.c
d8d8bc
index 3870522fa..0b9023734 100644
d8d8bc
--- a/libblkid/src/superblocks/ext.c
d8d8bc
+++ b/libblkid/src/superblocks/ext.c
d8d8bc
@@ -164,10 +164,11 @@ static struct ext2_super_block *ext_get_super(
d8d8bc
 static void ext_get_info(blkid_probe pr, int ver, struct ext2_super_block *es)
d8d8bc
 {
d8d8bc
 	struct blkid_chain *chn = blkid_probe_get_chain(pr);
d8d8bc
+	uint32_t s_feature_incompat = le32_to_cpu(es->s_feature_incompat);
d8d8bc
 
d8d8bc
 	DBG(PROBE, ul_debug("ext2_sb.compat = %08X:%08X:%08X",
d8d8bc
 		   le32_to_cpu(es->s_feature_compat),
d8d8bc
-		   le32_to_cpu(es->s_feature_incompat),
d8d8bc
+		   s_feature_incompat,
d8d8bc
 		   le32_to_cpu(es->s_feature_ro_compat)));
d8d8bc
 
d8d8bc
 	if (*es->s_volume_name != '\0')
d8d8bc
@@ -179,7 +180,7 @@ static void ext_get_info(blkid_probe pr, int ver, struct ext2_super_block *es)
d8d8bc
 		blkid_probe_set_uuid_as(pr, es->s_journal_uuid, "EXT_JOURNAL");
d8d8bc
 
d8d8bc
 	if (ver != 2 && (chn->flags & BLKID_SUBLKS_SECTYPE) &&
d8d8bc
-	    ((le32_to_cpu(es->s_feature_incompat) & EXT2_FEATURE_INCOMPAT_UNSUPPORTED) == 0))
d8d8bc
+	    ((s_feature_incompat & EXT2_FEATURE_INCOMPAT_UNSUPPORTED) == 0))
d8d8bc
 		blkid_probe_set_value(pr, "SEC_TYPE",
d8d8bc
 				(unsigned char *) "ext2",
d8d8bc
 				sizeof("ext2"));
d8d8bc
@@ -190,6 +191,11 @@ static void ext_get_info(blkid_probe pr, int ver, struct ext2_super_block *es)
d8d8bc
 
d8d8bc
 	if (le32_to_cpu(es->s_log_block_size) < 32)
d8d8bc
 		blkid_probe_set_block_size(pr, 1024U << le32_to_cpu(es->s_log_block_size));
d8d8bc
+
d8d8bc
+	uint64_t fslastblock = le32_to_cpu(es->s_blocks_count) |
d8d8bc
+		((s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) ?
d8d8bc
+		(uint64_t) le32_to_cpu(es->s_blocks_count_hi) << 32 : 0);
d8d8bc
+	blkid_probe_set_fslastblock(pr, fslastblock);
d8d8bc
 }
d8d8bc
 
d8d8bc
 
d8d8bc
diff --git a/libblkid/src/superblocks/xfs.c b/libblkid/src/superblocks/xfs.c
d8d8bc
index 444050f55..1f2e92cac 100644
d8d8bc
--- a/libblkid/src/superblocks/xfs.c
d8d8bc
+++ b/libblkid/src/superblocks/xfs.c
d8d8bc
@@ -183,6 +183,7 @@ static int probe_xfs(blkid_probe pr, const struct blkid_idmag *mag)
d8d8bc
 				sizeof(xs->sb_fname));
d8d8bc
 	blkid_probe_set_uuid(pr, xs->sb_uuid);
d8d8bc
 	blkid_probe_set_fssize(pr, xfs_fssize(xs));
d8d8bc
+	blkid_probe_set_fslastblock(pr, be64_to_cpu(xs->sb_dblocks));
d8d8bc
 	blkid_probe_set_block_size(pr, be16_to_cpu(xs->sb_sectsize));
d8d8bc
 	return 0;
d8d8bc
 }
d8d8bc
-- 
d8d8bc
2.36.1
d8d8bc