From 2dc8cfb9a8082c040305b2a73763a451c28cf44d Mon Sep 17 00:00:00 2001 From: Philipp Marek Date: Tue, 18 Aug 2015 14:07:49 +0200 Subject: [PATCH] libblkid: added drbdmanage control volume detection. Signed-off-by: Karel Zak --- libblkid/src/Makemodule.am | 1 + libblkid/src/superblocks/drbdmanage.c | 92 ++++++++++++++++++ libblkid/src/superblocks/superblocks.c | 1 + libblkid/src/superblocks/superblocks.h | 1 + .../blkid/low-probe-drbdmanage-control-volume | 5 + .../drbdmanage-control-volume.img.bz2 | Bin 0 -> 2001 bytes 6 files changed, 100 insertions(+) create mode 100644 libblkid/src/superblocks/drbdmanage.c create mode 100644 tests/expected/blkid/low-probe-drbdmanage-control-volume create mode 100644 tests/ts/blkid/images-fs/drbdmanage-control-volume.img.bz2 diff --git a/libblkid/src/Makemodule.am b/libblkid/src/Makemodule.am index 7682958fe5..52d0b0a7b7 100644 --- a/libblkid/src/Makemodule.am +++ b/libblkid/src/Makemodule.am @@ -52,6 +52,7 @@ libblkid_la_SOURCES = \ libblkid/src/superblocks/ddf_raid.c \ libblkid/src/superblocks/drbd.c \ libblkid/src/superblocks/drbdproxy_datalog.c \ + libblkid/src/superblocks/drbdmanage.c \ libblkid/src/superblocks/exfat.c \ libblkid/src/superblocks/ext.c \ libblkid/src/superblocks/f2fs.c \ diff --git a/libblkid/src/superblocks/drbdmanage.c b/libblkid/src/superblocks/drbdmanage.c new file mode 100644 index 0000000000..ee841423f1 --- /dev/null +++ b/libblkid/src/superblocks/drbdmanage.c @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2015 by Philipp Marek + * + * This file may be redistributed under the terms of the + * GNU Lesser General Public License. + * + * DRBD is a blocklevel replication solution in the Linux kernel, + * upstream since 2.6.33. (See http://drbd.linbit.com/) + * DRBDmanage is a configuration frontend that assists in + * creating/deleting/modifying DRBD resources across multiple machines + * (a DRBDmanage "cluster"); this file detects its control volume, + * which is replicated (via DRBD 9) on some of the nodes. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "superblocks.h" + +struct drbdmanage_hdr { + unsigned char magic[11]; + unsigned char uuid[32]; + unsigned char lf; +} __attribute__ ((packed)); + +struct drbdmanage_pers { + char magic[4]; + uint32_t version_le; +} __attribute__ ((packed)); + + +const char persistence_magic[4] = "\x1a\xdb\x98\xa2"; + + +static int probe_drbdmanage(blkid_probe pr, + const struct blkid_idmag *mag __attribute__((__unused__))) +{ + struct drbdmanage_hdr *hdr; + unsigned char *cp; + struct drbdmanage_pers *prs; + char persistence_version[10]; + int l; + + + hdr = (struct drbdmanage_hdr*) + blkid_probe_get_buffer(pr, 0, sizeof(*hdr)); + if (!hdr) + return errno ? -errno : 1; + + for(cp=hdr->uuid; cp<&hdr->lf; cp++) + if (!isxdigit(*cp)) + return 1; + if (hdr->lf != '\n') + return 1; + + if (blkid_probe_set_id_label(pr, "UUID", + hdr->uuid, sizeof(hdr->uuid))) + return errno ? -errno : 1; + + prs = (struct drbdmanage_pers*) + blkid_probe_get_buffer(pr, 0x1000, sizeof(*prs)); + if (!prs) + return errno ? -errno : 1; + + if (memcmp(prs->magic, persistence_magic, sizeof(prs->magic)) == 0) { + l = sprintf(persistence_version, "%d", + be32toh(prs->version_le)); + blkid_probe_set_value(pr, "PERSISTENCE_VERSION", + persistence_version, l); + } + + return 0; +} + + +const struct blkid_idinfo drbdmanage_idinfo = +{ + .name = "drbdmanage_control_volume", + .usage = BLKID_USAGE_OTHER, + .probefunc = probe_drbdmanage, + .minsz = 64 * 1024, + .magics = { + { .magic = "$DRBDmgr=q", .len = 10, .sboff = 0 }, + }, +}; + diff --git a/libblkid/src/superblocks/superblocks.c b/libblkid/src/superblocks/superblocks.c index 334d673048..0d970f1341 100644 --- a/libblkid/src/superblocks/superblocks.c +++ b/libblkid/src/superblocks/superblocks.c @@ -103,6 +103,7 @@ static const struct blkid_idinfo *idinfos[] = &bcache_idinfo, &drbd_idinfo, + &drbdmanage_idinfo, &drbdproxy_datalog_idinfo, &lvm2_idinfo, &lvm1_idinfo, diff --git a/libblkid/src/superblocks/superblocks.h b/libblkid/src/superblocks/superblocks.h index 238a9ff1b3..79dba1a3cf 100644 --- a/libblkid/src/superblocks/superblocks.h +++ b/libblkid/src/superblocks/superblocks.h @@ -68,6 +68,7 @@ extern const struct blkid_idinfo bfs_idinfo; extern const struct blkid_idinfo vmfs_volume_idinfo; extern const struct blkid_idinfo vmfs_fs_idinfo; extern const struct blkid_idinfo drbd_idinfo; +extern const struct blkid_idinfo drbdmanage_idinfo; extern const struct blkid_idinfo drbdproxy_datalog_idinfo; extern const struct blkid_idinfo befs_idinfo; extern const struct blkid_idinfo nilfs2_idinfo; diff --git a/tests/expected/blkid/low-probe-drbdmanage-control-volume b/tests/expected/blkid/low-probe-drbdmanage-control-volume new file mode 100644 index 0000000000..9f23bfcf83 --- /dev/null +++ b/tests/expected/blkid/low-probe-drbdmanage-control-volume @@ -0,0 +1,5 @@ +ID_FS_PERSISTENCE_VERSION=1 +ID_FS_TYPE=drbdmanage_control_volume +ID_FS_USAGE=other +ID_FS_UUID=8765f402dcb246529acee269b0ba8f2e +ID_FS_UUID_ENC=8765f402dcb246529acee269b0ba8f2e diff --git a/tests/ts/blkid/images-fs/drbdmanage-control-volume.img.bz2 b/tests/ts/blkid/images-fs/drbdmanage-control-volume.img.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6979055449e8d393e6e82c1e392c8edf7d0c60bd GIT binary patch literal 2001 zc-jHc2QK(RT4*^jL0KkKSrzxk8vudd|Fivc6dHg3|Nr;9+z`t%tXN#Fj6Xk#Ks9g{V6@ul=QLsVLj|y$d|Dt zBw0S2N*@f*v!V2OJUK6xAC!wqu2HX_GiQ?;J9XifaW)~t*bB{xVBV4s4R_MBo5w36 zHPMEC)Vhi&f`VgXK4oqO_P;$ixfdkxBQgPI0BHcGi6odL)`qoqCQ@~^8mopm5gZOu zbP8Wg;w*uWers699%&uqY+EcF7RFO*l@w`s>_kLGn|847HJ*$@>=1(3;~cLB&f&-M z`4d3irjpUJyXI>aZcfxnOm;nM+6;fsezjFol*c@DkuNhM=)?_&dj=)S8}+kf*~YuK z+ATL}pS->_<9m&xQfEYh)}F?FQzj~7bdd?Tb#4f}N0h+M#$y&*V`R@bb-o(4^X~KK zg^@!{gB#duXx0}lk9bHGMJ~m##hqcGpRFN;;NhF8%9!D# zr`%eVG6@_(mr*-ZgYZ-V6I_vk)eDABX4dy0by4C8p0F2NoC0X0EgK?#ECpK81->FU z#y~LRoM1Nz$t}&rel51P)`r&ui}^4ZdfpB09vvrj-0YDQ<~36T2#0D}?`hM{0K0*L zl7$%xL3kryJ48WHH*X9e$liilB$8T766LH*fLKz50jpBAMUAct7CFBqs}JC447TF2 zDHAGaMGm5b_J6&RR+BWqCy+C)ytVM6JMEKd>tTw6f^?42tGq8NrFrRMgAa7<+=J7m#jwp?9iBHxHY}JT zDU6{*UmLJeU0%rXW%#e+2&~OUX%8!ylMY_zB#|+tjDy@TdCXfryVC2aEY}s-Bh47^ z;+0{6Yi{xB0{YMa;6suvTMOo(VOqrSZ#fxE10|T2vVGo*}CfJ)zu13*5Y0@s>!vnZmfuiP$*=n>C6)V zZa0uDOFeVGriQaJgp#Kn$w&HWb!!NEkV{{v$(Iccf#lF*o#6udW z2y|*~rxT^oWi(#97qGY+orokfs=jy%MVag*-PE5*RtRYZ^m2%3Ii+*vhs5iTA)Exs zjGJC=^(PV&`7lOp%AEW1- z8~HlLOR(GR0y)>}4|~cKsL86OXi*NB2d&3wG|?&s-wT^^EkR4E%Hr{9+zLCuZLc2$dHi{5fKpqnj#`1 zBt<#MZt}v`GG@*^m-mmJKo-woUQ;&^AyIktOw19fjdB~5Ap>82ON)D%LaGOd2`QLF zz0p0wQGNIc1c{~r)e*VgL85_1;SEZ+WgW4;b7tADw%5xtbj?@_Lcsw81p6j6UxB9C zv`8S@)5>z48+)4f@;4wV$0jVn(ax zFjNFKTxdW?UfG;$ycKC(FhyNo#ubah2Mn zLnqe>8|CKizY1Ky(`_`=zN$qwQo>eN?MMR9rl-vfvh^@+);emaLam0KlRc;?8n1vX z%p`oRM1^spqh}@ghHMaM!=T^Ybd?jw(DAs3j&Li zfFRU?Yf?b+ogjeHKl9bm!T!-6|Bm5|JVz8rkxKeM6Yvo+5Wb^ek}?L^(cz+liH`o{ ja#_{d<%pcRV;^O7bYVIg5&