diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/md/dm-thin-metadata.c | 3 | ||||
| -rw-r--r-- | drivers/md/dm-thin-metadata.h | 13 | ||||
| -rw-r--r-- | drivers/md/dm-thin.c | 19 | 
3 files changed, 20 insertions, 15 deletions
| diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index a680c761341f..737d38865b69 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c @@ -713,6 +713,9 @@ struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev,  	if (r)  		goto bad; +	if (bdev_size > THIN_METADATA_MAX_SECTORS) +		bdev_size = THIN_METADATA_MAX_SECTORS; +  	disk_super = dm_block_data(sblock);  	disk_super->magic = cpu_to_le64(THIN_SUPERBLOCK_MAGIC);  	disk_super->version = cpu_to_le32(THIN_VERSION); diff --git a/drivers/md/dm-thin-metadata.h b/drivers/md/dm-thin-metadata.h index 859c16896877..ed4725e67c96 100644 --- a/drivers/md/dm-thin-metadata.h +++ b/drivers/md/dm-thin-metadata.h @@ -11,6 +11,19 @@  #define THIN_METADATA_BLOCK_SIZE 4096 +/* + * The metadata device is currently limited in size. + * + * We have one block of index, which can hold 255 index entries.  Each + * index entry contains allocation info about 16k metadata blocks. + */ +#define THIN_METADATA_MAX_SECTORS (255 * (1 << 14) * (THIN_METADATA_BLOCK_SIZE / (1 << SECTOR_SHIFT))) + +/* + * A metadata device larger than 16GB triggers a warning. + */ +#define THIN_METADATA_MAX_SECTORS_WARNING (16 * (1024 * 1024 * 1024 >> SECTOR_SHIFT)) +  /*----------------------------------------------------------------*/  struct dm_pool_metadata; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index bcb143396fe0..2378ee88b1e8 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -33,16 +33,6 @@  #define DATA_DEV_BLOCK_SIZE_MAX_SECTORS (1024 * 1024 * 1024 >> SECTOR_SHIFT)  /* - * The metadata device is currently limited in size.  The limitation is - * checked lower down in dm-space-map-metadata, but we also check it here - * so we can fail early. - * - * We have one block of index, which can hold 255 index entries.  Each - * index entry contains allocation info about 16k metadata blocks. - */ -#define METADATA_DEV_MAX_SECTORS (255 * (1 << 14) * (THIN_METADATA_BLOCK_SIZE / (1 << SECTOR_SHIFT))) - -/*   * Device id is restricted to 24 bits.   */  #define MAX_DEV_ID ((1 << 24) - 1) @@ -1736,6 +1726,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)  	dm_block_t low_water_blocks;  	struct dm_dev *metadata_dev;  	sector_t metadata_dev_size; +	char b[BDEVNAME_SIZE];  	/*  	 * FIXME Remove validation from scope of lock. @@ -1757,11 +1748,9 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)  	}  	metadata_dev_size = i_size_read(metadata_dev->bdev->bd_inode) >> SECTOR_SHIFT; -	if (metadata_dev_size > METADATA_DEV_MAX_SECTORS) { -		ti->error = "Metadata device is too large"; -		r = -EINVAL; -		goto out_metadata; -	} +	if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING) +		DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.", +		       bdevname(metadata_dev->bdev, b), THIN_METADATA_MAX_SECTORS);  	r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev);  	if (r) { | 
