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

Commit 5dea271b authored by Mike Snitzer's avatar Mike Snitzer Committed by Alasdair G Kergon
Browse files

dm table: pass correct dev area size to device_area_is_valid



Incorrect device area lengths are being passed to device_area_is_valid().

The regression appeared in 2.6.31-rc1 through commit
754c5fc7.

With the dm-stripe target, the size of the target (ti->len) was used
instead of the stripe_width (ti->len/#stripes).  An example of a
consequent incorrect error message is:

  device-mapper: table: 254:0: sdb too small for target

Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent a732c207
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1318,7 +1318,7 @@ static int crypt_iterate_devices(struct dm_target *ti,
{
	struct crypt_config *cc = ti->private;

	return fn(ti, cc->dev, cc->start, data);
	return fn(ti, cc->dev, cc->start, ti->len, data);
}

static struct target_type crypt_target = {
+2 −2
Original line number Diff line number Diff line
@@ -324,12 +324,12 @@ static int delay_iterate_devices(struct dm_target *ti,
	struct delay_c *dc = ti->private;
	int ret = 0;

	ret = fn(ti, dc->dev_read, dc->start_read, data);
	ret = fn(ti, dc->dev_read, dc->start_read, ti->len, data);
	if (ret)
		goto out;

	if (dc->dev_write)
		ret = fn(ti, dc->dev_write, dc->start_write, data);
		ret = fn(ti, dc->dev_write, dc->start_write, ti->len, data);

out:
	return ret;
+1 −1
Original line number Diff line number Diff line
@@ -139,7 +139,7 @@ static int linear_iterate_devices(struct dm_target *ti,
{
	struct linear_c *lc = ti->private;

	return fn(ti, lc->dev, lc->start, data);
	return fn(ti, lc->dev, lc->start, ti->len, data);
}

static struct target_type linear_target = {
+1 −1
Original line number Diff line number Diff line
@@ -1453,7 +1453,7 @@ static int multipath_iterate_devices(struct dm_target *ti,

	list_for_each_entry(pg, &m->priority_groups, list) {
		list_for_each_entry(p, &pg->pgpaths, list) {
			ret = fn(ti, p->path.dev, ti->begin, data);
			ret = fn(ti, p->path.dev, ti->begin, ti->len, data);
			if (ret)
				goto out;
		}
+1 −1
Original line number Diff line number Diff line
@@ -1293,7 +1293,7 @@ static int mirror_iterate_devices(struct dm_target *ti,

	for (i = 0; !ret && i < ms->nr_mirrors; i++)
		ret = fn(ti, ms->mirror[i].dev,
			 ms->mirror[i].offset, data);
			 ms->mirror[i].offset, ti->len, data);

	return ret;
}
Loading