673c78
From fb9ea75a8a69b06eb6a4039b841ce3ccabb76775 Mon Sep 17 00:00:00 2001
673c78
From: Andrey Albershteyn <aalbersh@redhat.com>
673c78
Date: Wed, 27 Apr 2022 13:24:56 +0200
673c78
Subject: libblkid: add FSLASTBLOCK field interface showing area occupied by fs
673c78
673c78
Add interface to let filesystem set FSLASTBLOCK which is basically
673c78
total number of fsblocks (area occupied by fs). Enable that field in
673c78
the 'superblocks' sample.
673c78
673c78
Upstream: http://github.com/util-linux/util-linux/commit/b7cb26ec3
673c78
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2064810
673c78
Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
673c78
---
673c78
 libblkid/samples/superblocks.c         |  3 ++-
673c78
 libblkid/src/blkid.h.in                | 23 ++++++++++++-----------
673c78
 libblkid/src/superblocks/superblocks.c | 13 +++++++++++++
673c78
 libblkid/src/superblocks/superblocks.h |  1 +
673c78
 4 files changed, 28 insertions(+), 12 deletions(-)
673c78
673c78
diff --git a/libblkid/samples/superblocks.c b/libblkid/samples/superblocks.c
673c78
index 38903ecee..b7f94ec14 100644
673c78
--- a/libblkid/samples/superblocks.c
673c78
+++ b/libblkid/samples/superblocks.c
673c78
@@ -44,7 +44,8 @@ int main(int argc, char *argv[])
673c78
 			BLKID_SUBLKS_UUID | BLKID_SUBLKS_UUIDRAW |
673c78
 			BLKID_SUBLKS_TYPE | BLKID_SUBLKS_SECTYPE |
673c78
 			BLKID_SUBLKS_USAGE | BLKID_SUBLKS_VERSION |
673c78
-			BLKID_SUBLKS_MAGIC | BLKID_SUBLKS_FSSIZE);
673c78
+			BLKID_SUBLKS_MAGIC | BLKID_SUBLKS_FSSIZE |
673c78
+			BLKID_SUBLKS_FSLASTBLOCK);
673c78
 
673c78
 	rc = blkid_do_safeprobe(pr);
673c78
 	if (rc == -1)
673c78
diff --git a/libblkid/src/blkid.h.in b/libblkid/src/blkid.h.in
673c78
index ad4becf0a..56e64f9ab 100644
673c78
--- a/libblkid/src/blkid.h.in
673c78
+++ b/libblkid/src/blkid.h.in
673c78
@@ -271,17 +271,18 @@ extern int blkid_superblocks_get_name(size_t idx, const char **name, int *usage)
673c78
 extern int blkid_probe_enable_superblocks(blkid_probe pr, int enable)
673c78
 			__ul_attribute__((nonnull));
673c78
 
673c78
-#define BLKID_SUBLKS_LABEL	(1 << 1) /* read LABEL from superblock */
673c78
-#define BLKID_SUBLKS_LABELRAW	(1 << 2) /* read and define LABEL_RAW result value*/
673c78
-#define BLKID_SUBLKS_UUID	(1 << 3) /* read UUID from superblock */
673c78
-#define BLKID_SUBLKS_UUIDRAW	(1 << 4) /* read and define UUID_RAW result value */
673c78
-#define BLKID_SUBLKS_TYPE	(1 << 5) /* define TYPE result value */
673c78
-#define BLKID_SUBLKS_SECTYPE	(1 << 6) /* define compatible fs type (second type) */
673c78
-#define BLKID_SUBLKS_USAGE	(1 << 7) /* define USAGE result value */
673c78
-#define BLKID_SUBLKS_VERSION	(1 << 8) /* read FS type from superblock */
673c78
-#define BLKID_SUBLKS_MAGIC	(1 << 9) /* define SBMAGIC and SBMAGIC_OFFSET */
673c78
-#define BLKID_SUBLKS_BADCSUM	(1 << 10) /* allow a bad checksum */
673c78
-#define BLKID_SUBLKS_FSSIZE	(1 << 11) /* read and define FSSIZE from superblock */
673c78
+#define BLKID_SUBLKS_LABEL		(1 << 1) /* read LABEL from superblock */
673c78
+#define BLKID_SUBLKS_LABELRAW		(1 << 2) /* read and define LABEL_RAW result value*/
673c78
+#define BLKID_SUBLKS_UUID		(1 << 3) /* read UUID from superblock */
673c78
+#define BLKID_SUBLKS_UUIDRAW		(1 << 4) /* read and define UUID_RAW result value */
673c78
+#define BLKID_SUBLKS_TYPE		(1 << 5) /* define TYPE result value */
673c78
+#define BLKID_SUBLKS_SECTYPE		(1 << 6) /* define compatible fs type (second type) */
673c78
+#define BLKID_SUBLKS_USAGE		(1 << 7) /* define USAGE result value */
673c78
+#define BLKID_SUBLKS_VERSION		(1 << 8) /* read FS type from superblock */
673c78
+#define BLKID_SUBLKS_MAGIC		(1 << 9) /* define SBMAGIC and SBMAGIC_OFFSET */
673c78
+#define BLKID_SUBLKS_BADCSUM		(1 << 10) /* allow a bad checksum */
673c78
+#define BLKID_SUBLKS_FSSIZE		(1 << 11) /* read and define FSSIZE from superblock */
673c78
+#define BLKID_SUBLKS_FSLASTBLOCK	(1 << 12) /* read and define FSLASTBLOCK from superblock */
673c78
 
