diff options
-rw-r--r-- | drivers/md/bcache/extents.c | 9 | ||||
-rw-r--r-- | drivers/md/bcache/extents.h | 9 |
2 files changed, 12 insertions, 6 deletions
diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c index cd4e1117d667..86ecb8ee3d80 100644 --- a/drivers/md/bcache/extents.c +++ b/drivers/md/bcache/extents.c @@ -129,12 +129,9 @@ void bch_extent_drop_stale(struct cache_set *c, struct bkey *k) rcu_read_lock(); while (i < bch_extent_ptrs(k)) - if (should_drop_ptr(c, k, i)) { - bch_set_extent_ptrs(k, bch_extent_ptrs(k) - 1); - memmove(&k->val[i], - &k->val[i + 1], - (bch_extent_ptrs(k) - i) * sizeof(u64)); - } else + if (should_drop_ptr(c, k, i)) + bch_extent_drop_ptr(k, i); + else i++; rcu_read_unlock(); diff --git a/drivers/md/bcache/extents.h b/drivers/md/bcache/extents.h index 9a7f312a555c..556e16b13082 100644 --- a/drivers/md/bcache/extents.h +++ b/drivers/md/bcache/extents.h @@ -39,6 +39,15 @@ static inline void bch_set_extent_ptrs(struct bkey *k, unsigned i) bch_set_val_u64s(k, i); } +static inline void bch_extent_drop_ptr(struct bkey *k, unsigned ptr) +{ + BUG_ON(ptr >= bch_extent_ptrs(k)); + bch_set_extent_ptrs(k, bch_extent_ptrs(k) - 1); + memmove(&k->val[ptr], + &k->val[ptr + 1], + (bch_extent_ptrs(k) - ptr) * sizeof(u64)); +} + bool bch_cut_front(const struct bkey *, struct bkey *); bool bch_cut_back(const struct bkey *, struct bkey *); |