1. 05 8月, 2014 6 次提交
  2. 19 3月, 2014 10 次提交
    • K
      bcache: Kill bucket->gc_gen · 3a2fd9d5
      Kent Overstreet 提交于
      gc_gen was a temporary used to recalculate last_gc, but since we only need
      bucket->last_gc when gc isn't running (gc_mark_valid = 1), we can just update
      last_gc directly.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      3a2fd9d5
    • K
      bcache: Kill unused freelist · 2531d9ee
      Kent Overstreet 提交于
      This was originally added as at optimization that for various reasons isn't
      needed anymore, but it does add a lot of nasty corner cases (and it was
      responsible for some recently fixed bugs). Just get rid of it now.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      2531d9ee
    • K
      bcache: Rework btree cache reserve handling · 0a63b66d
      Kent Overstreet 提交于
      This changes the bucket allocation reserves to use _real_ reserves - separate
      freelists - instead of watermarks, which if nothing else makes the current code
      saner to reason about and is going to be important in the future when we add
      support for multiple btrees.
      
      It also adds btree_check_reserve(), which checks (and locks) the reserves for
      both bucket allocation and memory allocation for btree nodes; the old code just
      kinda sorta assumed that since (e.g. for btree node splits) it had the root
      locked and that meant no other threads could try to make use of the same
      reserve; this technically should have been ok for memory allocation (we should
      always have a reserve for memory allocation (the btree node cache is used as a
      reserve and we preallocate it)), but multiple btrees will mean that locking the
      root won't be sufficient anymore, and for the bucket allocation reserve it was
      technically possible for the old code to deadlock.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      0a63b66d
    • K
      bcache: Kill btree_io_wq · 56b30770
      Kent Overstreet 提交于
      With the locking rework in the last patch, this shouldn't be needed anymore -
      btree_node_write_work() only takes b->write_lock which is never held for very
      long.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      56b30770
    • K
      bcache: btree locking rework · 2a285686
      Kent Overstreet 提交于
      Add a new lock, b->write_lock, which is required to actually modify - or write -
      a btree node; this lock is only held for short durations.
      
      This means we can write out a btree node without taking b->lock, which _is_ held
      for long durations - solving a deadlock when btree_flush_write() (from the
      journalling code) is called with a btree node locked.
      
      Right now just occurs in bch_btree_set_root(), but with an upcoming journalling
      rework is going to happen a lot more.
      
      This also turns b->lock is now more of a read/intent lock instead of a
      read/write lock - but not completely, since it still blocks readers. May turn it
      into a real intent lock at some point in the future.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      2a285686
    • K
      bcache: Fix a race when freeing btree nodes · 05335cff
      Kent Overstreet 提交于
      This isn't a bulletproof fix; btree_node_free() -> bch_bucket_free() puts the
      bucket on the unused freelist, where it can be reused right away without any
      ordering requirements. It would be better to wait on at least a journal write to
      go down before reusing the bucket. bch_btree_set_root() does this, and inserting
      into non leaf nodes is completely synchronous so we should be ok, but future
      patches are just going to get rid of the unused freelist - it was needed in the
      past for various reasons but shouldn't be anymore.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      05335cff
    • K
      bcache: Add a real GC_MARK_RECLAIMABLE · 4fe6a816
      Kent Overstreet 提交于
      This means the garbage collection code can better check for data and metadata
      pointers to the same buckets.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      4fe6a816
    • K
      bcache: Kill dead cgroup code · 3f5e0a34
      Kent Overstreet 提交于
      This hasn't been used or even enabled in ages.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      3f5e0a34
    • K
      bcache: Fix another bug recovering from unclean shutdown · 487dded8
      Kent Overstreet 提交于
      The on disk bucket gens are allowed to be out of date, when we reuse buckets
      that didn't have any live data in them. To deal with this, the initial gc has to
      update the bucket gen when we find a pointer gen newer than the bucket's gen.
      
      Unfortunately we weren't doing this for pointers in the journal that we're about
      to replay.
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      487dded8
    • K
      bcache: Fix a bug recovering from unclean shutdown · 0bd143fd
      Kent Overstreet 提交于
      The code to fixup incorrect bucket prios incorrectly did not skip btree node
      freeing keys
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      0bd143fd
  3. 30 1月, 2014 2 次提交
    • K
      bcache: Minor fixes from kbuild robot · 3572324a
      Kent Overstreet 提交于
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      3572324a
    • D
      bcache: fix BUG_ON due to integer overflow with GC_SECTORS_USED · 94717447
      Darrick J. Wong 提交于
      The BUG_ON at the end of __bch_btree_mark_key can be triggered due to
      an integer overflow error:
      
      BITMASK(GC_SECTORS_USED, struct bucket, gc_mark, 2, 13);
      ...
      SET_GC_SECTORS_USED(g, min_t(unsigned,
      	     GC_SECTORS_USED(g) + KEY_SIZE(k),
      	     (1 << 14) - 1));
      BUG_ON(!GC_SECTORS_USED(g));
      
      In bcache.h, the SECTORS_USED bitfield is defined to be 13 bits wide.
      While the SET_ code tries to ensure that the field doesn't overflow by
      clamping it to (1<<14)-1 == 16383, this is incorrect because 16383
      requires 14 bits.  Therefore, if GC_SECTORS_USED() + KEY_SIZE() =
      8192, the SET_ statement tries to store 8192 into a 13-bit field.  In
      a 13-bit field, 8192 becomes zero, thus triggering the BUG_ON.
      
      Therefore, create a field width constant and a max value constant, and
      use those to create the bitfield and check the inputs to
      SET_GC_SECTORS_USED.  Arguably the BITMASK() template ought to have
      BUG_ON checks for too-large values, but that's a separate patch.
      Signed-off-by: NDarrick J. Wong <darrick.wong@oracle.com>
      94717447
  4. 09 1月, 2014 19 次提交
  5. 17 12月, 2013 2 次提交
    • N
      bcache: fix for gc and writeback race · bf0a628a
      Nicholas Swenson 提交于
      Garbage collector needs to check keys in the writeback keybuf to
      make sure it's not invalidating buckets to which the writeback
      keys point to.
      Signed-off-by: NNicholas Swenson <nks@daterainc.com>
      Signed-off-by: NKent Overstreet <kmo@daterainc.com>
      bf0a628a
    • K
      bcache: Fix dirty_data accounting · d24a6e10
      Kent Overstreet 提交于
      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: NKent 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
  6. 29 11月, 2013 1 次提交