Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 128994
b: refs/heads/master
c: 70b99e6
h: refs/heads/master
v: v3
  • Loading branch information
Chris Mason committed Oct 31, 2008
1 parent 386d43f commit cd9a729
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 10 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: d899e05215178fed903ad0e7fc1cb4d8e0cc0a88
refs/heads/master: 70b99e6959a4c28ae1b314985eca731f3db72f1d
4 changes: 4 additions & 0 deletions trunk/fs/btrfs/compression.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,10 +220,12 @@ static void end_compressed_bio_write(struct bio *bio, int err)
*/
inode = cb->inode;
tree = &BTRFS_I(inode)->io_tree;
cb->compressed_pages[0]->mapping = cb->inode->i_mapping;
tree->ops->writepage_end_io_hook(cb->compressed_pages[0],
cb->start,
cb->start + cb->len - 1,
NULL, 1);
cb->compressed_pages[0]->mapping = NULL;

end_compressed_writeback(inode, cb->start, cb->len);
/* note, our inode could be gone now */
Expand Down Expand Up @@ -306,6 +308,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start,
else
ret = 0;

page->mapping = NULL;
if (ret || bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) <
PAGE_CACHE_SIZE) {
bio_get(bio);
Expand Down Expand Up @@ -423,6 +426,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
else
ret = 0;

page->mapping = NULL;
if (ret || bio_add_page(comp_bio, page, PAGE_CACHE_SIZE, 0) <
PAGE_CACHE_SIZE) {
bio_get(comp_bio);
Expand Down
11 changes: 10 additions & 1 deletion trunk/fs/btrfs/extent_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1242,12 +1242,21 @@ static noinline u64 find_lock_delalloc_range(struct inode *inode,
delalloc_end = 0;
found = find_delalloc_range(tree, &delalloc_start, &delalloc_end,
max_bytes);
if (!found) {
if (!found || delalloc_end <= *start) {
*start = delalloc_start;
*end = delalloc_end;
return found;
}

/*
* start comes from the offset of locked_page. We have to lock
* pages in order, so we can't process delalloc bytes before
* locked_page
*/
if (delalloc_start < *start) {
delalloc_start = *start;
}

/*
* make sure to limit the number of pages we try to lock down
* if we're looping.
Expand Down
21 changes: 15 additions & 6 deletions trunk/fs/btrfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,8 @@ int noinline btrfs_drop_extents(struct btrfs_trans_handle *trans,
u64 search_start = start;
u64 leaf_start;
u64 ram_bytes = 0;
u8 compression = 0;
u8 encryption = 0;
u8 compression;
u8 encryption;
u16 other_encoding = 0;
u64 root_gen;
u64 root_owner;
Expand Down Expand Up @@ -415,6 +415,8 @@ int noinline btrfs_drop_extents(struct btrfs_trans_handle *trans,
leaf_start = 0;
root_gen = 0;
root_owner = 0;
compression = 0;
encryption = 0;
extent = NULL;
leaf = path->nodes[0];
slot = path->slots[0];
Expand Down Expand Up @@ -546,8 +548,12 @@ int noinline btrfs_drop_extents(struct btrfs_trans_handle *trans,
inline_limit - key.offset);
inode_sub_bytes(inode, extent_end -
inline_limit);
btrfs_truncate_item(trans, root, path,
new_size, 1);
btrfs_set_file_extent_ram_bytes(leaf, extent,
new_size);
if (!compression && !encryption) {
btrfs_truncate_item(trans, root, path,
new_size, 1);
}
}
}
/* delete the entire extent */
Expand All @@ -567,8 +573,11 @@ int noinline btrfs_drop_extents(struct btrfs_trans_handle *trans,
new_size = btrfs_file_extent_calc_inline_size(
extent_end - end);
inode_sub_bytes(inode, end - key.offset);
ret = btrfs_truncate_item(trans, root, path,
new_size, 0);
btrfs_set_file_extent_ram_bytes(leaf, extent,
new_size);
if (!compression && !encryption)
ret = btrfs_truncate_item(trans, root, path,
new_size, 0);
BUG_ON(ret);
}
/* create bookend, splitting the extent in two */
Expand Down
8 changes: 6 additions & 2 deletions trunk/fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ static int cow_file_range_inline(struct btrfs_trans_handle *trans,
data_len = compressed_size;

if (start > 0 ||
actual_end >= PAGE_CACHE_SIZE ||
data_len >= BTRFS_MAX_INLINE_DATA_SIZE(root) ||
(!compressed_size &&
(actual_end & (root->sectorsize - 1)) == 0) ||
Expand All @@ -248,7 +249,7 @@ static int cow_file_range_inline(struct btrfs_trans_handle *trans,
}

ret = btrfs_drop_extents(trans, root, inode, start,
aligned_end, aligned_end, &hint_byte);
aligned_end, start, &hint_byte);
BUG_ON(ret);

if (isize > actual_end)
Expand Down Expand Up @@ -423,6 +424,7 @@ static int cow_file_range(struct inode *inode, struct page *locked_page,
* free any pages it allocated and our page pointer array
*/
for (i = 0; i < nr_pages_ret; i++) {
WARN_ON(pages[i]->mapping);
page_cache_release(pages[i]);
}
kfree(pages);
Expand Down Expand Up @@ -572,8 +574,10 @@ static int cow_file_range(struct inode *inode, struct page *locked_page,
extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree,
start, end, locked_page, 0, 0, 0);
free_pages_out:
for (i = 0; i < nr_pages_ret; i++)
for (i = 0; i < nr_pages_ret; i++) {
WARN_ON(pages[i]->mapping);
page_cache_release(pages[i]);
}
if (pages)
kfree(pages);

Expand Down

0 comments on commit cd9a729

Please sign in to comment.