Btrfs: Optimize compressed writeback and reads
authorChris Mason <chris.mason@oracle.com>
Fri, 7 Nov 2008 03:02:51 +0000 (22:02 -0500)
committerChris Mason <chris.mason@oracle.com>
Fri, 7 Nov 2008 03:02:51 +0000 (22:02 -0500)
commit771ed689d2cd53439e28e095bc38fbe40a71429e
tree518801f7141928e398d40c2b5955720d4346ce1a
parent4a69a41009c4ac691f7d9c289f5f37fabeddce46
Btrfs: Optimize compressed writeback and reads

When reading compressed extents, try to put pages into the page cache
for any pages covered by the compressed extent that readpages didn't already
preload.

Add an async work queue to handle transformations at delayed allocation processing
time.  Right now this is just compression.  The workflow is:

1) Find offsets in the file marked for delayed allocation
2) Lock the pages
3) Lock the state bits
4) Call the async delalloc code

The async delalloc code clears the state lock bits and delalloc bits.  It is
important this happens before the range goes into the work queue because
otherwise it might deadlock with other work queue items that try to lock
those extent bits.

The file pages are compressed, and if the compression doesn't work the
pages are written back directly.

An ordered work queue is used to make sure the inodes are written in the same
order that pdflush or writepages sent them down.

This changes extent_write_cache_pages to let the writepage function
update the wbc nr_written count.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/compression.c
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/extent-tree.c
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h
fs/btrfs/file.c
fs/btrfs/inode.c
fs/btrfs/ordered-data.c
fs/btrfs/super.c
fs/btrfs/zlib.c