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