diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-05-08 16:31:21 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:04:02 -0400 |
commit | bbaf549e0c3d28399fc5abd68020d4025ae5c3a7 (patch) | |
tree | 19443b7e2a18fd04556ab9c5d914de3d29034a0d /fs/btrfs/inode.c | |
parent | c1c4d91c38e6e5b29543b02d4a4fb7f007e44f70 (diff) |
Btrfs: A number of nodatacow fixes
Once part of a delalloc request fails the cow checks, just cow the
entire range
It is possible for the back references to all be from the same root,
but still have snapshots against an extent. The checks are now more strict,
forcing cow any time there are multiple refs against the data extent.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 1bf37d15b174..a492fd238c88 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -207,9 +207,8 @@ again: | |||
207 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | 207 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); |
208 | found_type = btrfs_key_type(&found_key); | 208 | found_type = btrfs_key_type(&found_key); |
209 | if (found_key.objectid != inode->i_ino || | 209 | if (found_key.objectid != inode->i_ino || |
210 | found_type != BTRFS_EXTENT_DATA_KEY) { | 210 | found_type != BTRFS_EXTENT_DATA_KEY) |
211 | goto not_found; | 211 | goto not_found; |
212 | } | ||
213 | 212 | ||
214 | found_type = btrfs_file_extent_type(leaf, item); | 213 | found_type = btrfs_file_extent_type(leaf, item); |
215 | extent_start = found_key.offset; | 214 | extent_start = found_key.offset; |
@@ -245,7 +244,6 @@ again: | |||
245 | if (!block_group || block_group->ro) | 244 | if (!block_group || block_group->ro) |
246 | goto not_found; | 245 | goto not_found; |
247 | 246 | ||
248 | |||
249 | start = extent_end; | 247 | start = extent_end; |
250 | } else { | 248 | } else { |
251 | goto not_found; | 249 | goto not_found; |
@@ -260,8 +258,8 @@ loop: | |||
260 | goto again; | 258 | goto again; |
261 | 259 | ||
262 | not_found: | 260 | not_found: |
263 | cow_file_range(inode, start, cow_end); | 261 | cow_file_range(inode, start, end); |
264 | start = cow_end + 1; | 262 | start = end + 1; |
265 | goto loop; | 263 | goto loop; |
266 | } | 264 | } |
267 | 265 | ||