aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 0c79346fd2c9..61bd8953a683 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -115,6 +115,7 @@ static int cow_file_range(struct inode *inode, u64 start, u64 end)
115 trans = btrfs_start_transaction(root, 1); 115 trans = btrfs_start_transaction(root, 1);
116 BUG_ON(!trans); 116 BUG_ON(!trans);
117 btrfs_set_trans_block_group(trans, inode); 117 btrfs_set_trans_block_group(trans, inode);
118 mutex_unlock(&root->fs_info->fs_mutex);
118 119
119 num_bytes = (end - start + blocksize) & ~(blocksize - 1); 120 num_bytes = (end - start + blocksize) & ~(blocksize - 1);
120 num_bytes = max(blocksize, num_bytes); 121 num_bytes = max(blocksize, num_bytes);
@@ -159,6 +160,7 @@ static int cow_file_range(struct inode *inode, u64 start, u64 end)
159 btrfs_add_ordered_inode(inode); 160 btrfs_add_ordered_inode(inode);
160 btrfs_update_inode(trans, root, inode); 161 btrfs_update_inode(trans, root, inode);
161out: 162out:
163 mutex_lock(&root->fs_info->fs_mutex);
162 btrfs_end_transaction(trans, root); 164 btrfs_end_transaction(trans, root);
163 return ret; 165 return ret;
164} 166}
@@ -349,10 +351,12 @@ int __btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
349 351
350 mutex_lock(&root->fs_info->fs_mutex); 352 mutex_lock(&root->fs_info->fs_mutex);
351 trans = btrfs_start_transaction(root, 1); 353 trans = btrfs_start_transaction(root, 1);
354 mutex_unlock(&root->fs_info->fs_mutex);
352 355
353 btrfs_set_trans_block_group(trans, inode); 356 btrfs_set_trans_block_group(trans, inode);
354 btrfs_csum_file_blocks(trans, root, inode, bio, sums); 357 btrfs_csum_file_blocks(trans, root, inode, bio, sums);
355 358
359 mutex_lock(&root->fs_info->fs_mutex);
356 ret = btrfs_end_transaction(trans, root); 360 ret = btrfs_end_transaction(trans, root);
357 BUG_ON(ret); 361 BUG_ON(ret);
358 mutex_unlock(&root->fs_info->fs_mutex); 362 mutex_unlock(&root->fs_info->fs_mutex);
@@ -807,6 +811,7 @@ static int btrfs_unlink_trans(struct btrfs_trans_handle *trans,
807 goto err; 811 goto err;
808 } 812 }
809 ret = btrfs_delete_one_dir_name(trans, root, path, di); 813 ret = btrfs_delete_one_dir_name(trans, root, path, di);
814 btrfs_release_path(root, path);
810 815
811 dentry->d_inode->i_ctime = dir->i_ctime; 816 dentry->d_inode->i_ctime = dir->i_ctime;
812 ret = btrfs_del_inode_ref(trans, root, name, name_len, 817 ret = btrfs_del_inode_ref(trans, root, name, name_len,
@@ -881,8 +886,9 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
881 struct btrfs_trans_handle *trans; 886 struct btrfs_trans_handle *trans;
882 unsigned long nr = 0; 887 unsigned long nr = 0;
883 888
884 if (inode->i_size > BTRFS_EMPTY_DIR_SIZE) 889 if (inode->i_size > BTRFS_EMPTY_DIR_SIZE) {
885 return -ENOTEMPTY; 890 return -ENOTEMPTY;
891 }
886 892
887 mutex_lock(&root->fs_info->fs_mutex); 893 mutex_lock(&root->fs_info->fs_mutex);
888 ret = btrfs_check_free_space(root, 1, 1); 894 ret = btrfs_check_free_space(root, 1, 1);