diff --git a/Assemble.c b/Assemble.c
index d163eaa..2662261 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -662,9 +662,8 @@ static int load_devices(struct devs *devices, char *devmap,
if (strcmp(c->update, "uuid")==0 &&
ident->bitmap_fd >= 0 && !bitmap_done) {
- if (bitmap_update_uuid(ident->bitmap_fd,
- content->uuid,
- tst->ss->swapuuid) != 0)
+ copy_uuid(tst->devs->uuid, content->uuid, tst->ss->swapuuid);
+ if (tst->ss->write_bitmap(tst, dfd, UUIDUpdate))
pr_err("Could not update uuid on external bitmap.\n");
else
bitmap_done = 1;diff --git a/bitmap.c b/bitmap.c
index d21e5cc..575fcb9 100644
--- a/bitmap.c
+++ b/bitmap.c
@@ -457,23 +457,3 @@ out:
unlink(filename); /* possibly corrupted, better get rid of it */
return rv;
}
-
-int bitmap_update_uuid(int fd, int *uuid, int swap)
-{
- struct bitmap_super_s bm;
- if (lseek(fd, 0, 0) != 0)
- return 1;
- if (read(fd, &bm, sizeof(bm)) != sizeof(bm))
- return 1;
- if (bm.magic != __cpu_to_le32(BITMAP_MAGIC))
- return 1;
- copy_uuid(bm.uuid, uuid, swap);
- if (lseek(fd, 0, 0) != 0)
- return 2;
- if (write(fd, &bm, sizeof(bm)) != sizeof(bm)) {
- lseek(fd, 0, 0);
- return 2;
- }
- lseek(fd, 0, 0);
- return 0;
-}diff --git a/mdadm.h b/mdadm.h
index 97892e6..7b9bb28 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -358,6 +358,7 @@ enum bitmap_update {
NoUpdate,
NameUpdate,
NodeNumUpdate,
+ UUIDUpdate,
};
/* structures read from config file */@@ -1273,7 +1274,6 @@ extern int CreateBitmap(char *filename, int force, char uuid[16],
int major);
extern int ExamineBitmap(char *filename, int brief, struct supertype *st);
extern int Write_rules(char *rule_name);
-extern int bitmap_update_uuid(int fd, int *uuid, int swap);
extern unsigned long bitmap_sectors(struct bitmap_super_s *bsb);
extern int Dump_metadata(char *dev, char *dir, struct context *c,
struct supertype *st);
diff --git a/super0.c b/super0.c
index 6ad9d39..49267d1 100644
--- a/super0.c
+++ b/super0.c
@@ -1180,12 +1180,23 @@ static int write_bitmap0(struct supertype *st, int fd, enum bitmap_update update
unsigned long long dsize;
unsigned long long offset;
mdp_super_t *sb = st->sb;
+ bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MD_SB_BYTES);
int rv = 0;
int towrite, n;
void *buf;
+ switch (update) {
+ case UUIDUpdate:
+ memset((char *)bms->uuid, 0, sizeof(bms->uuid));
+ strncpy((char *)bms->uuid, (char *)st->devs->uuid, sizeof(bms->uuid));
+ break;
+ case NoUpdate:
+ default:
+ break;
+ }
+
if (!get_dev_size(fd, NULL, &dsize))
return 1;
diff --git a/super1.c b/super1.c
index 8128750..4ce7773 100644
--- a/super1.c
+++ b/super1.c
@@ -2232,6 +2232,10 @@ static int write_bitmap1(struct supertype *st, int fd, enum bitmap_update update
bms->nodes = __cpu_to_le32(st->nodes);
break;
+ case UUIDUpdate:
+ memset((char *)bms->uuid, 0, sizeof(bms->uuid));
+ strncpy((char *)bms->uuid, (char *)st->devs->uuid, sizeof(bms->uuid));
+ break;
case NoUpdate:
default:
break;