On Wed, Feb 20, 2013 at 10:28:10AM -0700, Aastha Mehta wrote: > Hello, > > I am trying to understand the COW mechanism in Btrfs. Is it correct to > say that unless nodatacow option is specified, Btrfs always performs > COW for all the data+metadata extents used in the system? >
So we always cow the metadata, but yes nodatacow means we don't cow the actual data in the data extents. > I saw that COWing is implemented in btrfs_cow_block() function, which > is called at the time of searching a slot for a particular item, while > inserting into a new slot, committing transactions, while creating > pending snapshots and few other places. > > However, while tracing through the complete write path, I could not > quite figure out when extents actually get COWed. Could you please > point me to the place where COWing takes place? Is there any time > when, for performance or any other reasons, the extents are not COWed > but overwritten in place (apart from the explicit nodatacow flag being > set during mount)? You'll want to look at the tree operation ->fill_delalloc(). Thats where we do cow_file_range(). We allocate new space and write. When we finish the ordered io we do btrfs_drop_extents() on the range we just wrote which will free up any existing extents that exist, and then insert our new file extent. Thanks, Josef -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html