Monitor: support spare-group manipulation for 1.x metadata.
The code for moving spares around a spare-group currently only works for 0.90 metadata. Generalise it for 1.x metadata as well. Reported-by: "Garth Snyder" <garth@grsweb.us> Signed-off-by NeilBrown <neilb@suse.de>
This commit is contained in:
parent
6957819fe6
commit
c7b474474c
8
Manage.c
8
Manage.c
|
@ -292,11 +292,15 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
} else {
|
} else {
|
||||||
j = 0;
|
j = 0;
|
||||||
|
|
||||||
if (stat(dv->devname, &stb)) {
|
tfd = dev_open(dv->devname, O_RDONLY);
|
||||||
|
if (tfd < 0 || fstat(tfd, &stb) != 0) {
|
||||||
fprintf(stderr, Name ": cannot find %s: %s\n",
|
fprintf(stderr, Name ": cannot find %s: %s\n",
|
||||||
dv->devname, strerror(errno));
|
dv->devname, strerror(errno));
|
||||||
|
if (tfd >= 0)
|
||||||
|
close(tfd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
close(tfd);
|
||||||
if ((stb.st_mode & S_IFMT) != S_IFBLK) {
|
if ((stb.st_mode & S_IFMT) != S_IFBLK) {
|
||||||
fprintf(stderr, Name ": %s is not a "
|
fprintf(stderr, Name ": %s is not a "
|
||||||
"block device.\n",
|
"block device.\n",
|
||||||
|
@ -313,7 +317,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
/* add the device */
|
/* add the device */
|
||||||
|
|
||||||
/* Make sure it isn't in use (in 2.6 or later) */
|
/* Make sure it isn't in use (in 2.6 or later) */
|
||||||
tfd = open(dv->devname, O_RDONLY|O_EXCL);
|
tfd = dev_open(dv->devname, O_RDONLY|O_EXCL);
|
||||||
if (tfd < 0) {
|
if (tfd < 0) {
|
||||||
fprintf(stderr, Name ": Cannot open %s: %s\n",
|
fprintf(stderr, Name ": Cannot open %s: %s\n",
|
||||||
dv->devname, strerror(errno));
|
dv->devname, strerror(errno));
|
||||||
|
|
19
Monitor.c
19
Monitor.c
|
@ -470,16 +470,25 @@ int Monitor(mddev_dev_t devlist,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dev > 0) {
|
if (dev > 0) {
|
||||||
if (ioctl(fd2, HOT_REMOVE_DISK,
|
struct mddev_dev_s devlist;
|
||||||
(unsigned long)dev) == 0) {
|
char devname[20];
|
||||||
if (ioctl(fd1, HOT_ADD_DISK,
|
devlist.next = NULL;
|
||||||
(unsigned long)dev) == 0) {
|
devlist.used = 0;
|
||||||
|
devlist.re_add = 0;
|
||||||
|
devlist.writemostly = 0;
|
||||||
|
devlist.devname = devname;
|
||||||
|
sprintf(devname, "%d:%d", major(dev), minor(dev));
|
||||||
|
|
||||||
|
devlist.disposition = 'r';
|
||||||
|
if (Manage_subdevs(st2->devname, fd2, &devlist, -1) == 0) {
|
||||||
|
devlist.disposition = 'a';
|
||||||
|
if (Manage_subdevs(st->devname, fd1, &devlist, -1) == 0) {
|
||||||
alert("MoveSpare", st->devname, st2->devname, mailaddr, mailfrom, alert_cmd, dosyslog);
|
alert("MoveSpare", st->devname, st2->devname, mailaddr, mailfrom, alert_cmd, dosyslog);
|
||||||
close(fd1);
|
close(fd1);
|
||||||
close(fd2);
|
close(fd2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else ioctl(fd2, HOT_ADD_DISK, (unsigned long) dev);
|
else Manage_subdevs(st2->devname, fd2, &devlist, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
close(fd1);
|
close(fd1);
|
||||||
|
|
2
super0.c
2
super0.c
|
@ -672,7 +672,7 @@ static int write_init_super0(struct supertype *st,
|
||||||
mdu_disk_info_t *dinfo, char *devname)
|
mdu_disk_info_t *dinfo, char *devname)
|
||||||
{
|
{
|
||||||
mdp_super_t *sb = st->sb;
|
mdp_super_t *sb = st->sb;
|
||||||
int fd = open(devname, O_RDWR|O_EXCL);
|
int fd = dev_open(devname, O_RDWR|O_EXCL);
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
|
|
2
super1.c
2
super1.c
|
@ -887,7 +887,7 @@ static int write_init_super1(struct supertype *st,
|
||||||
{
|
{
|
||||||
struct mdp_superblock_1 *sb = st->sb;
|
struct mdp_superblock_1 *sb = st->sb;
|
||||||
struct supertype refst;
|
struct supertype refst;
|
||||||
int fd = open(devname, O_RDWR | O_EXCL);
|
int fd = dev_open(devname, O_RDWR | O_EXCL);
|
||||||
int rfd;
|
int rfd;
|
||||||
int rv;
|
int rv;
|
||||||
int bm_space;
|
int bm_space;
|
||||||
|
|
Loading…
Reference in New Issue