diff options
| author | Chris Mason <chris.mason@oracle.com> | 2007-10-15 16:15:53 -0400 | 
|---|---|---|
| committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:03:56 -0400 | 
| commit | db94535db75e67fab12ccbb7f5ee548e33fed891 (patch) | |
| tree | 1ad7dfc82b003294a94ee87d7329b24b902b369f /fs/btrfs/tree-defrag.c | |
| parent | 1a5bc167f6707542b79a55452075525620ed43f5 (diff) | |
| download | olio-linux-3.10-db94535db75e67fab12ccbb7f5ee548e33fed891.tar.xz olio-linux-3.10-db94535db75e67fab12ccbb7f5ee548e33fed891.zip  | |
Btrfs: Allow tree blocks larger than the page size
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/tree-defrag.c')
| -rw-r--r-- | fs/btrfs/tree-defrag.c | 18 | 
1 files changed, 11 insertions, 7 deletions
diff --git a/fs/btrfs/tree-defrag.c b/fs/btrfs/tree-defrag.c index daf019afa0a..3feac2f2862 100644 --- a/fs/btrfs/tree-defrag.c +++ b/fs/btrfs/tree-defrag.c @@ -27,13 +27,15 @@ static void reada_defrag(struct btrfs_root *root,  {  	int i;  	u32 nritems; -	u64 blocknr; +	u64 bytenr; +	u32 blocksize;  	int ret; +	blocksize = btrfs_level_size(root, btrfs_header_level(node) - 1);  	nritems = btrfs_header_nritems(node);  	for (i = 0; i < nritems; i++) { -		blocknr = btrfs_node_blockptr(node, i); -		ret = readahead_tree_block(root, blocknr); +		bytenr = btrfs_node_blockptr(node, i); +		ret = readahead_tree_block(root, bytenr, blocksize);  		if (ret)  			break;  	} @@ -46,7 +48,7 @@ static int defrag_walk_down(struct btrfs_trans_handle *trans,  {  	struct extent_buffer *next;  	struct extent_buffer *cur; -	u64 blocknr; +	u64 bytenr;  	int ret = 0;  	int is_extent = 0; @@ -80,10 +82,11 @@ static int defrag_walk_down(struct btrfs_trans_handle *trans,  			break;  		} -		blocknr = btrfs_node_blockptr(cur, path->slots[*level]); +		bytenr = btrfs_node_blockptr(cur, path->slots[*level]);  		if (cache_only) { -			next = btrfs_find_tree_block(root, blocknr); +			next = btrfs_find_tree_block(root, bytenr, +					   btrfs_level_size(root, *level - 1));  			/* FIXME, test for defrag */  			if (!next || !btrfs_buffer_uptodate(next)) {  				free_extent_buffer(next); @@ -91,7 +94,8 @@ static int defrag_walk_down(struct btrfs_trans_handle *trans,  				continue;  			}  		} else { -			next = read_tree_block(root, blocknr); +			next = read_tree_block(root, bytenr, +				       btrfs_level_size(root, *level - 1));  		}  		ret = btrfs_cow_block(trans, root, next, path->nodes[*level],  				      path->slots[*level], &next);  |