• Kent Overstreet's avatar
    bcache: Fix dirty_data accounting · d24a6e10
    Kent Overstreet authored
    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: default avatarKent 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 */
    d24a6e10
btree.c 57.3 KB