diff options
Diffstat (limited to 'drivers/md/dm-thin.c')
-rw-r--r-- | drivers/md/dm-thin.c | 19 |
1 files changed, 4 insertions, 15 deletions
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 @@ | |||
33 | #define DATA_DEV_BLOCK_SIZE_MAX_SECTORS (1024 * 1024 * 1024 >> SECTOR_SHIFT) | 33 | #define DATA_DEV_BLOCK_SIZE_MAX_SECTORS (1024 * 1024 * 1024 >> SECTOR_SHIFT) |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * The metadata device is currently limited in size. The limitation is | ||
37 | * checked lower down in dm-space-map-metadata, but we also check it here | ||
38 | * so we can fail early. | ||
39 | * | ||
40 | * We have one block of index, which can hold 255 index entries. Each | ||
41 | * index entry contains allocation info about 16k metadata blocks. | ||
42 | */ | ||
43 | #define METADATA_DEV_MAX_SECTORS (255 * (1 << 14) * (THIN_METADATA_BLOCK_SIZE / (1 << SECTOR_SHIFT))) | ||
44 | |||
45 | /* | ||
46 | * Device id is restricted to 24 bits. | 36 | * Device id is restricted to 24 bits. |
47 | */ | 37 | */ |
48 | #define MAX_DEV_ID ((1 << 24) - 1) | 38 | #define MAX_DEV_ID ((1 << 24) - 1) |
@@ -1736,6 +1726,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
1736 | dm_block_t low_water_blocks; | 1726 | dm_block_t low_water_blocks; |
1737 | struct dm_dev *metadata_dev; | 1727 | struct dm_dev *metadata_dev; |
1738 | sector_t metadata_dev_size; | 1728 | sector_t metadata_dev_size; |
1729 | char b[BDEVNAME_SIZE]; | ||
1739 | 1730 | ||
1740 | /* | 1731 | /* |
1741 | * FIXME Remove validation from scope of lock. | 1732 | * FIXME Remove validation from scope of lock. |
@@ -1757,11 +1748,9 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
1757 | } | 1748 | } |
1758 | 1749 | ||
1759 | metadata_dev_size = i_size_read(metadata_dev->bdev->bd_inode) >> SECTOR_SHIFT; | 1750 | metadata_dev_size = i_size_read(metadata_dev->bdev->bd_inode) >> SECTOR_SHIFT; |
1760 | if (metadata_dev_size > METADATA_DEV_MAX_SECTORS) { | 1751 | if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING) |
1761 | ti->error = "Metadata device is too large"; | 1752 | DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.", |
1762 | r = -EINVAL; | 1753 | bdevname(metadata_dev->bdev, b), THIN_METADATA_MAX_SECTORS); |
1763 | goto out_metadata; | ||
1764 | } | ||
1765 | 1754 | ||
1766 | r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev); | 1755 | r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev); |
1767 | if (r) { | 1756 | if (r) { |