diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 274 | 
1 files changed, 98 insertions, 176 deletions
| diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index e9482f0db9d0..9357a19d2bff 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -14,17 +14,13 @@  #include <linux/init.h>  #include <linux/string.h>  #include <linux/backing-dev.h> -#include <linux/mpage.h> -#include <linux/swap.h>  #include <linux/writeback.h>  #include <linux/compat.h> -#include <linux/bit_spinlock.h>  #include <linux/xattr.h>  #include <linux/posix_acl.h>  #include <linux/falloc.h>  #include <linux/slab.h>  #include <linux/ratelimit.h> -#include <linux/mount.h>  #include <linux/btrfs.h>  #include <linux/blkdev.h>  #include <linux/posix_acl_xattr.h> @@ -1443,8 +1439,7 @@ next_slot:  			nocow = 1;  		} else if (extent_type == BTRFS_FILE_EXTENT_INLINE) {  			extent_end = found_key.offset + -				btrfs_file_extent_inline_len(leaf, -						     path->slots[0], fi); +				btrfs_file_extent_ram_bytes(leaf, fi);  			extent_end = ALIGN(extent_end,  					   fs_info->sectorsize);  		} else { @@ -1752,7 +1747,7 @@ static void btrfs_add_delalloc_inodes(struct btrfs_root *root,  void __btrfs_del_delalloc_inode(struct btrfs_root *root,  				struct btrfs_inode *inode)  { -	struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb); +	struct btrfs_fs_info *fs_info = root->fs_info;  	if (!list_empty(&inode->delalloc_inodes)) {  		list_del_init(&inode->delalloc_inodes); @@ -1903,8 +1898,8 @@ static void btrfs_clear_bit_hook(void *private_data,  }  /* - * extent_io.c merge_bio_hook, this must check the chunk tree to make sure - * we don't create bios that span stripes or chunks + * Merge bio hook, this must check the chunk tree to make sure we don't create + * bios that span stripes or chunks   *   * return 1 if page cannot be merged to bio   * return 0 if page can be merged to bio @@ -1962,7 +1957,7 @@ static blk_status_t btrfs_submit_bio_start(void *private_data, struct bio *bio,   * At IO completion time the cums attached on the ordered extent record   * are inserted into the btree   */ -static blk_status_t btrfs_submit_bio_done(void *private_data, struct bio *bio, +blk_status_t btrfs_submit_bio_done(void *private_data, struct bio *bio,  			  int mirror_num)  {  	struct inode *inode = private_data; @@ -2035,8 +2030,7 @@ static blk_status_t btrfs_submit_bio_hook(void *private_data, struct bio *bio,  		/* we're doing a write, do the async checksumming */  		ret = btrfs_wq_submit_bio(fs_info, bio, mirror_num, bio_flags,  					  bio_offset, inode, -					  btrfs_submit_bio_start, -					  btrfs_submit_bio_done); +					  btrfs_submit_bio_start);  		goto out;  	} else if (!skip_sum) {  		ret = btrfs_csum_one_bio(inode, bio, 0, 0); @@ -3610,18 +3604,15 @@ static int btrfs_read_locked_inode(struct inode *inode)  		filled = true;  	path = btrfs_alloc_path(); -	if (!path) { -		ret = -ENOMEM; -		goto make_bad; -	} +	if (!path) +		return -ENOMEM;  	memcpy(&location, &BTRFS_I(inode)->location, sizeof(location));  	ret = btrfs_lookup_inode(NULL, root, path, &location, 0);  	if (ret) { -		if (ret > 0) -			ret = -ENOENT; -		goto make_bad; +		btrfs_free_path(path); +		return ret;  	}  	leaf = path->nodes[0]; @@ -3774,11 +3765,6 @@ cache_acl:  	btrfs_sync_inode_flags_to_i_flags(inode);  	return 0; - -make_bad: -	btrfs_free_path(path); -	make_bad_inode(inode); -	return ret;  }  /* @@ -3984,7 +3970,7 @@ static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans,  		goto err;  	}  skip_backref: -	ret = btrfs_delete_delayed_dir_index(trans, fs_info, dir, index); +	ret = btrfs_delete_delayed_dir_index(trans, dir, index);  	if (ret) {  		btrfs_abort_transaction(trans, ret);  		goto err; @@ -4087,11 +4073,10 @@ out:  }  static int btrfs_unlink_subvol(struct btrfs_trans_handle *trans, -			struct btrfs_root *root, -			struct inode *dir, u64 objectid, -			const char *name, int name_len) +			       struct inode *dir, u64 objectid, +			       const char *name, int name_len)  { -	struct btrfs_fs_info *fs_info = root->fs_info; +	struct btrfs_root *root = BTRFS_I(dir)->root;  	struct btrfs_path *path;  	struct extent_buffer *leaf;  	struct btrfs_dir_item *di; @@ -4124,9 +4109,8 @@ static int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,  	}  	btrfs_release_path(path); -	ret = btrfs_del_root_ref(trans, fs_info, objectid, -				 root->root_key.objectid, dir_ino, -				 &index, name, name_len); +	ret = btrfs_del_root_ref(trans, objectid, root->root_key.objectid, +				 dir_ino, &index, name, name_len);  	if (ret < 0) {  		if (ret != -ENOENT) {  			btrfs_abort_transaction(trans, ret); @@ -4145,12 +4129,11 @@ static int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,  		leaf = path->nodes[0];  		btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); -		btrfs_release_path(path);  		index = key.offset;  	}  	btrfs_release_path(path); -	ret = btrfs_delete_delayed_dir_index(trans, fs_info, BTRFS_I(dir), index); +	ret = btrfs_delete_delayed_dir_index(trans, BTRFS_I(dir), index);  	if (ret) {  		btrfs_abort_transaction(trans, ret);  		goto out; @@ -4243,9 +4226,9 @@ again:  		prev = node;  		entry = rb_entry(node, struct btrfs_inode, rb_node); -		if (objectid < btrfs_ino(BTRFS_I(&entry->vfs_inode))) +		if (objectid < btrfs_ino(entry))  			node = node->rb_left; -		else if (objectid > btrfs_ino(BTRFS_I(&entry->vfs_inode))) +		else if (objectid > btrfs_ino(entry))  			node = node->rb_right;  		else  			break; @@ -4253,7 +4236,7 @@ again:  	if (!node) {  		while (prev) {  			entry = rb_entry(prev, struct btrfs_inode, rb_node); -			if (objectid <= btrfs_ino(BTRFS_I(&entry->vfs_inode))) { +			if (objectid <= btrfs_ino(entry)) {  				node = prev;  				break;  			} @@ -4262,7 +4245,7 @@ again:  	}  	while (node) {  		entry = rb_entry(node, struct btrfs_inode, rb_node); -		objectid = btrfs_ino(BTRFS_I(&entry->vfs_inode)) + 1; +		objectid = btrfs_ino(entry) + 1;  		inode = igrab(&entry->vfs_inode);  		if (inode) {  			spin_unlock(&root->inode_lock); @@ -4343,10 +4326,8 @@ int btrfs_delete_subvolume(struct inode *dir, struct dentry *dentry)  	btrfs_record_snapshot_destroy(trans, BTRFS_I(dir)); -	ret = btrfs_unlink_subvol(trans, root, dir, -				dest->root_key.objectid, -				dentry->d_name.name, -				dentry->d_name.len); +	ret = btrfs_unlink_subvol(trans, dir, dest->root_key.objectid, +				  dentry->d_name.name, dentry->d_name.len);  	if (ret) {  		err = ret;  		btrfs_abort_transaction(trans, ret); @@ -4441,7 +4422,7 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)  		return PTR_ERR(trans);  	if (unlikely(btrfs_ino(BTRFS_I(inode)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { -		err = btrfs_unlink_subvol(trans, root, dir, +		err = btrfs_unlink_subvol(trans, dir,  					  BTRFS_I(inode)->location.objectid,  					  dentry->d_name.name,  					  dentry->d_name.len); @@ -4643,8 +4624,8 @@ search_again:  					BTRFS_I(inode), leaf, fi,  					found_key.offset);  			} else if (extent_type == BTRFS_FILE_EXTENT_INLINE) { -				item_end += btrfs_file_extent_inline_len(leaf, -							 path->slots[0], fi); +				item_end += btrfs_file_extent_ram_bytes(leaf, +									fi);  				trace_btrfs_truncate_show_fi_inline(  					BTRFS_I(inode), leaf, fi, path->slots[0], @@ -5615,9 +5596,9 @@ static void inode_tree_add(struct inode *inode)  		parent = *p;  		entry = rb_entry(parent, struct btrfs_inode, rb_node); -		if (ino < btrfs_ino(BTRFS_I(&entry->vfs_inode))) +		if (ino < btrfs_ino(entry))  			p = &parent->rb_left; -		else if (ino > btrfs_ino(BTRFS_I(&entry->vfs_inode))) +		else if (ino > btrfs_ino(entry))  			p = &parent->rb_right;  		else {  			WARN_ON(!(entry->vfs_inode.i_state & @@ -5708,16 +5689,21 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location,  		int ret;  		ret = btrfs_read_locked_inode(inode); -		if (!is_bad_inode(inode)) { +		if (!ret) {  			inode_tree_add(inode);  			unlock_new_inode(inode);  			if (new)  				*new = 1;  		} else { -			unlock_new_inode(inode); -			iput(inode); -			ASSERT(ret < 0); -			inode = ERR_PTR(ret < 0 ? ret : -ESTALE); +			iget_failed(inode); +			/* +			 * ret > 0 can come from btrfs_search_slot called by +			 * btrfs_read_locked_inode, this means the inode item +			 * was not found. +			 */ +			if (ret > 0) +				ret = -ENOENT; +			inode = ERR_PTR(ret);  		}  	} @@ -5745,7 +5731,7 @@ static struct inode *new_simple_dir(struct super_block *s,  	inode->i_mtime = current_time(inode);  	inode->i_atime = inode->i_mtime;  	inode->i_ctime = inode->i_mtime; -	BTRFS_I(inode)->i_otime = timespec64_to_timespec(inode->i_mtime); +	BTRFS_I(inode)->i_otime = inode->i_mtime;  	return inode;  } @@ -6027,32 +6013,6 @@ err:  	return ret;  } -int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) -{ -	struct btrfs_root *root = BTRFS_I(inode)->root; -	struct btrfs_trans_handle *trans; -	int ret = 0; -	bool nolock = false; - -	if (test_bit(BTRFS_INODE_DUMMY, &BTRFS_I(inode)->runtime_flags)) -		return 0; - -	if (btrfs_fs_closing(root->fs_info) && -			btrfs_is_free_space_inode(BTRFS_I(inode))) -		nolock = true; - -	if (wbc->sync_mode == WB_SYNC_ALL) { -		if (nolock) -			trans = btrfs_join_transaction_nolock(root); -		else -			trans = btrfs_join_transaction(root); -		if (IS_ERR(trans)) -			return PTR_ERR(trans); -		ret = btrfs_commit_transaction(trans); -	} -	return ret; -} -  /*   * This is somewhat expensive, updating the tree every time the   * inode changes.  But, it is most likely to find the inode in cache. @@ -6335,8 +6295,10 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,  	location->type = BTRFS_INODE_ITEM_KEY;  	ret = btrfs_insert_inode_locked(inode); -	if (ret < 0) +	if (ret < 0) { +		iput(inode);  		goto fail; +	}  	path->leave_spinning = 1;  	ret = btrfs_insert_empty_items(trans, root, path, key, sizes, nitems); @@ -6349,7 +6311,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,  	inode->i_mtime = current_time(inode);  	inode->i_atime = inode->i_mtime;  	inode->i_ctime = inode->i_mtime; -	BTRFS_I(inode)->i_otime = timespec64_to_timespec(inode->i_mtime); +	BTRFS_I(inode)->i_otime = inode->i_mtime;  	inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0],  				  struct btrfs_inode_item); @@ -6395,12 +6357,11 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,  	return inode;  fail_unlock: -	unlock_new_inode(inode); +	discard_new_inode(inode);  fail:  	if (dir && name)  		BTRFS_I(dir)->index_cnt--;  	btrfs_free_path(path); -	iput(inode);  	return ERR_PTR(ret);  } @@ -6419,7 +6380,6 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,  		   struct btrfs_inode *parent_inode, struct btrfs_inode *inode,  		   const char *name, int name_len, int add_backref, u64 index)  { -	struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);  	int ret = 0;  	struct btrfs_key key;  	struct btrfs_root *root = parent_inode->root; @@ -6435,7 +6395,7 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,  	}  	if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) { -		ret = btrfs_add_root_ref(trans, fs_info, key.objectid, +		ret = btrfs_add_root_ref(trans, key.objectid,  					 root->root_key.objectid, parent_ino,  					 index, name, name_len);  	} else if (add_backref) { @@ -6471,7 +6431,7 @@ fail_dir_item:  	if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) {  		u64 local_index;  		int err; -		err = btrfs_del_root_ref(trans, fs_info, key.objectid, +		err = btrfs_del_root_ref(trans, key.objectid,  					 root->root_key.objectid, parent_ino,  					 &local_index, name, name_len); @@ -6505,7 +6465,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,  	struct btrfs_root *root = BTRFS_I(dir)->root;  	struct inode *inode = NULL;  	int err; -	int drop_inode = 0;  	u64 objectid;  	u64 index = 0; @@ -6527,6 +6486,7 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,  			mode, &index);  	if (IS_ERR(inode)) {  		err = PTR_ERR(inode); +		inode = NULL;  		goto out_unlock;  	} @@ -6541,31 +6501,24 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,  	err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);  	if (err) -		goto out_unlock_inode; +		goto out_unlock;  	err = btrfs_add_nondir(trans, BTRFS_I(dir), dentry, BTRFS_I(inode),  			0, index); -	if (err) { -		goto out_unlock_inode; -	} else { -		btrfs_update_inode(trans, root, inode); -		d_instantiate_new(dentry, inode); -	} +	if (err) +		goto out_unlock; + +	btrfs_update_inode(trans, root, inode); +	d_instantiate_new(dentry, inode);  out_unlock:  	btrfs_end_transaction(trans);  	btrfs_btree_balance_dirty(fs_info); -	if (drop_inode) { +	if (err && inode) {  		inode_dec_link_count(inode); -		iput(inode); +		discard_new_inode(inode);  	}  	return err; - -out_unlock_inode: -	drop_inode = 1; -	unlock_new_inode(inode); -	goto out_unlock; -  }  static int btrfs_create(struct inode *dir, struct dentry *dentry, @@ -6575,7 +6528,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,  	struct btrfs_trans_handle *trans;  	struct btrfs_root *root = BTRFS_I(dir)->root;  	struct inode *inode = NULL; -	int drop_inode_on_err = 0;  	int err;  	u64 objectid;  	u64 index = 0; @@ -6598,9 +6550,9 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,  			mode, &index);  	if (IS_ERR(inode)) {  		err = PTR_ERR(inode); +		inode = NULL;  		goto out_unlock;  	} -	drop_inode_on_err = 1;  	/*  	* If the active LSM wants to access the inode during  	* d_instantiate it needs these. Smack checks to see @@ -6613,33 +6565,28 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,  	err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);  	if (err) -		goto out_unlock_inode; +		goto out_unlock;  	err = btrfs_update_inode(trans, root, inode);  	if (err) -		goto out_unlock_inode; +		goto out_unlock;  	err = btrfs_add_nondir(trans, BTRFS_I(dir), dentry, BTRFS_I(inode),  			0, index);  	if (err) -		goto out_unlock_inode; +		goto out_unlock;  	BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;  	d_instantiate_new(dentry, inode);  out_unlock:  	btrfs_end_transaction(trans); -	if (err && drop_inode_on_err) { +	if (err && inode) {  		inode_dec_link_count(inode); -		iput(inode); +		discard_new_inode(inode);  	}  	btrfs_btree_balance_dirty(fs_info);  	return err; - -out_unlock_inode: -	unlock_new_inode(inode); -	goto out_unlock; -  }  static int btrfs_link(struct dentry *old_dentry, struct inode *dir, @@ -6748,6 +6695,7 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)  			S_IFDIR | mode, &index);  	if (IS_ERR(inode)) {  		err = PTR_ERR(inode); +		inode = NULL;  		goto out_fail;  	} @@ -6758,34 +6706,30 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)  	err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);  	if (err) -		goto out_fail_inode; +		goto out_fail;  	btrfs_i_size_write(BTRFS_I(inode), 0);  	err = btrfs_update_inode(trans, root, inode);  	if (err) -		goto out_fail_inode; +		goto out_fail;  	err = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode),  			dentry->d_name.name,  			dentry->d_name.len, 0, index);  	if (err) -		goto out_fail_inode; +		goto out_fail;  	d_instantiate_new(dentry, inode);  	drop_on_err = 0;  out_fail:  	btrfs_end_transaction(trans); -	if (drop_on_err) { +	if (err && inode) {  		inode_dec_link_count(inode); -		iput(inode); +		discard_new_inode(inode);  	}  	btrfs_btree_balance_dirty(fs_info);  	return err; - -out_fail_inode: -	unlock_new_inode(inode); -	goto out_fail;  }  static noinline int uncompress_inline(struct btrfs_path *path, @@ -6847,7 +6791,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,  	    size_t pg_offset, u64 start, u64 len,  		int create)  { -	struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb); +	struct btrfs_fs_info *fs_info = inode->root->fs_info;  	int ret;  	int err = 0;  	u64 extent_start = 0; @@ -6943,7 +6887,8 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,  						       extent_start);  	} else if (found_type == BTRFS_FILE_EXTENT_INLINE) {  		size_t size; -		size = btrfs_file_extent_inline_len(leaf, path->slots[0], item); + +		size = btrfs_file_extent_ram_bytes(leaf, item);  		extent_end = ALIGN(extent_start + size,  				   fs_info->sectorsize); @@ -6994,7 +6939,7 @@ next:  		if (new_inline)  			goto out; -		size = btrfs_file_extent_inline_len(leaf, path->slots[0], item); +		size = btrfs_file_extent_ram_bytes(leaf, item);  		extent_offset = page_offset(page) + pg_offset - extent_start;  		copy_size = min_t(u64, PAGE_SIZE - pg_offset,  				  size - extent_offset); @@ -7865,7 +7810,7 @@ static blk_status_t dio_read_error(struct inode *inode, struct bio *failed_bio,  	isector >>= inode->i_sb->s_blocksize_bits;  	bio = btrfs_create_repair_bio(inode, failed_bio, failrec, page,  				pgoff, isector, repair_endio, repair_arg); -	bio_set_op_attrs(bio, REQ_OP_READ, read_mode); +	bio->bi_opf = REQ_OP_READ | read_mode;  	btrfs_debug(BTRFS_I(inode)->root->fs_info,  		    "repair DIO read error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d", @@ -8299,8 +8244,7 @@ static inline blk_status_t btrfs_submit_dio_bio(struct bio *bio,  	if (write && async_submit) {  		ret = btrfs_wq_submit_bio(fs_info, bio, 0, 0,  					  file_offset, inode, -					  btrfs_submit_bio_start_direct_io, -					  btrfs_submit_bio_done); +					  btrfs_submit_bio_start_direct_io);  		goto err;  	} else if (write) {  		/* @@ -9005,13 +8949,14 @@ again:  	unlock_extent_cached(io_tree, page_start, page_end, &cached_state); -out_unlock:  	if (!ret2) {  		btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, true);  		sb_end_pagefault(inode->i_sb);  		extent_changeset_free(data_reserved);  		return VM_FAULT_LOCKED;  	} + +out_unlock:  	unlock_page(page);  out:  	btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, (ret != 0)); @@ -9443,6 +9388,7 @@ static int btrfs_rename_exchange(struct inode *old_dir,  	u64 new_idx = 0;  	u64 root_objectid;  	int ret; +	int ret2;  	bool root_log_pinned = false;  	bool dest_log_pinned = false; @@ -9538,8 +9484,7 @@ static int btrfs_rename_exchange(struct inode *old_dir,  	/* src is a subvolume */  	if (old_ino == BTRFS_FIRST_FREE_OBJECTID) {  		root_objectid = BTRFS_I(old_inode)->root->root_key.objectid; -		ret = btrfs_unlink_subvol(trans, root, old_dir, -					  root_objectid, +		ret = btrfs_unlink_subvol(trans, old_dir, root_objectid,  					  old_dentry->d_name.name,  					  old_dentry->d_name.len);  	} else { /* src is an inode */ @@ -9558,8 +9503,7 @@ static int btrfs_rename_exchange(struct inode *old_dir,  	/* dest is a subvolume */  	if (new_ino == BTRFS_FIRST_FREE_OBJECTID) {  		root_objectid = BTRFS_I(new_inode)->root->root_key.objectid; -		ret = btrfs_unlink_subvol(trans, dest, new_dir, -					  root_objectid, +		ret = btrfs_unlink_subvol(trans, new_dir, root_objectid,  					  new_dentry->d_name.name,  					  new_dentry->d_name.len);  	} else { /* dest is an inode */ @@ -9639,7 +9583,8 @@ out_fail:  			dest_log_pinned = false;  		}  	} -	ret = btrfs_end_transaction(trans); +	ret2 = btrfs_end_transaction(trans); +	ret = ret ? ret : ret2;  out_notrans:  	if (new_ino == BTRFS_FIRST_FREE_OBJECTID)  		up_read(&fs_info->subvol_sem); @@ -9818,7 +9763,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,  	if (unlikely(old_ino == BTRFS_FIRST_FREE_OBJECTID)) {  		root_objectid = BTRFS_I(old_inode)->root->root_key.objectid; -		ret = btrfs_unlink_subvol(trans, root, old_dir, root_objectid, +		ret = btrfs_unlink_subvol(trans, old_dir, root_objectid,  					old_dentry->d_name.name,  					old_dentry->d_name.len);  	} else { @@ -9840,8 +9785,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,  		if (unlikely(btrfs_ino(BTRFS_I(new_inode)) ==  			     BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {  			root_objectid = BTRFS_I(new_inode)->location.objectid; -			ret = btrfs_unlink_subvol(trans, dest, new_dir, -						root_objectid, +			ret = btrfs_unlink_subvol(trans, new_dir, root_objectid,  						new_dentry->d_name.name,  						new_dentry->d_name.len);  			BUG_ON(new_inode->i_nlink == 0); @@ -10112,7 +10056,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,  	struct btrfs_key key;  	struct inode *inode = NULL;  	int err; -	int drop_inode = 0;  	u64 objectid;  	u64 index = 0;  	int name_len; @@ -10145,6 +10088,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,  				objectid, S_IFLNK|S_IRWXUGO, &index);  	if (IS_ERR(inode)) {  		err = PTR_ERR(inode); +		inode = NULL;  		goto out_unlock;  	} @@ -10161,12 +10105,12 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,  	err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);  	if (err) -		goto out_unlock_inode; +		goto out_unlock;  	path = btrfs_alloc_path();  	if (!path) {  		err = -ENOMEM; -		goto out_unlock_inode; +		goto out_unlock;  	}  	key.objectid = btrfs_ino(BTRFS_I(inode));  	key.offset = 0; @@ -10176,7 +10120,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,  				      datasize);  	if (err) {  		btrfs_free_path(path); -		goto out_unlock_inode; +		goto out_unlock;  	}  	leaf = path->nodes[0];  	ei = btrfs_item_ptr(leaf, path->slots[0], @@ -10208,26 +10152,19 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,  	if (!err)  		err = btrfs_add_nondir(trans, BTRFS_I(dir), dentry,  				BTRFS_I(inode), 0, index); -	if (err) { -		drop_inode = 1; -		goto out_unlock_inode; -	} +	if (err) +		goto out_unlock;  	d_instantiate_new(dentry, inode);  out_unlock:  	btrfs_end_transaction(trans); -	if (drop_inode) { +	if (err && inode) {  		inode_dec_link_count(inode); -		iput(inode); +		discard_new_inode(inode);  	}  	btrfs_btree_balance_dirty(fs_info);  	return err; - -out_unlock_inode: -	drop_inode = 1; -	unlock_new_inode(inode); -	goto out_unlock;  }  static int __btrfs_prealloc_file_range(struct inode *inode, int mode, @@ -10436,14 +10373,14 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)  	ret = btrfs_init_inode_security(trans, inode, dir, NULL);  	if (ret) -		goto out_inode; +		goto out;  	ret = btrfs_update_inode(trans, root, inode);  	if (ret) -		goto out_inode; +		goto out;  	ret = btrfs_orphan_add(trans, BTRFS_I(inode));  	if (ret) -		goto out_inode; +		goto out;  	/*  	 * We set number of links to 0 in btrfs_new_inode(), and here we set @@ -10453,21 +10390,15 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)  	 *    d_tmpfile() -> inode_dec_link_count() -> drop_nlink()  	 */  	set_nlink(inode, 1); -	unlock_new_inode(inode);  	d_tmpfile(dentry, inode); +	unlock_new_inode(inode);  	mark_inode_dirty(inode); -  out:  	btrfs_end_transaction(trans); -	if (ret) -		iput(inode); +	if (ret && inode) +		discard_new_inode(inode);  	btrfs_btree_balance_dirty(fs_info);  	return ret; - -out_inode: -	unlock_new_inode(inode); -	goto out; -  }  __attribute__((const)) @@ -10476,12 +10407,6 @@ static int btrfs_readpage_io_failed_hook(struct page *page, int failed_mirror)  	return -EAGAIN;  } -static struct btrfs_fs_info *iotree_fs_info(void *private_data) -{ -	struct inode *inode = private_data; -	return btrfs_sb(inode->i_sb); -} -  static void btrfs_check_extent_io_range(void *private_data, const char *caller,  					u64 start, u64 end)  { @@ -10496,9 +10421,9 @@ static void btrfs_check_extent_io_range(void *private_data, const char *caller,  	}  } -void btrfs_set_range_writeback(void *private_data, u64 start, u64 end) +void btrfs_set_range_writeback(struct extent_io_tree *tree, u64 start, u64 end)  { -	struct inode *inode = private_data; +	struct inode *inode = tree->private_data;  	unsigned long index = start >> PAGE_SHIFT;  	unsigned long end_index = end >> PAGE_SHIFT;  	struct page *page; @@ -10554,10 +10479,7 @@ static const struct extent_io_ops btrfs_extent_io_ops = {  	/* mandatory callbacks */  	.submit_bio_hook = btrfs_submit_bio_hook,  	.readpage_end_io_hook = btrfs_readpage_end_io_hook, -	.merge_bio_hook = btrfs_merge_bio_hook,  	.readpage_io_failed_hook = btrfs_readpage_io_failed_hook, -	.tree_fs_info = iotree_fs_info, -	.set_range_writeback = btrfs_set_range_writeback,  	/* optional callbacks */  	.fill_delalloc = run_delalloc_range, |