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

dm cache: policy change version from string to integer set

Separate dm cache policy version string into 3 unsigned numbers
corresponding to major, minor and patchlevel and store them at the end
of the on-disk metadata so we know which version of the policy generated
the hints in case a future version wants to use them differently.

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>

authored by

Mike Snitzer and committed by
Alasdair G Kergon
4e7f506f e2e74d61

+36 -6
+13 -2
drivers/md/dm-cache-metadata.c
··· 83 83 __le32 read_misses; 84 84 __le32 write_hits; 85 85 __le32 write_misses; 86 + 87 + __le32 policy_version[CACHE_POLICY_VERSION_SIZE]; 86 88 } __packed; 87 89 88 90 struct dm_cache_metadata { ··· 111 109 bool clean_when_opened:1; 112 110 113 111 char policy_name[CACHE_POLICY_NAME_SIZE]; 112 + unsigned policy_version[CACHE_POLICY_VERSION_SIZE]; 114 113 size_t policy_hint_size; 115 114 struct dm_cache_statistics stats; 116 115 }; ··· 271 268 memset(disk_super->uuid, 0, sizeof(disk_super->uuid)); 272 269 disk_super->magic = cpu_to_le64(CACHE_SUPERBLOCK_MAGIC); 273 270 disk_super->version = cpu_to_le32(CACHE_VERSION); 274 - memset(disk_super->policy_name, 0, CACHE_POLICY_NAME_SIZE); 271 + memset(disk_super->policy_name, 0, sizeof(disk_super->policy_name)); 272 + memset(disk_super->policy_version, 0, sizeof(disk_super->policy_version)); 275 273 disk_super->policy_hint_size = 0; 276 274 277 275 r = dm_sm_copy_root(cmd->metadata_sm, &disk_super->metadata_space_map_root, ··· 288 284 disk_super->metadata_block_size = cpu_to_le32(DM_CACHE_METADATA_BLOCK_SIZE >> SECTOR_SHIFT); 289 285 disk_super->data_block_size = cpu_to_le32(cmd->data_block_size); 290 286 disk_super->cache_blocks = cpu_to_le32(0); 291 - memset(disk_super->policy_name, 0, sizeof(disk_super->policy_name)); 292 287 293 288 disk_super->read_hits = cpu_to_le32(0); 294 289 disk_super->read_misses = cpu_to_le32(0); ··· 481 478 cmd->data_block_size = le32_to_cpu(disk_super->data_block_size); 482 479 cmd->cache_blocks = to_cblock(le32_to_cpu(disk_super->cache_blocks)); 483 480 strncpy(cmd->policy_name, disk_super->policy_name, sizeof(cmd->policy_name)); 481 + cmd->policy_version[0] = le32_to_cpu(disk_super->policy_version[0]); 482 + cmd->policy_version[1] = le32_to_cpu(disk_super->policy_version[1]); 483 + cmd->policy_version[2] = le32_to_cpu(disk_super->policy_version[2]); 484 484 cmd->policy_hint_size = le32_to_cpu(disk_super->policy_hint_size); 485 485 486 486 cmd->stats.read_hits = le32_to_cpu(disk_super->read_hits); ··· 578 572 disk_super->discard_nr_blocks = cpu_to_le64(from_dblock(cmd->discard_nr_blocks)); 579 573 disk_super->cache_blocks = cpu_to_le32(from_cblock(cmd->cache_blocks)); 580 574 strncpy(disk_super->policy_name, cmd->policy_name, sizeof(disk_super->policy_name)); 575 + disk_super->policy_version[0] = cpu_to_le32(cmd->policy_version[0]); 576 + disk_super->policy_version[1] = cpu_to_le32(cmd->policy_version[1]); 577 + disk_super->policy_version[2] = cpu_to_le32(cmd->policy_version[2]); 581 578 582 579 disk_super->read_hits = cpu_to_le32(cmd->stats.read_hits); 583 580 disk_super->read_misses = cpu_to_le32(cmd->stats.read_misses); ··· 1079 1070 __le32 value; 1080 1071 size_t hint_size; 1081 1072 const char *policy_name = dm_cache_policy_get_name(policy); 1073 + const unsigned *policy_version = dm_cache_policy_get_version(policy); 1082 1074 1083 1075 if (!policy_name[0] || 1084 1076 (strlen(policy_name) > sizeof(cmd->policy_name) - 1)) ··· 1087 1077 1088 1078 if (strcmp(cmd->policy_name, policy_name)) { 1089 1079 strncpy(cmd->policy_name, policy_name, sizeof(cmd->policy_name)); 1080 + memcpy(cmd->policy_version, policy_version, sizeof(cmd->policy_version)); 1090 1081 1091 1082 hint_size = dm_cache_policy_get_hint_size(policy); 1092 1083 if (!hint_size)
+5 -2
drivers/md/dm-cache-policy-cleaner.c
··· 17 17 /*----------------------------------------------------------------*/ 18 18 19 19 #define DM_MSG_PREFIX "cache cleaner" 20 - #define CLEANER_VERSION "1.0.0" 21 20 22 21 /* Cache entry struct. */ 23 22 struct wb_cache_entry { ··· 433 434 434 435 static struct dm_cache_policy_type wb_policy_type = { 435 436 .name = "cleaner", 437 + .version = {1, 0, 0}, 436 438 .hint_size = 0, 437 439 .owner = THIS_MODULE, 438 440 .create = wb_create ··· 446 446 if (r < 0) 447 447 DMERR("register failed %d", r); 448 448 else 449 - DMINFO("version " CLEANER_VERSION " loaded"); 449 + DMINFO("version %u.%u.%u loaded", 450 + wb_policy_type.version[0], 451 + wb_policy_type.version[1], 452 + wb_policy_type.version[2]); 450 453 451 454 return r; 452 455 }
+2
drivers/md/dm-cache-policy-internal.h
··· 117 117 */ 118 118 const char *dm_cache_policy_get_name(struct dm_cache_policy *p); 119 119 120 + const unsigned *dm_cache_policy_get_version(struct dm_cache_policy *p); 121 + 120 122 size_t dm_cache_policy_get_hint_size(struct dm_cache_policy *p); 121 123 122 124 /*----------------------------------------------------------------*/
+6 -2
drivers/md/dm-cache-policy-mq.c
··· 14 14 #include <linux/vmalloc.h> 15 15 16 16 #define DM_MSG_PREFIX "cache-policy-mq" 17 - #define MQ_VERSION "1.0.0" 18 17 19 18 static struct kmem_cache *mq_entry_cache; 20 19 ··· 1132 1133 1133 1134 static struct dm_cache_policy_type mq_policy_type = { 1134 1135 .name = "mq", 1136 + .version = {1, 0, 0}, 1135 1137 .hint_size = 4, 1136 1138 .owner = THIS_MODULE, 1137 1139 .create = mq_create ··· 1140 1140 1141 1141 static struct dm_cache_policy_type default_policy_type = { 1142 1142 .name = "default", 1143 + .version = {1, 0, 0}, 1143 1144 .hint_size = 4, 1144 1145 .owner = THIS_MODULE, 1145 1146 .create = mq_create ··· 1165 1164 1166 1165 r = dm_cache_policy_register(&default_policy_type); 1167 1166 if (!r) { 1168 - DMINFO("version " MQ_VERSION " loaded"); 1167 + DMINFO("version %u.%u.%u loaded", 1168 + mq_policy_type.version[0], 1169 + mq_policy_type.version[1], 1170 + mq_policy_type.version[2]); 1169 1171 return 0; 1170 1172 } 1171 1173
+8
drivers/md/dm-cache-policy.c
··· 150 150 } 151 151 EXPORT_SYMBOL_GPL(dm_cache_policy_get_name); 152 152 153 + const unsigned *dm_cache_policy_get_version(struct dm_cache_policy *p) 154 + { 155 + struct dm_cache_policy_type *t = p->private; 156 + 157 + return t->version; 158 + } 159 + EXPORT_SYMBOL_GPL(dm_cache_policy_get_version); 160 + 153 161 size_t dm_cache_policy_get_hint_size(struct dm_cache_policy *p) 154 162 { 155 163 struct dm_cache_policy_type *t = p->private;
+2
drivers/md/dm-cache-policy.h
··· 196 196 * We maintain a little register of the different policy types. 197 197 */ 198 198 #define CACHE_POLICY_NAME_SIZE 16 199 + #define CACHE_POLICY_VERSION_SIZE 3 199 200 200 201 struct dm_cache_policy_type { 201 202 /* For use by the register code only. */ ··· 207 206 * what gets passed on the target line to select your policy. 208 207 */ 209 208 char name[CACHE_POLICY_NAME_SIZE]; 209 + unsigned version[CACHE_POLICY_VERSION_SIZE]; 210 210 211 211 /* 212 212 * Policies may store a hint for each each cache block.