Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dm cache: add remove_cblock method to policy interface

Implement policy_remove_cblock() and add remove_cblock method to the mq
policy. These methods will be used by the following cache block
invalidation patch which adds the 'invalidate_cblocks' message to the
cache core.

Also, update some comments in dm-cache-policy.h

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>

authored by

Joe Thornber and committed by
Mike Snitzer
532906aa 633618e3

+57 -4
+5
drivers/md/dm-cache-policy-internal.h
··· 64 64 p->remove_mapping(p, oblock); 65 65 } 66 66 67 + static inline int policy_remove_cblock(struct dm_cache_policy *p, dm_cblock_t cblock) 68 + { 69 + return p->remove_cblock(p, cblock); 70 + } 71 + 67 72 static inline void policy_force_mapping(struct dm_cache_policy *p, 68 73 dm_oblock_t current_oblock, dm_oblock_t new_oblock) 69 74 {
+35
drivers/md/dm-cache-policy-mq.c
··· 304 304 list_add(&e->list, &ep->free); 305 305 } 306 306 307 + /* 308 + * Returns NULL if the entry is free. 309 + */ 310 + static struct entry *epool_find(struct entry_pool *ep, dm_cblock_t cblock) 311 + { 312 + struct entry *e = ep->entries + from_cblock(cblock); 313 + return e->hlist.pprev ? e : NULL; 314 + } 315 + 307 316 static bool epool_empty(struct entry_pool *ep) 308 317 { 309 318 return list_empty(&ep->free); ··· 1029 1020 mutex_unlock(&mq->lock); 1030 1021 } 1031 1022 1023 + static int __remove_cblock(struct mq_policy *mq, dm_cblock_t cblock) 1024 + { 1025 + struct entry *e = epool_find(&mq->cache_pool, cblock); 1026 + 1027 + if (!e) 1028 + return -ENODATA; 1029 + 1030 + del(mq, e); 1031 + free_entry(&mq->cache_pool, e); 1032 + 1033 + return 0; 1034 + } 1035 + 1036 + static int mq_remove_cblock(struct dm_cache_policy *p, dm_cblock_t cblock) 1037 + { 1038 + int r; 1039 + struct mq_policy *mq = to_mq_policy(p); 1040 + 1041 + mutex_lock(&mq->lock); 1042 + r = __remove_cblock(mq, cblock); 1043 + mutex_unlock(&mq->lock); 1044 + 1045 + return r; 1046 + } 1047 + 1032 1048 static int __mq_writeback_work(struct mq_policy *mq, dm_oblock_t *oblock, 1033 1049 dm_cblock_t *cblock) 1034 1050 { ··· 1173 1139 mq->policy.load_mapping = mq_load_mapping; 1174 1140 mq->policy.walk_mappings = mq_walk_mappings; 1175 1141 mq->policy.remove_mapping = mq_remove_mapping; 1142 + mq->policy.remove_cblock = mq_remove_cblock; 1176 1143 mq->policy.writeback_work = mq_writeback_work; 1177 1144 mq->policy.force_mapping = mq_force_mapping; 1178 1145 mq->policy.residency = mq_residency;
+17 -4
drivers/md/dm-cache-policy.h
··· 135 135 */ 136 136 int (*lookup)(struct dm_cache_policy *p, dm_oblock_t oblock, dm_cblock_t *cblock); 137 137 138 - /* 139 - * oblock must be a mapped block. Must not block. 140 - */ 141 138 void (*set_dirty)(struct dm_cache_policy *p, dm_oblock_t oblock); 142 139 void (*clear_dirty)(struct dm_cache_policy *p, dm_oblock_t oblock); 143 140 ··· 156 159 void (*force_mapping)(struct dm_cache_policy *p, dm_oblock_t current_oblock, 157 160 dm_oblock_t new_oblock); 158 161 159 - int (*writeback_work)(struct dm_cache_policy *p, dm_oblock_t *oblock, dm_cblock_t *cblock); 162 + /* 163 + * This is called via the invalidate_cblocks message. It is 164 + * possible the particular cblock has already been removed due to a 165 + * write io in passthrough mode. In which case this should return 166 + * -ENODATA. 167 + */ 168 + int (*remove_cblock)(struct dm_cache_policy *p, dm_cblock_t cblock); 160 169 170 + /* 171 + * Provide a dirty block to be written back by the core target. 172 + * 173 + * Returns: 174 + * 175 + * 0 and @cblock,@oblock: block to write back provided 176 + * 177 + * -ENODATA: no dirty blocks available 178 + */ 179 + int (*writeback_work)(struct dm_cache_policy *p, dm_oblock_t *oblock, dm_cblock_t *cblock); 161 180 162 181 /* 163 182 * How full is the cache?