Make sure homehost is set correctly when --update=uuid
Signed-off-by: Neil Brown <neilb@suse.de>
This commit is contained in:
parent
a1cbd7d053
commit
e5eac01f3d
19
Assemble.c
19
Assemble.c
|
@ -33,7 +33,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
mddev_ident_t ident, char *conffile,
|
mddev_ident_t ident, char *conffile,
|
||||||
mddev_dev_t devlist, char *backup_file,
|
mddev_dev_t devlist, char *backup_file,
|
||||||
int readonly, int runstop,
|
int readonly, int runstop,
|
||||||
char *update,
|
char *update, char *homehost,
|
||||||
int verbose, int force)
|
int verbose, int force)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -294,11 +294,16 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
*(__u32*)(ident->uuid+3) = random();
|
*(__u32*)(ident->uuid+3) = random();
|
||||||
}
|
}
|
||||||
if (rfd >= 0) close(rfd);
|
if (rfd >= 0) close(rfd);
|
||||||
ident->uuid_set = 1;
|
|
||||||
}
|
}
|
||||||
memcpy(info.uuid, ident->uuid, 16);
|
memcpy(info.uuid, ident->uuid, 16);
|
||||||
st->ss->update_super(&info, super, update, devname, verbose);
|
strcpy(info.name, ident->name);
|
||||||
|
st->ss->update_super(&info, super, update, devname, verbose,
|
||||||
|
ident->uuid_set, homehost);
|
||||||
|
if (strcmp(update, "uuid")==0 &&
|
||||||
|
!ident->uuid_set) {
|
||||||
|
ident->uuid_set = 1;
|
||||||
|
memcpy(ident->uuid, info.uuid, 16);
|
||||||
|
}
|
||||||
dfd = dev_open(devname, O_RDWR|O_EXCL);
|
dfd = dev_open(devname, O_RDWR|O_EXCL);
|
||||||
if (dfd < 0)
|
if (dfd < 0)
|
||||||
fprintf(stderr, Name ": Cannot open %s for superblock update\n",
|
fprintf(stderr, Name ": Cannot open %s for superblock update\n",
|
||||||
|
@ -451,7 +456,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
info.events = devices[most_recent].events;
|
info.events = devices[most_recent].events;
|
||||||
st->ss->update_super(&info, super, "force", devices[chosen_drive].devname, verbose);
|
st->ss->update_super(&info, super, "force", devices[chosen_drive].devname, verbose, 0, NULL);
|
||||||
|
|
||||||
if (st->ss->store_super(st, fd, super)) {
|
if (st->ss->store_super(st, fd, super)) {
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@ -522,7 +527,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
info.disk.state = desired_state;
|
info.disk.state = desired_state;
|
||||||
|
|
||||||
if (devices[j].uptodate &&
|
if (devices[j].uptodate &&
|
||||||
st->ss->update_super(&info, super, "assemble", NULL, verbose)) {
|
st->ss->update_super(&info, super, "assemble", NULL, verbose, 0, NULL)) {
|
||||||
if (force) {
|
if (force) {
|
||||||
if (verbose >= 0)
|
if (verbose >= 0)
|
||||||
fprintf(stderr, Name ": "
|
fprintf(stderr, Name ": "
|
||||||
|
@ -547,7 +552,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
if (force && okcnt == info.array.raid_disks-1) {
|
if (force && okcnt == info.array.raid_disks-1) {
|
||||||
/* FIXME check event count */
|
/* FIXME check event count */
|
||||||
change += st->ss->update_super(&info, super, "force",
|
change += st->ss->update_super(&info, super, "force",
|
||||||
devices[chosen_drive].devname, verbose);
|
devices[chosen_drive].devname, verbose, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (change) {
|
if (change) {
|
||||||
|
|
|
@ -98,7 +98,7 @@ int Examine(mddev_dev_t devlist, int brief, int scan,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SparcAdjust)
|
if (SparcAdjust)
|
||||||
st->ss->update_super(NULL, super, "sparc2.2", devlist->devname, 0);
|
st->ss->update_super(NULL, super, "sparc2.2", devlist->devname, 0, 0, NULL);
|
||||||
/* Ok, its good enough to try, though the checksum could be wrong */
|
/* Ok, its good enough to try, though the checksum could be wrong */
|
||||||
if (brief) {
|
if (brief) {
|
||||||
struct array *ap;
|
struct array *ap;
|
||||||
|
|
6
Grow.c
6
Grow.c
|
@ -121,7 +121,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
|
||||||
info.disk.minor = minor(stb.st_rdev);
|
info.disk.minor = minor(stb.st_rdev);
|
||||||
info.disk.raid_disk = d;
|
info.disk.raid_disk = d;
|
||||||
info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
|
info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
|
||||||
st->ss->update_super(&info, super, "grow", newdev, 0);
|
st->ss->update_super(&info, super, "grow", newdev, 0, 0, NULL);
|
||||||
|
|
||||||
if (st->ss->store_super(st, nfd, super)) {
|
if (st->ss->store_super(st, nfd, super)) {
|
||||||
fprintf(stderr, Name ": Cannot store new superblock on %s\n", newdev);
|
fprintf(stderr, Name ": Cannot store new superblock on %s\n", newdev);
|
||||||
|
@ -179,7 +179,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
|
||||||
info.disk.minor = minor(stb.st_rdev);
|
info.disk.minor = minor(stb.st_rdev);
|
||||||
info.disk.raid_disk = nd;
|
info.disk.raid_disk = nd;
|
||||||
info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
|
info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
|
||||||
st->ss->update_super(&info, super, "grow", dv, 0);
|
st->ss->update_super(&info, super, "grow", dv, 0, 0, NULL);
|
||||||
|
|
||||||
if (st->ss->store_super(st, fd2, super)) {
|
if (st->ss->store_super(st, fd2, super)) {
|
||||||
fprintf(stderr, Name ": Cannot store new superblock on %s\n", dv);
|
fprintf(stderr, Name ": Cannot store new superblock on %s\n", dv);
|
||||||
|
@ -948,7 +948,7 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist, int cnt
|
||||||
continue;
|
continue;
|
||||||
st->ss->getinfo_super(&dinfo, super);
|
st->ss->getinfo_super(&dinfo, super);
|
||||||
dinfo.reshape_progress = __le64_to_cpu(bsb.length);
|
dinfo.reshape_progress = __le64_to_cpu(bsb.length);
|
||||||
st->ss->update_super(&dinfo, super, "_reshape_progress",NULL,0);
|
st->ss->update_super(&dinfo, super, "_reshape_progress",NULL,0, 0, NULL);
|
||||||
st->ss->store_super(st, fdlist[j], super);
|
st->ss->store_super(st, fdlist[j], super);
|
||||||
free(super);
|
free(super);
|
||||||
}
|
}
|
||||||
|
|
8
mdadm.c
8
mdadm.c
|
@ -939,14 +939,14 @@ int main(int argc, char *argv[])
|
||||||
else {
|
else {
|
||||||
rv |= Assemble(ss, devlist->devname, mdfd, array_ident, configfile,
|
rv |= Assemble(ss, devlist->devname, mdfd, array_ident, configfile,
|
||||||
NULL, backup_file,
|
NULL, backup_file,
|
||||||
readonly, runstop, update, verbose-quiet, force);
|
readonly, runstop, update, homehost, verbose-quiet, force);
|
||||||
close(mdfd);
|
close(mdfd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!scan)
|
} else if (!scan)
|
||||||
rv = Assemble(ss, devlist->devname, mdfd, &ident, configfile,
|
rv = Assemble(ss, devlist->devname, mdfd, &ident, configfile,
|
||||||
devlist->next, backup_file,
|
devlist->next, backup_file,
|
||||||
readonly, runstop, update, verbose-quiet, force);
|
readonly, runstop, update, homehost, verbose-quiet, force);
|
||||||
else if (devs_found>0) {
|
else if (devs_found>0) {
|
||||||
if (update && devs_found > 1) {
|
if (update && devs_found > 1) {
|
||||||
fprintf(stderr, Name ": can only update a single array at a time\n");
|
fprintf(stderr, Name ": can only update a single array at a time\n");
|
||||||
|
@ -972,7 +972,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
rv |= Assemble(ss, dv->devname, mdfd, array_ident, configfile,
|
rv |= Assemble(ss, dv->devname, mdfd, array_ident, configfile,
|
||||||
NULL, backup_file,
|
NULL, backup_file,
|
||||||
readonly, runstop, update, verbose-quiet, force);
|
readonly, runstop, update, homehost, verbose-quiet, force);
|
||||||
close(mdfd);
|
close(mdfd);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1004,7 +1004,7 @@ int main(int argc, char *argv[])
|
||||||
rv |= Assemble(ss, array_list->devname, mdfd,
|
rv |= Assemble(ss, array_list->devname, mdfd,
|
||||||
array_list, configfile,
|
array_list, configfile,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
readonly, runstop, NULL, verbose-quiet, force);
|
readonly, runstop, NULL, homehost, verbose-quiet, force);
|
||||||
close(mdfd);
|
close(mdfd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
6
mdadm.h
6
mdadm.h
|
@ -278,7 +278,9 @@ extern struct superswitch {
|
||||||
void (*brief_detail_super)(void *sbv);
|
void (*brief_detail_super)(void *sbv);
|
||||||
void (*uuid_from_super)(int uuid[4], void *sbv);
|
void (*uuid_from_super)(int uuid[4], void *sbv);
|
||||||
void (*getinfo_super)(struct mdinfo *info, void *sbv);
|
void (*getinfo_super)(struct mdinfo *info, void *sbv);
|
||||||
int (*update_super)(struct mdinfo *info, void *sbv, char *update, char *devname, int verbose);
|
int (*update_super)(struct mdinfo *info, void *sbv, char *update,
|
||||||
|
char *devname, int verbose,
|
||||||
|
int uuid_set, char *homehost);
|
||||||
__u64 (*event_super)(void *sbv);
|
__u64 (*event_super)(void *sbv);
|
||||||
int (*init_super)(struct supertype *st, void **sbp, mdu_array_info_t *info, unsigned long long size, char *name, char *homehost);
|
int (*init_super)(struct supertype *st, void **sbp, mdu_array_info_t *info, unsigned long long size, char *name, char *homehost);
|
||||||
void (*add_to_super)(void *sbv, mdu_disk_info_t *dinfo);
|
void (*add_to_super)(void *sbv, mdu_disk_info_t *dinfo);
|
||||||
|
@ -342,7 +344,7 @@ extern int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
char *conffile,
|
char *conffile,
|
||||||
mddev_dev_t devlist, char *backup_file,
|
mddev_dev_t devlist, char *backup_file,
|
||||||
int readonly, int runstop,
|
int readonly, int runstop,
|
||||||
char *update,
|
char *update, char *homehost,
|
||||||
int verbose, int force);
|
int verbose, int force);
|
||||||
|
|
||||||
extern int Build(char *mddev, int mdfd, int chunk, int level, int layout,
|
extern int Build(char *mddev, int mdfd, int chunk, int level, int layout,
|
||||||
|
|
10
super0.c
10
super0.c
|
@ -334,7 +334,9 @@ static void getinfo_super0(struct mdinfo *info, void *sbv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int update_super0(struct mdinfo *info, void *sbv, char *update, char *devname, int verbose)
|
static int update_super0(struct mdinfo *info, void *sbv, char *update,
|
||||||
|
char *devname, int verbose,
|
||||||
|
int uuid_set, char *homehost)
|
||||||
{
|
{
|
||||||
/* NOTE: for 'assemble' and 'force' we need to return non-zero if any change was made.
|
/* NOTE: for 'assemble' and 'force' we need to return non-zero if any change was made.
|
||||||
* For others, the return value is ignored.
|
* For others, the return value is ignored.
|
||||||
|
@ -441,6 +443,12 @@ static int update_super0(struct mdinfo *info, void *sbv, char *update, char *dev
|
||||||
sb->recovery_cp = 0;
|
sb->recovery_cp = 0;
|
||||||
}
|
}
|
||||||
if (strcmp(update, "uuid") == 0) {
|
if (strcmp(update, "uuid") == 0) {
|
||||||
|
if (!uuid_set && homehost) {
|
||||||
|
unsigned char *hash = SHA1((unsigned char*)homehost,
|
||||||
|
strlen(homehost),
|
||||||
|
NULL);
|
||||||
|
memcpy(info->uuid+2, hash, 8);
|
||||||
|
}
|
||||||
sb->set_uuid0 = info->uuid[0];
|
sb->set_uuid0 = info->uuid[0];
|
||||||
sb->set_uuid1 = info->uuid[1];
|
sb->set_uuid1 = info->uuid[1];
|
||||||
sb->set_uuid2 = info->uuid[2];
|
sb->set_uuid2 = info->uuid[2];
|
||||||
|
|
4
super1.c
4
super1.c
|
@ -434,7 +434,9 @@ static void getinfo_super1(struct mdinfo *info, void *sbv)
|
||||||
info->array.working_disks = working;
|
info->array.working_disks = working;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update_super1(struct mdinfo *info, void *sbv, char *update, char *devname, int verbose)
|
static int update_super1(struct mdinfo *info, void *sbv, char *update,
|
||||||
|
char *devname, int verbose,
|
||||||
|
int uuid_set, char *homehost)
|
||||||
{
|
{
|
||||||
/* NOTE: for 'assemble' and 'force' we need to return non-zero if any change was made.
|
/* NOTE: for 'assemble' and 'force' we need to return non-zero if any change was made.
|
||||||
* For others, the return value is ignored.
|
* For others, the return value is ignored.
|
||||||
|
|
Loading…
Reference in New Issue