Commit 9b011adf authored by Wang Shilong's avatar Wang Shilong Committed by Chris Mason

Btrfs: remove scrub_super_lock holding in btrfs_sync_log()

Originally, we introduced scrub_super_lock to synchronize
tree log code with scrubbing super.

However we can replace scrub_super_lock with device_list_mutex,
because writing super will hold this mutex, this will reduce an extra
lock holding when writing supers in sync log code.
Signed-off-by: default avatarWang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
parent 7fdf4b60
...@@ -1586,7 +1586,6 @@ struct btrfs_fs_info { ...@@ -1586,7 +1586,6 @@ struct btrfs_fs_info {
atomic_t scrubs_paused; atomic_t scrubs_paused;
atomic_t scrub_cancel_req; atomic_t scrub_cancel_req;
wait_queue_head_t scrub_pause_wait; wait_queue_head_t scrub_pause_wait;
struct rw_semaphore scrub_super_lock;
int scrub_workers_refcnt; int scrub_workers_refcnt;
struct btrfs_workers scrub_workers; struct btrfs_workers scrub_workers;
struct btrfs_workers scrub_wr_completion_workers; struct btrfs_workers scrub_wr_completion_workers;
...@@ -3950,9 +3949,7 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, ...@@ -3950,9 +3949,7 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
u64 end, struct btrfs_scrub_progress *progress, u64 end, struct btrfs_scrub_progress *progress,
int readonly, int is_dev_replace); int readonly, int is_dev_replace);
void btrfs_scrub_pause(struct btrfs_root *root); void btrfs_scrub_pause(struct btrfs_root *root);
void btrfs_scrub_pause_super(struct btrfs_root *root);
void btrfs_scrub_continue(struct btrfs_root *root); void btrfs_scrub_continue(struct btrfs_root *root);
void btrfs_scrub_continue_super(struct btrfs_root *root);
int btrfs_scrub_cancel(struct btrfs_fs_info *info); int btrfs_scrub_cancel(struct btrfs_fs_info *info);
int btrfs_scrub_cancel_dev(struct btrfs_fs_info *info, int btrfs_scrub_cancel_dev(struct btrfs_fs_info *info,
struct btrfs_device *dev); struct btrfs_device *dev);
......
...@@ -2250,7 +2250,6 @@ int open_ctree(struct super_block *sb, ...@@ -2250,7 +2250,6 @@ int open_ctree(struct super_block *sb,
atomic_set(&fs_info->scrubs_paused, 0); atomic_set(&fs_info->scrubs_paused, 0);
atomic_set(&fs_info->scrub_cancel_req, 0); atomic_set(&fs_info->scrub_cancel_req, 0);
init_waitqueue_head(&fs_info->scrub_pause_wait); init_waitqueue_head(&fs_info->scrub_pause_wait);
init_rwsem(&fs_info->scrub_super_lock);
fs_info->scrub_workers_refcnt = 0; fs_info->scrub_workers_refcnt = 0;
#ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
fs_info->check_integrity_print_mask = 0; fs_info->check_integrity_print_mask = 0;
......
...@@ -2932,13 +2932,15 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, ...@@ -2932,13 +2932,15 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
atomic_inc(&fs_info->scrubs_running); atomic_inc(&fs_info->scrubs_running);
mutex_unlock(&fs_info->scrub_lock); mutex_unlock(&fs_info->scrub_lock);
mutex_unlock(&fs_info->fs_devices->device_list_mutex);
if (!is_dev_replace) { if (!is_dev_replace) {
down_read(&fs_info->scrub_super_lock); /*
* by holding device list mutex, we can
* kick off writing super in log tree sync.
*/
ret = scrub_supers(sctx, dev); ret = scrub_supers(sctx, dev);
up_read(&fs_info->scrub_super_lock);
} }
mutex_unlock(&fs_info->fs_devices->device_list_mutex);
if (!ret) if (!ret)
ret = scrub_enumerate_chunks(sctx, dev, start, end, ret = scrub_enumerate_chunks(sctx, dev, start, end,
...@@ -2988,16 +2990,6 @@ void btrfs_scrub_continue(struct btrfs_root *root) ...@@ -2988,16 +2990,6 @@ void btrfs_scrub_continue(struct btrfs_root *root)
wake_up(&fs_info->scrub_pause_wait); wake_up(&fs_info->scrub_pause_wait);
} }
void btrfs_scrub_pause_super(struct btrfs_root *root)
{
down_write(&root->fs_info->scrub_super_lock);
}
void btrfs_scrub_continue_super(struct btrfs_root *root)
{
up_write(&root->fs_info->scrub_super_lock);
}
int btrfs_scrub_cancel(struct btrfs_fs_info *fs_info) int btrfs_scrub_cancel(struct btrfs_fs_info *fs_info)
{ {
mutex_lock(&fs_info->scrub_lock); mutex_lock(&fs_info->scrub_lock);
......
...@@ -2586,9 +2586,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, ...@@ -2586,9 +2586,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
* the running transaction open, so a full commit can't hop * the running transaction open, so a full commit can't hop
* in and cause problems either. * in and cause problems either.
*/ */
btrfs_scrub_pause_super(root);
ret = write_ctree_super(trans, root->fs_info->tree_root, 1); ret = write_ctree_super(trans, root->fs_info->tree_root, 1);
btrfs_scrub_continue_super(root);
if (ret) { if (ret) {
btrfs_abort_transaction(trans, root, ret); btrfs_abort_transaction(trans, root, ret);
goto out_wake_log_root; goto out_wake_log_root;
......
...@@ -132,7 +132,9 @@ struct btrfs_fs_devices { ...@@ -132,7 +132,9 @@ struct btrfs_fs_devices {
/* all of the devices in the FS, protected by a mutex /* all of the devices in the FS, protected by a mutex
* so we can safely walk it to write out the supers without * so we can safely walk it to write out the supers without
* worrying about add/remove by the multi-device code * worrying about add/remove by the multi-device code.
* Scrubbing super can kick off supers writing by holding
* this mutex lock.
*/ */
struct mutex device_list_mutex; struct mutex device_list_mutex;
struct list_head devices; struct list_head devices;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment