Btrfs: kill the orphan space calculation for snapshots
This patch kills off the calculation for the amount of space needed for the orphan operations during a snapshot. The thing is we only do snapshots on commit, so any space that is in the block_rsv->freed[] isn't going to be in the new snapshot anyway, so there isn't any reason to require that space to be reserved for the snapshot to occur. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com>
This commit is contained in:
parent
7709cde33f
commit
dba68306f3
|
@ -2577,11 +2577,6 @@ int btrfs_update_inode(struct btrfs_trans_handle *trans,
|
||||||
int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode);
|
int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode);
|
||||||
int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode);
|
int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode);
|
||||||
int btrfs_orphan_cleanup(struct btrfs_root *root);
|
int btrfs_orphan_cleanup(struct btrfs_root *root);
|
||||||
void btrfs_orphan_pre_snapshot(struct btrfs_trans_handle *trans,
|
|
||||||
struct btrfs_pending_snapshot *pending,
|
|
||||||
u64 *bytes_to_reserve);
|
|
||||||
void btrfs_orphan_post_snapshot(struct btrfs_trans_handle *trans,
|
|
||||||
struct btrfs_pending_snapshot *pending);
|
|
||||||
void btrfs_orphan_commit_root(struct btrfs_trans_handle *trans,
|
void btrfs_orphan_commit_root(struct btrfs_trans_handle *trans,
|
||||||
struct btrfs_root *root);
|
struct btrfs_root *root);
|
||||||
int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size);
|
int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size);
|
||||||
|
|
|
@ -2079,89 +2079,6 @@ void btrfs_run_delayed_iputs(struct btrfs_root *root)
|
||||||
up_read(&root->fs_info->cleanup_work_sem);
|
up_read(&root->fs_info->cleanup_work_sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* calculate extra metadata reservation when snapshotting a subvolume
|
|
||||||
* contains orphan files.
|
|
||||||
*/
|
|
||||||
void btrfs_orphan_pre_snapshot(struct btrfs_trans_handle *trans,
|
|
||||||
struct btrfs_pending_snapshot *pending,
|
|
||||||
u64 *bytes_to_reserve)
|
|
||||||
{
|
|
||||||
struct btrfs_root *root;
|
|
||||||
struct btrfs_block_rsv *block_rsv;
|
|
||||||
u64 num_bytes;
|
|
||||||
int index;
|
|
||||||
|
|
||||||
root = pending->root;
|
|
||||||
if (!root->orphan_block_rsv || list_empty(&root->orphan_list))
|
|
||||||
return;
|
|
||||||
|
|
||||||
block_rsv = root->orphan_block_rsv;
|
|
||||||
|
|
||||||
/* orphan block reservation for the snapshot */
|
|
||||||
num_bytes = block_rsv->size;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* after the snapshot is created, COWing tree blocks may use more
|
|
||||||
* space than it frees. So we should make sure there is enough
|
|
||||||
* reserved space.
|
|
||||||
*/
|
|
||||||
index = trans->transid & 0x1;
|
|
||||||
if (block_rsv->reserved + block_rsv->freed[index] < block_rsv->size) {
|
|
||||||
num_bytes += block_rsv->size -
|
|
||||||
(block_rsv->reserved + block_rsv->freed[index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
*bytes_to_reserve += num_bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
void btrfs_orphan_post_snapshot(struct btrfs_trans_handle *trans,
|
|
||||||
struct btrfs_pending_snapshot *pending)
|
|
||||||
{
|
|
||||||
struct btrfs_root *root = pending->root;
|
|
||||||
struct btrfs_root *snap = pending->snap;
|
|
||||||
struct btrfs_block_rsv *block_rsv;
|
|
||||||
u64 num_bytes;
|
|
||||||
int index;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!root->orphan_block_rsv || list_empty(&root->orphan_list))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* refill source subvolume's orphan block reservation */
|
|
||||||
block_rsv = root->orphan_block_rsv;
|
|
||||||
index = trans->transid & 0x1;
|
|
||||||
if (block_rsv->reserved + block_rsv->freed[index] < block_rsv->size) {
|
|
||||||
num_bytes = block_rsv->size -
|
|
||||||
(block_rsv->reserved + block_rsv->freed[index]);
|
|
||||||
ret = btrfs_block_rsv_migrate(&pending->block_rsv,
|
|
||||||
root->orphan_block_rsv,
|
|
||||||
num_bytes);
|
|
||||||
BUG_ON(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* setup orphan block reservation for the snapshot */
|
|
||||||
block_rsv = btrfs_alloc_block_rsv(snap);
|
|
||||||
BUG_ON(!block_rsv);
|
|
||||||
|
|
||||||
btrfs_add_durable_block_rsv(root->fs_info, block_rsv);
|
|
||||||
snap->orphan_block_rsv = block_rsv;
|
|
||||||
|
|
||||||
num_bytes = root->orphan_block_rsv->size;
|
|
||||||
ret = btrfs_block_rsv_migrate(&pending->block_rsv,
|
|
||||||
block_rsv, num_bytes);
|
|
||||||
BUG_ON(ret);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* insert orphan item for the snapshot */
|
|
||||||
WARN_ON(!root->orphan_item_inserted);
|
|
||||||
ret = btrfs_insert_orphan_item(trans, root->fs_info->tree_root,
|
|
||||||
snap->root_key.objectid);
|
|
||||||
BUG_ON(ret);
|
|
||||||
snap->orphan_item_inserted = 1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
enum btrfs_orphan_cleanup_state {
|
enum btrfs_orphan_cleanup_state {
|
||||||
ORPHAN_CLEANUP_STARTED = 1,
|
ORPHAN_CLEANUP_STARTED = 1,
|
||||||
ORPHAN_CLEANUP_DONE = 2,
|
ORPHAN_CLEANUP_DONE = 2,
|
||||||
|
|
|
@ -911,7 +911,6 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
|
||||||
}
|
}
|
||||||
|
|
||||||
btrfs_reloc_pre_snapshot(trans, pending, &to_reserve);
|
btrfs_reloc_pre_snapshot(trans, pending, &to_reserve);
|
||||||
btrfs_orphan_pre_snapshot(trans, pending, &to_reserve);
|
|
||||||
|
|
||||||
if (to_reserve > 0) {
|
if (to_reserve > 0) {
|
||||||
ret = btrfs_block_rsv_add(trans, root, &pending->block_rsv,
|
ret = btrfs_block_rsv_add(trans, root, &pending->block_rsv,
|
||||||
|
@ -1002,7 +1001,6 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
|
||||||
BUG_ON(IS_ERR(pending->snap));
|
BUG_ON(IS_ERR(pending->snap));
|
||||||
|
|
||||||
btrfs_reloc_post_snapshot(trans, pending);
|
btrfs_reloc_post_snapshot(trans, pending);
|
||||||
btrfs_orphan_post_snapshot(trans, pending);
|
|
||||||
fail:
|
fail:
|
||||||
kfree(new_root_item);
|
kfree(new_root_item);
|
||||||
trans->block_rsv = rsv;
|
trans->block_rsv = rsv;
|
||||||
|
|
Loading…
Reference in New Issue