All of lore.kernel.org
 help / color / mirror / Atom feed
* dm-ioctl on amd64 with 32bit userspace
@ 2007-09-17 16:57 Guido Guenther
  2007-09-20  0:26 ` Andrew Morton
  2007-09-20 15:32 ` Alasdair G Kergon
  0 siblings, 2 replies; 7+ messages in thread
From: Guido Guenther @ 2007-09-17 16:57 UTC (permalink / raw)
  To: Alasdair G Kergon; +Cc: Andrew Morton, dm-devel

Hi,

using something like:

dmsetup message <mpath> 0 fail_if_no_path

on a 32 bit dmsetup with a amd64 kernel currently fails with:
 "Invalid target message parameters."

since the structure padding is 8 bytes and so we're looking at a 4 byte
to high address in target_message() - this also affects dev_rename() and
dev_set_geometry(). The attached patch works around the problem but
doesn't look like a proper fix. But since all the 32bit to 64bit ioctl
conversion in device mapper seems a bit strange, I'm not sure where to
fix this properly.

The bad thing about this is that multipath failover after a trespas on
such a system won't work (among other things). This at least has been
broken since 2.6.18 (I doubt it ever worked) and is still broken in
2.6.23-rc6-git7. With this patch, failover after a trespas and device
renaming works as expected.
Cheers,
 -- Guido

Signed-off-by: Guido Guenther <agx@sigxcpu.org>

--- aa-amd64-smp/drivers/md/dm-ioctl.c	2007-09-17 14:51:10.000000000 +0000
+++ linux-2.6.22/drivers/md/dm-ioctl.c	2007-07-08 23:32:17.000000000 +0000
@@ -700,7 +700,7 @@
 	int r;
 	char *new_name = (char *) param + param->data_start;
 
-	if (new_name < (char *) (param + 1) ||
+	if (new_name < (char *) ((void*)(param + 1) - 4) ||
 	    invalid_str(new_name, (void *) param + param_size)) {
 		DMWARN("Invalid new logical volume name supplied.");
 		return -EINVAL;
@@ -726,7 +726,7 @@
 	if (!md)
 		return -ENXIO;
 
-	if (geostr < (char *) (param + 1) ||
+	if (geostr < (char *) ((void *)(param + 1) - 4) ||
 	    invalid_str(geostr, (void *) param + param_size)) {
 		DMWARN("Invalid geometry supplied.");
 		goto out;
@@ -1233,7 +1233,7 @@
 	if (r)
 		goto out;
 
-	if (tmsg < (struct dm_target_msg *) (param + 1) ||
+	if (tmsg < (struct dm_target_msg *) ((void*)(param + 1) - 4) ||
 	    invalid_str(tmsg->message, (void *) param + param_size)) {
 		DMWARN("Invalid target message parameters.");
 		r = -EINVAL;

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2007-10-04 17:28 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-09-17 16:57 dm-ioctl on amd64 with 32bit userspace Guido Guenther
2007-09-20  0:26 ` Andrew Morton
2007-09-20  1:24   ` Alasdair G Kergon
2007-09-20  7:07     ` Guido Guenther
2007-09-20 15:32 ` Alasdair G Kergon
2007-09-20 18:46   ` Guido Guenther
     [not found]     ` <20070929132754.GA19089@bogon.ms20.nix>
     [not found]       ` <20071002010519.GB18444@agk.fab.redhat.com>
     [not found]         ` <20071002071647.GA11183@bogon.ms20.nix>
2007-10-04 17:28           ` Alasdair G Kergon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.