diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-18 12:32:44 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-18 12:32:44 -0500 |
| commit | ea88eeac0cb8328014b53d80ca631e8dc0dc18dc (patch) | |
| tree | de605c1d0e7ab1e342eedad47c56061b65a6b790 /drivers/md | |
| parent | 848b81415c42ff3dc9a4204749087b015c37ef66 (diff) | |
| parent | a9add5d92b64ea57fb4c3b557c3891cdeb15fa0c (diff) | |
Merge tag 'md-3.8' of git://neil.brown.name/md
Pull md update from Neil Brown:
"Mostly just little fixes. Probably biggest part is AVX accelerated
RAID6 calculations."
* tag 'md-3.8' of git://neil.brown.name/md:
md/raid5: add blktrace calls
md/raid5: use async_tx_quiesce() instead of open-coding it.
md: Use ->curr_resync as last completed request when cleanly aborting resync.
lib/raid6: build proper files on corresponding arch
lib/raid6: Add AVX2 optimized gen_syndrome functions
lib/raid6: Add AVX2 optimized recovery functions
md: Update checkpoint of resync/recovery based on time.
md:Add place to update ->recovery_cp.
md.c: re-indent various 'switch' statements.
md: close race between removing and adding a device.
md: removed unused variable in calc_sb_1_csm.
Diffstat (limited to 'drivers/md')
| -rw-r--r-- | drivers/md/md.c | 256 | ||||
| -rw-r--r-- | drivers/md/md.h | 2 | ||||
| -rw-r--r-- | drivers/md/raid5.c | 43 |
3 files changed, 171 insertions, 130 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 4843b004c558..3db3d1b271f7 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -1414,12 +1414,11 @@ static __le32 calc_sb_1_csum(struct mdp_superblock_1 * sb) | |||
| 1414 | unsigned long long newcsum; | 1414 | unsigned long long newcsum; |
| 1415 | int size = 256 + le32_to_cpu(sb->max_dev)*2; | 1415 | int size = 256 + le32_to_cpu(sb->max_dev)*2; |
| 1416 | __le32 *isuper = (__le32*)sb; | 1416 | __le32 *isuper = (__le32*)sb; |
| 1417 | int i; | ||
| 1418 | 1417 | ||
| 1419 | disk_csum = sb->sb_csum; | 1418 | disk_csum = sb->sb_csum; |
| 1420 | sb->sb_csum = 0; | 1419 | sb->sb_csum = 0; |
| 1421 | newcsum = 0; | 1420 | newcsum = 0; |
| 1422 | for (i=0; size>=4; size -= 4 ) | 1421 | for (; size >= 4; size -= 4) |
| 1423 | newcsum += le32_to_cpu(*isuper++); | 1422 | newcsum += le32_to_cpu(*isuper++); |
| 1424 | 1423 | ||
| 1425 | if (size == 2) | 1424 | if (size == 2) |
| @@ -4753,6 +4752,8 @@ md_attr_store(struct kobject *kobj, struct attribute *attr, | |||
| 4753 | } | 4752 | } |
| 4754 | mddev_get(mddev); | 4753 | mddev_get(mddev); |
| 4755 | spin_unlock(&all_mddevs_lock); | 4754 | spin_unlock(&all_mddevs_lock); |
| 4755 | if (entry->store == new_dev_store) | ||
| 4756 | flush_workqueue(md_misc_wq); | ||
| 4756 | rv = mddev_lock(mddev); | 4757 | rv = mddev_lock(mddev); |
| 4757 | if (!rv) { | 4758 | if (!rv) { |
| 4758 | rv = entry->store(mddev, page, length); | 4759 | rv = entry->store(mddev, page, length); |
| @@ -6346,24 +6347,23 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 6346 | * Commands dealing with the RAID driver but not any | 6347 | * Commands dealing with the RAID driver but not any |
| 6347 | * particular array: | 6348 | * particular array: |
| 6348 | */ | 6349 | */ |
| 6349 | switch (cmd) | 6350 | switch (cmd) { |
| 6350 | { | 6351 | case RAID_VERSION: |
| 6351 | case RAID_VERSION: | 6352 | err = get_version(argp); |
| 6352 | err = get_version(argp); | 6353 | goto done; |
| 6353 | goto done; | ||
| 6354 | 6354 | ||
| 6355 | case PRINT_RAID_DEBUG: | 6355 | case PRINT_RAID_DEBUG: |
| 6356 | err = 0; | 6356 | err = 0; |
| 6357 | md_print_devices(); | 6357 | md_print_devices(); |
| 6358 | goto done; | 6358 | goto done; |
| 6359 | 6359 | ||
| 6360 | #ifndef MODULE | 6360 | #ifndef MODULE |
| 6361 | case RAID_AUTORUN: | 6361 | case RAID_AUTORUN: |
| 6362 | err = 0; | 6362 | err = 0; |
| 6363 | autostart_arrays(arg); | 6363 | autostart_arrays(arg); |
| 6364 | goto done; | 6364 | goto done; |
| 6365 | #endif | 6365 | #endif |
| 6366 | default:; | 6366 | default:; |
| 6367 | } | 6367 | } |
| 6368 | 6368 | ||
| 6369 | /* | 6369 | /* |
| @@ -6398,6 +6398,10 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 6398 | goto abort; | 6398 | goto abort; |
| 6399 | } | 6399 | } |
| 6400 | 6400 | ||
| 6401 | if (cmd == ADD_NEW_DISK) | ||
| 6402 | /* need to ensure md_delayed_delete() has completed */ | ||
| 6403 | flush_workqueue(md_misc_wq); | ||
| 6404 | |||
| 6401 | err = mddev_lock(mddev); | 6405 | err = mddev_lock(mddev); |
| 6402 | if (err) { | 6406 | if (err) { |
| 6403 | printk(KERN_INFO | 6407 | printk(KERN_INFO |
| @@ -6406,50 +6410,44 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 6406 | goto abort; | 6410 | goto abort; |
| 6407 | } | 6411 | } |
| 6408 | 6412 | ||
| 6409 | switch (cmd) | 6413 | if (cmd == SET_ARRAY_INFO) { |
| 6410 | { | 6414 | mdu_array_info_t info; |
| 6411 | case SET_ARRAY_INFO: | 6415 | if (!arg) |
| 6412 | { | 6416 | memset(&info, 0, sizeof(info)); |
| 6413 | mdu_array_info_t info; | 6417 | else if (copy_from_user(&info, argp, sizeof(info))) { |
| 6414 | if (!arg) | 6418 | err = -EFAULT; |
| 6415 | memset(&info, 0, sizeof(info)); | 6419 | goto abort_unlock; |
| 6416 | else if (copy_from_user(&info, argp, sizeof(info))) { | 6420 | } |
| 6417 | err = -EFAULT; | 6421 | if (mddev->pers) { |
| 6418 | goto abort_unlock; | 6422 | err = update_array_info(mddev, &info); |
| 6419 | } | 6423 | if (err) { |
| 6420 | if (mddev->pers) { | 6424 | printk(KERN_WARNING "md: couldn't update" |
| 6421 | err = update_array_info(mddev, &info); | 6425 | " array info. %d\n", err); |
| 6422 | if (err) { | 6426 | goto abort_unlock; |
| 6423 | printk(KERN_WARNING "md: couldn't update" | ||
| 6424 | " array info. %d\n", err); | ||
| 6425 | goto abort_unlock; | ||
| 6426 | } | ||
| 6427 | goto done_unlock; | ||
| 6428 | } | ||
| 6429 | if (!list_empty(&mddev->disks)) { | ||
| 6430 | printk(KERN_WARNING | ||
| 6431 | "md: array %s already has disks!\n", | ||
| 6432 | mdname(mddev)); | ||
| 6433 | err = -EBUSY; | ||
| 6434 | goto abort_unlock; | ||
| 6435 | } | ||
| 6436 | if (mddev->raid_disks) { | ||
| 6437 | printk(KERN_WARNING | ||
| 6438 | "md: array %s already initialised!\n", | ||
| 6439 | mdname(mddev)); | ||
| 6440 | err = -EBUSY; | ||
| 6441 | goto abort_unlock; | ||
| 6442 | } | ||
| 6443 | err = set_array_info(mddev, &info); | ||
| 6444 | if (err) { | ||
| 6445 | printk(KERN_WARNING "md: couldn't set" | ||
| 6446 | " array info. %d\n", err); | ||
| 6447 | goto abort_unlock; | ||
| 6448 | } | ||
| 6449 | } | 6427 | } |
| 6450 | goto done_unlock; | 6428 | goto done_unlock; |
| 6451 | 6429 | } | |
| 6452 | default:; | 6430 | if (!list_empty(&mddev->disks)) { |
| 6431 | printk(KERN_WARNING | ||
| 6432 | "md: array %s already has disks!\n", | ||
| 6433 | mdname(mddev)); | ||
| 6434 | err = -EBUSY; | ||
| 6435 | goto abort_unlock; | ||
| 6436 | } | ||
| 6437 | if (mddev->raid_disks) { | ||
| 6438 | printk(KERN_WARNING | ||
| 6439 | "md: array %s already initialised!\n", | ||
| 6440 | mdname(mddev)); | ||
| 6441 | err = -EBUSY; | ||
| 6442 | goto abort_unlock; | ||
| 6443 | } | ||
| 6444 | err = set_array_info(mddev, &info); | ||
| 6445 | if (err) { | ||
| 6446 | printk(KERN_WARNING "md: couldn't set" | ||
| 6447 | " array info. %d\n", err); | ||
| 6448 | goto abort_unlock; | ||
| 6449 | } | ||
| 6450 | goto done_unlock; | ||
| 6453 | } | 6451 | } |
| 6454 | 6452 | ||
| 6455 | /* | 6453 | /* |
| @@ -6468,52 +6466,51 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 6468 | /* | 6466 | /* |
| 6469 | * Commands even a read-only array can execute: | 6467 | * Commands even a read-only array can execute: |
| 6470 | */ | 6468 | */ |
| 6471 | switch (cmd) | 6469 | switch (cmd) { |
| 6472 | { | 6470 | case GET_BITMAP_FILE: |
| 6473 | case GET_BITMAP_FILE: | 6471 | err = get_bitmap_file(mddev, argp); |
| 6474 | err = get_bitmap_file(mddev, argp); | 6472 | goto done_unlock; |
| 6475 | goto done_unlock; | ||
| 6476 | 6473 | ||
| 6477 | case RESTART_ARRAY_RW: | 6474 | case RESTART_ARRAY_RW: |
| 6478 | err = restart_array(mddev); | 6475 | err = restart_array(mddev); |
| 6479 | goto done_unlock; | 6476 | goto done_unlock; |
| 6480 | 6477 | ||
| 6481 | case STOP_ARRAY: | 6478 | case STOP_ARRAY: |
| 6482 | err = do_md_stop(mddev, 0, bdev); | 6479 | err = do_md_stop(mddev, 0, bdev); |
| 6483 | goto done_unlock; | < | |
