/* * Copyright (C) 2009 by Bastian Friedrich * * This file may be redistributed under the terms of the * GNU Lesser General Public License. * * defines, structs taken from drbd source; file names represent drbd source * files. */ #include #include #include #include #include #include #include #include #include "superblocks.h" /* * drbd/linux/drbd.h */ #define DRBD_MAGIC 0x83740267 /* * user/drbdmeta.c * We only support v08 for now */ #define DRBD_MD_MAGIC_08 (DRBD_MAGIC+4) #define DRBD_MD_MAGIC_84_UNCLEAN (DRBD_MAGIC+5) /* * drbd/linux/drbd.h */ enum drbd_uuid_index { UI_CURRENT, UI_BITMAP, UI_HISTORY_START, UI_HISTORY_END, UI_SIZE, /* nl-packet: number of dirty bits */ UI_FLAGS, /* nl-packet: flags */ UI_EXTENDED_SIZE /* Everything. */ }; /* * user/drbdmeta.c * Minor modifications wrt. types */ struct md_on_disk_08 { uint64_t la_sect; /* last agreed size. */ uint64_t uuid[UI_SIZE]; /* UUIDs */ uint64_t device_uuid; uint64_t reserved_u64_1; uint32_t flags; uint32_t magic; uint32_t md_size_sect; int32_t al_offset; /* signed sector offset to this block */ uint32_t al_nr_extents; /* important for restoring the AL */ int32_t bm_offset; /* signed sector offset to the bitmap, from here */ uint32_t bm_bytes_per_bit; uint32_t reserved_u32[4]; char reserved[8 * 512 - (8*(UI_SIZE+3)+4*11)]; }; static int probe_drbd(blkid_probe pr, const struct blkid_idmag *mag __attribute__((__unused__))) { struct md_on_disk_08 *md; off_t off; off = pr->size - sizeof(*md); /* Small devices cannot be drbd (?) */ if (pr->size < 0x10000) return -1; md = (struct md_on_disk_08 *) blkid_probe_get_buffer(pr, off, sizeof(struct md_on_disk_08)); if (!md) return -1; if (be32_to_cpu(md->magic) != DRBD_MD_MAGIC_08 && be32_to_cpu(md->magic) != DRBD_MD_MAGIC_84_UNCLEAN) return -1; /* * DRBD does not have "real" uuids; the following resembles DRBD's * notion of uuids (64 bit, see struct above) */ blkid_probe_sprintf_uuid(pr, (unsigned char *) &md->device_uuid, sizeof(md->device_uuid), "%" PRIx64, be64_to_cpu(md->device_uuid)); blkid_probe_set_version(pr, "v08"); if (blkid_probe_set_magic(pr, off + offsetof(struct md_on_disk_08, magic), sizeof(md->magic), (unsigned char *) &md->magic)) return -1; return 0; } const struct blkid_idinfo drbd_idinfo = { .name = "drbd", .usage = BLKID_USAGE_RAID, .probefunc = probe_drbd, .magics = BLKID_NONE_MAGIC };