aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/compression.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-10-31 12:46:39 -0400
committerChris Mason <chris.mason@oracle.com>2008-10-31 12:46:39 -0400
commit70b99e6959a4c28ae1b314985eca731f3db72f1d (patch)
tree81578759fe422f7b17a734b8bf16b042aa02a046 /fs/btrfs/compression.c
parentd899e05215178fed903ad0e7fc1cb4d8e0cc0a88 (diff)
Btrfs: Compression corner fixes
Make sure we keep page->mapping NULL on the pages we're getting via alloc_page. It gets set so a few of the callbacks can do the right thing, but in general these pages don't have a mapping. Don't try to truncate compressed inline items in btrfs_drop_extents. The whole compressed item must be preserved. Don't try to create multipage inline compressed items. When we try to overwrite just the first page of the file, we would have to read in and recow all the pages after it in the same compressed inline items. For now, only create single page inline items. Make sure we lock pages in the correct order during delalloc. The search into the state tree for delalloc bytes can return bytes before the page we already have locked. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/compression.c')
-rw-r--r--fs/btrfs/compression.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 9adaa79adad9..354913177ba6 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -220,10 +220,12 @@ static void end_compressed_bio_write(struct bio *bio, int err)
220 */ 220 */
221 inode = cb->inode; 221 inode = cb->inode;
222 tree = &BTRFS_I(inode)->io_tree; 222 tree = &BTRFS_I(inode)->io_tree;
223 cb->compressed_pages[0]->mapping = cb->inode->i_mapping;
223 tree->ops->writepage_end_io_hook(cb->compressed_pages[0], 224 tree->ops->writepage_end_io_hook(cb->compressed_pages[0],
224 cb->start, 225 cb->start,
225 cb->start + cb->len - 1, 226 cb->start + cb->len - 1,
226 NULL, 1); 227 NULL, 1);
228 cb->compressed_pages[0]->mapping = NULL;
227 229
228 end_compressed_writeback(inode, cb->start, cb->len); 230 end_compressed_writeback(inode, cb->start, cb->len);
229 /* note, our inode could be gone now */ 231 /* note, our inode could be gone now */
@@ -306,6 +308,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start,
306 else 308 else
307 ret = 0; 309 ret = 0;
308 310
311 page->mapping = NULL;
309 if (ret || bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < 312 if (ret || bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) <
310 PAGE_CACHE_SIZE) { 313 PAGE_CACHE_SIZE) {
311 bio_get(bio); 314 bio_get(bio);
@@ -423,6 +426,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
423 else 426 else
424 ret = 0; 427 ret = 0;
425 428
429 page->mapping = NULL;
426 if (ret || bio_add_page(comp_bio, page, PAGE_CACHE_SIZE, 0) < 430 if (ret || bio_add_page(comp_bio, page, PAGE_CACHE_SIZE, 0) <
427 PAGE_CACHE_SIZE) { 431 PAGE_CACHE_SIZE) {
428 bio_get(comp_bio); 432 bio_get(comp_bio);