]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libblkid: Add scoutfs filesystem.
authorAuke Kok <auke.kok@versity.com>
Tue, 27 May 2025 19:34:43 +0000 (12:34 -0700)
committerAuke Kok <auke.kok@versity.com>
Fri, 30 May 2025 18:17:01 +0000 (11:17 -0700)
The scoutfs filesystem is maintained out-of-tree, but current enough
that we want to submit it for inclusion in libblkid - there's a few
users out there that would benefit from being able to have lsblk aid in
diagnosing and identifying.

For more information about scoutfs, visit the github page here:
   https://github.com/versity/scoutfs

Test images are provided for both data and meta devices. These were
taken from validation samples.

The wiper is set to only wipe a minute part of the filesystem -
basically only the superblock. This is adequately destructive.

Signed-off-by: Auke Kok <auke.kok@versity.com>
libblkid/meson.build
libblkid/src/Makemodule.am
libblkid/src/superblocks/scoutfs.c [new file with mode: 0644]
libblkid/src/superblocks/superblocks.c
libblkid/src/superblocks/superblocks.h
tests/expected/blkid/low-probe-scoutfs_data [new file with mode: 0644]
tests/expected/blkid/low-probe-scoutfs_meta [new file with mode: 0644]
tests/ts/blkid/images-fs/scoutfs_data.img.xz [new file with mode: 0644]
tests/ts/blkid/images-fs/scoutfs_meta.img.xz [new file with mode: 0644]

