diff options
| -rw-r--r-- | fs/btrfs/inode.c | 17 | 
1 files changed, 15 insertions, 2 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 11ff5bb40153..90b1c1df0943 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -928,8 +928,18 @@ static int submit_uncompressed_range(struct btrfs_inode *inode,  		goto out;  	}  	if (ret < 0) { -		if (locked_page) +		btrfs_cleanup_ordered_extents(inode, locked_page, start, end - start + 1); +		if (locked_page) { +			const u64 page_start = page_offset(locked_page); +			const u64 page_end = page_start + PAGE_SIZE - 1; + +			btrfs_page_set_error(inode->root->fs_info, locked_page, +					     page_start, PAGE_SIZE); +			set_page_writeback(locked_page); +			end_page_writeback(locked_page); +			end_extent_writepage(locked_page, ret, page_start, page_end);  			unlock_page(locked_page); +		}  		goto out;  	} @@ -1378,9 +1388,12 @@ out_unlock:  	 * However, in case of unlock == 0, we still need to unlock the pages  	 * (except @locked_page) to ensure all the pages are unlocked.  	 */ -	if (!unlock && orig_start < start) +	if (!unlock && orig_start < start) { +		if (!locked_page) +			mapping_set_error(inode->vfs_inode.i_mapping, ret);  		extent_clear_unlock_delalloc(inode, orig_start, start - 1,  					     locked_page, 0, page_ops); +	}  	/*  	 * For the range (2). If we reserved an extent for our delalloc range  | 
