/src/util-linux/libblkid/src/superblocks/mpool.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (C) 2016 Micron Technology, Inc. |
3 | | * |
4 | | * This file may be redistributed under the terms of the |
5 | | * GNU Lesser General Public License. |
6 | | */ |
7 | | |
8 | | #include <stdio.h> |
9 | | #include <stdlib.h> |
10 | | #include <unistd.h> |
11 | | #include <string.h> |
12 | | #include <stdint.h> |
13 | | #include "crc32c.h" |
14 | | #include "superblocks.h" |
15 | | |
16 | | #define MAX_MPOOL_NAME_LEN 32 |
17 | | |
18 | | struct omf_sb_descriptor { |
19 | | uint64_t osb_magic; |
20 | | uint8_t osb_name[MAX_MPOOL_NAME_LEN]; |
21 | | unsigned char osb_poolid[16]; /* UUID of pool this drive belongs to */ |
22 | | uint16_t osb_vers; |
23 | | uint32_t osb_gen; |
24 | | uint32_t osb_cksum1; /* crc32c of the preceding fields */ |
25 | | } __attribute__((packed)); |
26 | | |
27 | | static int probe_mpool(blkid_probe pr, const struct blkid_idmag *mag) |
28 | 112 | { |
29 | 112 | const struct omf_sb_descriptor *osd; |
30 | 112 | uint32_t sb_crc; |
31 | | |
32 | 112 | osd = blkid_probe_get_sb(pr, mag, struct omf_sb_descriptor); |
33 | 112 | if (!osd) |
34 | 0 | return errno ? -errno : 1; |
35 | | |
36 | 112 | sb_crc = crc32c(~0L, (const void *)osd, |
37 | 112 | offsetof(struct omf_sb_descriptor, osb_cksum1)); |
38 | 112 | sb_crc ^= ~0L; |
39 | | |
40 | 112 | if (!blkid_probe_verify_csum(pr, sb_crc, le32_to_cpu(osd->osb_cksum1))) |
41 | 111 | return 1; |
42 | | |
43 | 1 | blkid_probe_set_label(pr, osd->osb_name, sizeof(osd->osb_name)); |
44 | 1 | blkid_probe_set_uuid(pr, osd->osb_poolid); |
45 | | |
46 | 1 | return 0; |
47 | 112 | } |
48 | | |
49 | | /* "mpoolDev" in ASCII */ |
50 | | #define MPOOL_SB_MAGIC "\x6D\x70\x6f\x6f\x6c\x44\x65\x76" |
51 | | |
52 | | const struct blkid_idinfo mpool_idinfo = |
53 | | { |
54 | | .name = "mpool", |
55 | | .usage = BLKID_USAGE_FILESYSTEM, |
56 | | .probefunc = probe_mpool, |
57 | | .magics = |
58 | | { |
59 | | { .magic = MPOOL_SB_MAGIC, .len = 8}, |
60 | | { NULL } |
61 | | } |
62 | | }; |