summaryrefslogtreecommitdiffstats
path: root/libblkid/src/superblocks/mpool.c
diff options
context:
space:
mode:
authorJohn Groves2017-11-16 06:01:39 +0100
committerKarel Zak2017-11-16 11:44:52 +0100
commitb0a89709bfef495084381f8cc8948921d2e04ae5 (patch)
tree97bdb79e90c7701564222e79facc00aa4125016b /libblkid/src/superblocks/mpool.c
parentlib: Add simple crc32c() function (diff)
downloadkernel-qcow2-util-linux-b0a89709bfef495084381f8cc8948921d2e04ae5.tar.gz
kernel-qcow2-util-linux-b0a89709bfef495084381f8cc8948921d2e04ae5.tar.xz
kernel-qcow2-util-linux-b0a89709bfef495084381f8cc8948921d2e04ae5.zip
libblkid: Add support for Micron mpool formatted drives
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libblkid/src/superblocks/mpool.c')
-rw-r--r--libblkid/src/superblocks/mpool.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/libblkid/src/superblocks/mpool.c b/libblkid/src/superblocks/mpool.c
new file mode 100644
index 000000000..5f30fd496
--- /dev/null
+++ b/libblkid/src/superblocks/mpool.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016 Micron Technology, Inc.
+ *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdint.h>
+#include "crc32c.h"
+#include "superblocks.h"
+
+#include <uuid.h>
+
+#define MAX_MPOOL_NAME_LEN 32
+
+struct omf_sb_descriptor {
+ uint64_t osb_magic;
+ uint8_t osb_name[MAX_MPOOL_NAME_LEN];
+ uuid_t osb_poolid; /* UUID of pool this drive belongs to */
+ uint16_t osb_vers;
+ uint32_t osb_gen;
+ uint32_t osb_cksum1; /* crc32c of the preceding fields */
+} __attribute__((packed));
+
+static int probe_mpool(blkid_probe pr, const struct blkid_idmag *mag)
+{
+ struct omf_sb_descriptor *osd;
+ uint32_t sb_crc;
+
+ osd = blkid_probe_get_sb(pr, mag, struct omf_sb_descriptor);
+ if (!osd)
+ return errno ? -errno : 1;
+
+ sb_crc = crc32c(~0L, (const void *)osd,
+ offsetof(struct omf_sb_descriptor, osb_cksum1));
+ sb_crc ^= ~0L;
+
+ if (!blkid_probe_verify_csum(pr, sb_crc, osd->osb_cksum1))
+ return 1;
+
+ blkid_probe_set_label(pr, osd->osb_name, sizeof(osd->osb_name));
+ blkid_probe_set_uuid(pr, osd->osb_poolid);
+
+ return 0;
+}
+
+/**
+ * Superblock (sb) -- magic = ASCII "mpoolDev"
+ */
+#define MPOOL_SB_MAGIC "\x6D\x70\x6f\x6f\x6c\x44\x65\x76"
+
+const struct blkid_idinfo mpool_idinfo =
+{
+ .name = "mpool",
+ .usage = BLKID_USAGE_FILESYSTEM,
+ .probefunc = probe_mpool,
+ .magics =
+ {
+ { .magic = MPOOL_SB_MAGIC, .len = 8},
+ { NULL }
+ }
+};