diff options
| author | Josef Bacik <josef@redhat.com> | 2011-04-05 13:02:27 -0400 | 
|---|---|---|
| committer | Josef Bacik <josef@redhat.com> | 2011-04-08 13:00:34 -0400 | 
| commit | 12ddb96cb6752218d8a1aeb696ec9b0ca7adb42f (patch) | |
| tree | cffdb38f2f479dde85d5f96879e53ac4b8f4d6ef | |
| parent | 06d5a5899d6d3ac401d2359b5eac6d2a3a0fe331 (diff) | |
Btrfs: map the inode item when doing fill_inode_item
Instead of calling kmap_atomic for every thing we set in the inode item, map the
entire inode item at the start and unmap it at the end.  This makes a sequential
dd of 400mb O_DIRECT something like 1% faster.  Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
| -rw-r--r-- | fs/btrfs/inode.c | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index cc6022842e0c..da2680263d9f 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2589,6 +2589,13 @@ static void fill_inode_item(struct btrfs_trans_handle *trans,  			    struct btrfs_inode_item *item,  			    struct inode *inode)  { +	if (!leaf->map_token) +		map_private_extent_buffer(leaf, (unsigned long)item, +					  sizeof(struct btrfs_inode_item), +					  &leaf->map_token, &leaf->kaddr, +					  &leaf->map_start, &leaf->map_len, +					  KM_USER1); +  	btrfs_set_inode_uid(leaf, item, inode->i_uid);  	btrfs_set_inode_gid(leaf, item, inode->i_gid);  	btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); @@ -2617,6 +2624,11 @@ static void fill_inode_item(struct btrfs_trans_handle *trans,  	btrfs_set_inode_rdev(leaf, item, inode->i_rdev);  	btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags);  	btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); + +	if (leaf->map_token) { +		unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); +		leaf->map_token = NULL; +	}  }  /*  | 
