linux/fs/btrfs
Arne Jansen 7414a03fbf btrfs: initial readahead code and prototypes
This is the implementation for the generic read ahead framework.

To trigger a readahead, btrfs_reada_add must be called. It will start
a read ahead for the given range [start, end) on tree root. The returned
handle can either be used to wait on the readahead to finish
(btrfs_reada_wait), or to send it to the background (btrfs_reada_detach).

The read ahead works as follows:
On btrfs_reada_add, the root of the tree is inserted into a radix_tree.
reada_start_machine will then search for extents to prefetch and trigger
some reads. When a read finishes for a node, all contained node/leaf
pointers that lie in the given range will also be enqueued. The reads will
be triggered in sequential order, thus giving a big win over a naive
enumeration. It will also make use of multi-device layouts. Each disk
will have its on read pointer and all disks will by utilized in parallel.
Also will no two disks read both sides of a mirror simultaneously, as this
would waste seeking capacity. Instead both disks will read different parts
of the filesystem.
Any number of readaheads can be started in parallel. The read order will be
determined globally, i.e. 2 parallel readaheads will normally finish faster
than the 2 started one after another.

Changes v2:
 - protect root->node by transaction instead of node_lock
 - fix missed branches:
    The readahead had a too simple check to determine if a branch from
    a node should be checked or not. It now also records the upper bound
    of each node to see if the requested RA range lies within.
 - use KERN_CONT to debug output, to avoid line breaks
 - defer reada_start_machine to worker to avoid deadlock

Changes v3:
 - protect root->node by rcu

Changes v5:
 - changed EIO-semantics of reada_tree_block_flagged
 - remove spin_lock from reada_control and make elems an atomic_t
 - remove unused read_total from reada_control
 - kill reada_key_cmp, use btrfs_comp_cpu_keys instead
 - use kref-style release functions where possible
 - return struct reada_control * instead of void * from btrfs_reada_add

Signed-off-by: Arne Jansen <sensille@gmx.net>
2011-10-02 08:48:44 +02:00
..
acl.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable 2011-08-02 21:14:05 -10:00
async-thread.c
async-thread.h
btrfs_inode.h Btrfs: fix an oops when deleting snapshots 2011-09-11 10:52:24 -04:00
compat.h
compression.c Btrfs: check the nodatasum flag when writing compressed files 2011-08-01 14:30:46 -04:00
compression.h
ctree.c Btrfs: remove lockdep magic from btrfs_next_leaf 2011-07-27 12:46:47 -04:00
ctree.h btrfs: initial readahead code and prototypes 2011-10-02 08:48:44 +02:00
delayed-inode.c Btrfs: switch the btrfs tree locks to reader/writer 2011-07-27 12:46:46 -04:00
delayed-inode.h atomic: use <linux/atomic.h> 2011-07-26 16:49:47 -07:00
delayed-ref.c
delayed-ref.h
dir-item.c Btrfs: remove redundant code for dir item lookup 2011-08-01 14:30:48 -04:00
disk-io.c btrfs: state information for readahead 2011-10-02 08:48:30 +02:00
disk-io.h btrfs: add READAHEAD extent buffer flag 2011-10-02 08:47:57 +02:00
export.c
export.h
extent_io.c btrfs: add an extra wait mode to read_extent_buffer_pages 2011-10-02 08:47:55 +02:00
extent_io.h btrfs: add READAHEAD extent buffer flag 2011-10-02 08:47:57 +02:00
extent_map.c Btrfs: clean up code for merging extent maps 2011-08-01 14:30:50 -04:00
extent_map.h
extent-tree.c Btrfs: fix 64 bit divide problem 2011-08-21 07:02:00 -07:00
file-item.c Btrfs: skip locking if searching the commit root in csum lookup 2011-09-11 10:52:24 -04:00
file.c Merge branch 'btrfs-3.0' into for-linus 2011-09-30 15:26:09 -04:00
free-space-cache.c Btrfs: reset to appropriate block rsv after orphan operations 2011-09-11 10:52:24 -04:00
free-space-cache.h
hash.h
inode-item.c Btrfs: BUG_ON is deleted from the caller of btrfs_truncate_item & btrfs_extend_item 2011-05-23 13:24:39 -04:00
inode-map.c btrfs: add helper for fs_info->closing 2011-06-04 08:11:22 -04:00
inode-map.h
inode.c Btrfs: only clear the need lookup flag after the dentry is setup 2011-09-18 10:34:03 -04:00
ioctl.c Merge branch 'btrfs-3.0' into for-linus 2011-09-20 14:49:29 -04:00
ioctl.h Btrfs: add mount -o auto_defrag 2011-05-26 17:52:15 -04:00
Kconfig
locking.c Btrfs: switch the btrfs tree locks to reader/writer 2011-07-27 12:46:46 -04:00
locking.h Btrfs: switch the btrfs tree locks to reader/writer 2011-07-27 12:46:46 -04:00
lzo.c
Makefile btrfs: initial readahead code and prototypes 2011-10-02 08:48:44 +02:00
ordered-data.c
ordered-data.h
orphan.c
print-tree.c
print-tree.h
reada.c btrfs: initial readahead code and prototypes 2011-10-02 08:48:44 +02:00
relocation.c Merge branch 'integration' into for-linus 2011-07-27 16:18:13 -04:00
root-tree.c btrfs: make btrfs_set_root_node void 2011-08-01 14:30:44 -04:00
scrub.c btrfs: remove unneeded includes from scrub.c 2011-06-10 14:59:52 +02:00
struct-funcs.c Btrfs: stop using highmem for extent_buffers 2011-07-27 12:46:45 -04:00
super.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable 2011-07-08 23:25:45 -07:00
sysfs.c btrfs: Remove unused sysfs code 2011-06-17 14:54:18 -04:00
transaction.c Btrfs: fix misuse of trans block rsv 2011-09-11 10:52:24 -04:00
transaction.h Merge branch 'for-chris' of 2011-05-28 07:00:39 -04:00
tree-defrag.c
tree-log.c Btrfs: fix an oops of log replay 2011-08-16 21:09:15 -04:00
tree-log.h
version.h
volumes.c btrfs: state information for readahead 2011-10-02 08:48:30 +02:00
volumes.h btrfs: state information for readahead 2011-10-02 08:48:30 +02:00
xattr.c btrfs: xattr: fix attribute removal 2011-09-11 10:52:25 -04:00
xattr.h
zlib.c