Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 360436
b: refs/heads/master
c: 3e04e7f
h: refs/heads/master
v: v3
  • Loading branch information
Josef Bacik committed Feb 20, 2013
1 parent 134ea58 commit 4f5c91a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 70afa3998c9baed4186df38988246de1abdab56d
refs/heads/master: 3e04e7f10b68999e0d8321516ea19d9d5b044dee
38 changes: 28 additions & 10 deletions trunk/fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,7 @@ static noinline int submit_compressed_extents(struct inode *inode,
if (list_empty(&async_cow->extents))
return 0;


again:
while (!list_empty(&async_cow->extents)) {
async_extent = list_entry(async_cow->extents.next,
struct async_extent, list);
Expand Down Expand Up @@ -648,6 +648,8 @@ static noinline int submit_compressed_extents(struct inode *inode,
async_extent->ram_size - 1,
btrfs_get_extent,
WB_SYNC_ALL);
else if (ret)
unlock_page(async_cow->locked_page);
kfree(async_extent);
cond_resched();
continue;
Expand All @@ -672,19 +674,18 @@ static noinline int submit_compressed_extents(struct inode *inode,

if (ret) {
int i;

for (i = 0; i < async_extent->nr_pages; i++) {
WARN_ON(async_extent->pages[i]->mapping);
page_cache_release(async_extent->pages[i]);
}
kfree(async_extent->pages);
async_extent->nr_pages = 0;
async_extent->pages = NULL;
unlock_extent(io_tree, async_extent->start,
async_extent->start +
async_extent->ram_size - 1);

if (ret == -ENOSPC)
goto retry;
goto out_free; /* JDM: Requeue? */
goto out_free;
}

/*
Expand All @@ -696,7 +697,8 @@ static noinline int submit_compressed_extents(struct inode *inode,
async_extent->ram_size - 1, 0);

em = alloc_extent_map();
BUG_ON(!em); /* -ENOMEM */
if (!em)
goto out_free_reserve;
em->start = async_extent->start;
em->len = async_extent->ram_size;
em->orig_start = em->start;
Expand Down Expand Up @@ -728,14 +730,18 @@ static noinline int submit_compressed_extents(struct inode *inode,
async_extent->ram_size - 1, 0);
}

if (ret)
goto out_free_reserve;

ret = btrfs_add_ordered_extent_compress(inode,
async_extent->start,
ins.objectid,
async_extent->ram_size,
ins.offset,
BTRFS_ORDERED_COMPRESSED,
async_extent->compress_type);
BUG_ON(ret); /* -ENOMEM */
if (ret)
goto out_free_reserve;

/*
* clear dirty, set writeback and unlock the pages.
Expand All @@ -756,18 +762,30 @@ static noinline int submit_compressed_extents(struct inode *inode,
ins.objectid,
ins.offset, async_extent->pages,
async_extent->nr_pages);

BUG_ON(ret); /* -ENOMEM */
alloc_hint = ins.objectid + ins.offset;
kfree(async_extent);
if (ret)
goto out;
cond_resched();
}
ret = 0;
out:
return ret;
out_free_reserve:
btrfs_free_reserved_extent(root, ins.objectid, ins.offset);
out_free:
extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree,
async_extent->start,
async_extent->start +
async_extent->ram_size - 1,
NULL, EXTENT_CLEAR_UNLOCK_PAGE |
EXTENT_CLEAR_UNLOCK |
EXTENT_CLEAR_DELALLOC |
EXTENT_CLEAR_DIRTY |
EXTENT_SET_WRITEBACK |
EXTENT_END_WRITEBACK);
kfree(async_extent);
goto out;
goto again;
}

static u64 get_extent_allocation_hint(struct inode *inode, u64 start,
Expand Down

0 comments on commit 4f5c91a

Please sign in to comment.