diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 28 | 
1 files changed, 12 insertions, 16 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index a84420491c1..49fd7b66d57 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -529,9 +529,7 @@ static int cache_block_group(struct btrfs_block_group_cache *cache,  	 * allocate blocks for the tree root we can't do the fast caching since  	 * we likely hold important locks.  	 */ -	if (trans && (!trans->transaction->in_commit) && -	    (root && root != root->fs_info->tree_root) && -	    btrfs_test_opt(root, SPACE_CACHE)) { +	if (fs_info->mount_opt & BTRFS_MOUNT_SPACE_CACHE) {  		ret = load_free_space_cache(fs_info, cache);  		spin_lock(&cache->lock); @@ -2303,6 +2301,7 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans,  				if (ret) {  					printk(KERN_DEBUG "btrfs: run_delayed_extent_op returned %d\n", ret); +					spin_lock(&delayed_refs->lock);  					return ret;  				} @@ -2333,6 +2332,7 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans,  		if (ret) {  			printk(KERN_DEBUG "btrfs: run_one_delayed_ref returned %d\n", ret); +			spin_lock(&delayed_refs->lock);  			return ret;  		} @@ -3152,15 +3152,14 @@ static void set_avail_alloc_bits(struct btrfs_fs_info *fs_info, u64 flags)  /*   * returns target flags in extended format or 0 if restripe for this   * chunk_type is not in progress + * + * should be called with either volume_mutex or balance_lock held   */  static u64 get_restripe_target(struct btrfs_fs_info *fs_info, u64 flags)  {  	struct btrfs_balance_control *bctl = fs_info->balance_ctl;  	u64 target = 0; -	BUG_ON(!mutex_is_locked(&fs_info->volume_mutex) && -	       !spin_is_locked(&fs_info->balance_lock)); -  	if (!bctl)  		return 0; @@ -3772,13 +3771,10 @@ again:  		 */  		if (current->journal_info)  			return -EAGAIN; -		ret = wait_event_interruptible(space_info->wait, -					       !space_info->flush); -		/* Must have been interrupted, return */ -		if (ret) { -			printk(KERN_DEBUG "btrfs: %s returning -EINTR\n", __func__); +		ret = wait_event_killable(space_info->wait, !space_info->flush); +		/* Must have been killed, return */ +		if (ret)  			return -EINTR; -		}  		spin_lock(&space_info->lock);  	} @@ -4205,7 +4201,7 @@ static u64 calc_global_metadata_size(struct btrfs_fs_info *fs_info)  	num_bytes += div64_u64(data_used + meta_used, 50);  	if (num_bytes * 3 > meta_used) -		num_bytes = div64_u64(meta_used, 3) * 2; +		num_bytes = div64_u64(meta_used, 3);  	return ALIGN(num_bytes, fs_info->extent_root->leafsize << 10);  } @@ -4218,8 +4214,8 @@ static void update_global_block_rsv(struct btrfs_fs_info *fs_info)  	num_bytes = calc_global_metadata_size(fs_info); -	spin_lock(&block_rsv->lock);  	spin_lock(&sinfo->lock); +	spin_lock(&block_rsv->lock);  	block_rsv->size = num_bytes; @@ -4245,8 +4241,8 @@ static void update_global_block_rsv(struct btrfs_fs_info *fs_info)  		block_rsv->full = 1;  	} -	spin_unlock(&sinfo->lock);  	spin_unlock(&block_rsv->lock); +	spin_unlock(&sinfo->lock);  }  static void init_global_block_rsv(struct btrfs_fs_info *fs_info) @@ -6572,7 +6568,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,  			goto skip;  	} -	if (!btrfs_buffer_uptodate(next, generation)) { +	if (!btrfs_buffer_uptodate(next, generation, 0)) {  		btrfs_tree_unlock(next);  		free_extent_buffer(next);  		next = NULL;  |