|
@@ -2079,89 +2079,6 @@ void btrfs_run_delayed_iputs(struct btrfs_root *root)
|
|
|
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 {
|
|
|
ORPHAN_CLEANUP_STARTED = 1,
|
|
|
ORPHAN_CLEANUP_DONE = 2,
|