Thread (6 messages) 6 messages, 4 authors, 2010-06-18

Re: Problem re-shaping RAID6

From: Neil Brown <hidden>
Date: 2010-06-13 23:15:18

On Sun, 13 Jun 2010 15:15:08 -0400
Jérôme Poulin [off-list ref] wrote:
quoted hunk ↗ jump to hunk
I had problems reshaping my RAID6 down 1 disk today and found a
problem in Grow.c:

diff -udpr mdadm-3.1.2/Grow.c mdadm-3.1.2-critical-section/Grow.c
--- mdadm-3.1.2/Grow.c  2010-03-09 23:31:39.000000000 -0500
+++ mdadm-3.1.2-critical-section/Grow.c 2010-06-13 14:57:44.000000000 -0400
@@ -497,7 +497,7 @@ int Grow_reshape(char *devname, int fd,
        int rv = 0;
        struct supertype *st;

-       int nchunk, ochunk;
+       unsigned long nchunk, ochunk;
        int nlayout, olayout;
        int ndisks, odisks;
        int ndata, odata;

After changing this I was able to re-shape the array, it seems it was
overflowing and I had a message saying:
root@billsshack:~/mdadm-3.1.2/ > ./mdadm --grow /dev/md0
--raid-devices=6 --backup-file=/mnt/data1/md-raid6-grow-backup.bak
mdadm: Need to backup 4503599627350016K of critical section..
mdadm: /dev/md0: Something wrong - reshape aborted

Now it works:
root@billsshack:~/mdadm-3.1.2/ > ./mdadm --grow /dev/md0
--raid-devices=6 --backup-file=/mnt/data1/md-raid6-grow-backup.bak
mdadm: Need to backup 20480K of critical section..
root@billsshack:~/mdadm-3.1.2/ > cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
[faulty] [linear]
md0 : active raid6 dm-6[0] dm-8[5] dm-5[4] dm-3[3] dm-4[2] dm-7[1]
      7814041600 blocks super 0.91 level 6, 1024k chunk, algorithm 2
[6/5] [UUUUUU]
      [>....................]  reshape =  0.0% (33792/1953510400)
finish=1926.0min speed=16896K/sec


Here's a nice output of GDB:
      Breakpoint 1, Grow_reshape (devname=0x7fffffffe390 "/dev/md0",
fd=5, quiet=0,
          backup_file=0x7fffffffe3b8
"/mnt/data1/md-raid6-grow-backup.bak", size=1953510400, level=65534,
          layout_str=0x0, chunksize=0, raid_disks=6) at Grow.c:939
      939                     blocks = ochunk/512 * nchunk/512 * odata
* ndata / a;
      (gdb) p ochunk/512
      $9 = 2048
      (gdb) p ochunk/512 * nchunk/512
      $10 = -4194304

Thanks.
I fixed this bug a slightly different way

-               blocks = ochunk/512 * nchunk/512 * odata * ndata / a;
+               blocks = (ochunk/512) * (nchunk/512) * odata * ndata / a;


See
http://neil.brown.name/git?p=mdadm;a=commitdiff;h=200871adf9e15d5ad985f28c349fd89c386ef48a

I guess it is time to release a 3.1.3...

Thanks,
NeilBrown

      (gdb) p nchunk
      $11 = 1048576
      (gdb) p ochunk
      $12 = 1048576
      (gdb) p ochunk/512
      $13 = 2048
      (gdb) p nchunk/512
      $14 = 2048
      (gdb) p 2048*2048
      $15 = 4194304
      (gdb) p 2048*2048*odata
      $16 = 20971520
      (gdb) p 2048*2048*odata*ndata
      $17 = 83886080
      (gdb) p 2048*2048*odata*ndata/a
      $18 = 40960
      (gdb) p ochunk/512 * nchunk/512 * odata * ndata / a
      $19 = 9007199254700032
      (gdb) p ochunk/512 * nchunk/512
      $20 = -4194304
      (gdb)
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help