]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Merge branch 'master' into devel-3.0
authorNeilBrown <neilb@suse.de>
Tue, 2 Jun 2009 05:28:36 +0000 (15:28 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 2 Jun 2009 05:28:36 +0000 (15:28 +1000)
Conflicts:
super0.c
super1.c

Manage.c
Monitor.c

index 594adeffc352fa23bc4d342880bd83ffd9f8a878..3aa09bcba241caba52b989abd6804de9e65a056e 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -441,11 +441,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",
@@ -467,7 +471,7 @@ int Manage_subdevs(char *devname, int fd,
                                return 1;
                        }
                        /* Make sure it isn't in use (in 2.6 or later) */
-                       tfd = open(dv->devname, O_RDONLY|O_EXCL|O_DIRECT);
+                       tfd = dev_open(dv->devname, O_RDONLY|O_EXCL|O_DIRECT);
                        if (tfd < 0) {
                                fprintf(stderr, Name ": Cannot open %s: %s\n",
                                        dv->devname, strerror(errno));
@@ -623,7 +627,7 @@ int Manage_subdevs(char *devname, int fd,
                                int dfd;
                                if (dv->writemostly == 1)
                                        disc.state |= 1 << MD_DISK_WRITEMOSTLY;
-                               dfd = open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
+                               dfd = dev_open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
                                if (tst->ss->add_to_super(tst, &disc, dfd,
                                                          dv->devname)) {
                                        close(dfd);
index a0651e4393275e0c49af6088f54b60e38d5292f3..f6fd95cdfa9401c9bef67bdefd3403f8a3a5e852 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -480,16 +480,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);