0001
0002
0003
0004
0005
0006
0007 #ifndef DM_CACHE_POLICY_H
0008 #define DM_CACHE_POLICY_H
0009
0010 #include "dm-cache-block-types.h"
0011
0012 #include <linux/device-mapper.h>
0013
0014
0015
0016
0017
0018
0019
0020 enum policy_operation {
0021 POLICY_PROMOTE,
0022 POLICY_DEMOTE,
0023 POLICY_WRITEBACK
0024 };
0025
0026
0027
0028
0029 struct policy_work {
0030 enum policy_operation op;
0031 dm_oblock_t oblock;
0032 dm_cblock_t cblock;
0033 };
0034
0035
0036
0037
0038
0039 struct dm_cache_policy {
0040
0041
0042
0043 void (*destroy)(struct dm_cache_policy *p);
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 int (*lookup)(struct dm_cache_policy *p, dm_oblock_t oblock, dm_cblock_t *cblock,
0057 int data_dir, bool fast_copy, bool *background_queued);
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 int (*lookup_with_work)(struct dm_cache_policy *p,
0069 dm_oblock_t oblock, dm_cblock_t *cblock,
0070 int data_dir, bool fast_copy,
0071 struct policy_work **work);
0072
0073
0074
0075
0076
0077 int (*get_background_work)(struct dm_cache_policy *p, bool idle,
0078 struct policy_work **result);
0079
0080
0081
0082
0083
0084 void (*complete_background_work)(struct dm_cache_policy *p,
0085 struct policy_work *work,
0086 bool success);
0087
0088 void (*set_dirty)(struct dm_cache_policy *p, dm_cblock_t cblock);
0089 void (*clear_dirty)(struct dm_cache_policy *p, dm_cblock_t cblock);
0090
0091
0092
0093
0094
0095 int (*load_mapping)(struct dm_cache_policy *p, dm_oblock_t oblock,
0096 dm_cblock_t cblock, bool dirty,
0097 uint32_t hint, bool hint_valid);
0098
0099
0100
0101
0102
0103 int (*invalidate_mapping)(struct dm_cache_policy *p, dm_cblock_t cblock);
0104
0105
0106
0107
0108
0109 uint32_t (*get_hint)(struct dm_cache_policy *p, dm_cblock_t cblock);
0110
0111
0112
0113
0114 dm_cblock_t (*residency)(struct dm_cache_policy *p);
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125 void (*tick)(struct dm_cache_policy *p, bool can_block);
0126
0127
0128
0129
0130 int (*emit_config_values)(struct dm_cache_policy *p, char *result,
0131 unsigned maxlen, ssize_t *sz_ptr);
0132 int (*set_config_value)(struct dm_cache_policy *p,
0133 const char *key, const char *value);
0134
0135 void (*allow_migrations)(struct dm_cache_policy *p, bool allow);
0136
0137
0138
0139
0140 void *private;
0141 };
0142
0143
0144
0145
0146
0147
0148 #define CACHE_POLICY_NAME_SIZE 16
0149 #define CACHE_POLICY_VERSION_SIZE 3
0150
0151 struct dm_cache_policy_type {
0152
0153 struct list_head list;
0154
0155
0156
0157
0158
0159 char name[CACHE_POLICY_NAME_SIZE];
0160 unsigned version[CACHE_POLICY_VERSION_SIZE];
0161
0162
0163
0164
0165
0166 struct dm_cache_policy_type *real;
0167
0168
0169
0170
0171
0172
0173 size_t hint_size;
0174
0175 struct module *owner;
0176 struct dm_cache_policy *(*create)(dm_cblock_t cache_size,
0177 sector_t origin_size,
0178 sector_t block_size);
0179 };
0180
0181 int dm_cache_policy_register(struct dm_cache_policy_type *type);
0182 void dm_cache_policy_unregister(struct dm_cache_policy_type *type);
0183
0184
0185
0186 #endif