diff options
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/disk-io.c | 7 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 8 | ||||
| -rw-r--r-- | fs/btrfs/extent_io.c | 3 | ||||
| -rw-r--r-- | fs/btrfs/file.c | 8 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 50 | ||||
| -rw-r--r-- | fs/btrfs/relocation.c | 3 | 
6 files changed, 23 insertions, 56 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 87b25543d7d..2b59201b955 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1982,7 +1982,12 @@ struct btrfs_root *open_ctree(struct super_block *sb,  	if (!(sb->s_flags & MS_RDONLY)) {  		ret = btrfs_recover_relocation(tree_root); -		BUG_ON(ret); +		if (ret < 0) { +			printk(KERN_WARNING +			       "btrfs: failed to recover relocation\n"); +			err = -EINVAL; +			goto fail_trans_kthread; +		}  	}  	location.objectid = BTRFS_FS_TREE_OBJECTID; diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 432a2da4641..559f72489b3 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -5402,10 +5402,6 @@ static noinline int walk_down_tree(struct btrfs_trans_handle *trans,  	int ret;  	while (level >= 0) { -		if (path->slots[level] >= -		    btrfs_header_nritems(path->nodes[level])) -			break; -  		ret = walk_down_proc(trans, root, path, wc, lookup_info);  		if (ret > 0)  			break; @@ -5413,6 +5409,10 @@ static noinline int walk_down_tree(struct btrfs_trans_handle *trans,  		if (level == 0)  			break; +		if (path->slots[level] >= +		    btrfs_header_nritems(path->nodes[level])) +			break; +  		ret = do_walk_down(trans, root, path, wc, &lookup_info);  		if (ret > 0) {  			path->slots[level]++; diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 96577e8bf9f..b177ed31961 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3165,10 +3165,9 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,  		spin_unlock(&tree->buffer_lock);  		goto free_eb;  	} -	spin_unlock(&tree->buffer_lock); -  	/* add one reference for the tree */  	atomic_inc(&eb->refs); +	spin_unlock(&tree->buffer_lock);  	return eb;  free_eb: diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index c02033596f0..6ed434ac037 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -720,13 +720,15 @@ again:  					inode->i_ino, orig_offset);  		BUG_ON(ret);  	} -	fi = btrfs_item_ptr(leaf, path->slots[0], -			   struct btrfs_file_extent_item);  	if (del_nr == 0) { +		fi = btrfs_item_ptr(leaf, path->slots[0], +			   struct btrfs_file_extent_item);  		btrfs_set_file_extent_type(leaf, fi,  					   BTRFS_FILE_EXTENT_REG);  		btrfs_mark_buffer_dirty(leaf);  	} else { +		fi = btrfs_item_ptr(leaf, del_slot - 1, +			   struct btrfs_file_extent_item);  		btrfs_set_file_extent_type(leaf, fi,  					   BTRFS_FILE_EXTENT_REG);  		btrfs_set_file_extent_num_bytes(leaf, fi, @@ -1133,7 +1135,7 @@ int btrfs_sync_file(struct file *file, struct dentry *dentry, int datasync)  	}  	mutex_lock(&dentry->d_inode->i_mutex);  out: -	return ret > 0 ? EIO : ret; +	return ret > 0 ? -EIO : ret;  }  static const struct vm_operations_struct btrfs_file_vm_ops = { diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8cd109972fa..4deb280f896 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1681,24 +1681,6 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,   * before we start the transaction.  It limits the amount of btree   * reads required while inside the transaction.   */ -static noinline void reada_csum(struct btrfs_root *root, -				struct btrfs_path *path, -				struct btrfs_ordered_extent *ordered_extent) -{ -	struct btrfs_ordered_sum *sum; -	u64 bytenr; - -	sum = list_entry(ordered_extent->list.next, struct btrfs_ordered_sum, -			 list); -	bytenr = sum->sums[0].bytenr; - -	/* -	 * we don't care about the results, the point of this search is -	 * just to get the btree leaves into ram -	 */ -	btrfs_lookup_csum(NULL, root->fs_info->csum_root, path, bytenr, 0); -} -  /* as ordered data IO finishes, this gets called so we can finish   * an ordered extent if the range of bytes in the file it covers are   * fully written. @@ -1709,7 +1691,6 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)  	struct btrfs_trans_handle *trans;  	struct btrfs_ordered_extent *ordered_extent = NULL;  	struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; -	struct btrfs_path *path;  	int compressed = 0;  	int ret; @@ -1717,32 +1698,9 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)  	if (!ret)  		return 0; -	/* -	 * before we join the transaction, try to do some of our IO. -	 * This will limit the amount of IO that we have to do with -	 * the transaction running.  We're unlikely to need to do any -	 * IO if the file extents are new, the disk_i_size checks -	 * covers the most common case. -	 */ -	if (start < BTRFS_I(inode)->disk_i_size) { -		path = btrfs_alloc_path(); -		if (path) { -			ret = btrfs_lookup_file_extent(NULL, root, path, -						       inode->i_ino, -						       start, 0); -			ordered_extent = btrfs_lookup_ordered_extent(inode, -								     start); -			if (!list_empty(&ordered_extent->list)) { -				btrfs_release_path(root, path); -				reada_csum(root, path, ordered_extent); -			} -			btrfs_free_path(path); -		} -	} - -	if (!ordered_extent) -		ordered_extent = btrfs_lookup_ordered_extent(inode, start); +	ordered_extent = btrfs_lookup_ordered_extent(inode, start);  	BUG_ON(!ordered_extent); +  	if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) {  		BUG_ON(!list_empty(&ordered_extent->list));  		ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); @@ -5841,7 +5799,9 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end,  		inode->i_ctime = CURRENT_TIME;  		BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC;  		if (!(mode & FALLOC_FL_KEEP_SIZE) && -		    cur_offset > inode->i_size) { +			(actual_len > inode->i_size) && +			(cur_offset > inode->i_size)) { +  			if (cur_offset > actual_len)  				i_size  = actual_len;  			else diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index ed3e4a2ec2c..ab7ab531874 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -3764,7 +3764,8 @@ out:  				       BTRFS_DATA_RELOC_TREE_OBJECTID);  		if (IS_ERR(fs_root))  			err = PTR_ERR(fs_root); -		btrfs_orphan_cleanup(fs_root); +		else +			btrfs_orphan_cleanup(fs_root);  	}  	return err;  }  |