]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Discourage large devices from being added to 0.90 arrays.
authorNeilBrown <neilb@suse.de>
Thu, 8 Sep 2011 03:05:31 +0000 (13:05 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 8 Sep 2011 03:05:31 +0000 (13:05 +1000)
0.90 arrays can only use up to 4TB per device.  So when a larger
device is added, complain a bit.  Still allow it if --force is given
as there could be a valid use.

Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c
Incremental.c
Manage.c
mdadm.c
mdadm.h

diff --git a/Grow.c b/Grow.c
index 1aab1132f2374b0ff741def3f26b94e989c17c8a..048351d7fab236b77738789572b80afa8d1fe578 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -1893,7 +1893,7 @@ static int reshape_array(char *container, int fd, char *devname,
         */
        if (devlist)
                Manage_subdevs(devname, fd, devlist, !quiet,
-                              0,NULL);
+                              0,NULL, 0);
 
        if (reshape.backup_blocks == 0) {
                /* No restriping needed, but we might need to impose
index 09cdd9b403cd507077015094be03117a5a3c69ec..791ad85accfb4e656c40f0ca04f81940e87bfc13 100644 (file)
@@ -1035,7 +1035,7 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
                        close(dfd);
                        *dfdp = -1;
                        rv =  Manage_subdevs(chosen->sys_name, mdfd, &devlist,
-                                            -1, 0, NULL);
+                                            -1, 0, NULL, 0);
                        close(mdfd);
                }
                if (verbose > 0) {
@@ -1666,15 +1666,15 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
                                if (subfd >= 0) {
                                        Manage_subdevs(memb->dev, subfd,
                                                       &devlist, verbose, 0,
-                                                      NULL);
+                                                      NULL, 0);
                                        close(subfd);
                                }
                        }
                free_mdstat(mdstat);
        } else
-               Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0, NULL);
+               Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0, NULL, 0);
        devlist.disposition = 'r';
-       rv = Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0, NULL);
+       rv = Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0, NULL, 0);
        close(mdfd);
        free_mdstat(ent);
        return rv;
index 66d697803e2866923897e7a3af27b70749631432..1b2b75afbd99b6717c16a61d08d554506e8e8992 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -371,7 +371,7 @@ int Manage_resize(char *devname, int fd, long long size, int raid_disks)
 
 int Manage_subdevs(char *devname, int fd,
                   struct mddev_dev *devlist, int verbose, int test,
-                  char *update)
+                  char *update, int force)
 {
        /* do something to each dev.
         * devmode can be
@@ -632,6 +632,27 @@ int Manage_subdevs(char *devname, int fd,
                                continue;
                        }
 
+                       if (tst->ss->validate_geometry(
+                                   tst, array.level, array.layout,
+                                   array.raid_disks, NULL,
+                                   ldsize >> 9, NULL, NULL, 0) == 0) {
+                               if (!force) {
+                                       fprintf(stderr, Name
+                                               ": %s is larger than %s can "
+                                               "effectively use.\n"
+                                               "       Add --force is you "
+                                               "really wan to add this device.\n",
+                                               add_dev, devname);
+                                       close(tfd);
+                                       return 1;
+                               }
+                               fprintf(stderr, Name
+                                       ": %s is larger than %s can "
+                                       "effectively use.\n"
+                                       "       Adding anyway as --force "
+                                       "was given.\n",
+                                       add_dev, devname);
+                       }
                        if (!tst->ss->external &&
                            array.major_version == 0 &&
                            md_get_version(fd)%100 < 2) {
@@ -1188,9 +1209,9 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
        sprintf(devname, "%d:%d", major(devid), minor(devid));
 
        devlist.disposition = 'r';
-       if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL) == 0) {
+       if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL, 0) == 0) {
                devlist.disposition = 'a';
-               if (Manage_subdevs(to_devname, fd1, &devlist, -1, 0, NULL) == 0) {
+               if (Manage_subdevs(to_devname, fd1, &devlist, -1, 0, NULL, 0) == 0) {
                        /* make sure manager is aware of changes */
                        ping_manager(to_devname);
                        ping_manager(from_devname);
@@ -1198,7 +1219,7 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
                        close(fd2);
                        return 1;
                }
-               else Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL);
+               else Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL, 0);
        }
        close(fd1);
        close(fd2);
diff --git a/mdadm.c b/mdadm.c
index fb51051217f993b0680f8ee2ead34fc096bda6b6..4b817ab9a0ab06b03c1ebddcab4e7ed36f9c54c1 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -609,6 +609,7 @@ int main(int argc, char *argv[])
                case O(ASSEMBLE,Force): /* force assembly */
                case O(MISC,'f'): /* force zero */
                case O(MISC,Force): /* force zero */
+               case O(MANAGE,Force): /* add device which is too large */
                        force=1;
                        continue;
 
@@ -1202,7 +1203,7 @@ int main(int argc, char *argv[])
                if (!rv && devs_found>1)
                        rv = Manage_subdevs(devlist->devname, mdfd,
                                            devlist->next, verbose-quiet, test,
-                                           update);
+                                           update, force);
                if (!rv && readonly < 0)
                        rv = Manage_ro(devlist->devname, mdfd, readonly);
                if (!rv && runstop)
diff --git a/mdadm.h b/mdadm.h
index 8bd007733c9ad10010846dafc45d01344c3a4f37..d616966f3675775ae6e7ee5c5e8812dfcf0ecb00 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -1010,7 +1010,7 @@ extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
 extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
 extern int Manage_subdevs(char *devname, int fd,
                          struct mddev_dev *devlist, int verbose, int test,
-                         char *update);
+                         char *update, int force);
 extern int autodetect(void);
 extern int Grow_Add_device(char *devname, int fd, char *newdev);
 extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);