diff options
author | Joe Thornber <ejt@redhat.com> | 2013-10-16 05:59:26 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2013-11-11 11:37:49 -0500 |
commit | 53d498198d3e8bce4287112beafc30befcba98cc (patch) | |
tree | a12f0184d3a5505eca616e32c9b27be551f90070 | |
parent | 2ee57d587357f0d752af6c2e3e46434a74b1bee3 (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.c | 24 |
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 | ||
143 | static 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 | |||
137 | static int sb_check(struct dm_block_validator *v, | 155 | static 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 | ||
170 | static struct dm_block_validator sb_validator = { | 188 | static 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; |