index 2a23b8dbc8b2213c7c9b3457f00c07e8d9f64bd1..2435692cd2d117cbe266e3227ca13c43b0a96abe 100644 (file)
@@ -93,6 +93,7 @@ lib_blkid_sources = '''
   src/superblocks/promise_raid.c
   src/superblocks/reiserfs.c
   src/superblocks/romfs.c
+  src/superblocks/scoutfs.c
   src/superblocks/silicon_raid.c
   src/superblocks/squashfs.c
   src/superblocks/stratis.c
index 78ebb22253f3db1bf3d4f9626a85f25d81bbb1a8..321d3fbe9c4bd8465e2932bf895160b9c76a725e 100644 (file)
@@ -83,6 +83,7 @@ libblkid_la_SOURCES = \
        libblkid/src/superblocks/promise_raid.c \
        libblkid/src/superblocks/reiserfs.c \
        libblkid/src/superblocks/romfs.c \
+       libblkid/src/superblocks/scoutfs.c \
        libblkid/src/superblocks/silicon_raid.c \
        libblkid/src/superblocks/squashfs.c \
        libblkid/src/superblocks/stratis.c \
diff --git a/libblkid/src/superblocks/scoutfs.c b/libblkid/src/superblocks/scoutfs.c
new file mode 100644 (file)
index 0000000..b897945
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2025 Versity, Inc.
+ *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License.
+ */
+
+#include <inttypes.h>
+
+#include "superblocks.h"
+#include "crc32c.h"
+
+enum {
+       SCOUTFS_TYPE_DATA,
+       SCOUTFS_TYPE_METADATA,
+};
+
+#define SCOUTFS_UUID_BYTES 16
+
+#define SCOUTFS_BLOCK_SM_SHIFT 12
+#define SCOUTFS_BLOCK_SM_SIZE  (1 << SCOUTFS_BLOCK_SM_SHIFT)
+#define SCOUTFS_BLOCK_LG_SHIFT 16
+#define SCOUTFS_BLOCK_LG_SIZE  (1 << SCOUTFS_BLOCK_LG_SHIFT)
+
+struct scoutfs_block_header {
+       uint32_t crc;
+       uint32_t magic;
+       uint64_t fsid;
+       uint64_t seq;
+       uint64_t blkno;
+};
+
+#define SCOUTFS_FLAG_IS_META_BDEV 0x01
+
+struct scoutfs_super_block {
+       struct scoutfs_block_header hdr;
+       uint64_t id;
+       uint64_t fmt_vers;
+       uint64_t flags;
+       uint8_t uuid[SCOUTFS_UUID_BYTES];
+       /* rest omitted */
+};
+
+static int probe_scoutfs(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       const struct scoutfs_super_block *sb;
+       const unsigned char *buf;
+       uint32_t crc;
+
+       /* scoutfs_super_block is always in a SCOUTFS_BLOCK_SM_SIZE block */
+       buf = blkid_probe_get_sb_buffer(pr, mag, SCOUTFS_BLOCK_SM_SIZE);
+       if (buf == NULL)
+               return errno ? -errno : 1;
+       sb = (struct scoutfs_super_block *)buf;
+
+       crc = crc32c(~0, (char *)buf + sizeof(sb->hdr.crc), SCOUTFS_BLOCK_SM_SIZE - sizeof(sb->hdr.crc));
+       if (!blkid_probe_verify_csum(pr, crc, le32_to_cpu(sb->hdr.crc)))
+               return BLKID_PROBE_NONE;
+
+       blkid_probe_sprintf_version(pr, "%"PRIu64, le64_to_cpu(sb->fmt_vers));
+       blkid_probe_set_uuid(pr, sb->uuid);
+       blkid_probe_sprintf_value(pr, "FSID", "%016"PRIx64, le64_to_cpu(sb->hdr.fsid));
+       blkid_probe_set_wiper(pr, 0, 0x10000);
+
+       if (mag->hint == SCOUTFS_TYPE_METADATA) {
+               /* meta blocksize is 64k blocks */
+               blkid_probe_set_fsblocksize(pr, SCOUTFS_BLOCK_LG_SIZE);
+               blkid_probe_set_block_size(pr, SCOUTFS_BLOCK_LG_SIZE);
+
+               if (!(le64_to_cpu(sb->flags) & SCOUTFS_FLAG_IS_META_BDEV))
+                       return BLKID_PROBE_NONE;
+       } else {
+               /* data blocksize is 4k blocks */
+               blkid_probe_set_fsblocksize(pr, SCOUTFS_BLOCK_SM_SIZE);
+               blkid_probe_set_block_size(pr, SCOUTFS_BLOCK_SM_SIZE);
+
+               if (le64_to_cpu(sb->flags) & SCOUTFS_FLAG_IS_META_BDEV)
+                       return BLKID_PROBE_NONE;
+       }
+
+       return 0;
+}
+
+/*
+ * Scoutfs has the same magic value for the data and the meta devices,
+ * and the superblock format used in them is identical, except for the
+ * flag used to indicate the meta device superblock.
+ */
+const struct blkid_idinfo scoutfs_meta_idinfo =
+{
+       .name           = "scoutfs_meta",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_scoutfs,
+       .minsz          = 0x20000,
+       .magics         = {
+               {
+                 .magic        = "\x8b\x42\x3c\x10",
+                 .hint         = SCOUTFS_TYPE_METADATA,
+                 .kboff        = 64,
+                 .sboff        = 4,
+                 .len          = 4,
+               },
+               { NULL }
+       }
+};
+
+const struct blkid_idinfo scoutfs_data_idinfo =
+{
+       .name           = "scoutfs_data",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_scoutfs,
+       .minsz          = 0x20000,
+       .magics         = {
+               {
+                 .magic        = "\x8b\x42\x3c\x10",
+                 .hint         = SCOUTFS_TYPE_DATA,
+                 .kboff        = 64,
+                 .sboff        = 4,
+                 .len          = 4,
+               },
+               { NULL }
+       }
+};
index 82047f18644db499548648052214fb0276918527..0fd9cc5f6f70f98dd564b6083b05e1c33ae77c7a 100644 (file)
@@ -158,6 +158,8 @@ static const struct blkid_idinfo *idinfos[] =
        &refs_idinfo,
        &cramfs_idinfo,
        &romfs_idinfo,
+       &scoutfs_meta_idinfo,
+       &scoutfs_data_idinfo,
        &minix_idinfo,
        &gfs_idinfo,
        &gfs2_idinfo,
index 140261eae8e96070299e0474a6720e3cf1d74110..af3eb2fa351195d96ccfc3738f86d50a05da021a 100644 (file)
@@ -46,6 +46,8 @@ extern const struct blkid_idinfo exfs_idinfo;
 extern const struct blkid_idinfo gfs_idinfo;
 extern const struct blkid_idinfo gfs2_idinfo;
 extern const struct blkid_idinfo romfs_idinfo;
+extern const struct blkid_idinfo scoutfs_meta_idinfo;
+extern const struct blkid_idinfo scoutfs_data_idinfo;
 extern const struct blkid_idinfo ocfs_idinfo;
 extern const struct blkid_idinfo ocfs2_idinfo;
 extern const struct blkid_idinfo oracleasm_idinfo;
diff --git a/tests/expected/blkid/low-probe-scoutfs_data b/tests/expected/blkid/low-probe-scoutfs_data
new file mode 100644 (file)
index 0000000..28767e8
--- /dev/null
@@ -0,0 +1,8 @@
+ID_FS_BLOCK_SIZE=4096
+ID_FS_FSBLOCKSIZE=4096
+ID_FS_FSID=7ccb1220c4306893
+ID_FS_TYPE=scoutfs_data
+ID_FS_USAGE=filesystem
+ID_FS_UUID=bf33ff54-5260-46ee-9505-c369e4c49882
+ID_FS_UUID_ENC=bf33ff54-5260-46ee-9505-c369e4c49882
+ID_FS_VERSION=2
diff --git a/tests/expected/blkid/low-probe-scoutfs_meta b/tests/expected/blkid/low-probe-scoutfs_meta
new file mode 100644 (file)
index 0000000..c050aba
--- /dev/null
@@ -0,0 +1,8 @@
+ID_FS_BLOCK_SIZE=65536
+ID_FS_FSBLOCKSIZE=65536
+ID_FS_FSID=7ccb1220c4306893
+ID_FS_TYPE=scoutfs_meta
+ID_FS_USAGE=filesystem
+ID_FS_UUID=bf33ff54-5260-46ee-9505-c369e4c49882
+ID_FS_UUID_ENC=bf33ff54-5260-46ee-9505-c369e4c49882
+ID_FS_VERSION=2
diff --git a/tests/ts/blkid/images-fs/scoutfs_data.img.xz b/tests/ts/blkid/images-fs/scoutfs_data.img.xz
new file mode 100644 (file)
index 0000000..5b29fb9
Binary files /dev/null and b/tests/ts/blkid/images-fs/scoutfs_data.img.xz differ
diff --git a/tests/ts/blkid/images-fs/scoutfs_meta.img.xz b/tests/ts/blkid/images-fs/scoutfs_meta.img.xz
new file mode 100644 (file)
index 0000000..4043165
Binary files /dev/null and b/tests/ts/blkid/images-fs/scoutfs_meta.img.xz differ