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

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

 



Hi Heming

In fact it's not a wrong cluster nodes. This patch only avoids to do the job that doesn't need to do, right? The cluster nodes don't change when adding a new disk. Even NodeNumUpdate is specified, it'll not change the cluster nodes. If so, the subject is a little confusing.

Regards
Xiao

On 10/24/2020 11:07 PM, Zhao Heming wrote:
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;




[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