diff options
author | NeilBrown <neilb@suse.de> | 2009-06-02 15:28:36 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-06-02 15:28:36 +1000 |
commit | 3b435195fc34ba447c8ca8fa2f90cd6d5ad88cdb (patch) | |
tree | ef736cccca9d0c9053dc6437f7d229dfcdd9b23f | |
parent | 38a07ed61e58320e18a6c25ab9da4d749d43bdc5 (diff) | |
parent | c7b474474c793e9a82bd0d84868fdf7367c89696 (diff) | |
download | mdadm-3b435195fc34ba447c8ca8fa2f90cd6d5ad88cdb.tar.gz mdadm-3b435195fc34ba447c8ca8fa2f90cd6d5ad88cdb.tar.xz mdadm-3b435195fc34ba447c8ca8fa2f90cd6d5ad88cdb.zip |
Merge branch 'master' into devel-3.0
Conflicts:
super0.c
super1.c
-rw-r--r-- | Manage.c | 10 | ||||
-rw-r--r-- | Monitor.c | 19 |
2 files changed, 21 insertions, 8 deletions
@@ -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); @@ -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); |