aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid1.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@cse.unsw.edu.au>2005-06-21 20:17:12 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-21 22:07:43 -0400
commit06d91a5fe0b50c9060e70bdf7786f8a3c66249db (patch)
tree95a8b9228534cebb12eb31c1cc9cc0c45f685410 /drivers/md/raid1.c
parentfca4d848f0e6fafdc2b25f8a0cf1e76935f13ac2 (diff)
[PATCH] md: improve locking on 'safemode' and move superblock writes
When md marks the superblock dirty before a write, it calls generic_make_request (to write the superblock) from within generic_make_request (to write the first dirty block), which could cause problems later. With this patch, the superblock write is always done by the helper thread, and write request are delayed until that write completes. Also, the locking around marking the array dirty and writing the superblock is improved to avoid possible races. Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r--drivers/md/raid1.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index b34ad56362df..3f1280bbaf39 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -530,6 +530,8 @@ static int make_request(request_queue_t *q, struct bio * bio)
530 * thread has put up a bar for new requests. 530 * thread has put up a bar for new requests.
531 * Continue immediately if no resync is active currently. 531 * Continue immediately if no resync is active currently.
532 */ 532 */
533 if (md_write_start(mddev, bio)==0)
534 return 0;
533 spin_lock_irq(&conf->resync_lock); 535 spin_lock_irq(&conf->resync_lock);
534 wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock, ); 536 wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock, );
535 conf->nr_pending++; 537 conf->nr_pending++;
@@ -611,7 +613,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
611 rcu_read_unlock(); 613 rcu_read_unlock();
612 614
613 atomic_set(&r1_bio->remaining, 1); 615 atomic_set(&r1_bio->remaining, 1);
614 md_write_start(mddev); 616
615 for (i = 0; i < disks; i++) { 617 for (i = 0; i < disks; i++) {
616 struct bio *mbio; 618 struct bio *mbio;
617 if (!r1_bio->bios[i]) 619 if (!r1_bio->bios[i])