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