aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-05-01 08:53:32 -0400
committerDavid Woodhouse <dwmw2@hera.kernel.org>2007-05-01 08:53:32 -0400
commit090d18753c7fb73f7d846c3a89a50cd35136d144 (patch)
treee36965065fd68633c06cbe4b8312e5afe49997f4 /fs/btrfs/disk-io.c
parent31f3c99b73483f7b738a886c552050cbd6128ff3 (diff)
Btrfs: directory readahead
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index e1b6e13a5ae8..354524adf984 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -5,6 +5,7 @@
5#include <linux/scatterlist.h> 5#include <linux/scatterlist.h>
6#include <linux/swap.h> 6#include <linux/swap.h>
7#include <linux/radix-tree.h> 7#include <linux/radix-tree.h>
8#include <linux/file.h>
8#include "ctree.h" 9#include "ctree.h"
9#include "disk-io.h" 10#include "disk-io.h"
10#include "transaction.h" 11#include "transaction.h"
@@ -253,6 +254,29 @@ static struct address_space_operations btree_aops = {
253 .sync_page = block_sync_page, 254 .sync_page = block_sync_page,
254}; 255};
255 256
257int readahead_tree_block(struct btrfs_root *root, u64 blocknr)
258{
259 struct buffer_head *bh = NULL;
260
261 bh = btrfs_find_create_tree_block(root, blocknr);
262 if (!bh)
263 return 0;
264 if (buffer_uptodate(bh))
265 goto done;
266 if (test_set_buffer_locked(bh))
267 goto done;
268 if (!buffer_uptodate(bh)) {
269 get_bh(bh);
270 bh->b_end_io = end_buffer_read_sync;
271 submit_bh(READ, bh);
272 } else {
273 unlock_buffer(bh);
274 }
275done:
276 brelse(bh);
277 return 0;
278}
279
256struct buffer_head *read_tree_block(struct btrfs_root *root, u64 blocknr) 280struct buffer_head *read_tree_block(struct btrfs_root *root, u64 blocknr)
257{ 281{
258 struct buffer_head *bh = NULL; 282 struct buffer_head *bh = NULL;
@@ -270,11 +294,14 @@ struct buffer_head *read_tree_block(struct btrfs_root *root, u64 blocknr)
270 wait_on_buffer(bh); 294 wait_on_buffer(bh);
271 if (!buffer_uptodate(bh)) 295 if (!buffer_uptodate(bh))
272 goto fail; 296 goto fail;
273 csum_tree_block(root, bh, 1);
274 } else { 297 } else {
275 unlock_buffer(bh); 298 unlock_buffer(bh);
276 } 299 }
277uptodate: 300uptodate:
301 if (!buffer_checked(bh)) {
302 csum_tree_block(root, bh, 1);
303 set_buffer_checked(bh);
304 }
278 if (check_tree_block(root, bh)) 305 if (check_tree_block(root, bh))
279 BUG(); 306 BUG();
280 return bh; 307 return bh;