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

Merge tag 'md-6.9-20240216' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md into for-6.9/block

Pull MD changes from Song:

"1. Cleanup redundant checks, by Yu Kuai.
2. Remove deprecated headers, by Marc Zyngier and Song Liu.
3. Concurrency fixes, by Li Lingfeng.
4. Memory leak fix, by Li Nan."

* tag 'md-6.9-20240216' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md:
md: fix kmemleak of rdev->serial
md/multipath: Remove md-multipath.h
md/linear: Get rid of md-linear.h
md: use RCU lock to protect traversal in md_spares_need_change()
md: get rdev->mddev with READ_ONCE()
md: remove redundant md_wakeup_thread()
md: remove redundant check of 'mddev->sync_thread'

+18 -85
-17
drivers/md/md-linear.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 */ 2 - #ifndef _LINEAR_H 3 - #define _LINEAR_H 4 - 5 - struct dev_info { 6 - struct md_rdev *rdev; 7 - sector_t end_sector; 8 - }; 9 - 10 - struct linear_conf 11 - { 12 - struct rcu_head rcu; 13 - sector_t array_sectors; 14 - int raid_disks; /* a copy of mddev->raid_disks */ 15 - struct dev_info disks[] __counted_by(raid_disks); 16 - }; 17 - #endif
-32
drivers/md/md-multipath.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 */ 2 - #ifndef _MULTIPATH_H 3 - #define _MULTIPATH_H 4 - 5 - struct multipath_info { 6 - struct md_rdev *rdev; 7 - }; 8 - 9 - struct mpconf { 10 - struct mddev *mddev; 11 - struct multipath_info *multipaths; 12 - int raid_disks; 13 - spinlock_t device_lock; 14 - struct list_head retry_list; 15 - 16 - mempool_t pool; 17 - }; 18 - 19 - /* 20 - * this is our 'private' 'collective' MULTIPATH buffer head. 21 - * it contains information about what kind of IO operations were started 22 - * for this MULTIPATH operation, and about their status: 23 - */ 24 - 25 - struct multipath_bh { 26 - struct mddev *mddev; 27 - struct bio *master_bio; 28 - struct bio bio; 29 - int path; 30 - struct list_head retry_list; 31 - }; 32 - #endif
+16 -32
drivers/md/md.c
··· 2562 2562 fail: 2563 2563 pr_warn("md: failed to register dev-%s for %s\n", 2564 2564 b, mdname(mddev)); 2565 + mddev_destroy_serial_pool(mddev, rdev); 2565 2566 return err; 2566 2567 } 2567 2568 ··· 2592 2591 list_del_rcu(&rdev->same_set); 2593 2592 pr_debug("md: unbind<%pg>\n", rdev->bdev); 2594 2593 mddev_destroy_serial_pool(rdev->mddev, rdev); 2595 - rdev->mddev = NULL; 2594 + WRITE_ONCE(rdev->mddev, NULL); 2596 2595 sysfs_remove_link(&rdev->kobj, "block"); 2597 2596 sysfs_put(rdev->sysfs_state); 2598 2597 sysfs_put(rdev->sysfs_unack_badblocks); ··· 2930 2929 set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); 2931 2930 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 2932 2931 md_new_event(); 2933 - md_wakeup_thread(mddev->thread); 2934 2932 return 0; 2935 2933 } 2936 2934 ··· 3044 3044 3045 3045 if (err == 0) { 3046 3046 md_kick_rdev_from_array(rdev); 3047 - if (mddev->pers) { 3047 + if (mddev->pers) 3048 3048 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); 3049 - md_wakeup_thread(mddev->thread); 3050 - } 3051 3049 md_new_event(); 3052 3050 } 3053 3051 } ··· 3075 3077 clear_bit(BlockedBadBlocks, &rdev->flags); 3076 3078 wake_up(&rdev->blocked_wait); 3077 3079 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); 3078 - md_wakeup_thread(rdev->mddev->thread); 3079 3080 3080 3081 err = 0; 3081 3082 } else if (cmd_match(buf, "insync") && rdev->raid_disk == -1) { ··· 3112 3115 !test_bit(Replacement, &rdev->flags)) 3113 3116 set_bit(WantReplacement, &rdev->flags); 3114 3117 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); 3115 - md_wakeup_thread(rdev->mddev->thread); 3116 3118 err = 0; 3117 3119 } else if (cmd_match(buf, "-want_replacement")) { 3118 3120 /* Clearing 'want_replacement' is always allowed. ··· 3241 3245 if (rdev->raid_disk >= 0) 3242 3246 return -EBUSY; 3243 3247 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); 3244 - md_wakeup_thread(rdev->mddev->thread); 3245 3248 } else if (rdev->mddev->pers) { 3246 3249 /* Activating a spare .. or possibly reactivating 3247 3250 * if we ever get bitmaps working here. ··· 3334 3339 if (kstrtoull(buf, 10, &new_offset) < 0) 3335 3340 return -EINVAL; 3336 3341 3337 - if (mddev->sync_thread || 3338 - test_bit(MD_RECOVERY_RUNNING,&mddev->recovery)) 3342 + if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) 3339 3343 return -EBUSY; 3340 3344 if (new_offset == rdev->data_offset) 3341 3345 /* reset is always permitted */ ··· 3665 3671 struct kernfs_node *kn = NULL; 3666 3672 bool suspend = false; 3667 3673 ssize_t rv; 3668 - struct mddev *mddev = rdev->mddev; 3674 + struct mddev *mddev = READ_ONCE(rdev->mddev); 3669 3675 3670 3676 if (!entry->store) 3671 3677 return -EIO; ··· 4007 4013 */ 4008 4014 4009 4015 rv = -EBUSY; 4010 - if (mddev->sync_thread || 4011 - test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 4016 + if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 4012 4017 mddev->reshape_position != MaxSector || 4013 4018 mddev->sysfs_active) 4014 4019 goto out_unlock; ··· 6181 6188 /* run start up tasks that require md_thread */ 6182 6189 md_start(mddev); 6183 6190 6184 - md_wakeup_thread(mddev->thread); 6185 6191 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ 6186 6192 6187 6193 set_capacity_and_notify(mddev->gendisk, mddev->array_sectors); ··· 6201 6209 6202 6210 if (mddev->pers->start) { 6203 6211 set_bit(MD_RECOVERY_WAIT, &mddev->recovery); 6204 - md_wakeup_thread(mddev->thread); 6205 6212 ret = mddev->pers->start(mddev); 6206 6213 clear_bit(MD_RECOVERY_WAIT, &mddev->recovery); 6207 6214 md_wakeup_thread(mddev->sync_thread); ··· 6245 6254 pr_debug("md: %s switched to read-write mode.\n", mdname(mddev)); 6246 6255 /* Kick recovery or resync if necessary */ 6247 6256 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 6248 - md_wakeup_thread(mddev->thread); 6249 6257 md_wakeup_thread(mddev->sync_thread); 6250 6258 sysfs_notify_dirent_safe(mddev->sysfs_state); 6251 6259 return 0; ··· 6388 6398 if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { 6389 6399 did_freeze = 1; 6390 6400 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 6391 - md_wakeup_thread(mddev->thread); 6392 6401 } 6393 6402 6394 6403 stop_sync_thread(mddev, false, false); ··· 6397 6408 6398 6409 mutex_lock(&mddev->open_mutex); 6399 6410 if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) || 6400 - mddev->sync_thread || 6401 6411 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { 6402 6412 pr_warn("md: %s still in use.\n",mdname(mddev)); 6403 6413 err = -EBUSY; ··· 6419 6431 if ((mddev->pers && !err) || did_freeze) { 6420 6432 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 6421 6433 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 6422 - md_wakeup_thread(mddev->thread); 6423 6434 sysfs_notify_dirent_safe(mddev->sysfs_state); 6424 6435 } 6425 6436 ··· 6440 6453 if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { 6441 6454 did_freeze = 1; 6442 6455 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 6443 - md_wakeup_thread(mddev->thread); 6444 6456 } 6445 6457 6446 6458 stop_sync_thread(mddev, true, false); ··· 6447 6461 mutex_lock(&mddev->open_mutex); 6448 6462 if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) || 6449 6463 mddev->sysfs_active || 6450 - mddev->sync_thread || 6451 6464 test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { 6452 6465 pr_warn("md: %s still in use.\n",mdname(mddev)); 6453 6466 mutex_unlock(&mddev->open_mutex); 6454 6467 if (did_freeze) { 6455 6468 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 6456 6469 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 6457 - md_wakeup_thread(mddev->thread); 6458 6470 } 6459 6471 return -EBUSY; 6460 6472 } ··· 6993 7009 6994 7010 md_kick_rdev_from_array(rdev); 6995 7011 set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); 6996 - if (mddev->thread) 6997 - md_wakeup_thread(mddev->thread); 6998 - else 7012 + if (!mddev->thread) 6999 7013 md_update_sb(mddev, 1); 7000 7014 md_new_event(); 7001 7015 ··· 7075 7093 * array immediately. 7076 7094 */ 7077 7095 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 7078 - md_wakeup_thread(mddev->thread); 7079 7096 md_new_event(); 7080 7097 return 0; 7081 7098 ··· 7288 7307 * of each device. If num_sectors is zero, we find the largest size 7289 7308 * that fits. 7290 7309 */ 7291 - if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 7292 - mddev->sync_thread) 7310 + if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) 7293 7311 return -EBUSY; 7294 7312 if (!md_is_rdwr(mddev)) 7295 7313 return -EROFS; ··· 7325 7345 if (raid_disks <= 0 || 7326 7346 (mddev->max_disks && raid_disks >= mddev->max_disks)) 7327 7347 return -EINVAL; 7328 - if (mddev->sync_thread || 7329 - test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 7348 + if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 7330 7349 test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) || 7331 7350 mddev->reshape_position != MaxSector) 7332 7351 return -EBUSY; ··· 9241 9262 { 9242 9263 struct md_rdev *rdev; 9243 9264 9244 - rdev_for_each(rdev, mddev) 9245 - if (rdev_removeable(rdev) || rdev_addable(rdev)) 9265 + rcu_read_lock(); 9266 + rdev_for_each_rcu(rdev, mddev) { 9267 + if (rdev_removeable(rdev) || rdev_addable(rdev)) { 9268 + rcu_read_unlock(); 9246 9269 return true; 9270 + } 9271 + } 9272 + rcu_read_unlock(); 9247 9273 return false; 9248 9274 } 9249 9275
+2 -4
drivers/md/raid5.c
··· 6967 6967 pr_debug("md/raid: change stripe_size from %lu to %lu\n", 6968 6968 conf->stripe_size, new); 6969 6969 6970 - if (mddev->sync_thread || 6971 - test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 6972 - mddev->reshape_position != MaxSector || 6973 - mddev->sysfs_active) { 6970 + if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || 6971 + mddev->reshape_position != MaxSector || mddev->sysfs_active) { 6974 6972 err = -EBUSY; 6975 6973 goto out_unlock; 6976 6974 }