diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 88 | 
1 files changed, 31 insertions, 57 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 08e65e9cf2aa..a1d36e62179c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -39,7 +39,6 @@  #include "btrfs_inode.h"  #include "volumes.h"  #include "print-tree.h" -#include "async-thread.h"  #include "locking.h"  #include "tree-log.h"  #include "free-space-cache.h" @@ -60,8 +59,6 @@ static void end_workqueue_fn(struct btrfs_work *work);  static void free_fs_root(struct btrfs_root *root);  static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info,  				    int read_only); -static void btrfs_destroy_ordered_operations(struct btrfs_transaction *t, -					     struct btrfs_root *root);  static void btrfs_destroy_ordered_extents(struct btrfs_root *root);  static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans,  				      struct btrfs_root *root); @@ -695,35 +692,41 @@ static void end_workqueue_bio(struct bio *bio, int err)  {  	struct end_io_wq *end_io_wq = bio->bi_private;  	struct btrfs_fs_info *fs_info; +	struct btrfs_workqueue *wq; +	btrfs_work_func_t func;  	fs_info = end_io_wq->info;  	end_io_wq->error = err; -	btrfs_init_work(&end_io_wq->work, end_workqueue_fn, NULL, NULL);  	if (bio->bi_rw & REQ_WRITE) { -		if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) -			btrfs_queue_work(fs_info->endio_meta_write_workers, -					 &end_io_wq->work); -		else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_FREE_SPACE) -			btrfs_queue_work(fs_info->endio_freespace_worker, -					 &end_io_wq->work); -		else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) -			btrfs_queue_work(fs_info->endio_raid56_workers, -					 &end_io_wq->work); -		else -			btrfs_queue_work(fs_info->endio_write_workers, -					 &end_io_wq->work); +		if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) { +			wq = fs_info->endio_meta_write_workers; +			func = btrfs_endio_meta_write_helper; +		} else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_FREE_SPACE) { +			wq = fs_info->endio_freespace_worker; +			func = btrfs_freespace_write_helper; +		} else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) { +			wq = fs_info->endio_raid56_workers; +			func = btrfs_endio_raid56_helper; +		} else { +			wq = fs_info->endio_write_workers; +			func = btrfs_endio_write_helper; +		}  	} else { -		if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) -			btrfs_queue_work(fs_info->endio_raid56_workers, -					 &end_io_wq->work); -		else if (end_io_wq->metadata) -			btrfs_queue_work(fs_info->endio_meta_workers, -					 &end_io_wq->work); -		else -			btrfs_queue_work(fs_info->endio_workers, -					 &end_io_wq->work); +		if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) { +			wq = fs_info->endio_raid56_workers; +			func = btrfs_endio_raid56_helper; +		} else if (end_io_wq->metadata) { +			wq = fs_info->endio_meta_workers; +			func = btrfs_endio_meta_helper; +		} else { +			wq = fs_info->endio_workers; +			func = btrfs_endio_helper; +		}  	} + +	btrfs_init_work(&end_io_wq->work, func, end_workqueue_fn, NULL, NULL); +	btrfs_queue_work(wq, &end_io_wq->work);  }  /* @@ -830,7 +833,7 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode,  	async->submit_bio_start = submit_bio_start;  	async->submit_bio_done = submit_bio_done; -	btrfs_init_work(&async->work, run_one_async_start, +	btrfs_init_work(&async->work, btrfs_worker_helper, run_one_async_start,  			run_one_async_done, run_one_async_free);  	async->bio_flags = bio_flags; @@ -3452,7 +3455,8 @@ static int write_all_supers(struct btrfs_root *root, int max_mirrors)  		btrfs_set_stack_device_generation(dev_item, 0);  		btrfs_set_stack_device_type(dev_item, dev->type);  		btrfs_set_stack_device_id(dev_item, dev->devid); -		btrfs_set_stack_device_total_bytes(dev_item, dev->total_bytes); +		btrfs_set_stack_device_total_bytes(dev_item, +						   dev->disk_total_bytes);  		btrfs_set_stack_device_bytes_used(dev_item, dev->bytes_used);  		btrfs_set_stack_device_io_align(dev_item, dev->io_align);  		btrfs_set_stack_device_io_width(dev_item, dev->io_width); @@ -3829,34 +3833,6 @@ static void btrfs_error_commit_super(struct btrfs_root *root)  	btrfs_cleanup_transaction(root);  } -static void btrfs_destroy_ordered_operations(struct btrfs_transaction *t, -					     struct btrfs_root *root) -{ -	struct btrfs_inode *btrfs_inode; -	struct list_head splice; - -	INIT_LIST_HEAD(&splice); - -	mutex_lock(&root->fs_info->ordered_operations_mutex); -	spin_lock(&root->fs_info->ordered_root_lock); - -	list_splice_init(&t->ordered_operations, &splice); -	while (!list_empty(&splice)) { -		btrfs_inode = list_entry(splice.next, struct btrfs_inode, -					 ordered_operations); - -		list_del_init(&btrfs_inode->ordered_operations); -		spin_unlock(&root->fs_info->ordered_root_lock); - -		btrfs_invalidate_inodes(btrfs_inode->root); - -		spin_lock(&root->fs_info->ordered_root_lock); -	} - -	spin_unlock(&root->fs_info->ordered_root_lock); -	mutex_unlock(&root->fs_info->ordered_operations_mutex); -} -  static void btrfs_destroy_ordered_extents(struct btrfs_root *root)  {  	struct btrfs_ordered_extent *ordered; @@ -4093,8 +4069,6 @@ again:  void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans,  				   struct btrfs_root *root)  { -	btrfs_destroy_ordered_operations(cur_trans, root); -  	btrfs_destroy_delayed_refs(cur_trans, root);  	cur_trans->state = TRANS_STATE_COMMIT_START;  |