update hole handling
PATCH 1/4 update hole handling
Hello,
This patch splits the hole insertion code out of btrfs_setattr into btrfs_cont_expand and updates btrfs_get_extent to properly handle the case that file extent items are not continuous.
Regards
Signed-off-by Yan Zheng <[email protected]>
---
fs/btrfs/ctree.h +1 -0
@@ -1845,6 +1845,7 @@ int btrfs_update_inode(struct btrfs_tranint btrfs_orphan_add (struct btrfs_trans_handle *trans,struct inode *inode);int btrfs_orphan_del (struct btrfs_trans_handle *trans,struct inode *inode);void btrfs_orphan_cleanup (struct btrfs_root *root); +int btrfs_cont_expand (struct inode *inode,loff_t size);/* ioctl.c */ long btrfs_ioctl (struct file *file,unsigned int cmd,unsigned long arg);
fs/btrfs/extent_map.h +1 -0
@@ -10,6 +10,7 @@/* bits for the flags field */ #define EXTENT_FLAG_PINNED 0/* this entry not yet on disk, don't free it */ +#define EXTENT_FLAG_VACANCY 1/* no file extent item found */ struct extent_map {struct rb_node rb_node;
fs/btrfs/file.c +6 -33
@@ -291,39 +291,6 @@ static int noinline dirty_and_release_pa }set_extent_uptodate (io_tree, start_pos, end_of_last_block,GFP_NOFS ); -/* FIXME...EIEIO, ENOSPC and more */ -/* insert any holes we need to create */ -if (isize < start_pos) { -u64 last_pos_in_file; -u64 hole_size; -u64 mask = root->sectorsize -1 ; - last_pos_in_file = (isize + mask) & ~mask; - hole_size = (start_pos - last_pos_in_file + mask) & ~mask; -if (hole_size >0 ) { -btrfs_wait_ordered_range (inode, last_pos_in_file, - last_pos_in_file + hole_size); -mutex_lock (&BTRFS_I (inode)->extent_mutex); - err =btrfs_drop_extents (trans, root, inode, - last_pos_in_file, - last_pos_in_file + hole_size, - last_pos_in_file, - &hint_byte); -if (err) - goto failed; - - err =btrfs_insert_file_extent (trans, root, - inode->i_ino, - last_pos_in_file, -0 ,0 , hole_size,0 ); -btrfs_drop_extent_cache (inode, last_pos_in_file, - last_pos_in_file + hole_size -1 ,0 ); -mutex_unlock (&BTRFS_I (inode)->extent_mutex); -btrfs_check_file (root, inode); - } -if (err) - goto failed; - } -/* * either allocate an extent for the new bytes or setup the key * to show we are doing inline data in the extent
@@ -844,6 +811,12 @@ static int noinline prepare_pages(struct start_pos = pos & ~((u64 )root->sectorsize -1 ); last_pos = ((u64 )index + num_pages) <<PAGE_CACHE_SHIFT ; +if (start_pos > inode->i_size) { + err =btrfs_cont_expand (inode, start_pos); +if (err) +return err; + } +memset (pages,0 , num_pages *sizeof (struct page *)); again:for (i =0 ; i < num_pages; i++) {
fs/btrfs/inode.c +100 -89
249 lines not on this page · raw message