]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Call free_super before attempting to add a new device
authorNeilBrown <neilb@suse.de>
Mon, 31 Jan 2011 02:53:35 +0000 (13:53 +1100)
committerNeilBrown <neilb@suse.de>
Mon, 31 Jan 2011 02:53:35 +0000 (13:53 +1100)
Now that write_init_super doesn't close fds any more, we need
to call free_super before the ADD_NEW_DISK ioctl.
Also call free_super before some error returns, for cleanliness.

Signed-off-by: NeilBrown <neilb@suse.de>
Manage.c

index 824caa98d1dedbd00b02ccf31ecc33ed59ad52ac..481c16541bc381a04318ae87813d8108093deb58 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -858,6 +858,7 @@ int Manage_subdevs(char *devname, int fd,
                                        fprintf(stderr, Name ": add failed for %s:"
                                                " could not get exclusive access to container\n",
                                                dv->devname);
+                                       tst->ss->free_super(tst);
                                        return 1;
                                }
 
@@ -866,6 +867,7 @@ int Manage_subdevs(char *devname, int fd,
                                        fprintf(stderr, Name ": add failed for %s: sysfs_read failed\n",
                                                dv->devname);
                                        close(container_fd);
+                                       tst->ss->free_super(tst);
                                        return 1;
                                }
                                sra->array.level = LEVEL_CONTAINER;
@@ -887,14 +889,16 @@ int Manage_subdevs(char *devname, int fd,
                                ping_monitor(devnum2devname(devnum));
                                sysfs_free(sra);
                                close(container_fd);
-                       } else if (ioctl(fd, ADD_NEW_DISK, &disc)) {
-                               fprintf(stderr, Name ": add new device failed for %s as %d: %s\n",
-                                       dv->devname, j, strerror(errno));
-                               return 1;
+                       } else {
+                               tst->ss->free_super(tst);
+                               if (ioctl(fd, ADD_NEW_DISK, &disc)) {
+                                       fprintf(stderr, Name ": add new device failed for %s as %d: %s\n",
+                                               dv->devname, j, strerror(errno));
+                                       return 1;
+                               }
                        }
                        if (verbose >= 0)
                                fprintf(stderr, Name ": added %s\n", dv->devname);
-                       tst->ss->free_super(tst);
                        break;
 
                case 'r':