diff options
author | Coly Li <colyli@suse.de> | 2020-01-24 00:20:14 +0800 |
---|---|---|
committer | Coly Li <colyli@suse.de> | 2020-01-24 00:20:14 +0800 |
commit | 07a5f61f2d0bf9527c72a9f3bc76bcb8b501ef29 (patch) | |
tree | 200b9131f552206052a45ef3edbfef8f6a28b7dc | |
parent | c3e9389f4390acbc08c4306d75d148f683d47655 (diff) | |
download | linux-bcache-dev.tar.gz |
tempdev
-rw-r--r-- | drivers/md/bcache/bset.c | 15 | ||||
-rw-r--r-- | drivers/md/bcache/btree.c | 2 | ||||
-rw-r--r-- | drivers/md/bcache/btree.h | 13 |
3 files changed, 19 insertions, 11 deletions
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c index 4385303836d8e7..f541d3e4399ff5 100644 --- a/drivers/md/bcache/bset.c +++ b/drivers/md/bcache/bset.c @@ -545,7 +545,6 @@ static struct bkey *tree_to_bkey(struct bset_tree *t, unsigned int j) { return cacheline_to_bkey(t, to_inorder(j, t), t->tree[j].m); } - static struct bkey *tree_to_prev_bkey(struct bset_tree *t, unsigned int j) { return (void *) (((uint64_t *) tree_to_bkey(t, j)) - t->prev[j]); @@ -584,9 +583,12 @@ static inline uint64_t shrd128(uint64_t high, uint64_t low, uint8_t shift) static inline unsigned int bfloat_mantissa(const struct bkey *k, struct bkey_float *f) { - const uint64_t *p = &k->low - (f->exponent >> 6); - - return shrd128(p[-1], p[0], f->exponent & 63) & BKEY_MANTISSA_MASK; + if (!(f->exponent >> 6)) + return shrd128(0, KEY_INODE(k), f->exponent & 63) & + BKEY_MANTISSA_MASK; + else + return shrd128(KEY_INODE(k), k->low, f->exponent & 63) & + BKEY_MANTISSA_MASK; } static void make_bfloat(struct bset_tree *t, unsigned int j) @@ -621,7 +623,10 @@ static void make_bfloat(struct bset_tree *t, unsigned int j) else f->exponent = fls64(r->low ^ l->low); - f->exponent = max_t(int, f->exponent - BKEY_MANTISSA_BITS, 0); + if (f->exponent > BKEY_MANTISSA_BITS) + f->exponent -= BKEY_MANTISSA_BITS; + else + f->exponent = 0; /* * Setting f->exponent = 127 flags this node as failed, and causes the diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index ac8a99e0f4028f..db431c228035b4 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -99,7 +99,7 @@ #define PTR_HASH(c, k) \ (((k)->ptr[0] >> c->bucket_bits) | PTR_GEN(k, 0)) -#define insert_lock(s, b) ((b)->level <= (s)->lock) +#define insert_lock(s, b) ((s)->level >= (b)->lock) /* * These macros are for recursing down the btree - they handle the details of diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h index 3b1a423fb5936e..b7d285d15e0159 100644 --- a/drivers/md/bcache/btree.h +++ b/drivers/md/bcache/btree.h @@ -228,17 +228,20 @@ static inline void bch_btree_op_init(struct btree_op *op, int write_lock_level) static inline void rw_lock(bool w, struct btree *b, int level) { - w ? down_write_nested(&b->lock, level + 1) - : down_read_nested(&b->lock, level + 1); - if (w) + if (w) { + down_write_nested(&b->lock, level + 1); b->seq++; + } else + down_read_nested(&b->lock, level + 1); } static inline void rw_unlock(bool w, struct btree *b) { - if (w) + if (w) { b->seq++; - (w ? up_write : up_read)(&b->lock); + up_write(&b->lock); + } else + up_read(&b->lock); } void bch_btree_node_read_done(struct btree *b); |