Re: [PATCH] Fix reshape for decreasing data offset

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2019-01-07 21:37, bugfood-ml@xxxxxxxxxx wrote:
From: Corey Hickey <bugfood-c@xxxxxxxxxx>

...when not changing the number of disks.

This patch needs context to explain. These are the relevant parts of
the original code (condensed and annotated):

if (dir > 0) {
     /* Increase data offset (reshape backwards) */
     if (data_offset < sd->data_offset + min) {
         pr_err("--data-offset too small on %s\n",
                dn);
         goto release;
     }
} else {
     /* Decrease data offset (reshape forwards) */
     if (data_offset < sd->data_offset - min) {
         pr_err("--data-offset too small on %s\n",
                dn);
         goto release;
     }
}

When this code is reached, mdadm has already decided on a reshape
direction. When increasing the data offset, the reshape runs backwards
(dir==1); when decreasing the data offset, the reshape runs forwards
(dir==-1).

The conditional within the backwards reshape is correct: the requested
offset must be larger than the old offset plus a minimum delta; thus the
reshape has room to work.

For the forwards reshape, the requested offset needs to be smaller than
the old offset minus a minimum delta; to do this correctly, the
comparison must be reversed.

Also update the error message.

Note: I have tested this change on a RAID 5 on Linux 4.18.0 and verified
that there were no errors from the kernel and that the device data
remained intact. I do not know if there are considerations for different
RAID levels.
---
  Grow.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Grow.c b/Grow.c
index 363b209..c2cae00 100644
--- a/Grow.c
+++ b/Grow.c
@@ -2613,8 +2613,8 @@ static int set_new_data_offset(struct mdinfo *sra, struct supertype *st,
  					goto release;
  				}
  				if (data_offset != INVALID_SECTORS &&
-				    data_offset < sd->data_offset - min) {
-					pr_err("--data-offset too small on %s\n",
+				    data_offset > sd->data_offset - min) {
+					pr_err("--data-offset too large on %s\n",
  						dn);
  					goto release;
  				}

Hi,

Sorry to pester, but is this patch acceptable?

Thanks,
Corey



[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux