|
@@ -643,7 +643,33 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans,
|
|
|
|
|
|
/* delete the entire item, it is inside our range */
|
|
|
if (key.offset >= bytenr && csum_end <= end_byte) {
|
|
|
- ret = btrfs_del_item(trans, root, path);
|
|
|
+ int del_nr = 1;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Check how many csum items preceding this one in this
|
|
|
+ * leaf correspond to our range and then delete them all
|
|
|
+ * at once.
|
|
|
+ */
|
|
|
+ if (key.offset > bytenr && path->slots[0] > 0) {
|
|
|
+ int slot = path->slots[0] - 1;
|
|
|
+
|
|
|
+ while (slot >= 0) {
|
|
|
+ struct btrfs_key pk;
|
|
|
+
|
|
|
+ btrfs_item_key_to_cpu(leaf, &pk, slot);
|
|
|
+ if (pk.offset < bytenr ||
|
|
|
+ pk.type != BTRFS_EXTENT_CSUM_KEY ||
|
|
|
+ pk.objectid !=
|
|
|
+ BTRFS_EXTENT_CSUM_OBJECTID)
|
|
|
+ break;
|
|
|
+ path->slots[0] = slot;
|
|
|
+ del_nr++;
|
|
|
+ key.offset = pk.offset;
|
|
|
+ slot--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ret = btrfs_del_items(trans, root, path,
|
|
|
+ path->slots[0], del_nr);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
if (key.offset == bytenr)
|