Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6a1ed10 authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Alasdair G Kergon
Browse files

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: default avatarMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 8811f46c
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -343,9 +343,9 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md)
}

/*
 * If possible, this checks an area of a destination device is valid.
 * If possible, this checks an area of a destination device is invalid.
 */
static int device_area_is_valid(struct dm_target *ti, struct dm_dev *dev,
static int device_area_is_invalid(struct dm_target *ti, struct dm_dev *dev,
				  sector_t start, sector_t len, void *data)
{
	struct queue_limits *limits = data;
@@ -357,16 +357,16 @@ static int device_area_is_valid(struct dm_target *ti, struct dm_dev *dev,
	char b[BDEVNAME_SIZE];

	if (!dev_size)
		return 1;
		return 0;

	if ((start >= dev_size) || (start + len > dev_size)) {
		DMWARN("%s: %s too small for target",
		       dm_device_name(ti->table->md), bdevname(bdev, b));
		return 0;
		return 1;
	}

	if (logical_block_size_sectors <= 1)
		return 1;
		return 0;

	if (start & (logical_block_size_sectors - 1)) {
		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,
		       dm_device_name(ti->table->md),
		       (unsigned long long)start,
		       limits->logical_block_size, bdevname(bdev, b));
		return 0;
		return 1;
	}

	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,
		       dm_device_name(ti->table->md),
		       (unsigned long long)len,
		       limits->logical_block_size, bdevname(bdev, b));
		return 0;
		return 1;
	}

	return 1;
	return 0;
}

/*
@@ -1000,7 +1000,7 @@ int dm_calculate_queue_limits(struct dm_table *table,
		 * Check each device area is consistent with the target's
		 * overall queue limits.
		 */
		if (!ti->type->iterate_devices(ti, device_area_is_valid,
		if (ti->type->iterate_devices(ti, device_area_is_invalid,
					      &ti_limits))
			return -EINVAL;