bcachefs: Get disk reservation when overwriting data in old snapshot
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 21 Mar 2021 04:03:34 +0000 (00:03 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:56 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/io.c

index b841b3da2510b994afcc310fd162c000f663efcb..5ee9a6c2f4fdfa4ccfedcb6b6e46ddd3411f66d3 100644 (file)
@@ -224,9 +224,10 @@ int bch2_sum_sector_overwrites(struct btree_trans *trans,
                        (bkey_extent_is_allocation(&new->k) -
                         bkey_extent_is_allocation(old.k));
 
-               *disk_sectors_delta += sectors *
-                       (int) (bch2_bkey_nr_ptrs_allocated(bkey_i_to_s_c(new)) -
-                              bch2_bkey_nr_ptrs_fully_allocated(old));
+               *disk_sectors_delta += sectors * bch2_bkey_nr_ptrs_allocated(bkey_i_to_s_c(new));
+               *disk_sectors_delta -= new->k.p.snapshot == old.k->p.snapshot
+                       ? sectors * bch2_bkey_nr_ptrs_fully_allocated(old)
+                       : 0;
 
                if (!*should_check_enospc &&
                    (new_replicas > bch2_bkey_replicas(c, old) ||