]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libblkid: add erofs filesystem support
authorGao Xiang <hsiangkao@redhat.com>
Sat, 5 Dec 2020 07:44:10 +0000 (15:44 +0800)
committerKarel Zak <kzak@redhat.com>
Tue, 8 Dec 2020 09:34:47 +0000 (10:34 +0100)
Enhanced Read-Only File System (EROFS) has been included in Linux
kernel, many Linux distributions, buildroot and Android AOSP for
a while. Plus, nowadays, it's known that EROFS has been commercially
used by several Android vendors for their system partitions.
util-linux in busybox can also detect it recently.

This patch adds support for detecting EROFS filesystem to libblkid.

Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
libblkid/src/Makemodule.am
libblkid/src/superblocks/erofs.c [new file with mode: 0644]
libblkid/src/superblocks/superblocks.c
libblkid/src/superblocks/superblocks.h

index 1aa6dfcef129887160f0208cf5bc3cd1f887bc13..16a0a2826d9266b24779bf421fd94cc52d76ffa6 100644 (file)
@@ -101,6 +101,7 @@ libblkid_la_SOURCES = \
        libblkid/src/superblocks/xfs.c \
        libblkid/src/superblocks/zfs.c \
        libblkid/src/superblocks/zonefs.c \
+       libblkid/src/superblocks/erofs.c \
        \
        libblkid/src/topology/topology.c \
        libblkid/src/topology/topology.h
diff --git a/libblkid/src/superblocks/erofs.c b/libblkid/src/superblocks/erofs.c
new file mode 100644 (file)
index 0000000..0e7b422
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2020 Gao Xiang
+ *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License
+ */
+#include <stddef.h>
+#include <string.h>
+
+#include "superblocks.h"
+
+#define EROFS_SUPER_OFFSET      1024
+#define EROFS_SB_KBOFF         (EROFS_SUPER_OFFSET >> 10)
+
+#define EROFS_SUPER_MAGIC_V1   "\xe2\xe1\xf5\xe0"
+#define EROFS_MAGIC_OFF                0
+
+/* All in little-endian */
+struct erofs_super_block {
+       uint32_t        magic;
+       uint32_t        checksum;
+       uint32_t        feature_compat;
+       uint8_t         blkszbits;
+       uint8_t         reserved;
+
+       uint16_t        root_nid;
+       uint64_t        inos;
+
+       uint64_t        build_time;
+       uint32_t        build_time_nsec;
+       uint32_t        blocks;
+       uint32_t        meta_blkaddr;
+       uint32_t        xattr_blkaddr;
+       uint8_t         uuid[16];
+       uint8_t         volume_name[16];
+       uint32_t        feature_incompat;
+       uint8_t         reserved2[44];
+};
+
+static int probe_erofs(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct erofs_super_block *sb;
+
+       sb = blkid_probe_get_sb(pr, mag, struct erofs_super_block);
+       if (!sb)
+               return errno ? -errno : BLKID_PROBE_NONE;
+
+       if (sb->volume_name[0])
+               blkid_probe_set_label(pr, (unsigned char *)sb->volume_name,
+                                     sizeof(sb->volume_name));
+
+       blkid_probe_set_uuid(pr, sb->uuid);
+
+       if (sb->blkszbits < 32)
+               blkid_probe_set_block_size(pr, 1U << sb->blkszbits);
+       return BLKID_PROBE_OK;
+}
+
+const struct blkid_idinfo erofs_idinfo =
+{
+       .name           = "erofs",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_erofs,
+       .magics         =
+        {
+               {
+                       .magic = EROFS_SUPER_MAGIC_V1,
+                       .len = 4,
+                       .kboff = EROFS_SB_KBOFF,
+                       .sboff = EROFS_MAGIC_OFF,
+               }, { NULL }
+       }
+};
index 7b0f5eed098b43d71dd33749d28d420bbdb53ffe..f21365538050feb8fbfc46bfe995cf4ecf8a28af 100644 (file)
@@ -168,7 +168,8 @@ static const struct blkid_idinfo *idinfos[] =
        &f2fs_idinfo,
        &mpool_idinfo,
        &apfs_idinfo,
-       &zonefs_idinfo
+       &zonefs_idinfo,
+       &erofs_idinfo
 };
 
 /*
index 5ebe6bc432052e6a7ac0ce07e64b0b253d9ff45d..9c489c438e32b81edfb452bc391fc411dad4178c 100644 (file)
@@ -85,6 +85,7 @@ extern const struct blkid_idinfo stratis_idinfo;
 extern const struct blkid_idinfo bitlocker_idinfo;
 extern const struct blkid_idinfo apfs_idinfo;
 extern const struct blkid_idinfo zonefs_idinfo;
+extern const struct blkid_idinfo erofs_idinfo;
 
 /*
  * superblock functions