From: Neil Brown Date: Tue, 16 May 2006 06:05:27 +0000 (+0000) Subject: When updating uuid, update the bitmap as well - external bitmaps X-Git-Tag: mdadm-2.5~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8131b493df02ad22c8600f4c99d97003a807e5a7;p=thirdparty%2Fmdadm.git When updating uuid, update the bitmap as well - external bitmaps Signed-off-by: Neil Brown --- diff --git a/Assemble.c b/Assemble.c index a856456c..897c33f0 100644 --- a/Assemble.c +++ b/Assemble.c @@ -308,6 +308,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, devname); if (dfd >= 0) close(dfd); + + if (strcmp(update, "uuid")==0 && + ident->bitmap_fd) + bitmap_update_uuid(ident->bitmap_fd, info.uuid); } if (verbose > 0) diff --git a/ChangeLog b/ChangeLog index a6047ac0..fe22413a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,8 @@ Changes Prior to this release mode and auto-flag - --detail checks if array has been started or not and includes that in report. + - When using --update=uuid on an array with a bitmap, update the + bitmap's uuid too. Changes Prior to 2.4.1 release - Honour --write-mostly when adding to an array without persistent diff --git a/bitmap.c b/bitmap.c index 75492f75..8210278f 100644 --- a/bitmap.c +++ b/bitmap.c @@ -398,3 +398,17 @@ out: unlink(filename); /* possibly corrupted, better get rid of it */ return rv; } + +void bitmap_update_uuid(int fd, int *uuid) +{ + struct bitmap_super_s bm; + lseek(fd, 0, 0); + if (read(fd, &bm, sizeof(bm)) != sizeof(bm)) + return; + if (bm.magic != __cpu_to_le32(BITMAP_MAGIC)) + return; + memcpy(bm.uuid, uuid, 16); + lseek(fd, 0, 0); + write(fd, &bm, sizeof(bm)); + lseek(fd, 0, 0); +} diff --git a/mdadm.h b/mdadm.h index c53f9e91..70aa1508 100644 --- a/mdadm.h +++ b/mdadm.h @@ -361,6 +361,7 @@ extern int CreateBitmap(char *filename, int force, char uuid[16], unsigned long long array_size, int major); extern int ExamineBitmap(char *filename, int brief, struct supertype *st); +extern void bitmap_update_uuid(int fd, int *uuid); extern int md_get_version(int fd); extern int get_linux_version(void);