Thread (4 messages) 4 messages, 2 authors, 2020-10-29

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

From: Xiao Ni <hidden>
Date: 2020-10-28 21:55:35

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:
quoted hunk ↗ jump to hunk
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 <redacted>
---
  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;
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help