int btrfs_check_free_space(struct btrfs_root *root, u64 num_required,
int for_del)
{
- u64 total = btrfs_super_total_bytes(&root->fs_info->super_copy);
- u64 used = btrfs_super_bytes_used(&root->fs_info->super_copy);
+ u64 total;
+ u64 used;
u64 thresh;
unsigned long flags;
int ret = 0;
+ spin_lock_irqsave(&root->fs_info->delalloc_lock, flags);
+ total = btrfs_super_total_bytes(&root->fs_info->super_copy);
+ used = btrfs_super_bytes_used(&root->fs_info->super_copy);
if (for_del)
thresh = total * 90;
else
do_div(thresh, 100);
- spin_lock_irqsave(&root->fs_info->delalloc_lock, flags);
if (used + root->fs_info->delalloc_bytes + num_required > thresh)
ret = -ENOSPC;
spin_unlock_irqrestore(&root->fs_info->delalloc_lock, flags);
trans = btrfs_start_transaction(root, 1);
BUG_ON(!trans);
btrfs_set_trans_block_group(trans, inode);
- mutex_unlock(&root->fs_info->fs_mutex);
num_bytes = (end - start + blocksize) & ~(blocksize - 1);
num_bytes = max(blocksize, num_bytes);
btrfs_add_ordered_inode(inode);
btrfs_update_inode(trans, root, inode);
out:
- mutex_lock(&root->fs_info->fs_mutex);
btrfs_end_transaction(trans, root);
return ret;
}
{
struct btrfs_root *root = BTRFS_I(inode)->root;
int ret;
- mutex_lock(&root->fs_info->fs_mutex);
+
if (btrfs_test_opt(root, NODATACOW) ||
btrfs_test_flag(inode, NODATACOW))
ret = run_delalloc_nocow(inode, start, end);
else
ret = cow_file_range(inode, start, end);
- mutex_unlock(&root->fs_info->fs_mutex);
return ret;
}
ret = btrfs_csum_one_bio(root, bio, &sums);
BUG_ON(ret);
- mutex_lock(&root->fs_info->fs_mutex);
trans = btrfs_start_transaction(root, 1);
- mutex_unlock(&root->fs_info->fs_mutex);
btrfs_set_trans_block_group(trans, inode);
btrfs_csum_file_blocks(trans, root, inode, bio, sums);
- mutex_lock(&root->fs_info->fs_mutex);
ret = btrfs_end_transaction(trans, root);
BUG_ON(ret);
- mutex_unlock(&root->fs_info->fs_mutex);
kfree(sums);
btrfs_test_flag(inode, NODATASUM))
return 0;
- mutex_lock(&root->fs_info->fs_mutex);
path = btrfs_alloc_path();
item = btrfs_lookup_csum(NULL, root, path, inode->i_ino, start, 0);
if (IS_ERR(item)) {
out:
if (path)
btrfs_free_path(path);
- mutex_unlock(&root->fs_info->fs_mutex);
return ret;
}
path = btrfs_alloc_path();
BUG_ON(!path);
- mutex_lock(&root->fs_info->fs_mutex);
memcpy(&location, &BTRFS_I(inode)->location, sizeof(location));
ret = btrfs_lookup_inode(NULL, root, path, &location, 0);
btrfs_free_path(path);
inode_item = NULL;
- mutex_unlock(&root->fs_info->fs_mutex);
-
switch (inode->i_mode & S_IFMT) {
case S_IFREG:
inode->i_mapping->a_ops = &btrfs_aops;
return;
make_bad:
- btrfs_release_path(root, path);
btrfs_free_path(path);
- mutex_unlock(&root->fs_info->fs_mutex);
make_bad_inode(inode);
}
btrfs_set_inode_last_trans(trans, inode);
ret = 0;
failed:
- btrfs_release_path(root, path);
btrfs_free_path(path);
return ret;
}
unsigned long nr = 0;
root = BTRFS_I(dir)->root;
- mutex_lock(&root->fs_info->fs_mutex);
ret = btrfs_check_free_space(root, 1, 1);
if (ret)
btrfs_end_transaction(trans, root);
fail:
- mutex_unlock(&root->fs_info->fs_mutex);
btrfs_btree_balance_dirty(root, nr);
btrfs_throttle(root);
return ret;
return -ENOTEMPTY;
}
- mutex_lock(&root->fs_info->fs_mutex);
ret = btrfs_check_free_space(root, 1, 1);
if (ret)
goto fail;
nr = trans->blocks_used;
ret = btrfs_end_transaction(trans, root);
fail:
- mutex_unlock(&root->fs_info->fs_mutex);
btrfs_btree_balance_dirty(root, nr);
btrfs_throttle(root);
ret = btrfs_del_items(trans, root, path, pending_del_slot,
pending_del_nr);
}
- btrfs_release_path(root, path);
btrfs_free_path(path);
inode->i_sb->s_dirt = 1;
return ret;
if (attr->ia_size <= hole_start)
goto out;
- mutex_lock(&root->fs_info->fs_mutex);
err = btrfs_check_free_space(root, 1, 0);
- mutex_unlock(&root->fs_info->fs_mutex);
if (err)
goto fail;
lock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS);
hole_size = block_end - hole_start;
- mutex_lock(&root->fs_info->fs_mutex);
trans = btrfs_start_transaction(root, 1);
btrfs_set_trans_block_group(trans, inode);
err = btrfs_drop_extents(trans, root, inode,
btrfs_check_file(root, inode);
}
btrfs_end_transaction(trans, root);
- mutex_unlock(&root->fs_info->fs_mutex);
unlock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS);
if (err)
return err;
}
inode->i_size = 0;
- mutex_lock(&root->fs_info->fs_mutex);
trans = btrfs_start_transaction(root, 1);
btrfs_set_trans_block_group(trans, inode);
clear_inode(inode);
btrfs_end_transaction(trans, root);
- mutex_unlock(&root->fs_info->fs_mutex);
btrfs_btree_balance_dirty(root, nr);
btrfs_throttle(root);
return;
no_delete_lock:
nr = trans->blocks_used;
btrfs_end_transaction(trans, root);
- mutex_unlock(&root->fs_info->fs_mutex);
btrfs_btree_balance_dirty(root, nr);
btrfs_throttle(root);
no_delete:
path = btrfs_alloc_path();
BUG_ON(!path);
- mutex_lock(&root->fs_info->fs_mutex);
*sub_root = btrfs_read_fs_root(root->fs_info, location,
dentry->d_name.name,
location->offset = 0;
btrfs_free_path(path);
- mutex_unlock(&root->fs_info->fs_mutex);
return 0;
}
if (dentry->d_name.len > BTRFS_NAME_LEN)
return ERR_PTR(-ENAMETOOLONG);
- mutex_lock(&root->fs_info->fs_mutex);
ret = btrfs_inode_by_name(dir, dentry, &location);
- mutex_unlock(&root->fs_info->fs_mutex);
if (ret < 0)
return ERR_PTR(ret);
filp->f_pos = 1;
}
- mutex_lock(&root->fs_info->fs_mutex);
key.objectid = inode->i_ino;
path = btrfs_alloc_path();
path->reada = 2;
nopos:
ret = 0;
err:
- btrfs_release_path(root, path);
btrfs_free_path(path);
- mutex_unlock(&root->fs_info->fs_mutex);
return ret;
}
int ret = 0;
if (wait) {
- mutex_lock(&root->fs_info->fs_mutex);
trans = btrfs_start_transaction(root, 1);
btrfs_set_trans_block_group(trans, inode);
ret = btrfs_commit_transaction(trans, root);
- mutex_unlock(&root->fs_info->fs_mutex);
}
return ret;
}
struct btrfs_root *root = BTRFS_I(inode)->root;
struct btrfs_trans_handle *trans;
- mutex_lock(&root->fs_info->fs_mutex);
trans = btrfs_start_transaction(root, 1);
btrfs_set_trans_block_group(trans, inode);
btrfs_update_inode(trans, root, inode);
btrfs_end_transaction(trans, root);
- mutex_unlock(&root->fs_info->fs_mutex);
}
static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
if (!new_valid_dev(rdev))
return -EINVAL;
- mutex_lock(&root->fs_info->fs_mutex);
err = btrfs_check_free_space(root, 1, 0);
if (err)
goto fail;
nr = trans->blocks_used;
btrfs_end_transaction(trans, root);
fail:
- mutex_unlock(&root->fs_info->fs_mutex);
-
if (drop_inode) {
inode_dec_link_count(inode);
iput(inode);
unsigned long nr = 0;
u64 objectid;
- mutex_lock(&root->fs_info->fs_mutex);
err = btrfs_check_free_space(root, 1, 0);
if (err)
goto fail;
nr = trans->blocks_used;
btrfs_end_transaction(trans, root);
fail:
- mutex_unlock(&root->fs_info->fs_mutex);
-
if (drop_inode) {
inode_dec_link_count(inode);
iput(inode);
#else
inc_nlink(inode);
#endif
- mutex_lock(&root->fs_info->fs_mutex);
err = btrfs_check_free_space(root, 1, 0);
if (err)
goto fail;
nr = trans->blocks_used;
btrfs_end_transaction(trans, root);
fail:
- mutex_unlock(&root->fs_info->fs_mutex);
-
if (drop_inode) {
inode_dec_link_count(inode);
iput(inode);
u64 objectid = 0;
unsigned long nr = 1;
- mutex_lock(&root->fs_info->fs_mutex);
err = btrfs_check_free_space(root, 1, 0);
if (err)
goto out_unlock;
btrfs_end_transaction(trans, root);
out_unlock:
- mutex_unlock(&root->fs_info->fs_mutex);
if (drop_on_err)
iput(inode);
btrfs_btree_balance_dirty(root, nr);
path = btrfs_alloc_path();
BUG_ON(!path);
- mutex_lock(&root->fs_info->fs_mutex);
again:
spin_lock(&em_tree->lock);
if (!err)
err = ret;
}
- mutex_unlock(&root->fs_info->fs_mutex);
if (err) {
free_extent_map(em);
WARN_ON(1);
int ret;
u64 page_start;
- mutex_lock(&root->fs_info->fs_mutex);
ret = btrfs_check_free_space(root, PAGE_CACHE_SIZE, 0);
- mutex_unlock(&root->fs_info->fs_mutex);
if (ret)
goto out;
btrfs_truncate_page(inode->i_mapping, inode->i_size);
- mutex_lock(&root->fs_info->fs_mutex);
trans = btrfs_start_transaction(root, 1);
btrfs_set_trans_block_group(trans, inode);
ret = btrfs_end_transaction(trans, root);
BUG_ON(ret);
- mutex_unlock(&root->fs_info->fs_mutex);
btrfs_btree_balance_dirty(root, nr);
btrfs_throttle(root);
}
struct inode *new_inode = new_dentry->d_inode;
struct inode *old_inode = old_dentry->d_inode;
struct timespec ctime = CURRENT_TIME;
- struct btrfs_path *path;
int ret;
if (S_ISDIR(old_inode->i_mode) && new_inode &&
return -ENOTEMPTY;
}
- mutex_lock(&root->fs_info->fs_mutex);
ret = btrfs_check_free_space(root, 1, 0);
if (ret)
goto out_unlock;
trans = btrfs_start_transaction(root, 1);
btrfs_set_trans_block_group(trans, new_dir);
- path = btrfs_alloc_path();
- if (!path) {
- ret = -ENOMEM;
- goto out_fail;
- }
old_dentry->d_inode->i_nlink++;
old_dir->i_ctime = old_dir->i_mtime = ctime;
goto out_fail;
out_fail:
- btrfs_free_path(path);
btrfs_end_transaction(trans, root);
out_unlock:
- mutex_unlock(&root->fs_info->fs_mutex);
return ret;
}
if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root))
return -ENAMETOOLONG;
- mutex_lock(&root->fs_info->fs_mutex);
err = btrfs_check_free_space(root, 1, 0);
if (err)
goto out_fail;
nr = trans->blocks_used;
btrfs_end_transaction(trans, root);
out_fail:
- mutex_unlock(&root->fs_info->fs_mutex);
if (drop_inode) {
inode_dec_link_count(inode);
iput(inode);