aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c48
1 files changed, 24 insertions, 24 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 324a3663fcda..175c424f201f 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -371,10 +371,15 @@ static void md_end_flush(struct bio *bio, int err)
371 bio_put(bio); 371 bio_put(bio);
372} 372}
373 373
374static void submit_flushes(mddev_t *mddev) 374static void md_submit_flush_data(struct work_struct *ws);
375
376static void submit_flushes(struct work_struct *ws)
375{ 377{
378 mddev_t *mddev = container_of(ws, mddev_t, flush_work);
376 mdk_rdev_t *rdev; 379 mdk_rdev_t *rdev;
377 380
381 INIT_WORK(&mddev->flush_work, md_submit_flush_data);
382 atomic_set(&mddev->flush_pending, 1);
378 rcu_read_lock(); 383 rcu_read_lock();
379 list_for_each_entry_rcu(rdev, &mddev->disks, same_set) 384 list_for_each_entry_rcu(rdev, &mddev->disks, same_set)
380 if (rdev->raid_disk >= 0 && 385 if (rdev->raid_disk >= 0 &&
@@ -397,6 +402,8 @@ static void submit_flushes(mddev_t *mddev)
397 rdev_dec_pending(rdev, mddev); 402 rdev_dec_pending(rdev, mddev);
398 } 403 }
399 rcu_read_unlock(); 404 rcu_read_unlock();
405 if (atomic_dec_and_test(&mddev->flush_pending))
406 queue_work(md_wq, &mddev->flush_work);
400} 407}
401 408
402static void md_submit_flush_data(struct work_struct *ws) 409static void md_submit_flush_data(struct work_struct *ws)
@@ -404,8 +411,6 @@ static void md_submit_flush_data(struct work_struct *ws)
404 mddev_t *mddev = container_of(ws, mddev_t, flush_work); 411 mddev_t *mddev = container_of(ws, mddev_t, flush_work);
405 struct bio *bio = mddev->flush_bio; 412 struct bio *bio = mddev->flush_bio;
406 413
407 atomic_set(&mddev->flush_pending, 1);
408
409 if (bio->bi_size == 0) 414 if (bio->bi_size == 0)
410 /* an empty barrier - all done */ 415 /* an empty barrier - all done */
411 bio_endio(bio, 0); 416 bio_endio(bio, 0);
@@ -414,10 +419,9 @@ static void md_submit_flush_data(struct work_struct *ws)
414 if (mddev->pers->make_request(mddev, bio)) 419 if (mddev->pers->make_request(mddev, bio))
415 generic_make_request(bio); 420 generic_make_request(bio);
416 } 421 }
417 if (atomic_dec_and_test(&mddev->flush_pending)) { 422
418 mddev->flush_bio = NULL; 423 mddev->flush_bio = NULL;
419 wake_up(&mddev->sb_wait); 424 wake_up(&mddev->sb_wait);
420 }
421} 425}
422 426
423void md_flush_request(mddev_t *mddev, struct bio *bio) 427void md_flush_request(mddev_t *mddev, struct bio *bio)
@@ -429,13 +433,8 @@ void md_flush_request(mddev_t *mddev, struct bio *bio)
429 mddev->flush_bio = bio; 433 mddev->flush_bio = bio;
430 spin_unlock_irq(&mddev->write_lock); 434 spin_unlock_irq(&mddev->write_lock);
431 435
432 atomic_set(&mddev->flush_pending, 1); 436 INIT_WORK(&mddev->flush_work, submit_flushes);
433 INIT_WORK(&mddev->flush_work, md_submit_flush_data); 437 queue_work(md_wq, &mddev->flush_work);
434
435 submit_flushes(mddev);
436
437 if (atomic_dec_and_test(&mddev->flush_pending))
438 queue_work(md_wq, &mddev->flush_work);
439} 438}
440EXPORT_SYMBOL(md_flush_request); 439EXPORT_SYMBOL(md_flush_request);
441 440
@@ -1337,7 +1336,7 @@ super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
1337 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, 1336 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
1338 rdev->sb_page); 1337 rdev->sb_page);
1339 md_super_wait(rdev->mddev); 1338 md_super_wait(rdev->mddev);
1340 return num_sectors / 2; /* kB for sysfs */ 1339 return num_sectors;
1341} 1340}
1342 1341
1343 1342
@@ -1704,7 +1703,7 @@ super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
1704 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, 1703 md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
1705 rdev->sb_page); 1704 rdev->sb_page);
1706 md_super_wait(rdev->mddev); 1705 md_super_wait(rdev->mddev);
1707 return num_sectors / 2; /* kB for sysfs */ 1706 return num_sectors;
1708} 1707}
1709 1708
1710static struct super_type super_types[] = { 1709static struct super_type super_types[] = {
@@ -4296,9 +4295,6 @@ static int md_alloc(dev_t dev, char *name)
4296 goto abort; 4295 goto abort;
4297 mddev->queue->queuedata = mddev; 4296 mddev->queue->queuedata = mddev;
4298 4297
4299 /* Can be unlocked because the queue is new: no concurrency */
4300 queue_flag_set_unlocked(QUEUE_FLAG_CLUSTER, mddev->queue);
4301
4302 blk_queue_make_request(mddev->queue, md_make_request); 4298 blk_queue_make_request(mddev->queue, md_make_request);
4303 4299
4304 disk = alloc_disk(1 << shift); 4300 disk = alloc_disk(1 << shift);
@@ -4338,6 +4334,8 @@ static int md_alloc(dev_t dev, char *name)
4338 if (mddev->kobj.sd && 4334 if (mddev->kobj.sd &&
4339 sysfs_create_group(&mddev->kobj, &md_bitmap_group)) 4335 sysfs_create_group(&mddev->kobj, &md_bitmap_group))
4340 printk(KERN_DEBUG "pointless warning\n"); 4336 printk(KERN_DEBUG "pointless warning\n");
4337
4338 blk_queue_flush(mddev->queue, REQ_FLUSH | REQ_FUA);
4341 abort: 4339 abort:
4342 mutex_unlock(&disks_mutex); 4340 mutex_unlock(&disks_mutex);
4343 if (!error && mddev->kobj.sd) { 4341 if (!error && mddev->kobj.sd) {
@@ -5158,7 +5156,7 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
5158 PTR_ERR(rdev)); 5156 PTR_ERR(rdev));
5159 return PTR_ERR(rdev); 5157 return PTR_ERR(rdev);
5160 } 5158 }
5161 /* set save_raid_disk if appropriate */ 5159 /* set saved_raid_disk if appropriate */
5162 if (!mddev->persistent) { 5160 if (!mddev->persistent) {
5163 if (info->state & (1<<MD_DISK_SYNC) && 5161 if (info->state & (1<<MD_DISK_SYNC) &&
5164 info->raid_disk < mddev->raid_disks) 5162 info->raid_disk < mddev->raid_disks)
@@ -5168,7 +5166,10 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
5168 } else 5166 } else
5169 super_types[mddev->major_version]. 5167 super_types[mddev->major_version].
5170 validate_super(mddev, rdev); 5168 validate_super(mddev, rdev);
5171 rdev->saved_raid_disk = rdev->raid_disk; 5169 if (test_bit(In_sync, &rdev->flags))
5170 rdev->saved_raid_disk = rdev->raid_disk;
5171 else
5172 rdev->saved_raid_disk = -1;
5172 5173
5173 clear_bit(In_sync, &rdev->flags); /* just to be sure */ 5174 clear_bit(In_sync, &rdev->flags); /* just to be sure */
5174 if (info->state & (1<<MD_DISK_WRITEMOSTLY)) 5175 if (info->state & (1<<MD_DISK_WRITEMOSTLY))
@@ -6040,9 +6041,8 @@ static int md_thread(void * arg)
6040 || kthread_should_stop(), 6041 || kthread_should_stop(),
6041 thread->timeout); 6042 thread->timeout);
6042 6043
6043 clear_bit(THREAD_WAKEUP, &thread->flags); 6044 if (test_and_clear_bit(THREAD_WAKEUP, &thread->flags))
6044 6045 thread->run(thread->mddev);
6045 thread->run(thread->mddev);
6046 } 6046 }
6047 6047
6048 return 0; 6048 return 0;