aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Thornber <ejt@redhat.com>2013-10-16 05:59:26 -0400
committerMike Snitzer <snitzer@redhat.com>2013-11-11 11:37:49 -0500
commit53d498198d3e8bce4287112beafc30befcba98cc (patch)
treea12f0184d3a5505eca616e32c9b27be551f90070
parent2ee57d587357f0d752af6c2e3e46434a74b1bee3 (diff)
dm cache metadata: check the metadata version when reading the superblock
Need to check the version to verify on-disk metadata is supported. Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r--drivers/md/dm-cache-metadata.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c
index 8601425436cd..9ef0752e8a08 100644
--- a/drivers/md/dm-cache-metadata.c
+++ b/drivers/md/dm-cache-metadata.c
@@ -20,7 +20,13 @@
20 20
21#define CACHE_SUPERBLOCK_MAGIC 06142003 21#define CACHE_SUPERBLOCK_MAGIC 06142003
22#define CACHE_SUPERBLOCK_LOCATION 0 22#define CACHE_SUPERBLOCK_LOCATION 0
23#define CACHE_VERSION 1 23
24/*
25 * defines a range of metadata versions that this module can handle.
26 */
27#define MIN_CACHE_VERSION 1
28#define MAX_CACHE_VERSION 1
29
24#define CACHE_METADATA_CACHE_SIZE 64 30#define CACHE_METADATA_CACHE_SIZE 64
25 31
26/* 32/*
@@ -134,6 +140,18 @@ static void sb_prepare_for_write(struct dm_block_validator *v,
134 SUPERBLOCK_CSUM_XOR)); 140 SUPERBLOCK_CSUM_XOR));
135} 141}
136 142
143static int check_metadata_version(struct cache_disk_superblock *disk_super)
144{
145 uint32_t metadata_version = le32_to_cpu(disk_super->version);
146 if (metadata_version < MIN_CACHE_VERSION || metadata_version > MAX_CACHE_VERSION) {
147 DMERR("Cache metadata version %u found, but only versions between %u and %u supported.",
148 metadata_version, MIN_CACHE_VERSION, MAX_CACHE_VERSION);
149 return -EINVAL;
150 }
151
152 return 0;
153}
154
137static int sb_check(struct dm_block_validator *v, 155static int sb_check(struct dm_block_validator *v,
138 struct dm_block *b, 156 struct dm_block *b,
139 size_t sb_block_size) 157 size_t sb_block_size)
@@ -164,7 +182,7 @@ static int sb_check(struct dm_block_validator *v,
164 return -EILSEQ; 182 return -EILSEQ;
165 } 183 }
166 184
167 return 0; 185 return check_metadata_version(disk_super);
168} 186}
169 187
170static struct dm_block_validator sb_validator = { 188static struct dm_block_validator sb_validator = {
@@ -270,7 +288,7 @@ static int __write_initial_superblock(struct dm_cache_metadata *cmd)
270 disk_super->flags = 0; 288 disk_super->flags = 0;
271 memset(disk_super->uuid, 0, sizeof(disk_super->uuid)); 289 memset(disk_super->uuid, 0, sizeof(disk_super->uuid));
272 disk_super->magic = cpu_to_le64(CACHE_SUPERBLOCK_MAGIC); 290 disk_super->magic = cpu_to_le64(CACHE_SUPERBLOCK_MAGIC);
273 disk_super->version = cpu_to_le32(CACHE_VERSION); 291 disk_super->version = cpu_to_le32(MAX_CACHE_VERSION);
274 memset(disk_super->policy_name, 0, sizeof(disk_super->policy_name)); 292 memset(disk_super->policy_name, 0, sizeof(disk_super->policy_name));
275 memset(disk_super->policy_version, 0, sizeof(disk_super->policy_version)); 293 memset(disk_super->policy_version, 0, sizeof(disk_super->policy_version));
276 disk_super->policy_hint_size = 0; 294 disk_super->policy_hint_size = 0;