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 branch 'for-linus' of git://neil.brown.name/md

* 'for-linus' of git://neil.brown.name/md:
md/raid5: fix a hang on device failure.
md: fix clearing of 'blocked' flag in the presence of bad blocks.
md/linear: avoid corrupting structure while waiting for rcu_free to complete.
md: use REQ_NOIDLE flag in md_super_write()
md: ensure changes to 'write-mostly' are reflected in metadata.
md: report failure if a 'set faulty' request doesn't.

+15 -5
+1 -1
drivers/md/linear.h
··· 10 10 11 11 struct linear_private_data 12 12 { 13 + struct rcu_head rcu; 13 14 sector_t array_sectors; 14 15 dev_info_t disks[0]; 15 - struct rcu_head rcu; 16 16 }; 17 17 18 18
+13 -3
drivers/md/md.c
··· 848 848 bio->bi_end_io = super_written; 849 849 850 850 atomic_inc(&mddev->pending_writes); 851 - submit_bio(REQ_WRITE | REQ_SYNC | REQ_FLUSH | REQ_FUA, bio); 851 + submit_bio(WRITE_FLUSH_FUA, bio); 852 852 } 853 853 854 854 void md_super_wait(mddev_t *mddev) ··· 1738 1738 sb->level = cpu_to_le32(mddev->level); 1739 1739 sb->layout = cpu_to_le32(mddev->layout); 1740 1740 1741 + if (test_bit(WriteMostly, &rdev->flags)) 1742 + sb->devflags |= WriteMostly1; 1743 + else 1744 + sb->devflags &= ~WriteMostly1; 1745 + 1741 1746 if (mddev->bitmap && mddev->bitmap_info.file == NULL) { 1742 1747 sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_info.offset); 1743 1748 sb->feature_map = cpu_to_le32(MD_FEATURE_BITMAP_OFFSET); ··· 2566 2561 int err = -EINVAL; 2567 2562 if (cmd_match(buf, "faulty") && rdev->mddev->pers) { 2568 2563 md_error(rdev->mddev, rdev); 2569 - err = 0; 2564 + if (test_bit(Faulty, &rdev->flags)) 2565 + err = 0; 2566 + else 2567 + err = -EBUSY; 2570 2568 } else if (cmd_match(buf, "remove")) { 2571 2569 if (rdev->raid_disk >= 0) 2572 2570 err = -EBUSY; ··· 2592 2584 err = 0; 2593 2585 } else if (cmd_match(buf, "-blocked")) { 2594 2586 if (!test_bit(Faulty, &rdev->flags) && 2595 - test_bit(BlockedBadBlocks, &rdev->flags)) { 2587 + rdev->badblocks.unacked_exist) { 2596 2588 /* metadata handler doesn't understand badblocks, 2597 2589 * so we need to fail the device 2598 2590 */ ··· 5991 5983 return -ENODEV; 5992 5984 5993 5985 md_error(mddev, rdev); 5986 + if (!test_bit(Faulty, &rdev->flags)) 5987 + return -EBUSY; 5994 5988 return 0; 5995 5989 } 5996 5990
+1 -1
drivers/md/raid5.c
··· 3336 3336 3337 3337 finish: 3338 3338 /* wait for this device to become unblocked */ 3339 - if (unlikely(s.blocked_rdev)) 3339 + if (conf->mddev->external && unlikely(s.blocked_rdev)) 3340 3340 md_wait_for_blocked_rdev(s.blocked_rdev, conf->mddev); 3341 3341 3342 3342 if (s.handle_bad_blocks)