* [PATCH 00/25] reduce code in fs/compat_ioctl.c
@ 2005-11-05 16:26 Arnd Bergmann
2005-11-05 16:27 ` [PATCH 12/25] scsi: move SG_IO ioctl32 code to sg.c Arnd Bergmann
0 siblings, 1 reply; 4+ messages in thread
From: Arnd Bergmann @ 2005-11-05 16:26 UTC (permalink / raw)
To: linux-kernel
Cc: video4linux-list, linux-parport, zippel, rmk+serial, ext2-devel,
Kai.Makisara, netdev, linux-mtd, bluez-devel, hpa, urban,
samba-technical, Christoph Hellwig, tim, chas, osst,
linux-usb-devel, linux-scsi, linux-atm-general, reiserfs-dev,
lm-sensors, sfrench, vandrove, gadio, linux-serial, dgilbert,
osst-users, James.Bottomley, emoenke, nathans, marcel,
schwidefsky, maxk, packet-writing
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 8935 bytes --]
On Sünnavend 05 November 2005 00:51, Christoph Hellwig wrote:
> On Sat, Nov 05, 2005 at 12:10:46AM +0100, Arnd Bergmann wrote:
> >
> > BTW, I now have a set of 25 patches that moves all handlers from
> > fs/compat_ioctl.c over to the respective drivers and subsystems,
> > but I'm not sure how to best test that.
> > I intend to at least give it a test run on my Opteron for the whatever
> > ioctls I normally use, but the rest is just guesswork. Christoph,
> > can you review those patches?
>
> I'm not sure moving everything from fs/compat_ioctl.c is a good idea.
> Everything that is just in a single driver or subsystem that has
> common ioctl code - sure. else it doesn't make a lot of sense.
Ok, here is my full set of patches, let's see which ones are
sensible and which ones we are better off without.
Getting rid of fs/compat_ioctl.c completely could at least simplify
the compat_sys_ioctl() code a bit and would also make sure that
we only build the handlers into the kernel that can be used
potentially, which reduces the binary size.
The patch set is still largely untested, except for a single
compile test, but at least some of the patches are very simple,
so maybe I can get a quick ack or nack on them.
In general, I'm just moving over the handlers to the respective
subsystem without changing the logic, so the patch should not
have any effect on the ioctl operation itself, but it also
means that the handlers still use compat_alloc_user_space
or get_fs/set_fs when it's not really necessary.
Arnd <><
drivers/block/ioctl.c | 549 +++++
drivers/block/loop.c | 76
drivers/block/paride/pcd.c | 1
drivers/block/paride/pd.c | 1
drivers/block/paride/pt.c | 1
drivers/block/pktcdvd.c | 20
drivers/bluetooth/hci_ldisc.c | 22
drivers/cdrom/Makefile | 2
drivers/cdrom/aztcd.c | 1
drivers/cdrom/cdu31a.c | 1
drivers/cdrom/cm206.c | 1
drivers/cdrom/compat.c | 163 +
drivers/cdrom/gscd.c | 1
drivers/cdrom/mcdx.c | 1
drivers/cdrom/optcd.c | 1
drivers/cdrom/sbpcd.c | 1
drivers/cdrom/sjcd.c | 1
drivers/cdrom/sonycd535.c | 2
drivers/char/Makefile | 1
drivers/char/compat_mtio.c | 81
drivers/char/ftape/zftape/zftape-init.c | 1
drivers/char/n_tty.c | 1
drivers/char/raw.c | 91
drivers/char/tty_io.c | 191 +
drivers/char/viotape.c | 1
drivers/char/vt.c | 3
drivers/char/vt_ioctl.c | 195 +
drivers/i2c/i2c-dev.c | 141 +
drivers/ide/ide-cd.c | 1
drivers/ide/ide-floppy.c | 1
drivers/ide/ide-tape.c | 1
drivers/media/radio/miropcm20-radio.c | 1
drivers/media/radio/radio-aimslab.c | 1
drivers/media/radio/radio-aztech.c | 1
drivers/media/radio/radio-cadet.c | 1
drivers/media/radio/radio-gemtek-pci.c | 1
drivers/media/radio/radio-gemtek.c | 1
drivers/media/radio/radio-maestro.c | 1
drivers/media/radio/radio-maxiradio.c | 1
drivers/media/radio/radio-rtrack2.c | 1
drivers/media/radio/radio-sf16fmi.c | 1
drivers/media/radio/radio-sf16fmr2.c | 1
drivers/media/radio/radio-terratec.c | 1
drivers/media/radio/radio-trust.c | 1
drivers/media/radio/radio-typhoon.c | 1
drivers/media/radio/radio-zoltrix.c | 1
drivers/media/video/Makefile | 2
drivers/media/video/arv.c | 1
drivers/media/video/bttv-driver.c | 1
drivers/media/video/bw-qcam.c | 1
drivers/media/video/c-qcam.c | 1
drivers/media/video/compat_ioctl.c | 318 +++
drivers/media/video/cpia.c | 1
drivers/media/video/cx88/cx88-video.c | 2
drivers/media/video/meye.c | 1
drivers/media/video/pms.c | 1
drivers/media/video/saa5249.c | 1
drivers/media/video/saa7134/saa7134-video.c | 2
drivers/media/video/stradis.c | 1
drivers/media/video/w9966.c | 1
drivers/media/video/zoran_driver.c | 1
drivers/media/video/zr36120.c | 1
drivers/mtd/mtdchar.c | 94
drivers/net/ppp_generic.c | 179 +
drivers/s390/char/tape_char.c | 1
drivers/scsi/osst.c | 2
drivers/scsi/sg.c | 154 +
drivers/scsi/sr.c | 1
drivers/scsi/st.c | 2
drivers/usb/core/devio.c | 139 +
drivers/usb/media/dsbr100.c | 1
drivers/usb/media/ov511.c | 1
drivers/usb/media/pwc/pwc-if.c | 1
drivers/usb/media/se401.c | 1
drivers/usb/media/stv680.c | 1
drivers/usb/media/usbvideo.c | 1
drivers/usb/media/vicam.c | 1
drivers/usb/media/w9968cf.c | 1
drivers/video/fbmem.c | 147 +
fs/autofs/root.c | 35
fs/autofs4/root.c | 41
fs/block_dev.c | 10
fs/cifs/cifsfs.c | 10
fs/cifs/cifsfs.h | 2
fs/cifs/ioctl.c | 29
fs/compat.c | 27
fs/compat_ioctl.c | 2918 ----------------------------
fs/ext2/dir.c | 3
fs/ext2/ext2.h | 1
fs/ext2/file.c | 6
fs/ext2/ioctl.c | 31
fs/ext3/dir.c | 3
fs/ext3/file.c | 3
fs/ext3/ioctl.c | 66
fs/fat/dir.c | 54
fs/hfsplus/dir.c | 4
fs/hfsplus/hfsplus_fs.h | 4
fs/hfsplus/inode.c | 4
fs/hfsplus/ioctl.c | 29
fs/ncpfs/dir.c | 3
fs/ncpfs/file.c | 4
fs/ncpfs/ioctl.c | 241 ++
fs/reiserfs/dir.c | 3
fs/reiserfs/file.c | 4
fs/reiserfs/ioctl.c | 36
fs/smbfs/dir.c | 4
fs/smbfs/file.c | 4
fs/smbfs/ioctl.c | 16
fs/smbfs/proto.h | 1
fs/xfs/linux-2.6/xfs_ioctl32.c | 15
include/linux/cdrom.h | 2
include/linux/compat_ioctl.h | 387 ---
include/linux/ext2_fs.h | 7
include/linux/ext3_fs.h | 1
include/linux/fs.h | 3
include/linux/ioctl32.h | 2
include/linux/mtio.h | 12
include/linux/ncp_fs.h | 1
include/linux/net.h | 2
include/linux/reiserfs_fs.h | 9
include/linux/socket.h | 4
include/linux/tty.h | 2
include/linux/tty_driver.h | 4
include/linux/tty_ldisc.h | 2
include/linux/videodev.h | 2
include/net/sock.h | 9
net/atm/common.h | 1
net/atm/ioctl.c | 167 +
net/atm/pvc.c | 3
net/atm/svc.c | 3
net/bluetooth/bnep/sock.c | 1
net/bluetooth/cmtp/sock.c | 1
net/bluetooth/hci_sock.c | 1
net/bluetooth/hidp/sock.c | 1
net/bluetooth/rfcomm/sock.c | 1
net/compat.c | 1456 +++++++++----
net/socket.c | 7
137 files changed, 4527 insertions(+), 3807 deletions(-)
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 12/25] scsi: move SG_IO ioctl32 code to sg.c
2005-11-05 16:26 [PATCH 00/25] reduce code in fs/compat_ioctl.c Arnd Bergmann
@ 2005-11-05 16:27 ` Arnd Bergmann
2005-11-05 16:44 ` James Bottomley
0 siblings, 1 reply; 4+ messages in thread
From: Arnd Bergmann @ 2005-11-05 16:27 UTC (permalink / raw)
To: linux-kernel
Cc: Christoph Hellwig, dgilbert, James.Bottomley, linux-scsi,
Arnd Bergmann
[-- Attachment #1: sg-ioctl.diff --]
[-- Type: text/plain, Size: 10864 bytes --]
The sg driver already has a compat_ioctl function, so the
conversion handler for SG_IO can easily be moved in there
as well. It still uses compat_alloc_user_space, so it can
probably be simplified by using merging the conversion
handler with the native method.
CC: dgilbert@interlog.com
CC: James.Bottomley@SteelEye.com
CC: linux-scsi@vger.kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Index: linux-2.6.14-rc/drivers/scsi/sg.c
===================================================================
--- linux-2.6.14-rc.orig/drivers/scsi/sg.c 2005-11-05 02:38:14.000000000 +0100
+++ linux-2.6.14-rc/drivers/scsi/sg.c 2005-11-05 02:41:38.000000000 +0100
@@ -31,6 +31,7 @@
#include <linux/config.h>
#include <linux/module.h>
+#include <linux/compat.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/sched.h>
@@ -1087,6 +1088,156 @@
}
#ifdef CONFIG_COMPAT
+
+typedef struct sg_io_hdr32 {
+ compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */
+ compat_int_t dxfer_direction; /* [i] data transfer direction */
+ unsigned char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */
+ unsigned char mx_sb_len; /* [i] max length to write to sbp */
+ unsigned short iovec_count; /* [i] 0 implies no scatter gather */
+ compat_uint_t dxfer_len; /* [i] byte count of data transfer */
+ compat_uint_t dxferp; /* [i], [*io] points to data transfer memory
+ or scatter gather list */
+ compat_uptr_t cmdp; /* [i], [*i] points to command to perform */
+ compat_uptr_t sbp; /* [i], [*o] points to sense_buffer memory */
+ compat_uint_t timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */
+ compat_uint_t flags; /* [i] 0 -> default, see SG_FLAG... */
+ compat_int_t pack_id; /* [i->o] unused internally (normally) */
+ compat_uptr_t usr_ptr; /* [i->o] unused internally */
+ unsigned char status; /* [o] scsi status */
+ unsigned char masked_status; /* [o] shifted, masked scsi status */
+ unsigned char msg_status; /* [o] messaging level data (optional) */
+ unsigned char sb_len_wr; /* [o] byte count actually written to sbp */
+ unsigned short host_status; /* [o] errors from host adapter */
+ unsigned short driver_status; /* [o] errors from software driver */
+ compat_int_t resid; /* [o] dxfer_len - actual_transferred */
+ compat_uint_t duration; /* [o] time taken by cmd (unit: millisec) */
+ compat_uint_t info; /* [o] auxiliary information */
+} sg_io_hdr32_t; /* 64 bytes long (on sparc32) */
+
+typedef struct sg_iovec32 {
+ compat_uint_t iov_base;
+ compat_uint_t iov_len;
+} sg_iovec32_t;
+
+static int sg_build_iovec(sg_io_hdr_t __user *sgio, void __user *dxferp, u16 iovec_count)
+{
+ sg_iovec_t __user *iov = (sg_iovec_t __user *) (sgio + 1);
+ sg_iovec32_t __user *iov32 = dxferp;
+ int i;
+
+ for (i = 0; i < iovec_count; i++) {
+ u32 base, len;
+
+ if (get_user(base, &iov32[i].iov_base) ||
+ get_user(len, &iov32[i].iov_len) ||
+ put_user(compat_ptr(base), &iov[i].iov_base) ||
+ put_user(len, &iov[i].iov_len))
+ return -EFAULT;
+ }
+
+ if (put_user(iov, &sgio->dxferp))
+ return -EFAULT;
+ return 0;
+}
+
+static int sg_ioctl_trans(struct file *file, unsigned int cmd, unsigned long arg)
+{
+ sg_io_hdr_t __user *sgio;
+ sg_io_hdr32_t __user *sgio32;
+ u16 iovec_count;
+ u32 data;
+ void __user *dxferp;
+ int err;
+
+ sgio32 = compat_ptr(arg);
+ if (get_user(iovec_count, &sgio32->iovec_count))
+ return -EFAULT;
+
+ {
+ void __user *top = compat_alloc_user_space(0);
+ void __user *new = compat_alloc_user_space(sizeof(sg_io_hdr_t) +
+ (iovec_count * sizeof(sg_iovec_t)));
+ if (new > top)
+ return -EINVAL;
+
+ sgio = new;
+ }
+
+ /* Ok, now construct. */
+ if (copy_in_user(&sgio->interface_id, &sgio32->interface_id,
+ (2 * sizeof(int)) +
+ (2 * sizeof(unsigned char)) +
+ (1 * sizeof(unsigned short)) +
+ (1 * sizeof(unsigned int))))
+ return -EFAULT;
+
+ if (get_user(data, &sgio32->dxferp))
+ return -EFAULT;
+ dxferp = compat_ptr(data);
+ if (iovec_count) {
+ if (sg_build_iovec(sgio, dxferp, iovec_count))
+ return -EFAULT;
+ } else {
+ if (put_user(dxferp, &sgio->dxferp))
+ return -EFAULT;
+ }
+
+ {
+ unsigned char __user *cmdp;
+ unsigned char __user *sbp;
+
+ if (get_user(data, &sgio32->cmdp))
+ return -EFAULT;
+ cmdp = compat_ptr(data);
+
+ if (get_user(data, &sgio32->sbp))
+ return -EFAULT;
+ sbp = compat_ptr(data);
+
+ if (put_user(cmdp, &sgio->cmdp) ||
+ put_user(sbp, &sgio->sbp))
+ return -EFAULT;
+ }
+
+ if (copy_in_user(&sgio->timeout, &sgio32->timeout,
+ 3 * sizeof(int)))
+ return -EFAULT;
+
+ if (get_user(data, &sgio32->usr_ptr))
+ return -EFAULT;
+ if (put_user(compat_ptr(data), &sgio->usr_ptr))
+ return -EFAULT;
+
+ if (copy_in_user(&sgio->status, &sgio32->status,
+ (4 * sizeof(unsigned char)) +
+ (2 * sizeof(unsigned (short))) +
+ (3 * sizeof(int))))
+ return -EFAULT;
+
+ lock_kernel();
+ err = sg_ioctl(file->f_dentry->d_inode, file,
+ cmd, (unsigned long) sgio);
+ unlock_kernel();
+
+ if (err >= 0) {
+ void __user *datap;
+
+ if (copy_in_user(&sgio32->pack_id, &sgio->pack_id,
+ sizeof(int)) ||
+ get_user(datap, &sgio->usr_ptr) ||
+ put_user((u32)(unsigned long)datap,
+ &sgio32->usr_ptr) ||
+ copy_in_user(&sgio32->status, &sgio->status,
+ (4 * sizeof(unsigned char)) +
+ (2 * sizeof(unsigned short)) +
+ (3 * sizeof(int))))
+ err = -EFAULT;
+ }
+
+ return err;
+}
+
static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
{
Sg_device *sdp;
@@ -1096,6 +1247,9 @@
if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
return -ENXIO;
+ if (cmd_in == SG_IO)
+ return sg_ioctl_trans(filp, cmd_in, arg);
+
sdev = sdp->device;
if (sdev->host->hostt->compat_ioctl) {
int ret;
Index: linux-2.6.14-rc/fs/compat_ioctl.c
===================================================================
--- linux-2.6.14-rc.orig/fs/compat_ioctl.c 2005-11-05 02:41:37.000000000 +0100
+++ linux-2.6.14-rc/fs/compat_ioctl.c 2005-11-05 02:41:38.000000000 +0100
@@ -157,152 +157,6 @@
return err;
}
-typedef struct sg_io_hdr32 {
- compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */
- compat_int_t dxfer_direction; /* [i] data transfer direction */
- unsigned char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */
- unsigned char mx_sb_len; /* [i] max length to write to sbp */
- unsigned short iovec_count; /* [i] 0 implies no scatter gather */
- compat_uint_t dxfer_len; /* [i] byte count of data transfer */
- compat_uint_t dxferp; /* [i], [*io] points to data transfer memory
- or scatter gather list */
- compat_uptr_t cmdp; /* [i], [*i] points to command to perform */
- compat_uptr_t sbp; /* [i], [*o] points to sense_buffer memory */
- compat_uint_t timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */
- compat_uint_t flags; /* [i] 0 -> default, see SG_FLAG... */
- compat_int_t pack_id; /* [i->o] unused internally (normally) */
- compat_uptr_t usr_ptr; /* [i->o] unused internally */
- unsigned char status; /* [o] scsi status */
- unsigned char masked_status; /* [o] shifted, masked scsi status */
- unsigned char msg_status; /* [o] messaging level data (optional) */
- unsigned char sb_len_wr; /* [o] byte count actually written to sbp */
- unsigned short host_status; /* [o] errors from host adapter */
- unsigned short driver_status; /* [o] errors from software driver */
- compat_int_t resid; /* [o] dxfer_len - actual_transferred */
- compat_uint_t duration; /* [o] time taken by cmd (unit: millisec) */
- compat_uint_t info; /* [o] auxiliary information */
-} sg_io_hdr32_t; /* 64 bytes long (on sparc32) */
-
-typedef struct sg_iovec32 {
- compat_uint_t iov_base;
- compat_uint_t iov_len;
-} sg_iovec32_t;
-
-static int sg_build_iovec(sg_io_hdr_t __user *sgio, void __user *dxferp, u16 iovec_count)
-{
- sg_iovec_t __user *iov = (sg_iovec_t __user *) (sgio + 1);
- sg_iovec32_t __user *iov32 = dxferp;
- int i;
-
- for (i = 0; i < iovec_count; i++) {
- u32 base, len;
-
- if (get_user(base, &iov32[i].iov_base) ||
- get_user(len, &iov32[i].iov_len) ||
- put_user(compat_ptr(base), &iov[i].iov_base) ||
- put_user(len, &iov[i].iov_len))
- return -EFAULT;
- }
-
- if (put_user(iov, &sgio->dxferp))
- return -EFAULT;
- return 0;
-}
-
-static int sg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
- sg_io_hdr_t __user *sgio;
- sg_io_hdr32_t __user *sgio32;
- u16 iovec_count;
- u32 data;
- void __user *dxferp;
- int err;
-
- sgio32 = compat_ptr(arg);
- if (get_user(iovec_count, &sgio32->iovec_count))
- return -EFAULT;
-
- {
- void __user *top = compat_alloc_user_space(0);
- void __user *new = compat_alloc_user_space(sizeof(sg_io_hdr_t) +
- (iovec_count * sizeof(sg_iovec_t)));
- if (new > top)
- return -EINVAL;
-
- sgio = new;
- }
-
- /* Ok, now construct. */
- if (copy_in_user(&sgio->interface_id, &sgio32->interface_id,
- (2 * sizeof(int)) +
- (2 * sizeof(unsigned char)) +
- (1 * sizeof(unsigned short)) +
- (1 * sizeof(unsigned int))))
- return -EFAULT;
-
- if (get_user(data, &sgio32->dxferp))
- return -EFAULT;
- dxferp = compat_ptr(data);
- if (iovec_count) {
- if (sg_build_iovec(sgio, dxferp, iovec_count))
- return -EFAULT;
- } else {
- if (put_user(dxferp, &sgio->dxferp))
- return -EFAULT;
- }
-
- {
- unsigned char __user *cmdp;
- unsigned char __user *sbp;
-
- if (get_user(data, &sgio32->cmdp))
- return -EFAULT;
- cmdp = compat_ptr(data);
-
- if (get_user(data, &sgio32->sbp))
- return -EFAULT;
- sbp = compat_ptr(data);
-
- if (put_user(cmdp, &sgio->cmdp) ||
- put_user(sbp, &sgio->sbp))
- return -EFAULT;
- }
-
- if (copy_in_user(&sgio->timeout, &sgio32->timeout,
- 3 * sizeof(int)))
- return -EFAULT;
-
- if (get_user(data, &sgio32->usr_ptr))
- return -EFAULT;
- if (put_user(compat_ptr(data), &sgio->usr_ptr))
- return -EFAULT;
-
- if (copy_in_user(&sgio->status, &sgio32->status,
- (4 * sizeof(unsigned char)) +
- (2 * sizeof(unsigned (short))) +
- (3 * sizeof(int))))
- return -EFAULT;
-
- err = sys_ioctl(fd, cmd, (unsigned long) sgio);
-
- if (err >= 0) {
- void __user *datap;
-
- if (copy_in_user(&sgio32->pack_id, &sgio->pack_id,
- sizeof(int)) ||
- get_user(datap, &sgio->usr_ptr) ||
- put_user((u32)(unsigned long)datap,
- &sgio32->usr_ptr) ||
- copy_in_user(&sgio32->status, &sgio->status,
- (4 * sizeof(unsigned char)) +
- (2 * sizeof(unsigned short)) +
- (3 * sizeof(int))))
- err = -EFAULT;
- }
-
- return err;
-}
-
struct mtget32 {
compat_long_t mt_type;
@@ -1143,7 +997,6 @@
#endif
#ifdef DECLARES
-HANDLE_IOCTL(SG_IO,sg_ioctl_trans)
HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans)
--
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 12/25] scsi: move SG_IO ioctl32 code to sg.c
2005-11-05 16:27 ` [PATCH 12/25] scsi: move SG_IO ioctl32 code to sg.c Arnd Bergmann
@ 2005-11-05 16:44 ` James Bottomley
2005-11-05 19:19 ` Arnd Bergmann
0 siblings, 1 reply; 4+ messages in thread
From: James Bottomley @ 2005-11-05 16:44 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: linux-kernel, Christoph Hellwig, dgilbert, linux-scsi
On Sat, 2005-11-05 at 17:27 +0100, Arnd Bergmann wrote:
> plain text document attachment (sg-ioctl.diff)
> The sg driver already has a compat_ioctl function, so the
> conversion handler for SG_IO can easily be moved in there
> as well. It still uses compat_alloc_user_space, so it can
> probably be simplified by using merging the conversion
> handler with the native method.
This is the wrong place, isn't it? SG_IO is also in
drivers/block/scsi_ioctl.c which isn't modular, so shouldn't this be in
there?
James
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 12/25] scsi: move SG_IO ioctl32 code to sg.c
2005-11-05 16:44 ` James Bottomley
@ 2005-11-05 19:19 ` Arnd Bergmann
0 siblings, 0 replies; 4+ messages in thread
From: Arnd Bergmann @ 2005-11-05 19:19 UTC (permalink / raw)
To: James Bottomley; +Cc: linux-kernel, Christoph Hellwig, dgilbert, linux-scsi
On Sünnavend 05 November 2005 17:44, James Bottomley wrote:
> This is the wrong place, isn't it? SG_IO is also in
> drivers/block/scsi_ioctl.c which isn't modular, so shouldn't this be in
> there?
>
Yes, you're right. That patch broke compat SG_IO for the other scsi
drivers. I'll do a new one.
Arnd <><
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2005-11-05 19:19 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-11-05 16:26 [PATCH 00/25] reduce code in fs/compat_ioctl.c Arnd Bergmann
2005-11-05 16:27 ` [PATCH 12/25] scsi: move SG_IO ioctl32 code to sg.c Arnd Bergmann
2005-11-05 16:44 ` James Bottomley
2005-11-05 19:19 ` Arnd Bergmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).