Skip to content

Commit 7768ee3

Browse files
committed
Merge tag 'md/4.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md
Pull MD fixes from Shaohua Li: "Three small fixes for MD: - md-cluster fix for faulty device from Guoqing - writehint fix for writebehind IO for raid1 from Mariusz - a live lock fix for interrupted recovery from Yufen" * tag 'md/4.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md: raid1: copy write hint from master bio to behind bio md/raid1: exit sync request if MD_RECOVERY_INTR is set md-cluster: don't update recovery_offset for faulty device
2 parents a9e5b73 + dba40d4 commit 7768ee3

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

drivers/md/md.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9256,8 +9256,10 @@ void md_reload_sb(struct mddev *mddev, int nr)
92569256
check_sb_changes(mddev, rdev);
92579257

92589258
/* Read all rdev's to update recovery_offset */
9259-
rdev_for_each_rcu(rdev, mddev)
9260-
read_rdev(mddev, rdev);
9259+
rdev_for_each_rcu(rdev, mddev) {
9260+
if (!test_bit(Faulty, &rdev->flags))
9261+
read_rdev(mddev, rdev);
9262+
}
92619263
}
92629264
EXPORT_SYMBOL(md_reload_sb);
92639265

drivers/md/raid1.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ static void flush_pending_writes(struct r1conf *conf)
854854
* there is no normal IO happeing. It must arrange to call
855855
* lower_barrier when the particular background IO completes.
856856
*/
857-
static void raise_barrier(struct r1conf *conf, sector_t sector_nr)
857+
static sector_t raise_barrier(struct r1conf *conf, sector_t sector_nr)
858858
{
859859
int idx = sector_to_idx(sector_nr);
860860

@@ -885,13 +885,23 @@ static void raise_barrier(struct r1conf *conf, sector_t sector_nr)
885885
* max resync count which allowed on current I/O barrier bucket.
886886
*/
887887
wait_event_lock_irq(conf->wait_barrier,
888-
!conf->array_frozen &&
888+
(!conf->array_frozen &&
889889
!atomic_read(&conf->nr_pending[idx]) &&
890-
atomic_read(&conf->barrier[idx]) < RESYNC_DEPTH,
890+
atomic_read(&conf->barrier[idx]) < RESYNC_DEPTH) ||
891+
test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery),
891892
conf->resync_lock);
892893

894+
if (test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) {
895+
atomic_dec(&conf->barrier[idx]);
896+
spin_unlock_irq(&conf->resync_lock);
897+
wake_up(&conf->wait_barrier);
898+
return -EINTR;
899+
}
900+
893901
atomic_inc(&conf->nr_sync_pending);
894902
spin_unlock_irq(&conf->resync_lock);
903+
904+
return 0;
895905
}
896906

897907
static void lower_barrier(struct r1conf *conf, sector_t sector_nr)
@@ -1092,6 +1102,8 @@ static void alloc_behind_master_bio(struct r1bio *r1_bio,
10921102
goto skip_copy;
10931103
}
10941104

1105+
behind_bio->bi_write_hint = bio->bi_write_hint;
1106+
10951107
while (i < vcnt && size) {
10961108
struct page *page;
10971109
int len = min_t(int, PAGE_SIZE, size);
@@ -2662,9 +2674,12 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr,
26622674

26632675
bitmap_cond_end_sync(mddev->bitmap, sector_nr,
26642676
mddev_is_clustered(mddev) && (sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high));
2665-
r1_bio = raid1_alloc_init_r1buf(conf);
26662677

2667-
raise_barrier(conf, sector_nr);
2678+
2679+
if (raise_barrier(conf, sector_nr))
2680+
return 0;
2681+
2682+
r1_bio = raid1_alloc_init_r1buf(conf);
26682683

26692684
rcu_read_lock();
26702685
/*

0 commit comments

Comments
 (0)