From cb16bfaa86f09fae33a712510aa51a03ca370d63 Mon Sep 17 00:00:00 2001
From: Kent Overstreet <kent.overstreet@gmail.com>
Date: Sun, 21 Mar 2021 00:03:34 -0400
Subject: [PATCH] bcachefs: Get disk reservation when overwriting data in old
 snapshot

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
---
 fs/bcachefs/io.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c
index b841b3da2510b..5ee9a6c2f4fdf 100644
--- a/fs/bcachefs/io.c
+++ b/fs/bcachefs/io.c
@@ -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) ||
-- 
2.30.2