arch/um/drivers/ubd_kern.c      |   10 +++++-----
 drivers/acorn/block/fd1772.c    |    6 ++----
 drivers/acorn/block/mfmhd.c     |    6 +++---
 drivers/block/DAC960.c          |    6 +++---
 drivers/block/acsi.c            |   10 +++++-----
 drivers/block/amiflop.c         |    9 +++++----
 drivers/block/ataflop.c         |    8 ++++----
 drivers/block/cciss.c           |    7 +++----
 drivers/block/cpqarray.c        |   12 ++++++------
 drivers/block/floppy.c          |   10 +++++-----
 drivers/block/floppy98.c        |   10 +++++-----
 drivers/block/ioctl.c           |    6 +++---
 drivers/block/loop.c            |    8 ++++----
 drivers/block/nbd.c             |   22 +++++++++++-----------
 drivers/block/paride/pcd.c      |    6 +++---
 drivers/block/paride/pd.c       |    8 ++++----
 drivers/block/paride/pf.c       |    6 +++---
 drivers/block/ps2esdi.c         |    8 ++++----
 drivers/block/rd.c              |    3 +--
 drivers/block/swim3.c           |    6 +++---
 drivers/block/swim_iop.c        |    6 +++---
 drivers/block/umem.c            |    6 +++---
 drivers/block/xd.c              |    6 +++---
 drivers/block/xd.h              |    2 +-
 drivers/cdrom/aztcd.c           |    6 ++----
 drivers/cdrom/cdu31a.c          |    4 ++--
 drivers/cdrom/cm206.c           |    4 ++--
 drivers/cdrom/gscd.c            |    6 +++---
 drivers/cdrom/mcd.c             |    4 ++--
 drivers/cdrom/mcdx.c            |    6 +++---
 drivers/cdrom/optcd.c           |    5 +----
 drivers/cdrom/sbpcd.c           |    6 +++---
 drivers/cdrom/sjcd.c            |    5 +----
 drivers/cdrom/sonycd535.c       |    2 +-
 drivers/ide/ide-cd.c            |    5 ++---
 drivers/ide/ide-disk.c          |    3 +--
 drivers/ide/ide-floppy.c        |    3 +--
 drivers/ide/ide-tape.c          |    3 +--
 drivers/ide/legacy/hd.c         |    6 +++---
 drivers/ide/legacy/hd98.c       |    6 +++---
 drivers/md/md.c                 |   12 +++---------
 drivers/message/i2o/i2o_block.c |    6 +++---
 drivers/mtd/mtd_blkdevs.c       |    6 +++---
 drivers/s390/block/dasd_int.h   |    2 +-
 drivers/s390/block/dasd_ioctl.c |    3 +--
 drivers/s390/block/xpram.c      |    2 +-
 drivers/scsi/ide-scsi.c         |    3 +--
 drivers/scsi/sd.c               |    3 +--
 drivers/scsi/sr.c               |    8 ++++----
 include/linux/fs.h              |    2 +-
 50 files changed, 142 insertions(+), 166 deletions(-)

diff -puN arch/um/drivers/ubd_kern.c~RD2-ioctl-B6 arch/um/drivers/ubd_kern.c
--- 25/arch/um/drivers/ubd_kern.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/arch/um/drivers/ubd_kern.c	2003-12-29 23:01:54.000000000 -0800
@@ -51,7 +51,7 @@ static void (*do_ubd)(void);
 
 static int ubd_open(struct inode * inode, struct file * filp);
 static int ubd_release(struct inode * inode, struct file * file);
-static int ubd_ioctl(struct inode * inode, struct file * file,
+static int ubd_ioctl(struct block_device *bdev, struct file * file,
 		     unsigned int cmd, unsigned long arg);
 
 #define MAX_DEV (8)
@@ -865,11 +865,11 @@ static void do_ubd_request(request_queue
 	}
 }
 
