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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'md/4.4-rc5-fixes' of git://neil.brown.name/md

Pull md fixes from Neil Brown:
"Four fixes for md:

- two recently introduced regressions fixed.
- one older bug in RAID10 - tagged for -stable since 4.2
- one minor sysfs api improvement"

* tag 'md/4.4-rc5-fixes' of git://neil.brown.name/md:
Fix remove_and_add_spares removes drive added as spare in slot_store
md: fix bug due to nested suspend
MD: change journal disk role to disk 0
md/raid10: fix data corruption and crash during resync

+24 -10
+15 -7
drivers/md/md.c
··· 314 314 */ 315 315 void mddev_suspend(struct mddev *mddev) 316 316 { 317 - BUG_ON(mddev->suspended); 318 - mddev->suspended = 1; 317 + if (mddev->suspended++) 318 + return; 319 319 synchronize_rcu(); 320 320 wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0); 321 321 mddev->pers->quiesce(mddev, 1); ··· 326 326 327 327 void mddev_resume(struct mddev *mddev) 328 328 { 329 - mddev->suspended = 0; 329 + if (--mddev->suspended) 330 + return; 330 331 wake_up(&mddev->sb_wait); 331 332 mddev->pers->quiesce(mddev, 0); 332 333 ··· 1653 1652 rdev->journal_tail = le64_to_cpu(sb->journal_tail); 1654 1653 if (mddev->recovery_cp == MaxSector) 1655 1654 set_bit(MD_JOURNAL_CLEAN, &mddev->flags); 1656 - rdev->raid_disk = mddev->raid_disks; 1655 + rdev->raid_disk = 0; 1657 1656 break; 1658 1657 default: 1659 1658 rdev->saved_raid_disk = role; ··· 2774 2773 /* Activating a spare .. or possibly reactivating 2775 2774 * if we ever get bitmaps working here. 2776 2775 */ 2776 + int err; 2777 2777 2778 2778 if (rdev->raid_disk != -1) 2779 2779 return -EBUSY; ··· 2796 2794 rdev->saved_raid_disk = -1; 2797 2795 clear_bit(In_sync, &rdev->flags); 2798 2796 clear_bit(Bitmap_sync, &rdev->flags); 2799 - remove_and_add_spares(rdev->mddev, rdev); 2800 - if (rdev->raid_disk == -1) 2801 - return -EBUSY; 2797 + err = rdev->mddev->pers-> 2798 + hot_add_disk(rdev->mddev, rdev); 2799 + if (err) { 2800 + rdev->raid_disk = -1; 2801 + return err; 2802 + } else 2803 + sysfs_notify_dirent_safe(rdev->sysfs_state); 2804 + if (sysfs_link_rdev(rdev->mddev, rdev)) 2805 + /* failure here is OK */; 2802 2806 /* don't wakeup anyone, leave that to userspace. */ 2803 2807 } else { 2804 2808 if (slot >= rdev->mddev->raid_disks &&
+6 -2
drivers/md/md.h
··· 566 566 static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev) 567 567 { 568 568 char nm[20]; 569 - if (!test_bit(Replacement, &rdev->flags) && mddev->kobj.sd) { 569 + if (!test_bit(Replacement, &rdev->flags) && 570 + !test_bit(Journal, &rdev->flags) && 571 + mddev->kobj.sd) { 570 572 sprintf(nm, "rd%d", rdev->raid_disk); 571 573 return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm); 572 574 } else ··· 578 576 static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev) 579 577 { 580 578 char nm[20]; 581 - if (!test_bit(Replacement, &rdev->flags) && mddev->kobj.sd) { 579 + if (!test_bit(Replacement, &rdev->flags) && 580 + !test_bit(Journal, &rdev->flags) && 581 + mddev->kobj.sd) { 582 582 sprintf(nm, "rd%d", rdev->raid_disk); 583 583 sysfs_remove_link(&mddev->kobj, nm); 584 584 }
+3 -1
drivers/md/raid10.c
··· 1946 1946 1947 1947 first = i; 1948 1948 fbio = r10_bio->devs[i].bio; 1949 + fbio->bi_iter.bi_size = r10_bio->sectors << 9; 1950 + fbio->bi_iter.bi_idx = 0; 1949 1951 1950 1952 vcnt = (r10_bio->sectors + (PAGE_SIZE >> 9) - 1) >> (PAGE_SHIFT - 9); 1951 1953 /* now find blocks with errors */ ··· 1991 1989 bio_reset(tbio); 1992 1990 1993 1991 tbio->bi_vcnt = vcnt; 1994 - tbio->bi_iter.bi_size = r10_bio->sectors << 9; 1992 + tbio->bi_iter.bi_size = fbio->bi_iter.bi_size; 1995 1993 tbio->bi_rw = WRITE; 1996 1994 tbio->bi_private = r10_bio; 1997 1995 tbio->bi_iter.bi_sector = r10_bio->devs[i].addr;