673c78
 #define BLKID_SUBLKS_DEFAULT	(BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID | \
673c78
 				 BLKID_SUBLKS_TYPE | BLKID_SUBLKS_SECTYPE)
673c78
diff --git a/libblkid/src/superblocks/superblocks.c b/libblkid/src/superblocks/superblocks.c
673c78
index adf4ee025..5b899a830 100644
673c78
--- a/libblkid/src/superblocks/superblocks.c
673c78
+++ b/libblkid/src/superblocks/superblocks.c
673c78
@@ -68,6 +68,8 @@
673c78
  *
673c78
  * @FSSIZE: size of filesystem (implemented for XFS only)
673c78
  *
673c78
+ * @FSLASTBLOCK: last fsblock/total number of fsblocks
673c78
+ *
673c78
  * @SYSTEM_ID: ISO9660 system identifier
673c78
  *
673c78
  * @PUBLISHER_ID: ISO9660 publisher identifier
673c78
@@ -595,6 +597,17 @@ int blkid_probe_set_fssize(blkid_probe pr, uint64_t size)
673c78
 	return blkid_probe_sprintf_value(pr, "FSSIZE", "%" PRIu64, size);
673c78
 }
673c78
 
673c78
+int blkid_probe_set_fslastblock(blkid_probe pr, uint64_t lastblock)
673c78
+{
673c78
+	struct blkid_chain *chn = blkid_probe_get_chain(pr);
673c78
+
673c78
+	if (!(chn->flags & BLKID_SUBLKS_FSLASTBLOCK))
673c78
+		return 0;
673c78
+
673c78
+	return blkid_probe_sprintf_value(pr, "FSLASTBLOCK", "%" PRIu64,
673c78
+			lastblock);
673c78
+}
673c78
+
673c78
 int blkid_probe_set_id_label(blkid_probe pr, const char *name,
673c78
 			     const unsigned char *data, size_t len)
673c78
 {
673c78
diff --git a/libblkid/src/superblocks/superblocks.h b/libblkid/src/superblocks/superblocks.h
673c78
index 67803679f..251e2e386 100644
673c78
--- a/libblkid/src/superblocks/superblocks.h
673c78
+++ b/libblkid/src/superblocks/superblocks.h
673c78
@@ -112,6 +112,7 @@ extern int blkid_probe_set_utf8_id_label(blkid_probe pr, const char *name,
673c78
 
673c78
 int blkid_probe_set_block_size(blkid_probe pr, unsigned block_size);
673c78
 int blkid_probe_set_fssize(blkid_probe pr, uint64_t size);
673c78
+int blkid_probe_set_fslastblock(blkid_probe pr, uint64_t lastblock);
673c78
 
673c78
 extern int blkid_probe_is_bitlocker(blkid_probe pr);
673c78
 extern int blkid_probe_is_ntfs(blkid_probe pr);
673c78
-- 
673c78
2.36.1
673c78