]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow_reshape: set only component_size for size grow
authorKinga Stefaniuk <kinga.stefaniuk@intel.com>
Fri, 26 Apr 2024 06:33:00 +0000 (08:33 +0200)
committerMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Tue, 6 Aug 2024 12:40:49 +0000 (14:40 +0200)
Component_size couldn't be set using ioctl when new drive size is big
(e.g. 5TB). Command value is bigger than 32 bits and error is reported
- it is known ioctl limitation. Remove updating array properties using
ioctl, use sysfs instead. Sysfs was introduced in 3.10, so now it is old
enough to be safely used. Array_size in sysfs should be set for every
size change for external metadata, when grow is performed without
errors.

Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
Grow.c

diff --git a/Grow.c b/Grow.c
index a5f9027d93d82d03a1824f9e9120a51d256e066c..5810b128aa99919b65e4e7d578bef639576aef3d 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -2149,19 +2149,14 @@ int Grow_reshape(char *devname, int fd,
                if (s->size == MAX_SIZE)
                        s->size = 0;
                array.size = s->size;
-               if (s->size & ~INT32_MAX) {
-                       /* got truncated to 32bit, write to
-                        * component_size instead
-                        */
-                       rv = sysfs_set_num(sra, NULL, "component_size", s->size);
-               } else {
-                       rv = md_set_array_info(fd, &array);
+               rv = sysfs_set_num(sra, NULL, "component_size", s->size);
 
-                       /* manage array size when it is managed externally
-                        */
-                       if ((rv == 0) && st->ss->external)
-                               rv = set_array_size(st, sra, sra->text_version);
-               }
+               /*
+                * For native metadata, md/array_size is updated by kernel,
+                * for external management update it here.
+                */
+               if (st->ss->external && rv == MDADM_STATUS_SUCCESS)
+                       rv = set_array_size(st, sra, sra->text_version);
 
                if (raid0_takeover) {
                        /* do not recync non-existing parity,