aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-05-08 16:31:21 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:02 -0400
commitbbaf549e0c3d28399fc5abd68020d4025ae5c3a7 (patch)
tree19443b7e2a18fd04556ab9c5d914de3d29034a0d /fs/btrfs/inode.c
parentc1c4d91c38e6e5b29543b02d4a4fb7f007e44f70 (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.c8
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
262not_found: 260not_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