Skip to contentSkip to conversation

add ->compat_ioctl to dasd

PATCH In review Christoph Hellwig 2 participants 4 messages Dec 13, 2005 – Dec 14, 2005

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 2/3 add ->compat_ioctl to dasd

Add a compat_ioctl method to the dasd driver so the last entries in arch/s390/kernel/compat_ioctl.c can go away. Unlike the previous attempt this one does not replace the ioctl method with an unlocked_ioctl method so that the ioctl_by_bdev calls in s390 partition code continue to work.

drivers/s390/block/dasd.c +1 -0
Index: linux-2.6.15-rc5/drivers/s390/block/dasd.c
===================================================================
@@ -1751,6 +1751,7 @@
 	.open		= dasd_open,
 	.release	= dasd_release,
 	.ioctl		= dasd_ioctl,
+	.compat_ioctl	= dasd_compat_ioctl,
 	.getgeo		= dasd_getgeo,
 };
 
drivers/s390/block/dasd_int.h +1 -0
Index: linux-2.6.15-rc5/drivers/s390/block/dasd_int.h
===================================================================
@@ -527,6 +527,7 @@
 int  dasd_ioctl_no_register(struct module *, int, dasd_ioctl_fn_t);
 int  dasd_ioctl_no_unregister(struct module *, int, dasd_ioctl_fn_t);
 int  dasd_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
+long dasd_compat_ioctl(struct file *, unsigned int, unsigned long);
 
 /* externals in dasd_proc.c */
 int dasd_proc_init(void);
drivers/s390/block/dasd_ioctl.c +12 -0
Index: linux-2.6.15-rc5/drivers/s390/block/dasd_ioctl.c
===================================================================
@@ -118,6 +118,18 @@
 	return -EINVAL;
 }
 
+long
+dasd_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+	int rval;
+
+	lock_kernel();
+	rval = dasd_ioctl(filp->f_dentry->d_inode, filp, cmd, arg);
+	unlock_kernel();
+
+	return rval;
+}
+
 static int
 dasd_ioctl_api_version(struct block_device *bdev, int no, long args)
 {
arch/s390/kernel/compat_ioctl.c +0 -21
Index: linux-2.6.15-rc5/arch/s390/kernel/compat_ioctl.c
===================================================================
@@ -42,27 +42,6 @@
 #include <linux/compat_ioctl.h>
 #define DECLARES
 #include "../../../fs/compat_ioctl.c"
-
-/* s390 only ioctls */
-COMPATIBLE_IOCTL(DASDAPIVER)
-COMPATIBLE_IOCTL(BIODASDDISABLE)
-COMPATIBLE_IOCTL(BIODASDENABLE)
-COMPATIBLE_IOCTL(BIODASDRSRV)
-COMPATIBLE_IOCTL(BIODASDRLSE)
-COMPATIBLE_IOCTL(BIODASDSLCK)
-COMPATIBLE_IOCTL(BIODASDINFO)
-COMPATIBLE_IOCTL(BIODASDINFO2)
-COMPATIBLE_IOCTL(BIODASDFMT)
-COMPATIBLE_IOCTL(BIODASDPRRST)
-COMPATIBLE_IOCTL(BIODASDQUIESCE)
-COMPATIBLE_IOCTL(BIODASDRESUME)
-COMPATIBLE_IOCTL(BIODASDPRRD)
-COMPATIBLE_IOCTL(BIODASDPSRD)
-COMPATIBLE_IOCTL(BIODASDGATTR)
-COMPATIBLE_IOCTL(BIODASDSATTR)
-COMPATIBLE_IOCTL(BIODASDCMFENABLE)
-COMPATIBLE_IOCTL(BIODASDCMFDISABLE)
-COMPATIBLE_IOCTL(BIODASDREADALLCMB)
 };
 
 int ioctl_table_size = ARRAY_SIZE(ioctl_start);
#1 lore raw
Quoted 5 lines · Christoph Hellwig

Add a compat_ioctl method to the dasd driver so the last entries in arch/s390/kernel/compat_ioctl.c can go away. Unlike the previous attempt this one does not replace the ioctl method with an unlocked_ioctl method so that the ioctl_by_bdev calls in s390 partition code continue to work.

Looks better but still doesn't work. The dasd driver specific ioctls do work but there are some generic ones that are only available on the normal ioctl path, including BLKFLSBUF, BLKROSET and HDIO_GETGEO. That makes e.g. the 32 bit version of fdasd fail with "IOCTL error".

Signature · 6 lines
blue skies,
   Martin

Martin Schwidefsky
Linux for zSeries Development & Services
IBM Deutschland Entwicklung GmbH
#2 lore raw
Quoted 11 lines · Martin Schwidefsky
Quoted 5 lines · Christoph Hellwig

Add a compat_ioctl method to the dasd driver so the last entries in arch/s390/kernel/compat_ioctl.c can go away. Unlike the previous attempt this one does not replace the ioctl method with an unlocked_ioctl method so that the ioctl_by_bdev calls in s390 partition code continue to work.

Looks better but still doesn't work. The dasd driver specific ioctls do work but there are some generic ones that are only available on the normal ioctl path, including BLKFLSBUF, BLKROSET and HDIO_GETGEO. That makes e.g. the 32 bit version of fdasd fail with "IOCTL error".

Sorry, that's the ENOIOCTLCMD thing again, I forgot it in the first revision of the last patch aswell.

Here's the fix for that:

drivers/s390/block/dasd_ioctl.c +1 -1
Index: linux-2.6.15-rc5/drivers/s390/block/dasd_ioctl.c
===================================================================
@@ -127,7 +127,7 @@
 	rval = dasd_ioctl(filp->f_dentry->d_inode, filp, cmd, arg);
 	unlock_kernel();
 
-	return rval;
+	return (rval == -EINVAL) ? -ENOIOCTLCMD : rval;
 }
 
 static int
#3 lore raw
Quoted 8 lines · Christoph Hellwig
Quoted 7 lines · Martin Schwidefsky
Quoted 5 lines · Christoph Hellwig

Add a compat_ioctl method to the dasd driver so the last entries in arch/s390/kernel/compat_ioctl.c can go away. Unlike the previous attempt this one does not replace the ioctl method with an unlocked_ioctl method so that the ioctl_by_bdev calls in s390 partition code continue to work.

Quoted 7 lines
Quoted 4 lines

Looks better but still doesn't work. The dasd driver specific ioctls do work but there are some generic ones that are only available on the normal ioctl path, including BLKFLSBUF, BLKROSET and HDIO_GETGEO. That makes e.g. the 32 bit version of fdasd fail with "IOCTL error".

Sorry, that's the ENOIOCTLCMD thing again, I forgot it in the first revision of the last patch aswell.

Oh yes, I should have remember that fix. It works fine now.

Signature · 6 lines
blue skies,
   Martin

Martin Schwidefsky
Linux for zSeries Development & Services
IBM Deutschland Entwicklung GmbH