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