diff options
| author | Mikulas Patocka <mpatocka@redhat.com> | 2009-09-04 15:40:22 -0400 |
|---|---|---|
| committer | Alasdair G Kergon <agk@redhat.com> | 2009-09-04 15:40:22 -0400 |
| commit | f6a1ed10864b7540fa758bbccf3433fe17070329 (patch) | |
| tree | e0b8f1c02f0527e0870dee2977f311695856f8a5 | |
| parent | 8811f46c1f9386fc7017150de9d52359e5b1826e (diff) | |
dm table: fix queue_limit checking device iterator
The logic to check for valid device areas is inverted relative to proper
use with iterate_devices.
The iterate_devices method calls its callback for every underlying
device in the target. If any callback returns non-zero, iterate_devices
exits immediately. But the callback device_area_is_valid() returns 0 on
error and 1 on success. The overall effect without is that an error is
issued only if every device is invalid.
This patch renames device_area_is_valid to device_area_is_invalid and
inverts the logic so that one invalid device is sufficient to raise
an error.
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
| -rw-r--r-- | drivers/md/dm-table.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index d952b3441913..aa60526075d7 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
| @@ -343,10 +343,10 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md) | |||
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | /* | 345 | /* |
| 346 | * If possible, this checks an area of a destination device is valid. | 346 | * If possible, this checks an area of a destination device is invalid. |
| 347 | */ | 347 | */ |
| 348 | static int device_area_is_valid(struct dm_target *ti, struct dm_dev *dev, | 348 | static int device_area_is_invalid(struct dm_target *ti, struct dm_dev *dev, |
| 349 | sector_t start, sector_t len, void *data) | 349 | sector_t start, sector_t len, void *data) |
| 350 | { | 350 | { |
| 351 | struct queue_limits *limits = data; | 351 | struct queue_limits *limits = data; |
| 352 | struct block_device *bdev = dev->bdev; | 352 | struct block_device *bdev = dev->bdev; |
| @@ -357,16 +357,16 @@ static int device_area_is_valid(struct dm_target *ti, struct dm_dev *dev, | |||
| 357 | char b[BDEVNAME_SIZE]; | 357 | char b[BDEVNAME_SIZE]; |
| 358 | 358 | ||
| 359 | if (!dev_size) | 359 | if (!dev_size) |
| 360 | return 1; | 360 | return 0; |
| 361 | 361 | ||
| 362 | if ((start >= dev_size) || (start + len > dev_size)) { | 362 | if ((start >= dev_size) || (start + len > dev_size)) { |
| 363 | DMWARN("%s: %s too small for target", | 363 | DMWARN("%s: %s too small for target", |
| 364 | dm_device_name(ti->table->md), bdevname(bdev, b)); | 364 | dm_device_name(ti->table->md), bdevname(bdev, b)); |
| 365 | return 0; | 365 | return 1; |
| 366 | } | 366 | } |
| 367 | 367 | ||
| 368 | if (logical_block_size_sectors <= 1) | 368 | if (logical_block_size_sectors <= 1) |
| 369 | return 1; | 369 | return 0; |
| 370 | 370 | ||
| 371 | if (start & (logical_block_size_sectors - 1)) { | 371 | if (start & (logical_block_size_sectors - 1)) { |
| 372 | DMWARN("%s: start=%llu not aligned to h/w " | 372 | DMWARN("%s: start=%llu not aligned to h/w " |
| @@ -374,7 +374,7 @@ static int device_area_is_valid(struct dm_target *ti, struct dm_dev *dev, | |||
| 374 | dm_device_name(ti->table->md), | 374 | dm_device_name(ti->table->md), |
| 375 | (unsigned long long)start, | 375 | (unsigned long long)start, |
| 376 | limits->logical_block_size, bdevname(bdev, b)); | 376 | limits->logical_block_size, bdevname(bdev, b)); |
| 377 | return 0; | 377 | return 1; |
| 378 | } | 378 | } |
| 379 | 379 | ||
| 380 | if (len & (logical_block_size_sectors - 1)) { | 380 | if (len & (logical_block_size_sectors - 1)) { |
| @@ -383,10 +383,10 @@ static int device_area_is_valid(struct dm_target *ti, struct dm_dev *dev, | |||
| 383 | dm_device_name(ti->table->md), | 383 | dm_device_name(ti->table->md), |
| 384 | (unsigned long long)len, | 384 | (unsigned long long)len, |
| 385 | limits->logical_block_size, bdevname(bdev, b)); | 385 | limits->logical_block_size, bdevname(bdev, b)); |
| 386 | return 0; | 386 | return 1; |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | return 1; | 389 | return 0; |
| 390 | } | 390 | } |
| 391 | 391 | ||
| 392 | /* | 392 | /* |
| @@ -1000,8 +1000,8 @@ int dm_calculate_queue_limits(struct dm_table *table, | |||
| 1000 | * Check each device area is consistent with the target's | 1000 | * Check each device area is consistent with the target's |
| 1001 | * overall queue limits. | 1001 | * overall queue limits. |
| 1002 | */ | 1002 | */ |
| 1003 | if (!ti->type->iterate_devices(ti, device_area_is_valid, | 1003 | if (ti->type->iterate_devices(ti, device_area_is_invalid, |
| 1004 | &ti_limits)) | 1004 | &ti_limits)) |
| 1005 | return -EINVAL; | 1005 | return -EINVAL; |
| 1006 | 1006 | ||
| 1007 | combine_limits: | 1007 | combine_limits: |
