aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorKent Overstreet <koverstreet@google.com>2013-04-24 00:51:48 -0400
committerKent Overstreet <koverstreet@google.com>2013-04-24 16:07:39 -0400
commit8abb2a5dbadab91f9cae22270054e9ee3b3a1d2f (patch)
treeef40e5ed1d1833152ca8b542a688f9664820201f /drivers/md
parenta09ded8edf9ed4009930713e101249084cbcea5c (diff)
bcache: Make sure blocksize isn't smaller than device blocksize
Sanity check to make sure we don't end up doing IO the device doesn't support. Signed-off-by: Kent Overstreet <koverstreet@google.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/bcache/super.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index 6817ea46cf0a..b3601476f7dd 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -139,13 +139,17 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
139 if (bch_is_zero(sb->uuid, 16)) 139 if (bch_is_zero(sb->uuid, 16))
140 goto err; 140 goto err;
141 141
142 sb->block_size = le16_to_cpu(s->block_size);
143
144 err = "Superblock block size smaller than device block size";
145 if (sb->block_size << 9 < bdev_logical_block_size(bdev))
146 goto err;
147
142 switch (sb->version) { 148 switch (sb->version) {
143 case BCACHE_SB_VERSION_BDEV: 149 case BCACHE_SB_VERSION_BDEV:
144 sb->block_size = le16_to_cpu(s->block_size);
145 sb->data_offset = BDEV_DATA_START_DEFAULT; 150 sb->data_offset = BDEV_DATA_START_DEFAULT;
146 break; 151 break;
147 case BCACHE_SB_VERSION_BDEV_WITH_OFFSET: 152 case BCACHE_SB_VERSION_BDEV_WITH_OFFSET:
148 sb->block_size = le16_to_cpu(s->block_size);
149 sb->data_offset = le64_to_cpu(s->data_offset); 153 sb->data_offset = le64_to_cpu(s->data_offset);
150 154
151 err = "Bad data offset"; 155 err = "Bad data offset";