diff options
author | Nikolay Borisov <nborisov@suse.com> | 2018-01-31 10:14:02 -0500 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-03-01 10:16:12 -0500 |
commit | 765f3cebff0023d05d724374db8b63c01e07c499 (patch) | |
tree | 266350ba2f098cb79c0cdb2305ee30a3a878f100 /fs | |
parent | ac01f26a27f10aace4bb89fd2c2c05a60c251832 (diff) |
btrfs: Handle btrfs_set_extent_delalloc failure in relocate_file_extent_cluster
Essentially duplicate the error handling from the above block which
handles the !PageUptodate(page) case and additionally clear
EXTENT_BOUNDARY.
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/relocation.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index f0c3f00e97cb..cd2298d185dd 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
@@ -3268,8 +3268,22 @@ static int relocate_file_extent_cluster(struct inode *inode, | |||
3268 | nr++; | 3268 | nr++; |
3269 | } | 3269 | } |
3270 | 3270 | ||
3271 | btrfs_set_extent_delalloc(inode, page_start, page_end, 0, NULL, | 3271 | ret = btrfs_set_extent_delalloc(inode, page_start, page_end, 0, |
3272 | 0); | 3272 | NULL, 0); |
3273 | if (ret) { | ||
3274 | unlock_page(page); | ||
3275 | put_page(page); | ||
3276 | btrfs_delalloc_release_metadata(BTRFS_I(inode), | ||
3277 | PAGE_SIZE); | ||
3278 | btrfs_delalloc_release_extents(BTRFS_I(inode), | ||
3279 | PAGE_SIZE); | ||
3280 | |||
3281 | clear_extent_bits(&BTRFS_I(inode)->io_tree, | ||
3282 | page_start, page_end, | ||
3283 | EXTENT_LOCKED | EXTENT_BOUNDARY); | ||
3284 | goto out; | ||
3285 | |||
3286 | } | ||
3273 | set_page_dirty(page); | 3287 | set_page_dirty(page); |
3274 | 3288 | ||
3275 | unlock_extent(&BTRFS_I(inode)->io_tree, | 3289 | unlock_extent(&BTRFS_I(inode)->io_tree, |