Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

md-cluster: fix safemode_delay value when converting to clustered bitmap

When array convert to clustered bitmap, the safe_mode_delay doesn't
clean and vice versa. the /sys/block/mdX/md/safe_mode_delay keep original
value after changing bitmap type. In safe_delay_store(), the code forbids
setting mddev->safemode_delay when array is clustered. So in cluster-md
env, the expected safemode_delay value should be 0.

Reproducible steps:
```
node1 # mdadm --zero-superblock /dev/sd{b,c,d}
node1 # mdadm -C /dev/md0 -b internal -e 1.2 -n 2 -l mirror /dev/sdb /dev/sdc
node1 # cat /sys/block/md0/md/safe_mode_delay
0.204
node1 # mdadm -G /dev/md0 -b none
node1 # mdadm --grow /dev/md0 --bitmap=clustered
node1 # cat /sys/block/md0/md/safe_mode_delay
0.204 <== doesn't change, should ZERO for cluster-md

node1 # mdadm --zero-superblock /dev/sd{b,c,d}
node1 # mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sdb /dev/sdc
node1 # cat /sys/block/md0/md/safe_mode_delay
0.000
node1 # mdadm -G /dev/md0 -b none
node1 # cat /sys/block/md0/md/safe_mode_delay
0.000 <== doesn't change, should default value
```

Reviewed-by: NeilBrown <neilb@suse.de>
Signed-off-by: Zhao Heming <heming.zhao@suse.com>
Signed-off-by: Song Liu <songliubraving@fb.com>

authored by

Zhao Heming and committed by
Song Liu
7c9d5c54 3b5408b9

+9 -2
+9 -2
drivers/md/md.c
··· 101 101 * count by 2 for every hour elapsed between read errors. 102 102 */ 103 103 #define MD_DEFAULT_MAX_CORRECTED_READ_ERRORS 20 104 + /* Default safemode delay: 200 msec */ 105 + #define DEFAULT_SAFEMODE_DELAY ((200 * HZ)/1000 +1) 104 106 /* 105 107 * Current RAID-1,4,5 parallel reconstruction 'guaranteed speed limit' 106 108 * is 1000 KB/sec, so the extra system load does not show up that much. ··· 6036 6034 if (mddev_is_clustered(mddev)) 6037 6035 mddev->safemode_delay = 0; 6038 6036 else 6039 - mddev->safemode_delay = (200 * HZ)/1000 +1; /* 200 msec delay */ 6037 + mddev->safemode_delay = DEFAULT_SAFEMODE_DELAY; 6040 6038 mddev->in_sync = 1; 6041 6039 smp_wmb(); 6042 6040 spin_lock(&mddev->lock); ··· 7415 7413 7416 7414 mddev->bitmap_info.nodes = 0; 7417 7415 md_cluster_ops->leave(mddev); 7416 + mddev->safemode_delay = DEFAULT_SAFEMODE_DELAY; 7418 7417 } 7419 7418 mddev_suspend(mddev); 7420 7419 md_bitmap_destroy(mddev); ··· 8411 8408 8412 8409 int md_setup_cluster(struct mddev *mddev, int nodes) 8413 8410 { 8411 + int ret; 8414 8412 if (!md_cluster_ops) 8415 8413 request_module("md-cluster"); 8416 8414 spin_lock(&pers_lock); ··· 8423 8419 } 8424 8420 spin_unlock(&pers_lock); 8425 8421 8426 - return md_cluster_ops->join(mddev, nodes); 8422 + ret = md_cluster_ops->join(mddev, nodes); 8423 + if (!ret) 8424 + mddev->safemode_delay = 0; 8425 + return ret; 8427 8426 } 8428 8427 8429 8428 void md_cluster_stop(struct mddev *mddev)