diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
| -rw-r--r-- | fs/btrfs/extent_io.c | 24 | 
1 files changed, 16 insertions, 8 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index be1bf627a14..49f3c9dc09f 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -935,8 +935,10 @@ again:  	node = tree_search(tree, start);  	if (!node) {  		prealloc = alloc_extent_state_atomic(prealloc); -		if (!prealloc) -			return -ENOMEM; +		if (!prealloc) { +			err = -ENOMEM; +			goto out; +		}  		err = insert_state(tree, prealloc, start, end, &bits);  		prealloc = NULL;  		BUG_ON(err == -EEXIST); @@ -992,8 +994,10 @@ hit_next:  	 */  	if (state->start < start) {  		prealloc = alloc_extent_state_atomic(prealloc); -		if (!prealloc) -			return -ENOMEM; +		if (!prealloc) { +			err = -ENOMEM; +			goto out; +		}  		err = split_state(tree, state, prealloc, start);  		BUG_ON(err == -EEXIST);  		prealloc = NULL; @@ -1024,8 +1028,10 @@ hit_next:  			this_end = last_start - 1;  		prealloc = alloc_extent_state_atomic(prealloc); -		if (!prealloc) -			return -ENOMEM; +		if (!prealloc) { +			err = -ENOMEM; +			goto out; +		}  		/*  		 * Avoid to free 'prealloc' if it can be merged with @@ -1051,8 +1057,10 @@ hit_next:  	 */  	if (state->start <= end && state->end > end) {  		prealloc = alloc_extent_state_atomic(prealloc); -		if (!prealloc) -			return -ENOMEM; +		if (!prealloc) { +			err = -ENOMEM; +			goto out; +		}  		err = split_state(tree, state, prealloc, end + 1);  		BUG_ON(err == -EEXIST);  |