]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Monitor: support spare-group manipulation for 1.x metadata.
authorNeilBrown <neilb@suse.de>
Mon, 11 May 2009 23:49:45 +0000 (09:49 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 11 May 2009 23:49:45 +0000 (09:49 +1000)
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>

Manage.c
Monitor.c
super0.c
super1.c

index 33a0bc7fdca541686465b037d2bb14ab450f9e88..fa4bb60fc4c1df662f75b8799f5abf3cd0418423 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -292,11 +292,15 @@ int Manage_subdevs(char *devname, int fd,
                } else {
                        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",
                                        dv->devname, strerror(errno));
+                               if (tfd >= 0)
+                                       close(tfd);
                                return 1;
                        }
+                       close(tfd);
                        if ((stb.st_mode & S_IFMT) != S_IFBLK) {
                                fprintf(stderr, Name ": %s is not a "
                                        "block device.\n",
@@ -313,7 +317,7 @@ int Manage_subdevs(char *devname, int fd,
                        /* add the device */
 
                        /* 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) {
                                fprintf(stderr, Name ": Cannot open %s: %s\n",
                                        dv->devname, strerror(errno));
index 38256000668ded37368993cdf83a8fc390b5c4b3..e0a9d2a614a464816cfea126f21e3cd71982f954 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -470,16 +470,25 @@ int Monitor(mddev_dev_t devlist,
                                                        }
                                                }
                                                if (dev > 0) {
-                                                       if (ioctl(fd2, HOT_REMOVE_DISK,
-                                                                 (unsigned long)dev) == 0) {
-                                                               if (ioctl(fd1, HOT_ADD_DISK,
-                                                                         (unsigned long)dev) == 0) {
+                                                       struct mddev_dev_s devlist;
+                                                       char devname[20];
+                                                       devlist.next = NULL;
+                                                       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);
                                                                        close(fd1);
                                                                        close(fd2);
                                                                        break;
                                                                }
-                                                               else ioctl(fd2, HOT_ADD_DISK, (unsigned long) dev);
+                                                               else Manage_subdevs(st2->devname, fd2, &devlist, -1);
                                                        }
                                                }
                                                close(fd1);
index 90fdf23d075f46b1eceb90dfc0d6b6f6861efaba..ebba5341d2e1f7e21a32b0b2761f2a6d4b882d9a 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -672,7 +672,7 @@ static int write_init_super0(struct supertype *st,
                             mdu_disk_info_t *dinfo, char *devname)
 {
        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;
 
        if (fd < 0) {
index e545bf5bc6b8baa3be556bac150c7f8e4690c679..376b97d9a4a4e855f2eabfe6583f48ac9c11a6c3 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -887,7 +887,7 @@ static int write_init_super1(struct supertype *st,
 {
        struct mdp_superblock_1 *sb = st->sb;
        struct supertype refst;
-       int fd = open(devname, O_RDWR | O_EXCL);
+       int fd = dev_open(devname, O_RDWR | O_EXCL);
        int rfd;
        int rv;
        int bm_space;