|
@@ -2000,16 +2000,27 @@ static void metadata_low_callback(void *context)
|
|
dm_table_event(pool->ti->table);
|
|
dm_table_event(pool->ti->table);
|
|
}
|
|
}
|
|
|
|
|
|
-static sector_t get_metadata_dev_size(struct block_device *bdev)
|
|
|
|
|
|
+static sector_t get_dev_size(struct block_device *bdev)
|
|
|
|
+{
|
|
|
|
+ return i_size_read(bdev->bd_inode) >> SECTOR_SHIFT;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void warn_if_metadata_device_too_big(struct block_device *bdev)
|
|
{
|
|
{
|
|
- sector_t metadata_dev_size = i_size_read(bdev->bd_inode) >> SECTOR_SHIFT;
|
|
|
|
|
|
+ sector_t metadata_dev_size = get_dev_size(bdev);
|
|
char buffer[BDEVNAME_SIZE];
|
|
char buffer[BDEVNAME_SIZE];
|
|
|
|
|
|
- if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING) {
|
|
|
|
|
|
+ if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING)
|
|
DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.",
|
|
DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.",
|
|
bdevname(bdev, buffer), THIN_METADATA_MAX_SECTORS);
|
|
bdevname(bdev, buffer), THIN_METADATA_MAX_SECTORS);
|
|
- metadata_dev_size = THIN_METADATA_MAX_SECTORS_WARNING;
|
|
|
|
- }
|
|
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static sector_t get_metadata_dev_size(struct block_device *bdev)
|
|
|
|
+{
|
|
|
|
+ sector_t metadata_dev_size = get_dev_size(bdev);
|
|
|
|
+
|
|
|
|
+ if (metadata_dev_size > THIN_METADATA_MAX_SECTORS)
|
|
|
|
+ metadata_dev_size = THIN_METADATA_MAX_SECTORS;
|
|
|
|
|
|
return metadata_dev_size;
|
|
return metadata_dev_size;
|
|
}
|
|
}
|
|
@@ -2018,7 +2029,7 @@ static dm_block_t get_metadata_dev_size_in_blocks(struct block_device *bdev)
|
|
{
|
|
{
|
|
sector_t metadata_dev_size = get_metadata_dev_size(bdev);
|
|
sector_t metadata_dev_size = get_metadata_dev_size(bdev);
|
|
|
|
|
|
- sector_div(metadata_dev_size, THIN_METADATA_BLOCK_SIZE >> SECTOR_SHIFT);
|
|
|
|
|
|
+ sector_div(metadata_dev_size, THIN_METADATA_BLOCK_SIZE);
|
|
|
|
|
|
return metadata_dev_size;
|
|
return metadata_dev_size;
|
|
}
|
|
}
|
|
@@ -2096,12 +2107,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
|
ti->error = "Error opening metadata block device";
|
|
ti->error = "Error opening metadata block device";
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
}
|
|
}
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Run for the side-effect of possibly issuing a warning if the
|
|
|
|
- * device is too big.
|
|
|
|
- */
|
|
|
|
- (void) get_metadata_dev_size(metadata_dev->bdev);
|
|
|
|
|
|
+ warn_if_metadata_device_too_big(metadata_dev->bdev);
|
|
|
|
|
|
r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev);
|
|
r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev);
|
|
if (r) {
|
|
if (r) {
|
|
@@ -2288,6 +2294,7 @@ static int maybe_resize_metadata_dev(struct dm_target *ti, bool *need_commit)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
} else if (metadata_dev_size > sb_metadata_dev_size) {
|
|
} else if (metadata_dev_size > sb_metadata_dev_size) {
|
|
|
|
+ warn_if_metadata_device_too_big(pool->md_dev);
|
|
DMINFO("%s: growing the metadata device from %llu to %llu blocks",
|
|
DMINFO("%s: growing the metadata device from %llu to %llu blocks",
|
|
dm_device_name(pool->pool_md),
|
|
dm_device_name(pool->pool_md),
|
|
sb_metadata_dev_size, metadata_dev_size);
|
|
sb_metadata_dev_size, metadata_dev_size);
|