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>
This commit is contained in:
Chris Mason
2008-05-08 16:31:21 -04:00
parent c1c4d91c38
commit bbaf549e0c
2 changed files with 23 additions and 5 deletions

View File

@@ -207,9 +207,8 @@ again:
btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
found_type = btrfs_key_type(&found_key);
if (found_key.objectid != inode->i_ino ||
found_type != BTRFS_EXTENT_DATA_KEY) {
found_type != BTRFS_EXTENT_DATA_KEY)
goto not_found;
}
found_type = btrfs_file_extent_type(leaf, item);
extent_start = found_key.offset;
@@ -245,7 +244,6 @@ again:
if (!block_group || block_group->ro)
goto not_found;
start = extent_end;
} else {
goto not_found;
@@ -260,8 +258,8 @@ loop:
goto again;
not_found:
cow_file_range(inode, start, cow_end);
start = cow_end + 1;
cow_file_range(inode, start, end);
start = end + 1;
goto loop;
}