Add default Smack manifest for util-linux-ng.spec
[framework/base/util-linux-ng.git] / libblkid / src / superblocks / nvidia_raid.c
1 /*
2  * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
3  * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
4  *
5  * Inspired by libvolume_id by
6  *     Kay Sievers <kay.sievers@vrfy.org>
7  *
8  * This file may be redistributed under the terms of the
9  * GNU Lesser General Public License.
10  */
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14 #include <string.h>
15 #include <stdint.h>
16
17 #include "superblocks.h"
18
19 struct nv_metadata {
20         uint8_t         vendor[8];
21         uint32_t        size;
22         uint32_t        chksum;
23         uint16_t        version;
24 } __attribute__((packed));
25
26 #define NVIDIA_SIGNATURE                "NVIDIA"
27
28 static int probe_nvraid(blkid_probe pr,
29                 const struct blkid_idmag *mag __attribute__((__unused__)))
30 {
31         uint64_t off;
32         struct nv_metadata *nv;
33
34         if (pr->size < 0x10000)
35                 return -1;
36         if (!S_ISREG(pr->mode) && !blkid_probe_is_wholedisk(pr))
37                 return -1;
38
39         off = ((pr->size / 0x200) - 2) * 0x200;
40         nv = (struct nv_metadata *)
41                 blkid_probe_get_buffer(pr,
42                                 off,
43                                 sizeof(struct nv_metadata));
44         if (!nv)
45                 return -1;
46
47         if (memcmp(nv->vendor, NVIDIA_SIGNATURE, sizeof(NVIDIA_SIGNATURE)-1) != 0)
48                 return -1;
49         if (blkid_probe_sprintf_version(pr, "%u", le16_to_cpu(nv->version)) != 0)
50                 return -1;
51         if (blkid_probe_set_magic(pr, off, sizeof(nv->vendor),
52                                 (unsigned char *) nv->vendor))
53                 return -1;
54         return 0;
55 }
56
57 const struct blkid_idinfo nvraid_idinfo = {
58         .name           = "nvidia_raid_member",
59         .usage          = BLKID_USAGE_RAID,
60         .probefunc      = probe_nvraid,
61         .magics         = BLKID_NONE_MAGIC
62 };
63
64