xref: /openbmc/linux/drivers/md/dm-cache-policy-internal.h (revision c6b4fcbad044e6fffcc75bba160e720eb8d67d17)
1*c6b4fcbaSJoe Thornber /*
2*c6b4fcbaSJoe Thornber  * Copyright (C) 2012 Red Hat. All rights reserved.
3*c6b4fcbaSJoe Thornber  *
4*c6b4fcbaSJoe Thornber  * This file is released under the GPL.
5*c6b4fcbaSJoe Thornber  */
6*c6b4fcbaSJoe Thornber 
7*c6b4fcbaSJoe Thornber #ifndef DM_CACHE_POLICY_INTERNAL_H
8*c6b4fcbaSJoe Thornber #define DM_CACHE_POLICY_INTERNAL_H
9*c6b4fcbaSJoe Thornber 
10*c6b4fcbaSJoe Thornber #include "dm-cache-policy.h"
11*c6b4fcbaSJoe Thornber 
12*c6b4fcbaSJoe Thornber /*----------------------------------------------------------------*/
13*c6b4fcbaSJoe Thornber 
14*c6b4fcbaSJoe Thornber /*
15*c6b4fcbaSJoe Thornber  * Little inline functions that simplify calling the policy methods.
16*c6b4fcbaSJoe Thornber  */
17*c6b4fcbaSJoe Thornber static inline int policy_map(struct dm_cache_policy *p, dm_oblock_t oblock,
18*c6b4fcbaSJoe Thornber 			     bool can_block, bool can_migrate, bool discarded_oblock,
19*c6b4fcbaSJoe Thornber 			     struct bio *bio, struct policy_result *result)
20*c6b4fcbaSJoe Thornber {
21*c6b4fcbaSJoe Thornber 	return p->map(p, oblock, can_block, can_migrate, discarded_oblock, bio, result);
22*c6b4fcbaSJoe Thornber }
23*c6b4fcbaSJoe Thornber 
24*c6b4fcbaSJoe Thornber static inline int policy_lookup(struct dm_cache_policy *p, dm_oblock_t oblock, dm_cblock_t *cblock)
25*c6b4fcbaSJoe Thornber {
26*c6b4fcbaSJoe Thornber 	BUG_ON(!p->lookup);
27*c6b4fcbaSJoe Thornber 	return p->lookup(p, oblock, cblock);
28*c6b4fcbaSJoe Thornber }
29*c6b4fcbaSJoe Thornber 
30*c6b4fcbaSJoe Thornber static inline void policy_set_dirty(struct dm_cache_policy *p, dm_oblock_t oblock)
31*c6b4fcbaSJoe Thornber {
32*c6b4fcbaSJoe Thornber 	if (p->set_dirty)
33*c6b4fcbaSJoe Thornber 		p->set_dirty(p, oblock);
34*c6b4fcbaSJoe Thornber }
35*c6b4fcbaSJoe Thornber 
36*c6b4fcbaSJoe Thornber static inline void policy_clear_dirty(struct dm_cache_policy *p, dm_oblock_t oblock)
37*c6b4fcbaSJoe Thornber {
38*c6b4fcbaSJoe Thornber 	if (p->clear_dirty)
39*c6b4fcbaSJoe Thornber 		p->clear_dirty(p, oblock);
40*c6b4fcbaSJoe Thornber }
41*c6b4fcbaSJoe Thornber 
42*c6b4fcbaSJoe Thornber static inline int policy_load_mapping(struct dm_cache_policy *p,
43*c6b4fcbaSJoe Thornber 				      dm_oblock_t oblock, dm_cblock_t cblock,
44*c6b4fcbaSJoe Thornber 				      uint32_t hint, bool hint_valid)
45*c6b4fcbaSJoe Thornber {
46*c6b4fcbaSJoe Thornber 	return p->load_mapping(p, oblock, cblock, hint, hint_valid);
47*c6b4fcbaSJoe Thornber }
48*c6b4fcbaSJoe Thornber 
49*c6b4fcbaSJoe Thornber static inline int policy_walk_mappings(struct dm_cache_policy *p,
50*c6b4fcbaSJoe Thornber 				      policy_walk_fn fn, void *context)
51*c6b4fcbaSJoe Thornber {
52*c6b4fcbaSJoe Thornber 	return p->walk_mappings ? p->walk_mappings(p, fn, context) : 0;
53*c6b4fcbaSJoe Thornber }
54*c6b4fcbaSJoe Thornber 
55*c6b4fcbaSJoe Thornber static inline int policy_writeback_work(struct dm_cache_policy *p,
56*c6b4fcbaSJoe Thornber 					dm_oblock_t *oblock,
57*c6b4fcbaSJoe Thornber 					dm_cblock_t *cblock)
58*c6b4fcbaSJoe Thornber {
59*c6b4fcbaSJoe Thornber 	return p->writeback_work ? p->writeback_work(p, oblock, cblock) : -ENOENT;
60*c6b4fcbaSJoe Thornber }
61*c6b4fcbaSJoe Thornber 
62*c6b4fcbaSJoe Thornber static inline void policy_remove_mapping(struct dm_cache_policy *p, dm_oblock_t oblock)
63*c6b4fcbaSJoe Thornber {
64*c6b4fcbaSJoe Thornber 	return p->remove_mapping(p, oblock);
65*c6b4fcbaSJoe Thornber }
66*c6b4fcbaSJoe Thornber 
67*c6b4fcbaSJoe Thornber static inline void policy_force_mapping(struct dm_cache_policy *p,
68*c6b4fcbaSJoe Thornber 					dm_oblock_t current_oblock, dm_oblock_t new_oblock)
69*c6b4fcbaSJoe Thornber {
70*c6b4fcbaSJoe Thornber 	return p->force_mapping(p, current_oblock, new_oblock);
71*c6b4fcbaSJoe Thornber }
72*c6b4fcbaSJoe Thornber 
73*c6b4fcbaSJoe Thornber static inline dm_cblock_t policy_residency(struct dm_cache_policy *p)
74*c6b4fcbaSJoe Thornber {
75*c6b4fcbaSJoe Thornber 	return p->residency(p);
76*c6b4fcbaSJoe Thornber }
77*c6b4fcbaSJoe Thornber 
78*c6b4fcbaSJoe Thornber static inline void policy_tick(struct dm_cache_policy *p)
79*c6b4fcbaSJoe Thornber {
80*c6b4fcbaSJoe Thornber 	if (p->tick)
81*c6b4fcbaSJoe Thornber 		return p->tick(p);
82*c6b4fcbaSJoe Thornber }
83*c6b4fcbaSJoe Thornber 
84*c6b4fcbaSJoe Thornber static inline int policy_emit_config_values(struct dm_cache_policy *p, char *result, unsigned maxlen)
85*c6b4fcbaSJoe Thornber {
86*c6b4fcbaSJoe Thornber 	ssize_t sz = 0;
87*c6b4fcbaSJoe Thornber 	if (p->emit_config_values)
88*c6b4fcbaSJoe Thornber 		return p->emit_config_values(p, result, maxlen);
89*c6b4fcbaSJoe Thornber 
90*c6b4fcbaSJoe Thornber 	DMEMIT("0");
91*c6b4fcbaSJoe Thornber 	return 0;
92*c6b4fcbaSJoe Thornber }
93*c6b4fcbaSJoe Thornber 
94*c6b4fcbaSJoe Thornber static inline int policy_set_config_value(struct dm_cache_policy *p,
95*c6b4fcbaSJoe Thornber 					  const char *key, const char *value)
96*c6b4fcbaSJoe Thornber {
97*c6b4fcbaSJoe Thornber 	return p->set_config_value ? p->set_config_value(p, key, value) : -EINVAL;
98*c6b4fcbaSJoe Thornber }
99*c6b4fcbaSJoe Thornber 
100*c6b4fcbaSJoe Thornber /*----------------------------------------------------------------*/
101*c6b4fcbaSJoe Thornber 
102*c6b4fcbaSJoe Thornber /*
103*c6b4fcbaSJoe Thornber  * Creates a new cache policy given a policy name, a cache size, an origin size and the block size.
104*c6b4fcbaSJoe Thornber  */
105*c6b4fcbaSJoe Thornber struct dm_cache_policy *dm_cache_policy_create(const char *name, dm_cblock_t cache_size,
106*c6b4fcbaSJoe Thornber 					       sector_t origin_size, sector_t block_size);
107*c6b4fcbaSJoe Thornber 
108*c6b4fcbaSJoe Thornber /*
109*c6b4fcbaSJoe Thornber  * Destroys the policy.  This drops references to the policy module as well
110*c6b4fcbaSJoe Thornber  * as calling it's destroy method.  So always use this rather than calling
111*c6b4fcbaSJoe Thornber  * the policy->destroy method directly.
112*c6b4fcbaSJoe Thornber  */
113*c6b4fcbaSJoe Thornber void dm_cache_policy_destroy(struct dm_cache_policy *p);
114*c6b4fcbaSJoe Thornber 
115*c6b4fcbaSJoe Thornber /*
116*c6b4fcbaSJoe Thornber  * In case we've forgotten.
117*c6b4fcbaSJoe Thornber  */
118*c6b4fcbaSJoe Thornber const char *dm_cache_policy_get_name(struct dm_cache_policy *p);
119*c6b4fcbaSJoe Thornber 
120*c6b4fcbaSJoe Thornber size_t dm_cache_policy_get_hint_size(struct dm_cache_policy *p);
121*c6b4fcbaSJoe Thornber 
122*c6b4fcbaSJoe Thornber /*----------------------------------------------------------------*/
123*c6b4fcbaSJoe Thornber 
124*c6b4fcbaSJoe Thornber #endif /* DM_CACHE_POLICY_INTERNAL_H */
125