-static int ubd_ioctl(struct inode * inode, struct file * file,
+static int ubd_ioctl(struct block_device *bdev, struct file * file,
 		     unsigned int cmd, unsigned long arg)
 {
 	struct hd_geometry *loc = (struct hd_geometry *) arg;
-	struct ubd *dev = inode->i_bdev->bd_disk->private_data;
+	struct ubd *dev = bdev->bd_disk->private_data;
 	int err;
 	struct hd_driveid ubd_id = {
 		.cyls		= 0,
@@ -890,7 +890,7 @@ static int ubd_ioctl(struct inode * inod
 
 	case HDIO_SET_UNMASKINTR:
 		if(!capable(CAP_SYS_ADMIN)) return(-EACCES);
-		if((arg > 1) || (inode->i_bdev->bd_contains != inode->i_bdev))
+		if((arg > 1) || (bdev->bd_contains != bdev))
 			return(-EINVAL);
 		return(0);
 
@@ -910,7 +910,7 @@ static int ubd_ioctl(struct inode * inod
 
 	case HDIO_SET_MULTCOUNT:
 		if(!capable(CAP_SYS_ADMIN)) return(-EACCES);
-		if(inode->i_bdev->bd_contains != inode->i_bdev)
+		if(bdev->bd_contains != bdev)
 			return(-EINVAL);
 		return(0);
 
diff -puN drivers/acorn/block/fd1772.c~RD2-ioctl-B6 drivers/acorn/block/fd1772.c
--- 25/drivers/acorn/block/fd1772.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/acorn/block/fd1772.c	2003-12-29 23:01:54.000000000 -0800
@@ -365,7 +365,7 @@ static void finish_fdc_done(int dummy);
 static void floppy_off(unsigned int nr);
 static void setup_req_params(int drive);
 static void redo_fd_request(void);
-static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int
+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int
 		    cmd, unsigned long param);
 static void fd_probe(int drive);
 static int fd_test_drive_present(int drive);
@@ -1309,11 +1309,9 @@ static int invalidate_drive(struct block
 	return 0;
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp,
+static int fd_ioctl(struct block_device *bdev, struct file *filp,
 		    unsigned int cmd, unsigned long param)
 {
-	struct block_device *bdev = inode->i_bdev;
-
 	switch (cmd) {
 	case FDFMTEND:
 	case FDFLUSH:
diff -puN drivers/acorn/block/mfmhd.c~RD2-ioctl-B6 drivers/acorn/block/mfmhd.c
--- 25/drivers/acorn/block/mfmhd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/acorn/block/mfmhd.c	2003-12-29 23:01:54.000000000 -0800
@@ -1153,9 +1153,9 @@ static int mfm_initdrives(void)
  * The 'front' end of the mfm driver follows...
  */
 
-static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg)
+static int mfm_ioctl(struct block_device *bdev, struct file *file, u_int cmd, u_long arg)
 {
-	struct mfm_info *p = inode->i_bdev->bd_disk->private_data;
+	struct mfm_info *p = bdev->bd_disk->private_data;
 	struct hd_geometry *geo = (struct hd_geometry *) arg;
 	if (cmd != HDIO_GETGEO)
 		return -EINVAL;
@@ -1167,7 +1167,7 @@ static int mfm_ioctl(struct inode *inode
 		return -EFAULT;
 	if (put_user (p->cylinders, &geo->cylinders))
 		return -EFAULT;
-	if (put_user (get_start_sect(inode->i_bdev), &geo->start))
+	if (put_user (get_start_sect(bdev), &geo->start))
 		return -EFAULT;
 	return 0;
 }
diff -puN drivers/block/acsi.c~RD2-ioctl-B6 drivers/block/acsi.c
--- 25/drivers/block/acsi.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/acsi.c	2003-12-29 23:01:54.000000000 -0800
@@ -359,7 +359,7 @@ static void copy_from_acsibuffer( void )
 static void do_end_requests( void );
 static void do_acsi_request( request_queue_t * );
 static void redo_acsi_request( void );
-static int acsi_ioctl( struct inode *inode, struct file *file, unsigned int
+static int acsi_ioctl(struct block_device *bdev, struct file *file, unsigned int
                        cmd, unsigned long arg );
 static int acsi_open( struct inode * inode, struct file * filp );
 static int acsi_release( struct inode * inode, struct file * file );
@@ -1081,10 +1081,10 @@ static void redo_acsi_request( void )
  ***********************************************************************/
 
 
-static int acsi_ioctl( struct inode *inode, struct file *file,
-					   unsigned int cmd, unsigned long arg )
+static int acsi_ioctl(struct block_device *bdev, struct file *file,
+		      unsigned int cmd, unsigned long arg )
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct acsi_info_struct *aip = disk->private_data;
 	switch (cmd) {
 	  case HDIO_GETGEO:
@@ -1096,7 +1096,7 @@ static int acsi_ioctl( struct inode *ino
 	    put_user( 64, &geo->heads );
 	    put_user( 32, &geo->sectors );
 	    put_user( aip->size >> 11, &geo->cylinders );
-		put_user(get_start_sect(inode->i_bdev), &geo->start);
+		put_user(get_start_sect(bdev), &geo->start);
 		return 0;
 	  }
 	  case SCSI_IOCTL_GET_IDLUN:
diff -puN drivers/block/amiflop.c~RD2-ioctl-B6 drivers/block/amiflop.c
--- 25/drivers/block/amiflop.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/amiflop.c	2003-12-29 23:01:54.000000000 -0800
@@ -1434,10 +1434,11 @@ static void do_fd_request(request_queue_
 	redo_fd_request();
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp,
+static int fd_ioctl(struct block_device *bdev, struct file *filp,
 		    unsigned int cmd, unsigned long param)
 {
-	int drive = iminor(inode) & 3;
+	struct amiga_floppy_struct *floppy = bdev->bd_disk->private_data;
+	int drive = floppy - unit;
 	static struct floppy_struct getprm;
 
 	switch(cmd){
@@ -1459,7 +1460,7 @@ static int fd_ioctl(struct inode *inode,
 			rel_fdc();
 			return -EBUSY;
 		}
-		fsync_bdev(inode->i_bdev);
+		fsync_bdev(bdev);
 		if (fd_motor_on(drive) == 0) {
 			rel_fdc();
 			return -ENODEV;
@@ -1488,7 +1489,7 @@ static int fd_ioctl(struct inode *inode,
 		break;
 	case FDFMTEND:
 		floppy_off(drive);
-		invalidate_bdev(inode->i_bdev, 0);
+		invalidate_bdev(bdev, 0);
 		break;
 	case FDGETPRM:
 		memset((void *)&getprm, 0, sizeof (getprm));
diff -puN drivers/block/ataflop.c~RD2-ioctl-B6 drivers/block/ataflop.c
--- 25/drivers/block/ataflop.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/ataflop.c	2003-12-29 23:01:54.000000000 -0800
@@ -364,7 +364,7 @@ static void finish_fdc_done( int dummy )
 static __inline__ void copy_buffer( void *from, void *to);
 static void setup_req_params( int drive );
 static void redo_fd_request( void);
-static int fd_ioctl( struct inode *inode, struct file *filp, unsigned int
+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int
                      cmd, unsigned long param);
 static void fd_probe( int drive );
 static int fd_test_drive_present( int drive );
@@ -1496,10 +1496,10 @@ void do_fd_request(request_queue_t * q)
 	atari_enable_irq( IRQ_MFP_FDC );
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp,
+static int fd_ioctl(struct block_device *bdev, struct file *filp,
 		    unsigned int cmd, unsigned long param)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct atari_floppy_struct *floppy = disk->private_data;
 	int drive = floppy - unit;
 	int type = floppy->type;
@@ -1673,7 +1673,7 @@ static int fd_ioctl(struct inode *inode,
 		/* invalidate the buffer track to force a reread */
 		BufferDrive = -1;
 		set_bit(drive, &fake_change);
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		return 0;
 	default:
 		return -EINVAL;
diff -puN drivers/block/cciss.c~RD2-ioctl-B6 drivers/block/cciss.c
--- 25/drivers/block/cciss.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/cciss.c	2003-12-29 23:01:54.000000000 -0800
@@ -114,7 +114,7 @@ static ctlr_info_t *hba[MAX_CTLR];
 static void do_cciss_request(request_queue_t *q);
 static int cciss_open(struct inode *inode, struct file *filep);
 static int cciss_release(struct inode *inode, struct file *filep);
-static int cciss_ioctl(struct inode *inode, struct file *filep, 
+static int cciss_ioctl(struct block_device *bdev, struct file *filep,
 		unsigned int cmd, unsigned long arg);
 
 static int revalidate_allvol(ctlr_info_t *host);
@@ -407,10 +407,9 @@ static int cciss_release(struct inode *i
 /*
  * ioctl 
  */
-static int cciss_ioctl(struct inode *inode, struct file *filep, 
+static int cciss_ioctl(struct block_device *bdev, struct file *filep,
 		unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	ctlr_info_t *host = get_host(disk);
 	drive_info_struct *drv = get_drv(disk);
@@ -433,7 +432,7 @@ static int cciss_ioctl(struct inode *ino
                         driver_geo.sectors = 0x3f;
                         driver_geo.cylinders = (int)drv->nr_blocks / (0xff*0x3f);
                 }
-                driver_geo.start= get_start_sect(inode->i_bdev);
+                driver_geo.start= get_start_sect(bdev);
                 if (copy_to_user((void *) arg, &driver_geo,
                                 sizeof( struct hd_geometry)))
                         return  -EFAULT;
diff -puN drivers/block/cpqarray.c~RD2-ioctl-B6 drivers/block/cpqarray.c
--- 25/drivers/block/cpqarray.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/cpqarray.c	2003-12-29 23:01:54.000000000 -0800
@@ -130,7 +130,7 @@ static int sendcmd(
 
 static int ida_open(struct inode *inode, struct file *filep);
 static int ida_release(struct inode *inode, struct file *filep);
-static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg);
+static int ida_ioctl(struct block_device *bdev, struct file *filep, unsigned int cmd, unsigned long arg);
 static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io);
 
 static void do_ida_request(request_queue_t *q);
@@ -1022,10 +1022,10 @@ static void ida_timer(unsigned long tdat
  *  ida_ioctl does some miscellaneous stuff like reporting drive geometry,
  *  setting readahead and submitting commands from userspace to the controller.
  */
-static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
+static int ida_ioctl(struct block_device *bdev, struct file *filep, unsigned int cmd, unsigned long arg)
 {
-	drv_info_t *drv = get_drv(inode->i_bdev->bd_disk);
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
+	drv_info_t *drv = get_drv(bdev->bd_disk);
+	ctlr_info_t *host = get_host(bdev->bd_disk);
 	int error;
 	int diskinfo[4];
 	struct hd_geometry *geo = (struct hd_geometry *)arg;
@@ -1046,7 +1046,7 @@ static int ida_ioctl(struct inode *inode
 		put_user(diskinfo[0], &geo->heads);
 		put_user(diskinfo[1], &geo->sectors);
 		put_user(diskinfo[2], &geo->cylinders);
-		put_user(get_start_sect(inode->i_bdev), &geo->start);
+		put_user(get_start_sect(bdev), &geo->start);
 		return 0;
 	case IDAGETDRVINFO:
 		if (copy_to_user(&io->c.drv, drv, sizeof(drv_info_t)))
@@ -1076,7 +1076,7 @@ out_passthru:
 		put_user(host->ctlr_sig, (int*)arg);
 		return 0;
 	case IDAREVALIDATEVOLS:
-		if (iminor(inode) != 0)
+		if (bdev != bdev->bd_contains || drv != host->drv)
 			return -ENXIO;
 		return revalidate_allvol(host);
 	case IDADRIVERVERSION:
diff -puN drivers/block/DAC960.c~RD2-ioctl-B6 drivers/block/DAC960.c
--- 25/drivers/block/DAC960.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/DAC960.c	2003-12-29 23:01:54.000000000 -0800
@@ -91,10 +91,10 @@ static int DAC960_open(struct inode *ino
 	return 0;
 }
 
-static int DAC960_ioctl(struct inode *inode, struct file *file,
+static int DAC960_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	DAC960_Controller_T *p = disk->queue->queuedata;
 	int drive_nr = (long)disk->private_data;
 	struct hd_geometry g, *loc = (struct hd_geometry *)arg;
@@ -128,7 +128,7 @@ static int DAC960_ioctl(struct inode *in
 		g.cylinders = i->ConfigurableDeviceSize / (g.heads * g.sectors);
 	}
 	
-	g.start = get_start_sect(inode->i_bdev);
+	g.start = get_start_sect(bdev);
 
 	return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; 
 }
diff -puN drivers/block/floppy98.c~RD2-ioctl-B6 drivers/block/floppy98.c
--- 25/drivers/block/floppy98.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/floppy98.c	2003-12-29 23:01:54.000000000 -0800
@@ -3484,14 +3484,14 @@ static int get_floppy_geometry(int drive
 	return 0;
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int cmd,
 		    unsigned long param)
 {
 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
 #define OUT(c,x) case c: outparam = (const char *) (x); break
 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
 
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)bdev->bd_disk->private_data;
 	int i, type = ITYPE(UDRS->fd_device);
 	int ret;
 	int size;
@@ -3566,11 +3566,11 @@ static int fd_ioctl(struct inode *inode,
 			current_type[drive] = NULL;
 			floppy_sizes[drive] = MAX_DISK_SIZE << 1;
 			UDRS->keep_data = 0;
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 		case FDSETPRM:
 		case FDDEFPRM:
 			return set_geometry(cmd, & inparam.g,
-					    drive, type, inode->i_bdev);
+					    drive, type, bdev);
 		case FDGETPRM:
 			ECALL(get_floppy_geometry(drive, type, 
 						  (struct floppy_struct**)
@@ -3625,7 +3625,7 @@ static int fd_ioctl(struct inode *inode,
 		case FDFMTEND:
 		case FDFLUSH:
 			LOCK_FDC(drive,1);
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 
 		case FDSETEMSGTRESH:
 			UDP->max_errors.reporting =
diff -puN drivers/block/floppy.c~RD2-ioctl-B6 drivers/block/floppy.c
--- 25/drivers/block/floppy.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/floppy.c	2003-12-29 23:01:54.000000000 -0800
@@ -3456,14 +3456,14 @@ static int get_floppy_geometry(int drive
 	return 0;
 }
 
-static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int cmd,
 		    unsigned long param)
 {
 #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
 #define OUT(c,x) case c: outparam = (const char *) (x); break
 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
 
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)bdev->bd_disk->private_data;
 	int i, type = ITYPE(UDRS->fd_device);
 	int ret;
 	int size;
@@ -3539,11 +3539,11 @@ static int fd_ioctl(struct inode *inode,
 			current_type[drive] = NULL;
 			floppy_sizes[drive] = MAX_DISK_SIZE << 1;
 			UDRS->keep_data = 0;
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 		case FDSETPRM:
 		case FDDEFPRM:
 			return set_geometry(cmd, & inparam.g,
-					    drive, type, inode->i_bdev);
+					    drive, type, bdev);
 		case FDGETPRM:
 			ECALL(get_floppy_geometry(drive, type, 
 						  (struct floppy_struct**)
@@ -3574,7 +3574,7 @@ static int fd_ioctl(struct inode *inode,
 		case FDFMTEND:
 		case FDFLUSH:
 			LOCK_FDC(drive,1);
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 
 		case FDSETEMSGTRESH:
 			UDP->max_errors.reporting =
diff -puN drivers/block/ioctl.c~RD2-ioctl-B6 drivers/block/ioctl.c
--- 25/drivers/block/ioctl.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/ioctl.c	2003-12-29 23:01:54.000000000 -0800
@@ -194,7 +194,7 @@ int blkdev_ioctl(struct inode *inode, st
 		if (!capable(CAP_SYS_ADMIN))
 			return -EACCES;
 		if (disk->fops->ioctl) {
-			ret = disk->fops->ioctl(inode, file, cmd, arg);
+			ret = disk->fops->ioctl(bdev, file, cmd, arg);
 			if (ret != -EINVAL)
 				return ret;
 		}
@@ -203,7 +203,7 @@ int blkdev_ioctl(struct inode *inode, st
 		return 0;
 	case BLKROSET:
 		if (disk->fops->ioctl) {
-			ret = disk->fops->ioctl(inode, file, cmd, arg);
+			ret = disk->fops->ioctl(bdev, file, cmd, arg);
 			if (ret != -EINVAL)
 				return ret;
 		}
@@ -215,7 +215,7 @@ int blkdev_ioctl(struct inode *inode, st
 		return 0;
 	default:
 		if (disk->fops->ioctl)
-			return disk->fops->ioctl(inode, file, cmd, arg);
+			return disk->fops->ioctl(bdev, file, cmd, arg);
 	}
 	return -ENOTTY;
 }
diff -puN drivers/block/loop.c~RD2-ioctl-B6 drivers/block/loop.c
--- 25/drivers/block/loop.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/loop.c	2003-12-29 23:01:54.000000000 -0800
@@ -1056,19 +1056,19 @@ loop_get_status64(struct loop_device *lo
 	return err;
 }
 
-static int lo_ioctl(struct inode * inode, struct file * file,
+static int lo_ioctl(struct block_device *bdev, struct file *file,
 	unsigned int cmd, unsigned long arg)
 {
-	struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct loop_device *lo = bdev->bd_disk->private_data;
 	int err;
 
 	down(&lo->lo_ctl_mutex);
 	switch (cmd) {
 	case LOOP_SET_FD:
-		err = loop_set_fd(lo, file, inode->i_bdev, arg);
+		err = loop_set_fd(lo, file, bdev, arg);
 		break;
 	case LOOP_CLR_FD:
-		err = loop_clr_fd(lo, inode->i_bdev);
+		err = loop_clr_fd(lo, bdev);
 		break;
 	case LOOP_SET_STATUS:
 		err = loop_set_status_old(lo, (struct loop_info *) arg);
diff -puN drivers/block/nbd.c~RD2-ioctl-B6 drivers/block/nbd.c
--- 25/drivers/block/nbd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/nbd.c	2003-12-29 23:01:54.000000000 -0800
@@ -535,10 +535,10 @@ static void do_nbd_request(request_queue
 	return;
 }
 
-static int nbd_ioctl(struct inode *inode, struct file *file,
+static int nbd_ioctl(struct block_device *bdev, struct file *file,
 		     unsigned int cmd, unsigned long arg)
 {
-	struct nbd_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct nbd_device *lo = bdev->bd_disk->private_data;
 	int error;
 	struct request sreq ;
 
@@ -593,7 +593,7 @@ static int nbd_ioctl(struct inode *inode
 		error = -EINVAL;
 		file = fget(arg);
 		if (file) {
-			inode = file->f_dentry->d_inode;
+			struct inode *inode = file->f_dentry->d_inode;
 			if (inode->i_sock) {
 				lo->file = file;
 				lo->sock = SOCKET_I(inode);
@@ -606,20 +606,20 @@ static int nbd_ioctl(struct inode *inode
 	case NBD_SET_BLKSIZE:
 		lo->blksize = arg;
 		lo->bytesize &= ~(lo->blksize-1);
-		inode->i_bdev->bd_inode->i_size = lo->bytesize;
-		set_blocksize(inode->i_bdev, lo->blksize);
+		bdev->bd_inode->i_size = lo->bytesize;
+		set_blocksize(bdev, lo->blksize);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 	case NBD_SET_SIZE:
 		lo->bytesize = arg & ~(lo->blksize-1);
-		inode->i_bdev->bd_inode->i_size = lo->bytesize;
-		set_blocksize(inode->i_bdev, lo->blksize);
+		bdev->bd_inode->i_size = lo->bytesize;
+		set_blocksize(bdev, lo->blksize);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 	case NBD_SET_SIZE_BLOCKS:
 		lo->bytesize = ((u64) arg) * lo->blksize;
-		inode->i_bdev->bd_inode->i_size = lo->bytesize;
-		set_blocksize(inode->i_bdev, lo->blksize);
+		bdev->bd_inode->i_size = lo->bytesize;
+		set_blocksize(bdev, lo->blksize);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 	case NBD_DO_IT:
@@ -664,11 +664,11 @@ static int nbd_ioctl(struct inode *inode
 	case NBD_PRINT_DEBUG:
 #ifdef PARANOIA
 		printk(KERN_INFO "%s: next = %p, prev = %p. Global: in %d, out %d\n",
-			inode->i_bdev->bd_disk->disk_name, lo->queue_head.next,
+			bdev->bd_disk->disk_name, lo->queue_head.next,
 			lo->queue_head.prev, requests_in, requests_out);
 #else
 		printk(KERN_INFO "%s: next = %p, prev = %p\n",
-			inode->i_bdev->bd_disk->disk_name,
+			bdev->bd_disk->disk_name,
 			lo->queue_head.next, lo->queue_head.prev);
 #endif
 		return 0;
diff -puN drivers/block/paride/pcd.c~RD2-ioctl-B6 drivers/block/paride/pcd.c
--- 25/drivers/block/paride/pcd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/paride/pcd.c	2003-12-29 23:01:54.000000000 -0800
@@ -255,11 +255,11 @@ static int pcd_block_release(struct inod
 	return cdrom_release(&cd->info, file);
 }
 
-static int pcd_block_ioctl(struct inode *inode, struct file *file,
+static int pcd_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-	return cdrom_ioctl(&cd->info, inode->i_bdev, cmd, arg);
+	struct pcd_unit *cd = bdev->bd_disk->private_data;
+	return cdrom_ioctl(&cd->info, bdev, cmd, arg);
 }
 
 static int pcd_block_media_changed(struct gendisk *disk)
diff -puN drivers/block/paride/pd.c~RD2-ioctl-B6 drivers/block/paride/pd.c
--- 25/drivers/block/paride/pd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/paride/pd.c	2003-12-29 23:01:54.000000000 -0800
@@ -238,7 +238,7 @@ MODULE_PARM(drive3, "1-8i");
 void pd_setup(char *str, int *ints);
 static int pd_open(struct inode *inode, struct file *file);
 static void do_pd_request(request_queue_t * q);
-static int pd_ioctl(struct inode *inode, struct file *file,
+static int pd_ioctl(struct block_device *bdev, struct file *file,
 		    unsigned int cmd, unsigned long arg);
 static int pd_release(struct inode *inode, struct file *file);
 static int pd_revalidate(struct gendisk *p);
@@ -350,10 +350,10 @@ static int pd_open(struct inode *inode, 
 	return 0;
 }
 
-static int pd_ioctl(struct inode *inode, struct file *file,
+static int pd_ioctl(struct block_device *bdev, struct file *file,
 	 unsigned int cmd, unsigned long arg)
 {
-	struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
+	struct pd_unit *disk = bdev->bd_disk->private_data;
 	struct hd_geometry *geo = (struct hd_geometry *) arg;
 	struct hd_geometry g;
 
@@ -372,7 +372,7 @@ static int pd_ioctl(struct inode *inode,
 			g.sectors = disk->sectors;
 			g.cylinders = disk->cylinders;
 		}
-		g.start = get_start_sect(inode->i_bdev);
+		g.start = get_start_sect(bdev);
 		if (copy_to_user(geo, &g, sizeof(struct hd_geometry)))
 			return -EFAULT;
 		return 0;
diff -puN drivers/block/paride/pf.c~RD2-ioctl-B6 drivers/block/paride/pf.c
--- 25/drivers/block/paride/pf.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/paride/pf.c	2003-12-29 23:01:54.000000000 -0800
@@ -224,7 +224,7 @@ MODULE_PARM(drive3, "1-7i");
 
 static int pf_open(struct inode *inode, struct file *file);
 static void do_pf_request(request_queue_t * q);
-static int pf_ioctl(struct inode *inode, struct file *file,
+static int pf_ioctl(struct block_device *bdev, struct file *file,
 		    unsigned int cmd, unsigned long arg);
 
 static int pf_release(struct inode *inode, struct file *file);
@@ -334,9 +334,9 @@ static int pf_open(struct inode *inode, 
 	return 0;
 }
 
-static int pf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static int pf_ioctl(struct block_device *bdev, struct file *file, unsigned int cmd, unsigned long arg)
 {
-	struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
+	struct pf_unit *pf = bdev->bd_disk->private_data;
 	struct hd_geometry *geo = (struct hd_geometry *) arg;
 	struct hd_geometry g;
 	sector_t capacity;
diff -puN drivers/block/ps2esdi.c~RD2-ioctl-B6 drivers/block/ps2esdi.c
--- 25/drivers/block/ps2esdi.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/ps2esdi.c	2003-12-29 23:01:54.000000000 -0800
@@ -81,7 +81,7 @@ static void (*current_int_handler) (u_in
 static void ps2esdi_normal_interrupt_handler(u_int);
 static void ps2esdi_initial_reset_int_handler(u_int);
 static void ps2esdi_geometry_int_handler(u_int);
-static int ps2esdi_ioctl(struct inode *inode, struct file *file,
+static int ps2esdi_ioctl(struct block_device *bdev, struct file *file,
 			 u_int cmd, u_long arg);
 
 static int ps2esdi_read_status_words(int num_words, int max_words, u_short * buffer);
@@ -1059,10 +1059,10 @@ static void dump_cmd_complete_status(u_i
 
 }
 
-static int ps2esdi_ioctl(struct inode *inode,
+static int ps2esdi_ioctl(struct block_device *bdev,
 			 struct file *file, u_int cmd, u_long arg)
 {
-	struct ps2esdi_i_struct *p = inode->i_bdev->bd_disk->private_data;
+	struct ps2esdi_i_struct *p = bdev->bd_disk->private_data;
 	struct ps2esdi_geometry *geometry = (struct ps2esdi_geometry *) arg;
 	int err;
 
@@ -1073,7 +1073,7 @@ static int ps2esdi_ioctl(struct inode *i
 	put_user(p->head, (char *) &geometry->heads);
 	put_user(p->sect, (char *) &geometry->sectors);
 	put_user(p->cyl, (short *) &geometry->cylinders);
-	put_user(get_start_sect(inode->i_bdev), (long *) &geometry->start);
+	put_user(get_start_sect(bdev), (long *) &geometry->start);
 	return 0;
 }
 
diff -puN drivers/block/rd.c~RD2-ioctl-B6 drivers/block/rd.c
--- 25/drivers/block/rd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/rd.c	2003-12-29 23:01:54.000000000 -0800
@@ -242,10 +242,9 @@ fail:
 	return 0;
 } 
 
-static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static int rd_ioctl(struct block_device *bdev, struct file *file, unsigned int cmd, unsigned long arg)
 {
 	int error;
-	struct block_device *bdev = inode->i_bdev;
 
 	if (cmd != BLKFLSBUF)
 		return -EINVAL;
diff -puN drivers/block/swim3.c~RD2-ioctl-B6 drivers/block/swim3.c
--- 25/drivers/block/swim3.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/swim3.c	2003-12-29 23:01:54.000000000 -0800
@@ -239,7 +239,7 @@ static int grab_drive(struct floppy_stat
 		      int interruptible);
 static void release_drive(struct floppy_state *fs);
 static int fd_eject(struct floppy_state *fs);
-static int floppy_ioctl(struct inode *inode, struct file *filp,
+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
 			unsigned int cmd, unsigned long param);
 static int floppy_open(struct inode *inode, struct file *filp);
 static int floppy_release(struct inode *inode, struct file *filp);
@@ -811,10 +811,10 @@ static int fd_eject(struct floppy_state 
 static struct floppy_struct floppy_type =
 	{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL };	/*  7 1.44MB 3.5"   */
 
-static int floppy_ioctl(struct inode *inode, struct file *filp,
+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
 			unsigned int cmd, unsigned long param)
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = bdev->bd_disk->private_data;
 	int err;
 		
 	if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
diff -puN drivers/block/swim_iop.c~RD2-ioctl-B6 drivers/block/swim_iop.c
--- 25/drivers/block/swim_iop.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/swim_iop.c	2003-12-29 23:01:54.000000000 -0800
@@ -98,7 +98,7 @@ static void swimiop_receive(struct iop_m
 static void swimiop_status_update(int, struct swim_drvstatus *);
 static int swimiop_eject(struct floppy_state *fs);
 
-static int floppy_ioctl(struct inode *inode, struct file *filp,
+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
 			unsigned int cmd, unsigned long param);
 static int floppy_open(struct inode *inode, struct file *filp);
 static int floppy_release(struct inode *inode, struct file *filp);
@@ -348,10 +348,10 @@ static int swimiop_eject(struct floppy_s
 static struct floppy_struct floppy_type =
 	{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL };	/*  7 1.44MB 3.5"   */
 
-static int floppy_ioctl(struct inode *inode, struct file *filp,
+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
 			unsigned int cmd, unsigned long param)
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = bdev->bd_disk->private_data;
 	int err;
 
 	if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
diff -puN drivers/block/umem.c~RD2-ioctl-B6 drivers/block/umem.c
--- 25/drivers/block/umem.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/umem.c	2003-12-29 23:01:54.000000000 -0800
@@ -818,10 +818,10 @@ static int mm_revalidate(struct gendisk 
 --                            mm_ioctl
 -----------------------------------------------------------------------------------
 */
-static int mm_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
+static int mm_ioctl(struct block_device *bdev, struct file *f, unsigned int cmd, unsigned long arg)
 {
 	if (cmd == HDIO_GETGEO) {
-		struct cardinfo *card = i->i_bdev->bd_disk->private_data;
+		struct cardinfo *card = bdev->bd_disk->private_data;
 		int size = card->mm_size * (1024 / MM_HARDSECT);
 		struct hd_geometry geo;
 		/*
@@ -831,7 +831,7 @@ static int mm_ioctl(struct inode *i, str
 		 */
 		geo.heads     = 64;
 		geo.sectors   = 32;
-		geo.start     = get_start_sect(i->i_bdev);
+		geo.start     = get_start_sect(bdev);
 		geo.cylinders = size / (geo.heads * geo.sectors);
 
 		if (copy_to_user((void *) arg, &geo, sizeof(geo)))
diff -puN drivers/block/xd.c~RD2-ioctl-B6 drivers/block/xd.c
--- 25/drivers/block/xd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/xd.c	2003-12-29 23:01:54.000000000 -0800
@@ -322,9 +322,9 @@ static void do_xd_request (request_queue
 }
 
 /* xd_ioctl: handle device ioctl's */
-static int xd_ioctl (struct inode *inode,struct file *file,u_int cmd,u_long arg)
+static int xd_ioctl (struct block_device *bdev,struct file *file,u_int cmd,u_long arg)
 {
-	XD_INFO *p = inode->i_bdev->bd_disk->private_data;
+	XD_INFO *p = bdev->bd_disk->private_data;
 
 	switch (cmd) {
 		case HDIO_GETGEO:
@@ -334,7 +334,7 @@ static int xd_ioctl (struct inode *inode
 			g.heads = p->heads;
 			g.sectors = p->sectors;
 			g.cylinders = p->cylinders;
-			g.start = get_start_sect(inode->i_bdev);
+			g.start = get_start_sect(bdev);
 			return copy_to_user(geometry, &g, sizeof g) ? -EFAULT : 0;
 		}
 		case HDIO_SET_DMA:
diff -puN drivers/block/xd.h~RD2-ioctl-B6 drivers/block/xd.h
--- 25/drivers/block/xd.h~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/block/xd.h	2003-12-29 23:01:54.000000000 -0800
@@ -105,7 +105,7 @@ static u_char xd_detect (u_char *control
 static u_char xd_initdrives (void (*init_drive)(u_char drive));
 
 static void do_xd_request (request_queue_t * q);
-static int xd_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);
+static int xd_ioctl (struct block_device *bdev,struct file *file,unsigned int cmd,unsigned long arg);
 static int xd_readwrite (u_char operation,XD_INFO *disk,char *buffer,u_int block,u_int count);
 static void xd_recalibrate (u_char drive);
 
diff -puN drivers/cdrom/aztcd.c~RD2-ioctl-B6 drivers/cdrom/aztcd.c
--- 25/drivers/cdrom/aztcd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/aztcd.c	2003-12-29 23:01:54.000000000 -0800
@@ -330,7 +330,7 @@ static int aztGetToc(int multi);
 
 /* Kernel Interface Functions */
 static int check_aztcd_media_change(struct gendisk *disk);
-static int aztcd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
+static int aztcd_ioctl(struct block_device *bdev, struct file *fp, unsigned int cmd,
 		       unsigned long arg);
 static int aztcd_open(struct inode *ip, struct file *fp);
 static int aztcd_release(struct inode *inode, struct file *file);
@@ -1153,7 +1153,7 @@ static int check_aztcd_media_change(stru
 /*
  * Kernel IO-controls
 */
-static int aztcd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
+static int aztcd_ioctl(struct block_device *bdev, struct file *fp, unsigned int cmd,
 		       unsigned long arg)
 {
 	int i;
@@ -1171,8 +1171,6 @@ static int aztcd_ioctl(struct inode *ip,
 	       cmd, jiffies);
 	printk("aztcd Status %x\n", getAztStatus());
 #endif
-	if (!ip)
-		RETURNM("aztcd_ioctl 1", -EINVAL);
 	if (getAztStatus() < 0)
 		RETURNM("aztcd_ioctl 2", -EIO);
 	if ((!aztTocUpToDate) || (aztDiskChanged)) {
diff -puN drivers/cdrom/cdu31a.c~RD2-ioctl-B6 drivers/cdrom/cdu31a.c
--- 25/drivers/cdrom/cdu31a.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/cdu31a.c	2003-12-29 23:01:54.000000000 -0800
@@ -3177,10 +3177,10 @@ static int scd_block_release(struct inod
 	return cdrom_release(&scd_info, file);
 }
 
-static int scd_block_ioctl(struct inode *inode, struct file *file,
+static int scd_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	return cdrom_ioctl(&scd_info, inode->i_bdev, cmd, arg);
+	return cdrom_ioctl(&scd_info, bdev, cmd, arg);
 }
 
 static int scd_block_media_changed(struct gendisk *disk)
diff -puN drivers/cdrom/cm206.c~RD2-ioctl-B6 drivers/cdrom/cm206.c
--- 25/drivers/cdrom/cm206.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/cm206.c	2003-12-29 23:01:54.000000000 -0800
@@ -1360,10 +1360,10 @@ static int cm206_block_release(struct in
 	return cdrom_release(&cm206_info, file);
 }
 
-static int cm206_block_ioctl(struct inode *inode, struct file *file,
+static int cm206_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	return cdrom_ioctl(&cm206_info, inode->i_bdev, cmd, arg);
+	return cdrom_ioctl(&cm206_info, bdev, cmd, arg);
 }
 
 static int cm206_block_media_changed(struct gendisk *disk)
diff -puN drivers/cdrom/gscd.c~RD2-ioctl-B6 drivers/cdrom/gscd.c
--- 25/drivers/cdrom/gscd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/gscd.c	2003-12-29 23:01:54.000000000 -0800
@@ -91,7 +91,7 @@ static void gscd_bin2bcd(unsigned char *
 /* Schnittstellen zum Kern/FS */
 
 static void __do_gscd_request(unsigned long dummy);
-static int gscd_ioctl(struct inode *, struct file *, unsigned int,
+static int gscd_ioctl(struct block_device *, struct file *, unsigned int,
 		      unsigned long);
 static int gscd_open(struct inode *, struct file *);
 static int gscd_release(struct inode *, struct file *);
@@ -190,8 +190,8 @@ __setup("gscd=", gscd_setup);
 
 #endif
 
-static int gscd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
-		      unsigned long arg)
+static int gscd_ioctl(struct block_device *bdev, struct file *fp,
+			unsigned int cmd, unsigned long arg)
 {
 	unsigned char to_do[10];
 	unsigned char dummy;
diff -puN drivers/cdrom/mcd.c~RD2-ioctl-B6 drivers/cdrom/mcd.c
--- 25/drivers/cdrom/mcd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/mcd.c	2003-12-29 23:01:54.000000000 -0800
@@ -224,10 +224,10 @@ static int mcd_block_release(struct inod
 	return cdrom_release(&mcd_info, file);
 }
 
-static int mcd_block_ioctl(struct inode *inode, struct file *file,
+static int mcd_block_ioctl(struct struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	return cdrom_ioctl(&mcd_info, inode->i_bdev, cmd, arg);
+	return cdrom_ioctl(&mcd_info, bdev, cmd, arg);
 }
 
 static int mcd_block_media_changed(struct gendisk *disk)
diff -puN drivers/cdrom/mcdx.c~RD2-ioctl-B6 drivers/cdrom/mcdx.c
--- 25/drivers/cdrom/mcdx.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/mcdx.c	2003-12-29 23:01:54.000000000 -0800
@@ -233,11 +233,11 @@ static int mcdx_block_release(struct ino
 	return cdrom_release(&p->info, file);
 }
 
-static int mcdx_block_ioctl(struct inode *inode, struct file *file,
+static int mcdx_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	struct s_drive_stuff *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_ioctl(&p->info, inode->i_bdev, cmd, arg);
+	struct s_drive_stuff *p = bdev->bd_disk->private_data;
+	return cdrom_ioctl(&p->info, bdev, cmd, arg);
 }
 
 static int mcdx_block_media_changed(struct gendisk *disk)
diff -puN drivers/cdrom/optcd.c~RD2-ioctl-B6 drivers/cdrom/optcd.c
--- 25/drivers/cdrom/optcd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/optcd.c	2003-12-29 23:01:54.000000000 -0800
@@ -1713,16 +1713,13 @@ static int cdromreset(void)
 /* VFS calls */
 
 
-static int opt_ioctl(struct inode *ip, struct file *fp,
+static int opt_ioctl(struct block_device *bdev, struct file *fp,
                      unsigned int cmd, unsigned long arg)
 {
 	int status, err, retval = 0;
 
 	DEBUG((DEBUG_VFS, "starting opt_ioctl"));
 
-	if (!ip)
-		return -EINVAL;
-
 	if (cmd == CDROMRESET)
 		return cdromreset();
 
diff -puN drivers/cdrom/sbpcd.c~RD2-ioctl-B6 drivers/cdrom/sbpcd.c
--- 25/drivers/cdrom/sbpcd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/sbpcd.c	2003-12-29 23:01:54.000000000 -0800
@@ -5368,11 +5368,11 @@ static int sbpcd_block_release(struct in
 	return cdrom_release(p->sbpcd_infop, file);
 }
 
-static int sbpcd_block_ioctl(struct inode *inode, struct file *file,
+static int sbpcd_block_ioctl(struct block_device *bdev, struct file *file,
 				unsigned cmd, unsigned long arg)
 {
-	struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
-	return cdrom_ioctl(p->sbpcd_infop, inode->i_bdev, cmd, arg);
+	struct sbpcd_drive *p = bdev->bd_disk->private_data;
+	return cdrom_ioctl(p->sbpcd_infop, bdev, cmd, arg);
 }
 
 static int sbpcd_block_media_changed(struct gendisk *disk)
diff -puN drivers/cdrom/sjcd.c~RD2-ioctl-B6 drivers/cdrom/sjcd.c
--- 25/drivers/cdrom/sjcd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/sjcd.c	2003-12-29 23:01:54.000000000 -0800
@@ -713,16 +713,13 @@ static int sjcd_tray_open(void)
 /*
  * Do some user commands.
  */
-static int sjcd_ioctl(struct inode *ip, struct file *fp,
+static int sjcd_ioctl(struct block_device *bdev, struct file *fp,
 		      unsigned int cmd, unsigned long arg)
 {
 #if defined( SJCD_TRACE )
 	printk("SJCD:ioctl\n");
 #endif
 
-	if (ip == NULL)
-		return (-EINVAL);
-
 	sjcd_get_status();
 	if (!sjcd_status_valid)
 		return (-EIO);
diff -puN drivers/cdrom/sonycd535.c~RD2-ioctl-B6 drivers/cdrom/sonycd535.c
--- 25/drivers/cdrom/sonycd535.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/cdrom/sonycd535.c	2003-12-29 23:01:54.000000000 -0800
@@ -1061,7 +1061,7 @@ sony_get_subchnl_info(long arg)
  * The big ugly ioctl handler.
  */
 static int
-cdu_ioctl(struct inode *inode,
+cdu_ioctl(struct block_device *bdev,
 		  struct file *file,
 		  unsigned int cmd,
 		  unsigned long arg)
diff -puN drivers/ide/ide-cd.c~RD2-ioctl-B6 drivers/ide/ide-cd.c
--- 25/drivers/ide/ide-cd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/ide/ide-cd.c	2003-12-29 23:01:54.000000000 -0800
@@ -3360,15 +3360,14 @@ static int idecd_release(struct inode * 
 	return 0;
 }
 
-static int idecd_ioctl (struct inode *inode, struct file *file,
+static int idecd_ioctl (struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	ide_drive_t *drive = bdev->bd_disk->private_data;
 	int err = generic_ide_ioctl(bdev, cmd, arg);
 	if (err == -EINVAL) {
 		struct cdrom_info *info = drive->driver_data;
-		err = cdrom_ioctl(&info->devinfo, inode->i_bdev, cmd, arg);
+		err = cdrom_ioctl(&info->devinfo, bdev, cmd, arg);
 	}
 	return err;
 }
diff -puN drivers/ide/ide-disk.c~RD2-ioctl-B6 drivers/ide/ide-disk.c
--- 25/drivers/ide/ide-disk.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/ide/ide-disk.c	2003-12-29 23:01:54.000000000 -0800
@@ -1798,10 +1798,9 @@ static int idedisk_release(struct inode 
 	return 0;
 }
 
-static int idedisk_ioctl(struct inode *inode, struct file *file,
+static int idedisk_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	return generic_ide_ioctl(bdev, cmd, arg);
 }
 
diff -puN drivers/ide/ide-floppy.c~RD2-ioctl-B6 drivers/ide/ide-floppy.c
--- 25/drivers/ide/ide-floppy.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/ide/ide-floppy.c	2003-12-29 23:01:54.000000000 -0800
@@ -1938,10 +1938,9 @@ static int idefloppy_release(struct inod
 	return 0;
 }
 
-static int idefloppy_ioctl(struct inode *inode, struct file *file,
+static int idefloppy_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	ide_drive_t *drive = bdev->bd_disk->private_data;
 	idefloppy_floppy_t *floppy = drive->driver_data;
 	int err = generic_ide_ioctl(bdev, cmd, arg);
diff -puN drivers/ide/ide-tape.c~RD2-ioctl-B6 drivers/ide/ide-tape.c
--- 25/drivers/ide/ide-tape.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/ide/ide-tape.c	2003-12-29 23:01:54.000000000 -0800
@@ -6403,10 +6403,9 @@ static int idetape_release(struct inode 
 	return 0;
 }
 
-static int idetape_ioctl(struct inode *inode, struct file *file,
+static int idetape_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	ide_drive_t *drive = bdev->bd_disk->private_data;
 	int err = generic_ide_ioctl(bdev, cmd, arg);
 	if (err == -EINVAL)
diff -puN drivers/ide/legacy/hd98.c~RD2-ioctl-B6 drivers/ide/legacy/hd98.c
--- 25/drivers/ide/legacy/hd98.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/ide/legacy/hd98.c	2003-12-29 23:01:54.000000000 -0800
@@ -652,10 +652,10 @@ static void do_hd_request (request_queue
 	enable_irq(HD_IRQ);
 }
 
-static int hd_ioctl(struct inode * inode, struct file * file,
+static int hd_ioctl(struct block_device *bdev, struct file *file,
 	unsigned int cmd, unsigned long arg)
 {
-	struct hd_i_struct *disk = inode->i_bdev->bd_disk->private_data;
+	struct hd_i_struct *disk = bdev->bd_disk->private_data;
 	struct hd_geometry *loc = (struct hd_geometry *) arg;
 	struct hd_geometry g; 
 
@@ -666,7 +666,7 @@ static int hd_ioctl(struct inode * inode
 	g.heads = disk->head;
 	g.sectors = disk->sect;
 	g.cylinders = disk->cyl;
-	g.start = get_start_sect(inode->i_bdev);
+	g.start = get_start_sect(bdev);
 	return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; 
 }
 
diff -puN drivers/ide/legacy/hd.c~RD2-ioctl-B6 drivers/ide/legacy/hd.c
--- 25/drivers/ide/legacy/hd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/ide/legacy/hd.c	2003-12-29 23:01:54.000000000 -0800
@@ -656,10 +656,10 @@ static void do_hd_request (request_queue
 	enable_irq(HD_IRQ);
 }
 
-static int hd_ioctl(struct inode * inode, struct file * file,
+static int hd_ioctl(struct block_device *bdev, struct file *file,
 	unsigned int cmd, unsigned long arg)
 {
-	struct hd_i_struct *disk = inode->i_bdev->bd_disk->private_data;
+	struct hd_i_struct *disk = bdev->bd_disk->private_data;
 	struct hd_geometry *loc = (struct hd_geometry *) arg;
 	struct hd_geometry g; 
 
@@ -670,7 +670,7 @@ static int hd_ioctl(struct inode * inode
 	g.heads = disk->head;
 	g.sectors = disk->sect;
 	g.cylinders = disk->cyl;
-	g.start = get_start_sect(inode->i_bdev);
+	g.start = get_start_sect(bdev);
 	return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; 
 }
 
diff -puN drivers/md/md.c~RD2-ioctl-B6 drivers/md/md.c
--- 25/drivers/md/md.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/md/md.c	2003-12-29 23:01:54.000000000 -0800
@@ -2360,11 +2360,10 @@ static int set_disk_faulty(mddev_t *mdde
 	return 1;
 }
 
-static int md_ioctl(struct inode *inode, struct file *file,
+static int md_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
 	char b[BDEVNAME_SIZE];
-	unsigned int minor = iminor(inode);
 	int err = 0;
 	struct hd_geometry *loc = (struct hd_geometry *) arg;
 	mddev_t *mddev = NULL;
@@ -2372,11 +2371,6 @@ static int md_ioctl(struct inode *inode,
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
 
-	if (minor >= MAX_MD_DEVS) {
-		MD_BUG();
-		return -EINVAL;
-	}
-
 	/*
 	 * Commands dealing with the RAID driver but not any
 	 * particular array:
@@ -2405,7 +2399,7 @@ static int md_ioctl(struct inode *inode,
 	 * Commands creating/starting a new array:
 	 */
 
-	mddev = inode->i_bdev->bd_inode->u.generic_ip;
+	mddev = bdev->bd_inode->u.generic_ip;
 
 	if (!mddev) {
 		BUG();
@@ -2527,7 +2521,7 @@ static int md_ioctl(struct inode *inode,
 						(short *) &loc->cylinders);
 			if (err)
 				goto abort_unlock;
-			err = put_user (get_start_sect(inode->i_bdev),
+			err = put_user (get_start_sect(bdev),
 						(long *) &loc->start);
 			goto done_unlock;
 	}
diff -puN drivers/message/i2o/i2o_block.c~RD2-ioctl-B6 drivers/message/i2o/i2o_block.c
--- 25/drivers/message/i2o/i2o_block.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/message/i2o/i2o_block.c	2003-12-29 23:01:54.000000000 -0800
@@ -885,10 +885,10 @@ static void i2o_block_biosparam(
  *	Issue device specific ioctl calls.
  */
 
-static int i2ob_ioctl(struct inode *inode, struct file *file,
+static int i2ob_ioctl(struct block_device *bdev, struct file *file,
 		     unsigned int cmd, unsigned long arg)
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct i2ob_device *dev = disk->private_data;
 
 	/* Anyone capable of this syscall can do *real bad* things */
@@ -901,7 +901,7 @@ static int i2ob_ioctl(struct inode *inod
 			struct hd_geometry g;
 			i2o_block_biosparam(get_capacity(disk), 
 					&g.cylinders, &g.heads, &g.sectors);
-			g.start = get_start_sect(inode->i_bdev);
+			g.start = get_start_sect(bdev);
 			return copy_to_user((void *)arg,&g, sizeof(g))?-EFAULT:0;
 		}
 		
diff -puN drivers/mtd/mtd_blkdevs.c~RD2-ioctl-B6 drivers/mtd/mtd_blkdevs.c
--- 25/drivers/mtd/mtd_blkdevs.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/mtd/mtd_blkdevs.c	2003-12-29 23:01:54.000000000 -0800
@@ -194,10 +194,10 @@ int blktrans_release(struct inode *i, st
 }
 
 
-static int blktrans_ioctl(struct inode *inode, struct file *file, 
+static int blktrans_ioctl(struct block_device *bdev, struct file *file,
 			      unsigned int cmd, unsigned long arg)
 {
-	struct mtd_blktrans_dev *dev = inode->i_bdev->bd_disk->private_data;
+	struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data;
 	struct mtd_blktrans_ops *tr = dev->tr;
 
 	switch (cmd) {
@@ -217,7 +217,7 @@ static int blktrans_ioctl(struct inode *
 			if (ret)
 				return ret;
 
-			g.start = get_start_sect(inode->i_bdev);
+			g.start = get_start_sect(bdev);
 			if (copy_to_user((void *)arg, &g, sizeof(g)))
 				return -EFAULT;
 			return 0;
diff -puN drivers/s390/block/dasd_int.h~RD2-ioctl-B6 drivers/s390/block/dasd_int.h
--- 25/drivers/s390/block/dasd_int.h~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/s390/block/dasd_int.h	2003-12-29 23:01:54.000000000 -0800
@@ -493,7 +493,7 @@ int  dasd_ioctl_init(void);
 void dasd_ioctl_exit(void);
 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);
+int  dasd_ioctl(struct block_device *, struct file *, unsigned int, unsigned long);
 
 /* externals in dasd_proc.c */
 int dasd_proc_init(void);
diff -puN drivers/s390/block/dasd_ioctl.c~RD2-ioctl-B6 drivers/s390/block/dasd_ioctl.c
--- 25/drivers/s390/block/dasd_ioctl.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/s390/block/dasd_ioctl.c	2003-12-29 23:01:54.000000000 -0800
@@ -78,10 +78,9 @@ dasd_ioctl_no_unregister(struct module *
 }
 
 int
-dasd_ioctl(struct inode *inp, struct file *filp,
+dasd_ioctl(struct block_device *bdev, struct file *filp,
 	   unsigned int no, unsigned long data)
 {
-	struct block_device *bdev = inp->i_bdev;
 	struct dasd_device *device = bdev->bd_disk->private_data;
 	struct dasd_ioctl *ioctl;
 	const char *dir;
diff -puN drivers/s390/block/xpram.c~RD2-ioctl-B6 drivers/s390/block/xpram.c
--- 25/drivers/s390/block/xpram.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/s390/block/xpram.c	2003-12-29 23:01:54.000000000 -0800
@@ -328,7 +328,7 @@ fail:
 	return 0;
 }
 
-static int xpram_ioctl (struct inode *inode, struct file *filp,
+static int xpram_ioctl (struct block_device *bdev, struct file *filp,
 		 unsigned int cmd, unsigned long arg)
 {
 	struct hd_geometry *geo;
diff -puN drivers/scsi/ide-scsi.c~RD2-ioctl-B6 drivers/scsi/ide-scsi.c
--- 25/drivers/scsi/ide-scsi.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/scsi/ide-scsi.c	2003-12-29 23:01:54.000000000 -0800
@@ -650,10 +650,9 @@ static int idescsi_ide_release(struct in
 	return 0;
 }
 
-static int idescsi_ide_ioctl(struct inode *inode, struct file *file,
+static int idescsi_ide_ioctl(struct block_device *bdev, struct file *file,
 			unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	return generic_ide_ioctl(bdev, cmd, arg);
 }
 
diff -puN drivers/scsi/sd.c~RD2-ioctl-B6 drivers/scsi/sd.c
--- 25/drivers/scsi/sd.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/scsi/sd.c	2003-12-29 23:01:54.000000000 -0800
@@ -518,10 +518,9 @@ static int sd_hdio_getgeo(struct block_d
  *	Note: most ioctls are forward onto the block subsystem or further
  *	down in the scsi subsytem.
  **/
-static int sd_ioctl(struct inode * inode, struct file * filp, 
+static int sd_ioctl(struct block_device *bdev, struct file *filp,
 		    unsigned int cmd, unsigned long arg)
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	struct scsi_device *sdp = scsi_disk(disk)->device;
 	int error;
diff -puN drivers/scsi/sr.c~RD2-ioctl-B6 drivers/scsi/sr.c
--- 25/drivers/scsi/sr.c~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/drivers/scsi/sr.c	2003-12-29 23:01:54.000000000 -0800
@@ -425,10 +425,10 @@ static int sr_block_release(struct inode
 	return cdrom_release(&cd->cdi, file);
 }
 
-static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
-			  unsigned long arg)
+static int sr_block_ioctl(struct block_device *bdev, struct file *file,
+			  unsigned cmd, unsigned long arg)
 {
-	struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
+	struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
 	struct scsi_device *sdev = cd->device;
 
         /*
@@ -440,7 +440,7 @@ static int sr_block_ioctl(struct inode *
                 case SCSI_IOCTL_GET_BUS_NUMBER:
                         return scsi_ioctl(sdev, cmd, (void *)arg);
 	}
-	return cdrom_ioctl(&cd->cdi, inode->i_bdev, cmd, arg);
+	return cdrom_ioctl(&cd->cdi, bdev, cmd, arg);
 }
 
 static int sr_block_media_changed(struct gendisk *disk)
diff -puN include/linux/fs.h~RD2-ioctl-B6 include/linux/fs.h
--- 25/include/linux/fs.h~RD2-ioctl-B6	2003-12-29 23:01:54.000000000 -0800
+++ 25-akpm/include/linux/fs.h	2003-12-29 23:01:54.000000000 -0800
@@ -761,7 +761,7 @@ typedef int (*filldir_t)(void *, const c
 struct block_device_operations {
 	int (*open) (struct inode *, struct file *);
 	int (*release) (struct inode *, struct file *);
-	int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);
+	int (*ioctl) (struct block_device *, struct file *, unsigned, unsigned long);
 	int (*media_changed) (struct gendisk *);
 	int (*revalidate_disk) (struct gendisk *);
 	struct module *owner;

_