summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/extents.c9
-rw-r--r--drivers/md/bcache/extents.h9
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 *);