/* * Copyright (C) 2008 Karel Zak * * Inspired by libvolume_id by * Kay Sievers * * This file may be redistributed under the terms of the * GNU Lesser General Public License. */ #include #include #include #include #include #include #include #include "superblocks.h" struct promise_metadata { uint8_t sig[24]; }; #define PDC_CONFIG_OFF 0x1200 #define PDC_SIGNATURE "Promise Technology, Inc." static int probe_pdcraid(blkid_probe pr, const struct blkid_idmag *mag __attribute__((__unused__))) { size_t i; static unsigned int sectors[] = { 63, 255, 256, 16, 399, 591, 675, 735, 911, 974, 991, 951, 3087 }; uint64_t nsectors; if (pr->size < 0x40000) return 1; if (!S_ISREG(pr->mode) && !blkid_probe_is_wholedisk(pr)) return 1; nsectors = pr->size >> 9; for (i = 0; i < ARRAY_SIZE(sectors); i++) { uint64_t off; struct promise_metadata *pdc; if (nsectors < sectors[i]) return 1; off = (nsectors - sectors[i]) << 9; pdc = (struct promise_metadata *) blkid_probe_get_buffer(pr, off, sizeof(struct promise_metadata)); if (!pdc) return errno ? -errno : 1; if (memcmp(pdc->sig, PDC_SIGNATURE, sizeof(PDC_SIGNATURE) - 1) == 0) { if (blkid_probe_set_magic(pr, off, sizeof(pdc->sig), (unsigned char *) pdc->sig)) return 1; return 0; } } return 1; } const struct blkid_idinfo pdcraid_idinfo = { .name = "promise_fasttrack_raid_member", .usage = BLKID_USAGE_RAID, .probefunc = probe_pdcraid, .magics = BLKID_NONE_MAGIC };