diff options
author | David Sterba <dsterba@suse.com> | 2018-09-07 10:11:23 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-12-17 08:51:45 -0500 |
commit | cb5583dd52fab469a001a007385066fcd60629c5 (patch) | |
tree | 879234a636ac76661a0d9757a665cbc93b3a9562 /fs/btrfs/dev-replace.c | |
parent | 53176dde0acd8fa49c6c2e6097283acc6241480f (diff) |
btrfs: dev-replace: open code trivial locking helpers
The dev-replace locking functions are now trivial wrappers around rw
semaphore that can be used directly everywhere. No functional change.
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/dev-replace.c')
-rw-r--r-- | fs/btrfs/dev-replace.c | 81 |
1 files changed, 31 insertions, 50 deletions
diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c index a71661f43dec..6f7e890bf480 100644 --- a/fs/btrfs/dev-replace.c +++ b/fs/btrfs/dev-replace.c | |||
@@ -284,13 +284,13 @@ int btrfs_run_dev_replace(struct btrfs_trans_handle *trans, | |||
284 | struct btrfs_dev_replace_item *ptr; | 284 | struct btrfs_dev_replace_item *ptr; |
285 | struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; | 285 | struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; |
286 | 286 | ||
287 | btrfs_dev_replace_read_lock(dev_replace); | 287 | down_read(&dev_replace->rwsem); |
288 | if (!dev_replace->is_valid || | 288 | if (!dev_replace->is_valid || |
289 | !dev_replace->item_needs_writeback) { | 289 | !dev_replace->item_needs_writeback) { |
290 | btrfs_dev_replace_read_unlock(dev_replace); | 290 | up_read(&dev_replace->rwsem); |
291 | return 0; | 291 | return 0; |
292 | } | 292 | } |
293 | btrfs_dev_replace_read_unlock(dev_replace); | 293 | up_read(&dev_replace->rwsem); |
294 | 294 | ||
295 | key.objectid = 0; | 295 | key.objectid = 0; |
296 | key.type = BTRFS_DEV_REPLACE_KEY; | 296 | key.type = BTRFS_DEV_REPLACE_KEY; |
@@ -348,7 +348,7 @@ int btrfs_run_dev_replace(struct btrfs_trans_handle *trans, | |||
348 | ptr = btrfs_item_ptr(eb, path->slots[0], | 348 | ptr = btrfs_item_ptr(eb, path->slots[0], |
349 | struct btrfs_dev_replace_item); | 349 | struct btrfs_dev_replace_item); |
350 | 350 | ||
351 | btrfs_dev_replace_write_lock(dev_replace); | 351 | down_write(&dev_replace->rwsem); |
352 | if (dev_replace->srcdev) | 352 | if (dev_replace->srcdev) |
353 | btrfs_set_dev_replace_src_devid(eb, ptr, | 353 | btrfs_set_dev_replace_src_devid(eb, ptr, |
354 | dev_replace->srcdev->devid); | 354 | dev_replace->srcdev->devid); |
@@ -371,7 +371,7 @@ int btrfs_run_dev_replace(struct btrfs_trans_handle *trans, | |||
371 | btrfs_set_dev_replace_cursor_right(eb, ptr, | 371 | btrfs_set_dev_replace_cursor_right(eb, ptr, |
372 | dev_replace->cursor_right); | 372 | dev_replace->cursor_right); |
373 | dev_replace->item_needs_writeback = 0; | 373 | dev_replace->item_needs_writeback = 0; |
374 | btrfs_dev_replace_write_unlock(dev_replace); | 374 | up_write(&dev_replace->rwsem); |
375 | 375 | ||
376 | btrfs_mark_buffer_dirty(eb); | 376 | btrfs_mark_buffer_dirty(eb); |
377 | 377 | ||
@@ -432,7 +432,7 @@ static int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info, | |||
432 | } | 432 | } |
433 | 433 | ||
434 | need_unlock = true; | 434 | need_unlock = true; |
435 | btrfs_dev_replace_write_lock(dev_replace); | 435 | down_write(&dev_replace->rwsem); |
436 | switch (dev_replace->replace_state) { | 436 | switch (dev_replace->replace_state) { |
437 | case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: | 437 | case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: |
438 | case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: | 438 | case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: |
@@ -470,7 +470,7 @@ static int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info, | |||
470 | dev_replace->item_needs_writeback = 1; | 470 | dev_replace->item_needs_writeback = 1; |
471 | atomic64_set(&dev_replace->num_write_errors, 0); | 471 | atomic64_set(&dev_replace->num_write_errors, 0); |
472 | atomic64_set(&dev_replace->num_uncorrectable_read_errors, 0); | 472 | atomic64_set(&dev_replace->num_uncorrectable_read_errors, 0); |
473 | btrfs_dev_replace_write_unlock(dev_replace); | 473 | up_write(&dev_replace->rwsem); |
474 | need_unlock = false; | 474 | need_unlock = false; |
475 | 475 | ||
476 | ret = btrfs_sysfs_add_device_link(tgt_device->fs_devices, tgt_device); | 476 | ret = btrfs_sysfs_add_device_link(tgt_device->fs_devices, tgt_device); |
@@ -484,7 +484,7 @@ static int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info, | |||
484 | if (IS_ERR(trans)) { | 484 | if (IS_ERR(trans)) { |
485 | ret = PTR_ERR(trans); | 485 | ret = PTR_ERR(trans); |
486 | need_unlock = true; | 486 | need_unlock = true; |
487 | btrfs_dev_replace_write_lock(dev_replace); | 487 | down_write(&dev_replace->rwsem); |
488 | dev_replace->replace_state = | 488 | dev_replace->replace_state = |
489 | BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED; | 489 | BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED; |
490 | dev_replace->srcdev = NULL; | 490 | dev_replace->srcdev = NULL; |
@@ -511,7 +511,7 @@ static int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info, | |||
511 | 511 | ||
512 | leave: | 512 | leave: |
513 | if (need_unlock) | 513 | if (need_unlock) |
514 | btrfs_dev_replace_write_unlock(dev_replace); | 514 | up_write(&dev_replace->rwsem); |
515 | btrfs_destroy_dev_replace_tgtdev(tgt_device); | 515 | btrfs_destroy_dev_replace_tgtdev(tgt_device); |
516 | return ret; | 516 | return ret; |
517 | } | 517 | } |
@@ -579,18 +579,18 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info, | |||
579 | /* don't allow cancel or unmount to disturb the finishing procedure */ | 579 | /* don't allow cancel or unmount to disturb the finishing procedure */ |
580 | mutex_lock(&dev_replace->lock_finishing_cancel_unmount); | 580 | mutex_lock(&dev_replace->lock_finishing_cancel_unmount); |
581 | 581 | ||
582 | btrfs_dev_replace_read_lock(dev_replace); | 582 | down_read(&dev_replace->rwsem); |
583 | /* was the operation canceled, or is it finished? */ | 583 | /* was the operation canceled, or is it finished? */ |
584 | if (dev_replace->replace_state != | 584 | if (dev_replace->replace_state != |
585 | BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED) { | 585 | BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED) { |
586 | btrfs_dev_replace_read_unlock(dev_replace); | 586 | up_read(&dev_replace->rwsem); |
587 | mutex_unlock(&dev_replace->lock_finishing_cancel_unmount); | 587 | mutex_unlock(&dev_replace->lock_finishing_cancel_unmount); |
588 | return 0; | 588 | return 0; |
589 | } | 589 | } |
590 | 590 | ||
591 | tgt_device = dev_replace->tgtdev; | 591 | tgt_device = dev_replace->tgtdev; |
592 | src_device = dev_replace->srcdev; | 592 | src_device = dev_replace->srcdev; |
593 | btrfs_dev_replace_read_unlock(dev_replace); | 593 | up_read(&dev_replace->rwsem); |
594 | 594 | ||
595 | /* | 595 | /* |
596 | * flush all outstanding I/O and inode extent mappings before the | 596 | * flush all outstanding I/O and inode extent mappings before the |
@@ -614,7 +614,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info, | |||
614 | /* keep away write_all_supers() during the finishing procedure */ | 614 | /* keep away write_all_supers() during the finishing procedure */ |
615 | mutex_lock(&fs_info->fs_devices->device_list_mutex); | 615 | mutex_lock(&fs_info->fs_devices->device_list_mutex); |
616 | mutex_lock(&fs_info->chunk_mutex); | 616 | mutex_lock(&fs_info->chunk_mutex); |
617 | btrfs_dev_replace_write_lock(dev_replace); | 617 | down_write(&dev_replace->rwsem); |
618 | dev_replace->replace_state = | 618 | dev_replace->replace_state = |
619 | scrub_ret ? BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED | 619 | scrub_ret ? BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED |
620 | : BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED; | 620 | : BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED; |
@@ -635,7 +635,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info, | |||
635 | btrfs_dev_name(src_device), | 635 | btrfs_dev_name(src_device), |
636 | src_device->devid, | 636 | src_device->devid, |
637 | rcu_str_deref(tgt_device->name), scrub_ret); | 637 | rcu_str_deref(tgt_device->name), scrub_ret); |
638 | btrfs_dev_replace_write_unlock(dev_replace); | 638 | up_write(&dev_replace->rwsem); |
639 | mutex_unlock(&fs_info->chunk_mutex); | 639 | mutex_unlock(&fs_info->chunk_mutex); |
640 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); | 640 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); |
641 | btrfs_rm_dev_replace_blocked(fs_info); | 641 | btrfs_rm_dev_replace_blocked(fs_info); |
@@ -671,8 +671,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info, | |||
671 | list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list); | 671 | list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list); |
672 | fs_info->fs_devices->rw_devices++; | 672 | fs_info->fs_devices->rw_devices++; |
673 | 673 | ||
674 | btrfs_dev_replace_write_unlock(dev_replace); | 674 | up_write(&dev_replace->rwsem); |
675 | |||
676 | btrfs_rm_dev_replace_blocked(fs_info); | 675 | btrfs_rm_dev_replace_blocked(fs_info); |
677 | 676 | ||
678 | btrfs_rm_dev_replace_remove_srcdev(src_device); | 677 | btrfs_rm_dev_replace_remove_srcdev(src_device); |
@@ -769,7 +768,7 @@ void btrfs_dev_replace_status(struct btrfs_fs_info *fs_info, | |||
769 | { | 768 | { |
770 | struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; | 769 | struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; |
771 | 770 | ||
772 | btrfs_dev_replace_read_lock(dev_replace); | 771 | down_read(&dev_replace->rwsem); |
773 | /* even if !dev_replace_is_valid, the values are good enough for | 772 | /* even if !dev_replace_is_valid, the values are good enough for |
774 | * the replace_status ioctl */ | 773 | * the replace_status ioctl */ |
775 | args->result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR; | 774 | args->result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR; |
@@ -781,7 +780,7 @@ void btrfs_dev_replace_status(struct btrfs_fs_info *fs_info, | |||
781 | args->status.num_uncorrectable_read_errors = | 780 | args->status.num_uncorrectable_read_errors = |
782 | atomic64_read(&dev_replace->num_uncorrectable_read_errors); | 781 | atomic64_read(&dev_replace->num_uncorrectable_read_errors); |
783 | args->status.progress_1000 = btrfs_dev_replace_progress(fs_info); | 782 | args->status.progress_1000 = btrfs_dev_replace_progress(fs_info); |
784 | btrfs_dev_replace_read_unlock(dev_replace); | 783 | up_read(&dev_replace->rwsem); |
785 | } | 784 | } |
786 | 785 | ||
787 | int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info) | 786 | int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info) |
@@ -798,18 +797,18 @@ int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info) | |||
798 | return -EROFS; | 797 | return -EROFS; |
799 | 798 | ||
800 | mutex_lock(&dev_replace->lock_finishing_cancel_unmount); | 799 | mutex_lock(&dev_replace->lock_finishing_cancel_unmount); |
801 | btrfs_dev_replace_write_lock(dev_replace); | 800 | down_write(&dev_replace->rwsem); |
802 | switch (dev_replace->replace_state) { | 801 | switch (dev_replace->replace_state) { |
803 | case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: | 802 | case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: |
804 | case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: | 803 | case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: |
805 | case BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED: | 804 | case BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED: |
806 | result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED; | 805 | result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED; |
807 | btrfs_dev_replace_write_unlock(dev_replace); | 806 | up_write(&dev_replace->rwsem); |
808 | break; | 807 | break; |
809 | case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED: | 808 | case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED: |
810 | tgt_device = dev_replace->tgtdev; | 809 | tgt_device = dev_replace->tgtdev; |
811 | src_device = dev_replace->srcdev; | 810 | src_device = dev_replace->srcdev; |
812 | btrfs_dev_replace_write_unlock(dev_replace); | 811 | up_write(&dev_replace->rwsem); |
813 | ret = btrfs_scrub_cancel(fs_info); | 812 | ret = btrfs_scrub_cancel(fs_info); |
814 | if (ret < 0) { | 813 | if (ret < 0) { |
815 | result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED; | 814 | result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED; |
@@ -840,7 +839,7 @@ int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info) | |||
840 | dev_replace->time_stopped = ktime_get_real_seconds(); | 839 | dev_replace->time_stopped = ktime_get_real_seconds(); |
841 | dev_replace->item_needs_writeback = 1; | 840 | dev_replace->item_needs_writeback = 1; |
842 | 841 | ||
843 | btrfs_dev_replace_write_unlock(dev_replace); | 842 | up_write(&dev_replace->rwsem); |
844 | 843 | ||
845 | /* Scrub for replace must not be running in suspended state */ | 844 | /* Scrub for replace must not be running in suspended state */ |
846 | ret = btrfs_scrub_cancel(fs_info); | 845 | ret = btrfs_scrub_cancel(fs_info); |
@@ -875,7 +874,8 @@ void btrfs_dev_replace_suspend_for_unmount(struct btrfs_fs_info *fs_info) | |||
875 | struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; | 874 | struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; |
876 | 875 | ||
877 | mutex_lock(&dev_replace->lock_finishing_cancel_unmount); | 876 | mutex_lock(&dev_replace->lock_finishing_cancel_unmount); |
878 | btrfs_dev_replace_write_lock(dev_replace); | 877 | down_write(&dev_replace->rwsem); |
878 | |||
879 | switch (dev_replace->replace_state) { | 879 | switch (dev_replace->replace_state) { |
880 | case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: | 880 | case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: |
881 | case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: | 881 | case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: |
@@ -891,7 +891,7 @@ void btrfs_dev_replace_suspend_for_unmount(struct btrfs_fs_info *fs_info) | |||
891 | break; | 891 | break; |
892 | } | 892 | } |
893 | 893 | ||
894 | btrfs_dev_replace_write_unlock(dev_replace); | 894 | up_write(&dev_replace->rwsem); |
895 | mutex_unlock(&dev_replace->lock_finishing_cancel_unmount); | 895 | mutex_unlock(&dev_replace->lock_finishing_cancel_unmount); |
896 | } | 896 | } |
897 | 897 | ||
@@ -901,12 +901,13 @@ int btrfs_resume_dev_replace_async(struct btrfs_fs_info *fs_info) | |||
901 | struct task_struct *task; | 901 | struct task_struct *task; |
902 | struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; | 902 | struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; |
903 | 903 | ||
904 | btrfs_dev_replace_write_lock(dev_replace); | 904 | down_write(&dev_replace->rwsem); |
905 | |||
905 | switch (dev_replace->replace_state) { | 906 | switch (dev_replace->replace_state) { |
906 | case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: | 907 | case BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED: |
907 | case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: | 908 | case BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED: |
908 | case BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED: | 909 | case BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED: |
909 | btrfs_dev_replace_write_unlock(dev_replace); | 910 | up_write(&dev_replace->rwsem); |
910 | return 0; | 911 | return 0; |
911 | case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED: | 912 | case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED: |
912 | break; | 913 | break; |
@@ -922,10 +923,10 @@ int btrfs_resume_dev_replace_async(struct btrfs_fs_info *fs_info) | |||
922 | "you may cancel the operation after 'mount -o degraded'"); | 923 | "you may cancel the operation after 'mount -o degraded'"); |
923 | dev_replace->replace_state = | 924 | dev_replace->replace_state = |
924 | BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED; | 925 | BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED; |
925 | btrfs_dev_replace_write_unlock(dev_replace); | 926 | up_write(&dev_replace->rwsem); |
926 | return 0; | 927 | return 0; |
927 | } | 928 | } |
928 | btrfs_dev_replace_write_unlock(dev_replace); | 929 | up_write(&dev_replace->rwsem); |
929 | 930 | ||
930 | /* | 931 | /* |
931 | * This could collide with a paused balance, but the exclusive op logic | 932 | * This could collide with a paused balance, but the exclusive op logic |
@@ -933,10 +934,10 @@ int btrfs_resume_dev_replace_async(struct btrfs_fs_info *fs_info) | |||
933 | * dev-replace to start anyway. | 934 | * dev-replace to start anyway. |
934 | */ | 935 | */ |
935 | if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) { | 936 | if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) { |
936 | btrfs_dev_replace_write_lock(dev_replace); | 937 | down_write(&dev_replace->rwsem); |
937 | dev_replace->replace_state = | 938 | dev_replace->replace_state = |
938 | BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED; | 939 | BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED; |
939 | btrfs_dev_replace_write_unlock(dev_replace); | 940 | up_write(&dev_replace->rwsem); |
940 | btrfs_info(fs_info, | 941 | btrfs_info(fs_info, |
941 | "cannot resume dev-replace, other exclusive operation running"); | 942 | "cannot resume dev-replace, other exclusive operation running"); |
942 | return 0; | 943 | return 0; |
@@ -1000,26 +1001,6 @@ int btrfs_dev_replace_is_ongoing(struct btrfs_dev_replace *dev_replace) | |||
1000 | return 1; | 1001 | return 1; |
1001 | } | 1002 | } |
1002 | 1003 | ||
1003 | void btrfs_dev_replace_read_lock(struct btrfs_dev_replace *dev_replace) | ||
1004 | { | ||
1005 | down_read(&dev_replace->rwsem); | ||
1006 | } | ||
1007 | |||
1008 | void btrfs_dev_replace_read_unlock(struct btrfs_dev_replace *dev_replace) | ||
1009 | { | ||
1010 | up_read(&dev_replace->rwsem); | ||
1011 | } | ||
1012 | |||
1013 | void btrfs_dev_replace_write_lock(struct btrfs_dev_replace *dev_replace) | ||
1014 | { | ||
1015 | down_write(&dev_replace->rwsem); | ||
1016 | } | ||
1017 | |||
1018 | void btrfs_dev_replace_write_unlock(struct btrfs_dev_replace *dev_replace) | ||
1019 | { | ||
1020 | up_write(&dev_replace->rwsem); | ||
1021 | } | ||
1022 | |||
1023 | void btrfs_bio_counter_inc_noblocked(struct btrfs_fs_info *fs_info) | 1004 | void btrfs_bio_counter_inc_noblocked(struct btrfs_fs_info *fs_info) |
1024 | { | 1005 | { |
1025 | percpu_counter_inc(&fs_info->dev_replace.bio_counter); | 1006 | percpu_counter_inc(&fs_info->dev_replace.bio_counter); |