diff options
| -rw-r--r-- | Documentation/device-mapper/thin-provisioning.txt | 8 | ||||
| -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 |
4 files changed, 25 insertions, 18 deletions
diff --git a/Documentation/device-mapper/thin-provisioning.txt b/Documentation/device-mapper/thin-provisioning.txt index da50347c0053..a119fbdd0604 100644 --- a/Documentation/device-mapper/thin-provisioning.txt +++ b/Documentation/device-mapper/thin-provisioning.txt | |||
| @@ -75,10 +75,12 @@ less sharing than average you'll need a larger-than-average metadata device. | |||
| 75 | 75 | ||
| 76 | As a guide, we suggest you calculate the number of bytes to use in the | 76 | As a guide, we suggest you calculate the number of bytes to use in the |
| 77 | metadata device as 48 * $data_dev_size / $data_block_size but round it up | 77 | metadata device as 48 * $data_dev_size / $data_block_size but round it up |
| 78 | to 2MB if the answer is smaller. The largest size supported is 16GB. | 78 | to 2MB if the answer is smaller. If you're creating large numbers of |
| 79 | snapshots which are recording large amounts of change, you may find you | ||
| 80 | need to increase this. | ||
| 79 | 81 | ||
| 80 | If you're creating large numbers of snapshots which are recording large | 82 | The largest size supported is 16GB: If the device is larger, |
| 81 | amounts of change, you may need find you need to increase this. | 83 | a warning will be issued and the excess space will not be used. |
| 82 | 84 | ||
| 83 | Reloading a pool table | 85 | Reloading a pool table |
| 84 | ---------------------- | 86 | ---------------------- |
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, | |||
| 713 | if (r) | 713 | if (r) |
| 714 | goto bad; | 714 | goto bad; |
| 715 | 715 | ||
| 716 | if (bdev_size > THIN_METADATA_MAX_SECTORS) | ||
| 717 | bdev_size = THIN_METADATA_MAX_SECTORS; | ||
| 718 | |||
| 716 | disk_super = dm_block_data(sblock); | 719 | disk_super = dm_block_data(sblock); |
| 717 | disk_super->magic = cpu_to_le64(THIN_SUPERBLOCK_MAGIC); | 720 | disk_super->magic = cpu_to_le64(THIN_SUPERBLOCK_MAGIC); |
| 718 | disk_super->version = cpu_to_le32(THIN_VERSION); | 721 | 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 @@ | |||
| 11 | 11 | ||
| 12 | #define THIN_METADATA_BLOCK_SIZE 4096 | 12 | #define THIN_METADATA_BLOCK_SIZE 4096 |
| 13 | 13 | ||
| 14 | /* | ||
| 15 | * The metadata device is currently limited in size. | ||
| 16 | * | ||
| 17 | * We have one block of index, which can hold 255 index entries. Each | ||
| 18 | * index entry contains allocation info about 16k metadata blocks. | ||
| 19 | */ | ||
| 20 | #define THIN_METADATA_MAX_SECTORS (255 * (1 << 14) * (THIN_METADATA_BLOCK_SIZE / (1 << SECTOR_SHIFT))) | ||
| 21 | |||
| 22 | /* | ||
| 23 | * A metadata device larger than 16GB triggers a warning. | ||
| 24 | */ | ||
| 25 | #define THIN_METADATA_MAX_SECTORS_WARNING (16 * (1024 * 1024 * 1024 >> SECTOR_SHIFT)) | ||
| 26 | |||
| 14 | /*----------------------------------------------------------------*/ | 27 | /*----------------------------------------------------------------*/ |
| 15 | 28 | ||
| 16 | struct dm_pool_metadata; | 29 | 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 @@ | |||
| 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) { |
