aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/dev-replace.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2018-09-07 10:11:23 -0400
committerDavid Sterba <dsterba@suse.com>2018-12-17 08:51:45 -0500
commitcb5583dd52fab469a001a007385066fcd60629c5 (patch)
tree879234a636ac76661a0d9757a665cbc93b3a9562 /fs/btrfs/dev-replace.c
parent53176dde0acd8fa49c6c2e6097283acc6241480f (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.c81
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
512leave: 512leave:
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
787int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info) 786int 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
1003void btrfs_dev_replace_read_lock(struct btrfs_dev_replace *dev_replace)
1004{
1005 down_read(&dev_replace->rwsem);
1006}
1007
1008void btrfs_dev_replace_read_unlock(struct btrfs_dev_replace *dev_replace)
1009{
1010 up_read(&dev_replace->rwsem);
1011}
1012
1013void btrfs_dev_replace_write_lock(struct btrfs_dev_replace *dev_replace)
1014{
1015 down_write(&dev_replace->rwsem);
1016}
1017
1018void btrfs_dev_replace_write_unlock(struct btrfs_dev_replace *dev_replace)
1019{
1020 up_write(&dev_replace->rwsem);
1021}
1022
1023void btrfs_bio_counter_inc_noblocked(struct btrfs_fs_info *fs_info) 1004void 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);