/* * 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" enum { DRBD_VERSION_08, DRBD_VERSION_09, }; /* * drbd/drbd_int.h */ #define BM_BLOCK_SHIFT 12 /* 4k per bit */ #define BM_BLOCK_SIZE (1<device_uuid), "%" PRIx64, be64_to_cpu(read_unaligned_member(md, device_uuid))); blkid_probe_set_version(pr, "v08"); return 0; } static int probe_drbd_90(blkid_probe pr, const struct blkid_idmag *mag) { const struct meta_data_on_disk_9 *md; md = blkid_probe_get_sb(pr, mag, struct meta_data_on_disk_9); if (!md) return errno ? -errno : 1; if (be32_to_cpu(read_unaligned_member(md, bm_bytes_per_bit)) != BM_BLOCK_SIZE) return 1; if (!is_zero_padded(member_ptr(md, padding_start), member_ptr(md, padding_end))) 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, member_ptr(md, device_uuid), sizeof(md->device_uuid), "%" PRIx64, be64_to_cpu(read_unaligned_member(md, device_uuid))); blkid_probe_set_version(pr, "v09"); return 0; } static int probe_drbd(blkid_probe pr, const struct blkid_idmag *mag) { if (mag->hint == DRBD_VERSION_08) return probe_drbd_84(pr, mag); if (mag->hint == DRBD_VERSION_09) return probe_drbd_90(pr, mag); return 1; } const struct blkid_idinfo drbd_idinfo = { .name = "drbd", .usage = BLKID_USAGE_RAID, .probefunc = probe_drbd, /* * Smaller ones are certainly not DRBD9 devices. * Recent utils even refuse to generate larger ones, * keep this as a sufficient lower bound. */ .minsz = 0x10000, .magics = { { .magic = DRBD_MD_MAGIC_08, .len = sizeof(DRBD_MD_MAGIC_08) - 1, .hint = DRBD_VERSION_08, .kboff = -(DRBD_MD_OFFSET >> 10), .sboff = offsetof(struct md_on_disk_08, magic), }, { .magic = DRBD_MD_MAGIC_84_UNCLEAN, .len = sizeof(DRBD_MD_MAGIC_84_UNCLEAN) - 1, .hint = DRBD_VERSION_08, .kboff = -(DRBD_MD_OFFSET >> 10), .sboff = offsetof(struct md_on_disk_08, magic), }, { .magic = DRBD_MD_MAGIC_09, .len = sizeof(DRBD_MD_MAGIC_09) - 1, .hint = DRBD_VERSION_09, .kboff = -(DRBD_MD_OFFSET >> 10), .sboff = offsetof(struct meta_data_on_disk_9, magic), }, { NULL } } };