aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2009-02-04 09:31:06 -0500
committerChris Mason <chris.mason@oracle.com>2009-02-04 09:31:06 -0500
commitf03d9301f15fb69cdf1eb59d53c9fb72f68ecccc (patch)
tree2299a89d213e9fa5f616a5bb0b2125a3c632da97 /fs/btrfs/inode.c
parent811449496b3e3caa9a8cf43feacbade0153324f2 (diff)
Btrfs: Don't try to compress pages past i_size
The compression code had some checks to make sure we were only compressing bytes inside of i_size, but it wasn't catching every case. To make things worse, some incorrect math about the number of bytes remaining would make it try to compress more pages than the file really had. The fix used here is to fall back to the non-compression code in this case, which does all the proper cleanup of delalloc and other accounting. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 5792816d4fca..9b43a6f303b8 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -360,6 +360,19 @@ again:
360 nr_pages = (end >> PAGE_CACHE_SHIFT) - (start >> PAGE_CACHE_SHIFT) + 1; 360 nr_pages = (end >> PAGE_CACHE_SHIFT) - (start >> PAGE_CACHE_SHIFT) + 1;
361 nr_pages = min(nr_pages, (128 * 1024UL) / PAGE_CACHE_SIZE); 361 nr_pages = min(nr_pages, (128 * 1024UL) / PAGE_CACHE_SIZE);
362 362
363 /*
364 * we don't want to send crud past the end of i_size through
365 * compression, that's just a waste of CPU time. So, if the
366 * end of the file is before the start of our current
367 * requested range of bytes, we bail out to the uncompressed
368 * cleanup code that can deal with all of this.
369 *
370 * It isn't really the fastest way to fix things, but this is a
371 * very uncommon corner.
372 */
373 if (actual_end <= start)
374 goto cleanup_and_bail_uncompressed;
375
363 total_compressed = actual_end - start; 376 total_compressed = actual_end - start;
364 377
365 /* we want to make sure that amount of ram required to uncompress 378 /* we want to make sure that amount of ram required to uncompress
@@ -504,6 +517,7 @@ again:
504 goto again; 517 goto again;
505 } 518 }
506 } else { 519 } else {
520cleanup_and_bail_uncompressed:
507 /* 521 /*
508 * No compression, but we still need to write the pages in 522 * No compression, but we still need to write the pages in
509 * the file we've been given so far. redirty the locked 523 * the file we've been given so far. redirty the locked