diff options
Diffstat (limited to 'drivers/md/md.c')
| -rw-r--r-- | drivers/md/md.c | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 4e957f3140a8..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 | ||
| 374 | static void submit_flushes(mddev_t *mddev) | 374 | static void md_submit_flush_data(struct work_struct *ws); |
| 375 | |||
| 376 | static 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 | ||
| 402 | static void md_submit_flush_data(struct work_struct *ws) | 409 | static 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 | ||
| 423 | void md_flush_request(mddev_t *mddev, struct bio *bio) | 427 | void 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 | } |
| 440 | EXPORT_SYMBOL(md_flush_request); | 439 | EXPORT_SYMBOL(md_flush_request); |
| 441 | 440 | ||
| @@ -706,7 +705,7 @@ static struct mdk_personality *find_pers(int level, char *clevel) | |||
| 706 | /* return the offset of the super block in 512byte sectors */ | 705 | /* return the offset of the super block in 512byte sectors */ |
| 707 | static inline sector_t calc_dev_sboffset(struct block_device *bdev) | 706 | static inline sector_t calc_dev_sboffset(struct block_device *bdev) |
| 708 | { | 707 | { |
| 709 | sector_t num_sectors = bdev->bd_inode->i_size / 512; | 708 | sector_t num_sectors = i_size_read(bdev->bd_inode) / 512; |
| 710 | return MD_NEW_SIZE_SECTORS(num_sectors); | 709 | return MD_NEW_SIZE_SECTORS(num_sectors); |
| 711 | } | 710 | } |
| 712 | 711 | ||
| @@ -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 | ||
| @@ -1386,7 +1385,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | |||
| 1386 | */ | 1385 | */ |
| 1387 | switch(minor_version) { | 1386 | switch(minor_version) { |
| 1388 | case 0: | 1387 | case 0: |
| 1389 | sb_start = rdev->bdev->bd_inode->i_size >> 9; | 1388 | sb_start = i_size_read(rdev->bdev->bd_inode) >> 9; |
| 1390 | sb_start -= 8*2; | 1389 | sb_start -= 8*2; |
| 1391 | sb_start &= ~(sector_t)(4*2-1); | 1390 | sb_start &= ~(sector_t)(4*2-1); |
| 1392 | break; | 1391 | break; |
| @@ -1472,7 +1471,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | |||
| 1472 | ret = 0; | 1471 | ret = 0; |
| 1473 | } | 1472 | } |
| 1474 | if (minor_version) | 1473 | if (minor_version) |
| 1475 | rdev->sectors = (rdev->bdev->bd_inode->i_size >> 9) - | 1474 | rdev->sectors = (i_size_read(rdev->bdev->bd_inode) >> 9) - |
| 1476 | le64_to_cpu(sb->data_offset); | 1475 | le64_to_cpu(sb->data_offset); |
| 1477 | else | 1476 | else |
| 1478 | rdev->sectors = rdev->sb_start; | 1477 | rdev->sectors = rdev->sb_start; |
| @@ -1680,7 +1679,7 @@ super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors) | |||
| 1680 | return 0; /* component must fit device */ | 1679 | return 0; /* component must fit device */ |
| 1681 | if (rdev->sb_start < rdev->data_offset) { | 1680 | if (rdev->sb_start < rdev->data_offset) { |
| 1682 | /* minor versions 1 and 2; superblock before data */ | 1681 | /* minor versions 1 and 2; superblock before data */ |
| 1683 | max_sectors = rdev->bdev->bd_inode->i_size >> 9; | 1682 | max_sectors = i_size_read(rdev->bdev->bd_inode) >> 9; |
| 1684 | max_sectors -= rdev->data_offset; | 1683 | max_sectors -= rdev->data_offset; |
| 1685 | if (!num_sectors || num_sectors > max_sectors) | 1684 | if (!num_sectors || num_sectors > max_sectors) |
| 1686 | num_sectors = max_sectors; | 1685 | num_sectors = max_sectors; |
| @@ -1690,7 +1689,7 @@ super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors) | |||
| 1690 | } else { | 1689 | } else { |
| 1691 | /* minor version 0; superblock after data */ | 1690 | /* minor version 0; superblock after data */ |
| 1692 | sector_t sb_start; | 1691 | sector_t sb_start; |
| 1693 | sb_start = (rdev->bdev->bd_inode->i_size >> 9) - 8*2; | 1692 | sb_start = (i_size_read(rdev->bdev->bd_inode) >> 9) - 8*2; |
| 1694 | sb_start &= ~(sector_t)(4*2 - 1); | 1693 | sb_start &= ~(sector_t)(4*2 - 1); |
| 1695 | max_sectors = rdev->sectors + sb_start - rdev->sb_start; | 1694 | max_sectors = rdev->sectors + sb_start - rdev->sb_start; |
| 1696 | if (!num_sectors || num_sectors > max_sectors) | 1695 | if (!num_sectors || num_sectors > max_sectors) |
| @@ -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 | ||
| 1710 | static struct super_type super_types[] = { | 1709 | static struct super_type super_types[] = { |
| @@ -2584,7 +2583,7 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
| 2584 | if (!sectors) | 2583 | if (!sectors) |
| 2585 | return -EBUSY; | 2584 | return -EBUSY; |
| 2586 | } else if (!sectors) | 2585 | } else if (!sectors) |
| 2587 | sectors = (rdev->bdev->bd_inode->i_size >> 9) - | 2586 | sectors = (i_size_read(rdev->bdev->bd_inode) >> 9) - |
| 2588 | rdev->data_offset; | 2587 | rdev->data_offset; |
| 2589 | } | 2588 | } |
| 2590 | if (sectors < my_mddev->dev_sectors) | 2589 | if (sectors < my_mddev->dev_sectors) |
| @@ -2797,7 +2796,7 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi | |||
| 2797 | 2796 | ||
| 2798 | kobject_init(&rdev->kobj, &rdev_ktype); | 2797 | kobject_init(&rdev->kobj, &rdev_ktype); |
| 2799 | 2798 | ||
| 2800 | size = rdev->bdev->bd_inode->i_size >> BLOCK_SIZE_BITS; | 2799 | size = i_size_read(rdev->bdev->bd_inode) >> BLOCK_SIZE_BITS; |
| 2801 | if (!size) { | 2800 | if (!size) { |
| 2802 | printk(KERN_WARNING | 2801 | printk(KERN_WARNING |
| 2803 | "md: %s has zero or unknown size, marking faulty!\n", | 2802 | "md: %s has zero or unknown size, marking faulty!\n", |
| @@ -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)) |
| @@ -5235,8 +5236,8 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info) | |||
| 5235 | 5236 | ||
| 5236 | if (!mddev->persistent) { | 5237 | if (!mddev->persistent) { |
| 5237 | printk(KERN_INFO "md: nonpersistent superblock ...\n"); | 5238 | printk(KERN_INFO "md: nonpersistent superblock ...\n"); |
| 5238 | rdev->sb_start = rdev->bdev->bd_inode->i_size / 512; | 5239 | rdev->sb_start = i_size_read(rdev->bdev->bd_inode) / 512; |
| 5239 | } else | 5240 | } else |
| 5240 | rdev->sb_start = calc_dev_sboffset(rdev->bdev); | 5241 | rdev->sb_start = calc_dev_sboffset(rdev->bdev); |
| 5241 | rdev->sectors = rdev->sb_start; | 5242 | rdev->sectors = rdev->sb_start; |
| 5242 | 5243 | ||
| @@ -5306,7 +5307,7 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev) | |||
| 5306 | if (mddev->persistent) | 5307 | if (mddev->persistent) |
| 5307 | rdev->sb_start = calc_dev_sboffset(rdev->bdev); | 5308 | rdev->sb_start = calc_dev_sboffset(rdev->bdev); |
| 5308 | else | 5309 | else |
| 5309 | rdev->sb_start = rdev->bdev->bd_inode->i_size / 512; | 5310 | rdev->sb_start = i_size_read(rdev->bdev->bd_inode) / 512; |
| 5310 | 5311 | ||
| 5311 | rdev->sectors = rdev->sb_start; | 5312 | rdev->sectors = rdev->sb_start; |
| 5312 | 5313 | ||
| @@ -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; |
