bcache: Fix dirty_data accounting
authorKent Overstreet <kmo@daterainc.com>
Mon, 11 Nov 2013 05:55:27 +0000 (21:55 -0800)
committerKent Overstreet <kmo@daterainc.com>
Mon, 16 Dec 2013 22:22:16 +0000 (14:22 -0800)
commitd24a6e1087030b6da286df9433add5fa2f21b83b
tree9052b92c905d231c4e1a279ae1ea0b9ce83daeeb
parentce2b3f595e1c56639085645e0130426e443008c0
bcache: Fix dirty_data accounting

Dirty data accounting wasn't quite right - firstly, we were adding the key we're
inserting after it could have merged with another dirty key already in the
btree, and secondly we could sometimes pass the wrong offset to
bcache_dev_sectors_dirty_add() for dirty data we were overwriting - which is
important when tracking dirty data by stripe.

NOTE FOR BACKPORTERS: For 3.10 (and 3.11?) there's other accounting fixes
necessary that got squashed in with other patches; the full patch against 3.10
is 408cc2f47eeac93a, available at:
  git://evilpiepirate.org/~kent/linux-bcache.git bcache-3.10-writeback-fixes

Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Cc: linux-stable <stable@vger.kernel.org> # >= v3.10
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 2a46036..4a12b2f 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -1817,7 +1817,8 @@ static bool fix_overlapping_extents(struct btree *b, struct bkey *insert,
  if (KEY_START(k) > KEY_START(insert) + sectors_found)
  goto check_failed;

- if (KEY_PTRS(replace_key) != KEY_PTRS(k))
+ if (KEY_PTRS(k) != KEY_PTRS(replace_key) ||
+     KEY_DIRTY(k) != KEY_DIRTY(replace_key))
  goto check_failed;

  /* skip past gen */
drivers/md/bcache/btree.c