diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-11-28 11:49:56 +0000 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-11-28 11:49:56 +0000 |
commit | 9ee4be4156b1a507f199e750ba2c13ffb6ea9b42 (patch) | |
tree | c92cb39ad1f0be559390c2a995d9aad2b0300b14 /fs/btrfs/ctree.c | |
parent | 005d610f2abc550172726b997f5cfe683769cc1c (diff) | |
parent | d4d6373c1109b11c8118340be97ae31b8f94d66a (diff) | |
download | op-kernel-dev-9ee4be4156b1a507f199e750ba2c13ffb6ea9b42.zip op-kernel-dev-9ee4be4156b1a507f199e750ba2c13ffb6ea9b42.tar.gz |
Merge remote-tracking branch 'regulator/for-linus' into regulator-next
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r-- | fs/btrfs/ctree.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 0fe615e..dede441 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -514,10 +514,25 @@ static inline int should_cow_block(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct extent_buffer *buf) { + /* ensure we can see the force_cow */ + smp_rmb(); + + /* + * We do not need to cow a block if + * 1) this block is not created or changed in this transaction; + * 2) this block does not belong to TREE_RELOC tree; + * 3) the root is not forced COW. + * + * What is forced COW: + * when we create snapshot during commiting the transaction, + * after we've finished coping src root, we must COW the shared + * block to ensure the metadata consistency. + */ if (btrfs_header_generation(buf) == trans->transid && !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN) && !(root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID && - btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))) + btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)) && + !root->force_cow) return 0; return 1; } |