]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Manage: Call validate_geometry when adding drive to external container
authorMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Mon, 17 May 2021 14:39:03 +0000 (16:39 +0200)
committerJes Sorensen <jsorensen@fb.com>
Wed, 26 May 2021 11:26:34 +0000 (07:26 -0400)
When adding drive to container call validate_geometry to verify whether
drive is supported and can be addded to container.

Remove unused parameters from validate_geometry_imsm_container().
There is no need to pass them.
Don't calculate freesize if it is not mandatory. Make it configurable.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
Manage.c
super-ddf.c
super-intel.c

index 0a5f09b379ab643c183006d43fe6c85b9f94ae02..f789e0c176e5797fdac9c20d3a45def95ced07b8 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -992,6 +992,13 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
                        return -1;
                }
 
+               /* Check if metadata handler is able to accept the drive */
+               if (!tst->ss->validate_geometry(tst, LEVEL_CONTAINER, 0, 1, NULL,
+                   0, 0, dv->devname, NULL, 0, 1)) {
+                       close(container_fd);
+                       return -1;
+               }
+
                Kill(dv->devname, NULL, 0, -1, 0);
                dfd = dev_open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
                if (tst->ss->add_to_super(tst, &disc, dfd,
index 2314762007070f4df551b134d10c25f8d8a6ee58..80a40f84ab2f31a4dba7db40fb1d04b466fdacbf 100644 (file)
@@ -3475,10 +3475,11 @@ validate_geometry_ddf_container(struct supertype *st,
                return 0;
        }
        close(fd);
-
-       *freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
-       if (*freesize == 0)
-               return 0;
+       if (freesize) {
+               *freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
+               if (*freesize == 0)
+                       return 0;
+       }
 
        return 1;
 }
index fdcefb6156196660a043e65abdfaa378d731ea83..fe45d93301b2bed50f85224b9edbff2d114f4d32 100644 (file)
@@ -6652,8 +6652,7 @@ static int store_super_imsm(struct supertype *st, int fd)
 }
 
 static int validate_geometry_imsm_container(struct supertype *st, int level,
-                                           int layout, int raiddisks, int chunk,
-                                           unsigned long long size,
+                                           int raiddisks,
                                            unsigned long long data_offset,
                                            char *dev,
                                            unsigned long long *freesize,
@@ -6725,8 +6724,8 @@ static int validate_geometry_imsm_container(struct supertype *st, int level,
                        }
                }
        }
-
-       *freesize = avail_size_imsm(st, ldsize >> 9, data_offset);
+       if (freesize)
+               *freesize = avail_size_imsm(st, ldsize >> 9, data_offset);
        rv = 1;
 exit:
        if (super)
@@ -7586,15 +7585,11 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
         * if given unused devices create a container
         * if given given devices in a container create a member volume
         */
-       if (level == LEVEL_CONTAINER) {
+       if (level == LEVEL_CONTAINER)
                /* Must be a fresh device to add to a container */
-               return validate_geometry_imsm_container(st, level, layout,
-                                                       raiddisks,
-                                                       *chunk,
-                                                       size, data_offset,
-                                                       dev, freesize,
-                                                       verbose);
-       }
+               return validate_geometry_imsm_container(st, level, raiddisks,
+                                                       data_offset, dev,
+                                                       freesize, verbose);
 
        /*
         * Size is given in sectors.