X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=Manage.c;h=6f0a6a203f1d28beb4c493d72f055a5494cebebe;hp=594adeffc352fa23bc4d342880bd83ffd9f8a878;hb=d23534e4646313a67296b295666d165a87bb2c92;hpb=e736b62389a230cc427e7cf352539d1afab8f469 diff --git a/Manage.c b/Manage.c index 594adeff..6f0a6a20 100644 --- a/Manage.c +++ b/Manage.c @@ -140,7 +140,7 @@ static void remove_devices(int devnum, char *path) strcpy(path2, path); pe = path2 + strlen(path2); } else - path = NULL; + path2 = path = NULL; for (part = 0; part < 16; part++) { if (part) { @@ -161,6 +161,7 @@ static void remove_devices(int devnum, char *path) unlink(path2); } } + free(path2); } @@ -305,24 +306,6 @@ int Manage_resize(char *devname, int fd, long long size, int raid_disks) return 0; } -int Manage_reconfig(char *devname, int fd, int layout) -{ - mdu_array_info_t info; - if (ioctl(fd, GET_ARRAY_INFO, &info) != 0) { - fprintf(stderr, Name ": Cannot get array information for %s: %s\n", - devname, strerror(errno)); - return 1; - } - info.layout = layout; - printf("layout set to %d\n", info.layout); - if (ioctl(fd, SET_ARRAY_INFO, &info) != 0) { - fprintf(stderr, Name ": Cannot set layout for %s: %s\n", - devname, strerror(errno)); - return 1; - } - return 0; -} - int Manage_subdevs(char *devname, int fd, mddev_dev_t devlist, int verbose) { @@ -441,11 +424,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 +454,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)); @@ -591,6 +578,12 @@ int Manage_subdevs(char *devname, int fd, /* fall back on normal-add */ } } + if (dv->re_add) { + fprintf(stderr, Name + ": --re-add for %s to %s is not possible\n", + dv->devname, devname); + return 1; + } } else { /* non-persistent. Must ensure that new drive * is at least array.size big. @@ -623,7 +616,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); @@ -663,6 +656,7 @@ int Manage_subdevs(char *devname, int fd, disc.state |= (1<writemostly == 1) disc.state |= (1 << MD_DISK_WRITEMOSTLY); @@ -702,7 +696,8 @@ int Manage_subdevs(char *devname, int fd, tst->ss->getinfo_super(tst, &new_mdi); new_mdi.disk.major = disc.major; new_mdi.disk.minor = disc.minor; - if (sysfs_add_disk(sra, &new_mdi, 0) != 0) { + new_mdi.recovery_start = 0; + if (sysfs_add_disk(sra, &new_mdi) != 0) { fprintf(stderr, Name ": add new device to external metadata" " failed for %s\n", dv->devname); close(container_fd);