[PATCH] mdadm/bitmap: fix wrong bitmap nodes num when adding new disk

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

 



The bug introduced from commit 81306e021ebdcc4baef866da82d25c3f0a415d2d
In this patch, it modified two place to support NodeNumUpdate:
 Grow_addbitmap, write_init_super1

The path write_init_super1 is wrong.

reproducible steps:
```
node1 # mdadm -S --scan
node1 # for i in {a,b,c};do dd if=/dev/zero of=/dev/sd$i bs=1M count=10;
done
... ...
node1 # mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sda
/dev/sdb
mdadm: array /dev/md0 started.
node1 # mdadm --manage --add /dev/md0 /dev/sdc
mdadm: added /dev/sdc
node1 # mdadm --grow --raid-devices=3 /dev/md0
raid_disks for /dev/md0 set to 3
node1 # mdadm -X /dev/sdc
        Filename : /dev/sdc
           Magic : 6d746962
         Version : 5
            UUID : 9b0ff8c8:2a274a64:088ade6e:a88286a3
       Chunksize : 64 MB
          Daemon : 5s flush period
      Write Mode : Normal
       Sync Size : 306176 (299.00 MiB 313.52 MB)
   Cluster nodes : 4
    Cluster name : tb-ha-tst
       Node Slot : 0
          Events : 44
  Events Cleared : 0
           State : OK
          Bitmap : 5 bits (chunks), 0 dirty (0.0%)
mdadm: invalid bitmap magic 0x0, the bitmap file appears to be corrupted
       Node Slot : 1
          Events : 0
  Events Cleared : 0
           State : OK
          Bitmap : 0 bits (chunks), 0 dirty (0.0%)
```

There are three paths to call write_bitmap:
 Assemble, Grow, write_init_super.

1. Assemble & Grow should concern NodeNumUpdate

Grow: Grow_addbitmap => write_bitmap
trigger steps:
```
node1 # mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sda
/dev/sdb
node1 # mdadm -G /dev/md0 -b none
node1 # mdadm -G /dev/md0 -b clustered
```

Assemble: Assemble => load_devices => write_bitmap1
trigger steps:
```
node1 # mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sda
/dev/sdb
node2 # mdadm -A /dev/md0 /dev/sda /dev/sdb --update=nodes --nodes=5
```

2. write_init_super should use NoUpdate.

write_init_super is called by Create & Manage path.

Create: Create => write_init_super => write_bitmap
This is initialization, it doesn't need to care node changing.
trigger step:
```
node1 # mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sda
/dev/sdb
```

Manage: Manage_subdevs => Manage_add => write_init_super => write_bitmap
This is disk add, not node add. So it doesn't need to care node
changing.
trigger steps:
```
mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sda /dev/sdb
mdadm --manage --add /dev/md0 /dev/sdc
```

Signed-off-by: Zhao Heming <heming.zhao@xxxxxxxx>
---
 super1.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/super1.c b/super1.c
index 8b0d6ff..06fa3ad 100644
--- a/super1.c
+++ b/super1.c
@@ -2093,7 +2093,7 @@ static int write_init_super1(struct supertype *st)
 		if (rv == 0 &&
 		    (__le32_to_cpu(sb->feature_map) &
 		     MD_FEATURE_BITMAP_OFFSET)) {
-			rv = st->ss->write_bitmap(st, di->fd, NodeNumUpdate);
+			rv = st->ss->write_bitmap(st, di->fd, NoUpdate);
 		} else if (rv == 0 &&
 		    md_feature_any_ppl_on(sb->feature_map)) {
 			struct mdinfo info;
-- 
2.27.0




[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