| /* |
| * 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" |
| |
| #define MAX_MPOOL_NAME_LEN 32 |
| |
| struct omf_sb_descriptor { |
| uint64_t osb_magic; |
| uint8_t osb_name[MAX_MPOOL_NAME_LEN]; |
| unsigned char osb_poolid[16]; /* 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, le32_to_cpu(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; |
| } |
| |
| /* "mpoolDev" in ASCII */ |
| #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 } |
| } |
| }; |