From: Arnd Bergmann <arnd@arndb.de>
To: Jens Axboe <jens.axboe@oracle.com>
Cc: linux-kernel@vger.kernel.org, abhishekrai@google.com,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH] Fix blktrace setup 32-bit ioctl on 64-bit kernels
Date: Tue, 2 Oct 2007 10:15:32 +0200 [thread overview]
Message-ID: <200710021015.33203.arnd@arndb.de> (raw)
In-Reply-To: <20071002073943.GC5236@kernel.dk>
On Tuesday 02 October 2007, Jens Axboe wrote:
>
> The layout of struct blk_user_trace_setup is a bit unfortunate, it gets
> padded differently on 32-bit and 64-bit archs. So right now it's not
> possible to trace 64-bit kernels with a 32-bit app. This patch fixes
> that up by adding a compat ioctl handler for BLKTRACESETUP.
actually, I would guess that it is currently working on s390, sparc64,
powerpc, parisc and mips, but your patch breaks it :(.
> diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
> index 5a5b711..b18b9cc 100644
> --- a/fs/compat_ioctl.c
> +++ b/fs/compat_ioctl.c
I'd prefer to not add anything to fs/compat_ioctl.c at all, but always
handle these in the places where the native version is handled.
In your case, I'd either mark BLKTRACESETUP32 as COMPATIBLE_IOCTL() and
handle it from inside of blk_trace_ioctl(), or handle it in
compat_blkdev_ioctl.
> @@ -2052,6 +2052,51 @@ static int raw_ioctl(unsigned fd, unsigned cmd, unsigned long arg)
> }
> return ret;
> }
> +
> +struct blk_user_trace_setup32 {
> + char name[32];
> + u16 act_mask;
> + u16 pad;
> + u32 buf_size;
> + u32 buf_nr;
> + u64 start_lba;
> + u64 end_lba;
> + u32 pid;
> +} __attribute__((packed));
Errm, no. Everyone makes that mistake once, so you're in good company,
but the packed attribute makes this incorrect on every architecture
except x86_64 and ia64, because only i386 has no padding before the u64
and after the last member.
We now have the compat_u64 type that behaves like the 32 bit user space
version of an unsigned long long. If you use that to define
compat_blk_user_trace_setup, you don't need the attribute.
> +#define BLKTRACESETUP32 _IOWR(0x12,115,struct blk_user_trace_setup32)
> +
> +static int blktrace32_setup(int fd, unsigned cmd, unsigned long arg)
The naming convention these days is to use a 'compat_' prefix, not a '32'
postfix.
> +{
> + struct blk_user_trace_setup __user *buts = compat_alloc_user_space(sizeof(*buts));
> + struct blk_user_trace_setup32 __user *buts32 = compat_ptr(arg);
> + int err;
> +
> + if (copy_in_user(&buts->name, &buts32->name, BDEVNAME_SIZE) ||
> + get_user(buts->act_mask, &buts32->act_mask) ||
> + get_user(buts->buf_size, &buts32->buf_size) ||
> + get_user(buts->buf_nr, &buts32->buf_nr) ||
> + get_user(buts->start_lba, &buts32->start_lba) ||
> + get_user(buts->end_lba, &buts32->end_lba) ||
> + get_user(buts->pid, &buts32->pid))
> + return -EFAULT;
> +
> + err = sys_ioctl(fd, BLKTRACESETUP, (unsigned long) buts);
> + if (err)
> + return err;
> +
> + if (copy_to_user(&buts32->name, &buts->name, BDEVNAME_SIZE) ||
> + put_user(buts32->act_mask, &buts->act_mask) ||
> + put_user(buts32->buf_size, &buts->buf_size) ||
> + put_user(buts32->buf_nr, &buts->buf_nr) ||
> + put_user(buts32->start_lba, &buts->start_lba) ||
> + put_user(buts32->end_lba, &buts->end_lba) ||
> + put_user(buts32->pid, &buts->pid))
> + return -EFAULT;
> +
> + return err;
Most of these fields are read-only for the kernel, so you should only need
the first copy_to_user. I think you should split the blk_trace_setup function
to have the common code take a struct blk_user_trace_setup kernel pointer,
and one or two versions that just do the copy_{to,from}_user.
Arnd <><
next prev parent reply other threads:[~2007-10-02 8:16 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-02 7:39 [PATCH] Fix blktrace setup 32-bit ioctl on 64-bit kernels Jens Axboe
2007-10-02 7:52 ` David Miller
2007-10-02 8:15 ` Arnd Bergmann [this message]
2007-10-02 8:37 ` Jens Axboe
2007-10-02 9:28 ` Jens Axboe
2007-10-03 9:34 ` Arnd Bergmann
2007-10-03 15:55 ` Arnd Bergmann
2007-10-03 22:48 ` Arnd Bergmann
2007-10-04 18:16 ` Jens Axboe
2007-10-04 18:44 ` Arnd Bergmann
2007-10-05 10:41 ` Jens Axboe
2007-10-05 12:30 ` [PATCH] block: move ioctl conversion to compat_blkdev_ioctl Arnd Bergmann
2007-10-05 12:41 ` Jens Axboe
2007-10-05 12:41 ` Arnd Bergmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200710021015.33203.arnd@arndb.de \
--to=arnd@arndb.de \
--cc=abhishekrai@google.com \
--cc=jens.axboe@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.