diff options
author | Yan, Zheng <zheng.yan@oracle.com> | 2009-09-21 21:55:59 +0200 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2009-09-21 21:55:59 +0200 |
commit | 1c4850e21df8b441164d910bc611ef46a01d5d75 (patch) | |
tree | aeccbf3495421d1343bbe08cb824ac1ae6764e43 /fs/btrfs/transaction.c | |
parent | Btrfs: search for an allocation hint while filling file COW (diff) | |
download | linux-1c4850e21df8b441164d910bc611ef46a01d5d75.tar.xz linux-1c4850e21df8b441164d910bc611ef46a01d5d75.zip |
Btrfs: speed up snapshot dropping
This patch contains two changes to avoid unnecessary tree block reads during
snapshot dropping.
First, check tree block's reference count and flags before reading the tree
block. if reference count > 1 and there is no need to update backrefs, we can
avoid reading the tree block.
Second, save when snapshot was created in root_key.offset. we can compare block
pointer's generation with snapshot's creation generation during updating
backrefs. If a given block was created before snapshot was created, the
snapshot can't be the tree block's owner. So we can avoid reading the block.
Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to '')
-rw-r--r-- | fs/btrfs/transaction.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 6ed6186f51cd..94f816cb6e35 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -720,7 +720,8 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, memcpy(new_root_item, &root->root_item, sizeof(*new_root_item)); key.objectid = objectid; - key.offset = 0; + /* record when the snapshot was created in key.offset */ + key.offset = trans->transid; btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); old = btrfs_lock_root_node(root); |