block: Abstract out bvec iterator
[deliverable/linux.git] / drivers / md / dm-cache-policy-mq.c
index 782bf854666ab361503df8c1e29a60f17132ded3..bfba97dcde2d5a424853882bca6cd7384ff153c9 100644 (file)
@@ -72,7 +72,7 @@ static enum io_pattern iot_pattern(struct io_tracker *t)
 
 static void iot_update_stats(struct io_tracker *t, struct bio *bio)
 {
-       if (bio->bi_sector == from_oblock(t->last_end_oblock) + 1)
+       if (bio->bi_iter.bi_sector == from_oblock(t->last_end_oblock) + 1)
                t->nr_seq_samples++;
        else {
                /*
@@ -87,7 +87,7 @@ static void iot_update_stats(struct io_tracker *t, struct bio *bio)
                t->nr_rand_samples++;
        }
 
-       t->last_end_oblock = to_oblock(bio->bi_sector + bio_sectors(bio) - 1);
+       t->last_end_oblock = to_oblock(bio_end_sector(bio) - 1);
 }
 
 static void iot_check_for_pattern_switch(struct io_tracker *t)
@@ -304,6 +304,15 @@ static void free_entry(struct entry_pool *ep, struct entry *e)
        list_add(&e->list, &ep->free);
 }
 
+/*
+ * Returns NULL if the entry is free.
+ */
+static struct entry *epool_find(struct entry_pool *ep, dm_cblock_t cblock)
+{
+       struct entry *e = ep->entries + from_cblock(cblock);
+       return !hlist_unhashed(&e->hlist) ? e : NULL;
+}
+
 static bool epool_empty(struct entry_pool *ep)
 {
        return list_empty(&ep->free);
@@ -1020,6 +1029,31 @@ static void mq_remove_mapping(struct dm_cache_policy *p, dm_oblock_t oblock)
        mutex_unlock(&mq->lock);
 }
 
+static int __remove_cblock(struct mq_policy *mq, dm_cblock_t cblock)
+{
+       struct entry *e = epool_find(&mq->cache_pool, cblock);
+
+       if (!e)
+               return -ENODATA;
+
+       del(mq, e);
+       free_entry(&mq->cache_pool, e);
+
+       return 0;
+}
+
+static int mq_remove_cblock(struct dm_cache_policy *p, dm_cblock_t cblock)
+{
+       int r;
+       struct mq_policy *mq = to_mq_policy(p);
+
+       mutex_lock(&mq->lock);
+       r = __remove_cblock(mq, cblock);
+       mutex_unlock(&mq->lock);
+
+       return r;
+}
+
 static int __mq_writeback_work(struct mq_policy *mq, dm_oblock_t *oblock,
                              dm_cblock_t *cblock)
 {
@@ -1139,6 +1173,7 @@ static void init_policy_functions(struct mq_policy *mq)
        mq->policy.load_mapping = mq_load_mapping;
        mq->policy.walk_mappings = mq_walk_mappings;
        mq->policy.remove_mapping = mq_remove_mapping;
+       mq->policy.remove_cblock = mq_remove_cblock;
        mq->policy.writeback_work = mq_writeback_work;
        mq->policy.force_mapping = mq_force_mapping;
        mq->policy.residency = mq_residency;
This page took 0.035205 seconds and 5 git commands to generate.