Browse Source

Merge git://git.kernel.org/pub/scm/linux/kernel/git/viro/bdev

* git://git.kernel.org/pub/scm/linux/kernel/git/viro/bdev: (66 commits)
  [PATCH] kill the rest of struct file propagation in block ioctls
  [PATCH] get rid of struct file use in blkdev_ioctl() BLKBSZSET
  [PATCH] get rid of blkdev_locked_ioctl()
  [PATCH] get rid of blkdev_driver_ioctl()
  [PATCH] sanitize blkdev_get() and friends
  [PATCH] remember mode of reiserfs journal
  [PATCH] propagate mode through swsusp_close()
  [PATCH] propagate mode through open_bdev_excl/close_bdev_excl
  [PATCH] pass fmode_t to blkdev_put()
  [PATCH] kill the unused bsize on the send side of /dev/loop
  [PATCH] trim file propagation in block/compat_ioctl.c
  [PATCH] end of methods switch: remove the old ones
  [PATCH] switch sr
  [PATCH] switch sd
  [PATCH] switch ide-scsi
  [PATCH] switch tape_block
  [PATCH] switch dcssblk
  [PATCH] switch dasd
  [PATCH] switch mtd_blkdevs
  [PATCH] switch mmc
  ...
Linus Torvalds 17 years ago
parent
commit
2248485640
100 changed files with 850 additions and 976 deletions
  1. 9 10
      arch/um/drivers/ubd_kern.c
  2. 5 4
      block/bsg.c
  3. 1 1
      block/cmd-filter.c
  4. 70 105
      block/compat_ioctl.c
  5. 89 84
      block/ioctl.c
  6. 14 19
      block/scsi_ioctl.c
  7. 3 3
      drivers/block/DAC960.c
  8. 24 22
      drivers/block/amiflop.c
  9. 4 8
      drivers/block/aoe/aoeblk.c
  10. 18 19
      drivers/block/ataflop.c
  11. 2 3
      drivers/block/brd.c
  12. 36 35
      drivers/block/cciss.c
  13. 14 14
      drivers/block/cpqarray.c
  14. 24 30
      drivers/block/floppy.c
  15. 30 29
      drivers/block/loop.c
  16. 14 14
      drivers/block/nbd.c
  17. 11 10
      drivers/block/paride/pcd.c
  18. 7 7
      drivers/block/paride/pd.c
  19. 11 11
      drivers/block/paride/pf.c
  20. 1 1
      drivers/block/paride/pt.c
  21. 28 28
      drivers/block/pktcdvd.c
  22. 16 16
      drivers/block/swim3.c
  23. 10 12
      drivers/block/ub.c
  24. 5 5
      drivers/block/viodasd.c
  25. 4 4
      drivers/block/virtio_blk.c
  26. 2 2
      drivers/block/xd.c
  27. 1 1
      drivers/block/xd.h
  28. 7 8
      drivers/block/xen-blkfront.c
  29. 5 6
      drivers/block/xsysace.c
  30. 3 4
      drivers/block/z2ram.c
  31. 11 12
      drivers/cdrom/cdrom.c
  32. 7 7
      drivers/cdrom/gdrom.c
  33. 11 10
      drivers/cdrom/viocd.c
  34. 3 3
      drivers/char/nvram.c
  35. 4 4
      drivers/char/raw.c
  36. 9 13
      drivers/ide/ide-cd.c
  37. 1 1
      drivers/ide/ide-disk.h
  38. 2 3
      drivers/ide/ide-disk_ioctl.c
  39. 2 2
      drivers/ide/ide-floppy.h
  40. 8 9
      drivers/ide/ide-floppy_ioctl.c
  41. 9 11
      drivers/ide/ide-gd.c
  42. 1 2
      drivers/ide/ide-ioctls.c
  43. 6 11
      drivers/ide/ide-tape.c
  44. 2 2
      drivers/md/dm-ioctl.c
  45. 2 11
      drivers/md/dm-linear.c
  46. 4 10
      drivers/md/dm-mpath.c
  47. 8 8
      drivers/md/dm-table.c
  48. 8 19
      drivers/md/dm.c
  49. 10 10
      drivers/md/md.c
  50. 4 5
      drivers/memstick/core/mspro_block.c
  51. 6 7
      drivers/message/i2o/i2o_block.c
  52. 6 7
      drivers/mmc/card/block.c
  53. 2 2
      drivers/mtd/devices/block2mtd.c
  54. 9 15
      drivers/mtd/mtd_blkdevs.c
  55. 5 5
      drivers/mtd/mtdchar.c
  56. 1 1
      drivers/parisc/eisa_eeprom.c
  57. 4 7
      drivers/s390/block/dasd.c
  58. 2 2
      drivers/s390/block/dasd_genhd.c
  59. 1 2
      drivers/s390/block/dasd_int.h
  60. 1 14
      drivers/s390/block/dasd_ioctl.c
  61. 8 9
      drivers/s390/block/dcssblk.c
  62. 11 14
      drivers/s390/char/tape_block.c
  63. 8 14
      drivers/scsi/ide-scsi.c
  64. 3 3
      drivers/scsi/scsi_ioctl.c
  65. 15 20
      drivers/scsi/sd.c
  66. 1 1
      drivers/scsi/sg.c
  67. 17 23
      drivers/scsi/sr.c
  68. 4 3
      drivers/scsi/st.c
  69. 49 62
      fs/block_dev.c
  70. 1 0
      fs/ext2/xip.c
  71. 2 2
      fs/ext3/super.c
  72. 2 2
      fs/ext4/super.c
  73. 3 3
      fs/fifo.c
  74. 2 2
      fs/file_table.c
  75. 3 2
      fs/hostfs/hostfs_kern.c
  76. 2 2
      fs/jfs/jfs_logmgr.c
  77. 2 1
      fs/locks.c
  78. 3 3
      fs/ocfs2/cluster/heartbeat.c
  79. 1 1
      fs/open.c
  80. 2 2
      fs/partitions/check.c
  81. 2 2
      fs/proc/base.c
  82. 7 4
      fs/reiserfs/journal.c
  83. 10 4
      fs/super.c
  84. 2 2
      fs/xfs/linux-2.6/xfs_super.c
  85. 22 5
      include/linux/blkdev.h
  86. 5 5
      include/linux/cdrom.h
  87. 5 6
      include/linux/device-mapper.h
  88. 2 2
      include/linux/file.h
  89. 20 29
      include/linux/fs.h
  90. 1 1
      include/linux/fsnotify.h
  91. 3 4
      include/linux/ide.h
  92. 1 0
      include/linux/reiserfs_fs_sb.h
  93. 1 0
      include/linux/types.h
  94. 1 1
      include/scsi/scsi_ioctl.h
  95. 1 1
      ipc/shm.c
  96. 1 1
      kernel/power/disk.c
  97. 1 1
      kernel/power/power.h
  98. 7 7
      kernel/power/swap.c
  99. 1 1
      sound/core/oss/pcm_oss.c
  100. 1 1
      sound/oss/au1550_ac97.c

+ 9 - 10
arch/um/drivers/ubd_kern.c

@@ -98,9 +98,9 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data)
 
 
 static DEFINE_MUTEX(ubd_lock);
 static DEFINE_MUTEX(ubd_lock);
 
 
-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_open(struct block_device *bdev, fmode_t mode);
+static int ubd_release(struct gendisk *disk, fmode_t mode);
+static int ubd_ioctl(struct block_device *bdev, fmode_t mode,
 		     unsigned int cmd, unsigned long arg);
 		     unsigned int cmd, unsigned long arg);
 static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 
 
@@ -1112,9 +1112,9 @@ static int __init ubd_driver_init(void){
 
 
 device_initcall(ubd_driver_init);
 device_initcall(ubd_driver_init);
 
 
-static int ubd_open(struct inode *inode, struct file *filp)
+static int ubd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct ubd *ubd_dev = disk->private_data;
 	struct ubd *ubd_dev = disk->private_data;
 	int err = 0;
 	int err = 0;
 
 
@@ -1131,7 +1131,7 @@ static int ubd_open(struct inode *inode, struct file *filp)
 
 
 	/* This should no more be needed. And it didn't work anyway to exclude
 	/* This should no more be needed. And it didn't work anyway to exclude
 	 * read-write remounting of filesystems.*/
 	 * read-write remounting of filesystems.*/
-	/*if((filp->f_mode & FMODE_WRITE) && !ubd_dev->openflags.w){
+	/*if((mode & FMODE_WRITE) && !ubd_dev->openflags.w){
 	        if(--ubd_dev->count == 0) ubd_close_dev(ubd_dev);
 	        if(--ubd_dev->count == 0) ubd_close_dev(ubd_dev);
 	        err = -EROFS;
 	        err = -EROFS;
 	}*/
 	}*/
@@ -1139,9 +1139,8 @@ static int ubd_open(struct inode *inode, struct file *filp)
 	return err;
 	return err;
 }
 }
 
 
-static int ubd_release(struct inode * inode, struct file * file)
+static int ubd_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct ubd *ubd_dev = disk->private_data;
 	struct ubd *ubd_dev = disk->private_data;
 
 
 	if(--ubd_dev->count == 0)
 	if(--ubd_dev->count == 0)
@@ -1306,10 +1305,10 @@ static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return 0;
 	return 0;
 }
 }
 
 
-static int ubd_ioctl(struct inode * inode, struct file * file,
+static int ubd_ioctl(struct block_device *bdev, fmode_t mode,
 		     unsigned int cmd, unsigned long arg)
 		     unsigned int cmd, unsigned long arg)
 {
 {
-	struct ubd *ubd_dev = inode->i_bdev->bd_disk->private_data;
+	struct ubd *ubd_dev = bdev->bd_disk->private_data;
 	struct hd_driveid ubd_id = {
 	struct hd_driveid ubd_id = {
 		.cyls		= 0,
 		.cyls		= 0,
 		.heads		= 128,
 		.heads		= 128,

+ 5 - 4
block/bsg.c

@@ -173,7 +173,7 @@ unlock:
 
 
 static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq,
 static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq,
 				struct sg_io_v4 *hdr, struct bsg_device *bd,
 				struct sg_io_v4 *hdr, struct bsg_device *bd,
-				int has_write_perm)
+				fmode_t has_write_perm)
 {
 {
 	if (hdr->request_len > BLK_MAX_CDB) {
 	if (hdr->request_len > BLK_MAX_CDB) {
 		rq->cmd = kzalloc(hdr->request_len, GFP_KERNEL);
 		rq->cmd = kzalloc(hdr->request_len, GFP_KERNEL);
@@ -242,7 +242,7 @@ bsg_validate_sgv4_hdr(struct request_queue *q, struct sg_io_v4 *hdr, int *rw)
  * map sg_io_v4 to a request.
  * map sg_io_v4 to a request.
  */
  */
 static struct request *
 static struct request *
-bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, int has_write_perm)
+bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm)
 {
 {
 	struct request_queue *q = bd->queue;
 	struct request_queue *q = bd->queue;
 	struct request *rq, *next_rq = NULL;
 	struct request *rq, *next_rq = NULL;
@@ -601,7 +601,8 @@ bsg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 }
 }
 
 
 static int __bsg_write(struct bsg_device *bd, const char __user *buf,
 static int __bsg_write(struct bsg_device *bd, const char __user *buf,
-		       size_t count, ssize_t *bytes_written, int has_write_perm)
+		       size_t count, ssize_t *bytes_written,
+		       fmode_t has_write_perm)
 {
 {
 	struct bsg_command *bc;
 	struct bsg_command *bc;
 	struct request *rq;
 	struct request *rq;
@@ -913,7 +914,7 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 	case SG_EMULATED_HOST:
 	case SG_EMULATED_HOST:
 	case SCSI_IOCTL_SEND_COMMAND: {
 	case SCSI_IOCTL_SEND_COMMAND: {
 		void __user *uarg = (void __user *) arg;
 		void __user *uarg = (void __user *) arg;
-		return scsi_cmd_ioctl(file, bd->queue, NULL, cmd, uarg);
+		return scsi_cmd_ioctl(bd->queue, NULL, file->f_mode, cmd, uarg);
 	}
 	}
 	case SG_IO: {
 	case SG_IO: {
 		struct request *rq;
 		struct request *rq;

+ 1 - 1
block/cmd-filter.c

@@ -27,7 +27,7 @@
 #include <linux/cdrom.h>
 #include <linux/cdrom.h>
 
 
 int blk_verify_command(struct blk_cmd_filter *filter,
 int blk_verify_command(struct blk_cmd_filter *filter,
-		       unsigned char *cmd, int has_write_perm)
+		       unsigned char *cmd, fmode_t has_write_perm)
 {
 {
 	/* root can do any command. */
 	/* root can do any command. */
 	if (capable(CAP_SYS_RAWIO))
 	if (capable(CAP_SYS_RAWIO))

+ 70 - 105
block/compat_ioctl.c

@@ -71,8 +71,8 @@ static int compat_hdio_getgeo(struct gendisk *disk, struct block_device *bdev,
 	return ret;
 	return ret;
 }
 }
 
 
-static int compat_hdio_ioctl(struct inode *inode, struct file *file,
-		struct gendisk *disk, unsigned int cmd, unsigned long arg)
+static int compat_hdio_ioctl(struct block_device *bdev, fmode_t mode,
+		unsigned int cmd, unsigned long arg)
 {
 {
 	mm_segment_t old_fs = get_fs();
 	mm_segment_t old_fs = get_fs();
 	unsigned long kval;
 	unsigned long kval;
@@ -80,7 +80,7 @@ static int compat_hdio_ioctl(struct inode *inode, struct file *file,
 	int error;
 	int error;
 
 
 	set_fs(KERNEL_DS);
 	set_fs(KERNEL_DS);
-	error = blkdev_driver_ioctl(inode, file, disk,
+	error = __blkdev_driver_ioctl(bdev, mode,
 				cmd, (unsigned long)(&kval));
 				cmd, (unsigned long)(&kval));
 	set_fs(old_fs);
 	set_fs(old_fs);
 
 
@@ -111,8 +111,8 @@ struct compat_cdrom_generic_command {
 	compat_caddr_t	reserved[1];
 	compat_caddr_t	reserved[1];
 };
 };
 
 
-static int compat_cdrom_read_audio(struct inode *inode, struct file *file,
-		struct gendisk *disk, unsigned int cmd, unsigned long arg)
+static int compat_cdrom_read_audio(struct block_device *bdev, fmode_t mode,
+		unsigned int cmd, unsigned long arg)
 {
 {
 	struct cdrom_read_audio __user *cdread_audio;
 	struct cdrom_read_audio __user *cdread_audio;
 	struct compat_cdrom_read_audio __user *cdread_audio32;
 	struct compat_cdrom_read_audio __user *cdread_audio32;
@@ -134,12 +134,12 @@ static int compat_cdrom_read_audio(struct inode *inode, struct file *file,
 	if (put_user(datap, &cdread_audio->buf))
 	if (put_user(datap, &cdread_audio->buf))
 		return -EFAULT;
 		return -EFAULT;
 
 
-	return blkdev_driver_ioctl(inode, file, disk, cmd,
+	return __blkdev_driver_ioctl(bdev, mode, cmd,
 			(unsigned long)cdread_audio);
 			(unsigned long)cdread_audio);
 }
 }
 
 
-static int compat_cdrom_generic_command(struct inode *inode, struct file *file,
-		struct gendisk *disk, unsigned int cmd, unsigned long arg)
+static int compat_cdrom_generic_command(struct block_device *bdev, fmode_t mode,
+		unsigned int cmd, unsigned long arg)
 {
 {
 	struct cdrom_generic_command __user *cgc;
 	struct cdrom_generic_command __user *cgc;
 	struct compat_cdrom_generic_command __user *cgc32;
 	struct compat_cdrom_generic_command __user *cgc32;
@@ -167,7 +167,7 @@ static int compat_cdrom_generic_command(struct inode *inode, struct file *file,
 	    put_user(compat_ptr(data), &cgc->reserved[0]))
 	    put_user(compat_ptr(data), &cgc->reserved[0]))
 		return -EFAULT;
 		return -EFAULT;
 
 
-	return blkdev_driver_ioctl(inode, file, disk, cmd, (unsigned long)cgc);
+	return __blkdev_driver_ioctl(bdev, mode, cmd, (unsigned long)cgc);
 }
 }
 
 
 struct compat_blkpg_ioctl_arg {
 struct compat_blkpg_ioctl_arg {
@@ -177,7 +177,7 @@ struct compat_blkpg_ioctl_arg {
 	compat_caddr_t data;
 	compat_caddr_t data;
 };
 };
 
 
-static int compat_blkpg_ioctl(struct inode *inode, struct file *file,
+static int compat_blkpg_ioctl(struct block_device *bdev, fmode_t mode,
 		unsigned int cmd, struct compat_blkpg_ioctl_arg __user *ua32)
 		unsigned int cmd, struct compat_blkpg_ioctl_arg __user *ua32)
 {
 {
 	struct blkpg_ioctl_arg __user *a = compat_alloc_user_space(sizeof(*a));
 	struct blkpg_ioctl_arg __user *a = compat_alloc_user_space(sizeof(*a));
@@ -196,7 +196,7 @@ static int compat_blkpg_ioctl(struct inode *inode, struct file *file,
 	if (err)
 	if (err)
 		return err;
 		return err;
 
 
-	return blkdev_ioctl(inode, file, cmd, (unsigned long)a);
+	return blkdev_ioctl(bdev, mode, cmd, (unsigned long)a);
 }
 }
 
 
 #define BLKBSZGET_32		_IOR(0x12, 112, int)
 #define BLKBSZGET_32		_IOR(0x12, 112, int)
@@ -308,8 +308,8 @@ static struct {
 
 
 #define NR_FD_IOCTL_TRANS ARRAY_SIZE(fd_ioctl_trans_table)
 #define NR_FD_IOCTL_TRANS ARRAY_SIZE(fd_ioctl_trans_table)
 
 
-static int compat_fd_ioctl(struct inode *inode, struct file *file,
-		struct gendisk *disk, unsigned int cmd, unsigned long arg)
+static int compat_fd_ioctl(struct block_device *bdev, fmode_t mode,
+		unsigned int cmd, unsigned long arg)
 {
 {
 	mm_segment_t old_fs = get_fs();
 	mm_segment_t old_fs = get_fs();
 	void *karg = NULL;
 	void *karg = NULL;
@@ -413,7 +413,7 @@ static int compat_fd_ioctl(struct inode *inode, struct file *file,
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
 	set_fs(KERNEL_DS);
 	set_fs(KERNEL_DS);
-	err = blkdev_driver_ioctl(inode, file, disk, kcmd, (unsigned long)karg);
+	err = __blkdev_driver_ioctl(bdev, mode, kcmd, (unsigned long)karg);
 	set_fs(old_fs);
 	set_fs(old_fs);
 	if (err)
 	if (err)
 		goto out;
 		goto out;
@@ -579,8 +579,8 @@ static int compat_blk_trace_setup(struct block_device *bdev, char __user *arg)
 	return 0;
 	return 0;
 }
 }
 
 
-static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file,
-			struct gendisk *disk, unsigned cmd, unsigned long arg)
+static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
+			unsigned cmd, unsigned long arg)
 {
 {
 	int ret;
 	int ret;
 
 
@@ -596,7 +596,7 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file,
 	case HDIO_GET_ACOUSTIC:
 	case HDIO_GET_ACOUSTIC:
 	case HDIO_GET_ADDRESS:
 	case HDIO_GET_ADDRESS:
 	case HDIO_GET_BUSSTATE:
 	case HDIO_GET_BUSSTATE:
-		return compat_hdio_ioctl(inode, file, disk, cmd, arg);
+		return compat_hdio_ioctl(bdev, mode, cmd, arg);
 	case FDSETPRM32:
 	case FDSETPRM32:
 	case FDDEFPRM32:
 	case FDDEFPRM32:
 	case FDGETPRM32:
 	case FDGETPRM32:
@@ -606,11 +606,11 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file,
 	case FDPOLLDRVSTAT32:
 	case FDPOLLDRVSTAT32:
 	case FDGETFDCSTAT32:
 	case FDGETFDCSTAT32:
 	case FDWERRORGET32:
 	case FDWERRORGET32:
-		return compat_fd_ioctl(inode, file, disk, cmd, arg);
+		return compat_fd_ioctl(bdev, mode, cmd, arg);
 	case CDROMREADAUDIO:
 	case CDROMREADAUDIO:
-		return compat_cdrom_read_audio(inode, file, disk, cmd, arg);
+		return compat_cdrom_read_audio(bdev, mode, cmd, arg);
 	case CDROM_SEND_PACKET:
 	case CDROM_SEND_PACKET:
-		return compat_cdrom_generic_command(inode, file, disk, cmd, arg);
+		return compat_cdrom_generic_command(bdev, mode, cmd, arg);
 
 
 	/*
 	/*
 	 * No handler required for the ones below, we just need to
 	 * No handler required for the ones below, we just need to
@@ -679,55 +679,49 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file,
 	case DVD_WRITE_STRUCT:
 	case DVD_WRITE_STRUCT:
 	case DVD_AUTH:
 	case DVD_AUTH:
 		arg = (unsigned long)compat_ptr(arg);
 		arg = (unsigned long)compat_ptr(arg);
-	/* These intepret arg as an unsigned long, not as a pointer,
-	 * so we must not do compat_ptr() conversion. */
-	case HDIO_SET_MULTCOUNT:
-	case HDIO_SET_UNMASKINTR:
-	case HDIO_SET_KEEPSETTINGS:
-	case HDIO_SET_32BIT:
-	case HDIO_SET_NOWERR:
-	case HDIO_SET_DMA:
-	case HDIO_SET_PIO_MODE:
-	case HDIO_SET_NICE:
-	case HDIO_SET_WCACHE:
-	case HDIO_SET_ACOUSTIC:
-	case HDIO_SET_BUSSTATE:
-	case HDIO_SET_ADDRESS:
-	case CDROMEJECT_SW:
-	case CDROM_SET_OPTIONS:
-	case CDROM_CLEAR_OPTIONS:
-	case CDROM_SELECT_SPEED:
-	case CDROM_SELECT_DISC:
-	case CDROM_MEDIA_CHANGED:
-	case CDROM_DRIVE_STATUS:
-	case CDROM_LOCKDOOR:
-	case CDROM_DEBUG:
 		break;
 		break;
 	default:
 	default:
 		/* unknown ioctl number */
 		/* unknown ioctl number */
 		return -ENOIOCTLCMD;
 		return -ENOIOCTLCMD;
 	}
 	}
 
 
-	if (disk->fops->unlocked_ioctl)
-		return disk->fops->unlocked_ioctl(file, cmd, arg);
-
-	if (disk->fops->ioctl) {
-		lock_kernel();
-		ret = disk->fops->ioctl(inode, file, cmd, arg);
-		unlock_kernel();
-		return ret;
-	}
-
-	return -ENOTTY;
+	return __blkdev_driver_ioctl(bdev, mode, cmd, arg);
 }
 }
 
 
-static int compat_blkdev_locked_ioctl(struct inode *inode, struct file *file,
-				struct block_device *bdev,
-				unsigned cmd, unsigned long arg)
+/* Most of the generic ioctls are handled in the normal fallback path.
+   This assumes the blkdev's low level compat_ioctl always returns
+   ENOIOCTLCMD for unknown ioctls. */
+long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
 {
+	int ret = -ENOIOCTLCMD;
+	struct inode *inode = file->f_mapping->host;
+	struct block_device *bdev = inode->i_bdev;
+	struct gendisk *disk = bdev->bd_disk;
+	fmode_t mode = file->f_mode;
 	struct backing_dev_info *bdi;
 	struct backing_dev_info *bdi;
+	loff_t size;
+
+	if (file->f_flags & O_NDELAY)
+		mode |= FMODE_NDELAY_NOW;
 
 
 	switch (cmd) {
 	switch (cmd) {
+	case HDIO_GETGEO:
+		return compat_hdio_getgeo(disk, bdev, compat_ptr(arg));
+	case BLKFLSBUF:
+	case BLKROSET:
+	case BLKDISCARD:
+	/*
+	 * the ones below are implemented in blkdev_locked_ioctl,
+	 * but we call blkdev_ioctl, which gets the lock for us
+	 */
+	case BLKRRPART:
+		return blkdev_ioctl(bdev, mode, cmd,
+				(unsigned long)compat_ptr(arg));
+	case BLKBSZSET_32:
+		return blkdev_ioctl(bdev, mode, BLKBSZSET,
+				(unsigned long)compat_ptr(arg));
+	case BLKPG:
+		return compat_blkpg_ioctl(bdev, mode, cmd, compat_ptr(arg));
 	case BLKRAGET:
 	case BLKRAGET:
 	case BLKFRAGET:
 	case BLKFRAGET:
 		if (!arg)
 		if (!arg)
@@ -753,65 +747,36 @@ static int compat_blkdev_locked_ioctl(struct inode *inode, struct file *file,
 		bdi = blk_get_backing_dev_info(bdev);
 		bdi = blk_get_backing_dev_info(bdev);
 		if (bdi == NULL)
 		if (bdi == NULL)
 			return -ENOTTY;
 			return -ENOTTY;
+		lock_kernel();
 		bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE;
 		bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE;
+		unlock_kernel();
 		return 0;
 		return 0;
 	case BLKGETSIZE:
 	case BLKGETSIZE:
-		if ((bdev->bd_inode->i_size >> 9) > ~0UL)
+		size = bdev->bd_inode->i_size;
+		if ((size >> 9) > ~0UL)
 			return -EFBIG;
 			return -EFBIG;
-		return compat_put_ulong(arg, bdev->bd_inode->i_size >> 9);
+		return compat_put_ulong(arg, size >> 9);
 
 
 	case BLKGETSIZE64_32:
 	case BLKGETSIZE64_32:
 		return compat_put_u64(arg, bdev->bd_inode->i_size);
 		return compat_put_u64(arg, bdev->bd_inode->i_size);
 
 
 	case BLKTRACESETUP32:
 	case BLKTRACESETUP32:
-		return compat_blk_trace_setup(bdev, compat_ptr(arg));
+		lock_kernel();
+		ret = compat_blk_trace_setup(bdev, compat_ptr(arg));
+		unlock_kernel();
+		return ret;
 	case BLKTRACESTART: /* compatible */
 	case BLKTRACESTART: /* compatible */
 	case BLKTRACESTOP:  /* compatible */
 	case BLKTRACESTOP:  /* compatible */
 	case BLKTRACETEARDOWN: /* compatible */
 	case BLKTRACETEARDOWN: /* compatible */
-		return blk_trace_ioctl(bdev, cmd, compat_ptr(arg));
-	}
-	return -ENOIOCTLCMD;
-}
-
-/* Most of the generic ioctls are handled in the normal fallback path.
-   This assumes the blkdev's low level compat_ioctl always returns
-   ENOIOCTLCMD for unknown ioctls. */
-long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
-{
-	int ret = -ENOIOCTLCMD;
-	struct inode *inode = file->f_mapping->host;
-	struct block_device *bdev = inode->i_bdev;
-	struct gendisk *disk = bdev->bd_disk;
-
-	switch (cmd) {
-	case HDIO_GETGEO:
-		return compat_hdio_getgeo(disk, bdev, compat_ptr(arg));
-	case BLKFLSBUF:
-	case BLKROSET:
-	case BLKDISCARD:
-	/*
-	 * the ones below are implemented in blkdev_locked_ioctl,
-	 * but we call blkdev_ioctl, which gets the lock for us
-	 */
-	case BLKRRPART:
-		return blkdev_ioctl(inode, file, cmd,
-				(unsigned long)compat_ptr(arg));
-	case BLKBSZSET_32:
-		return blkdev_ioctl(inode, file, BLKBSZSET,
-				(unsigned long)compat_ptr(arg));
-	case BLKPG:
-		return compat_blkpg_ioctl(inode, file, cmd, compat_ptr(arg));
-	}
-
-	lock_kernel();
-	ret = compat_blkdev_locked_ioctl(inode, file, bdev, cmd, arg);
-	/* FIXME: why do we assume -> compat_ioctl needs the BKL? */
-	if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl)
-		ret = disk->fops->compat_ioctl(file, cmd, arg);
-	unlock_kernel();
-
-	if (ret != -ENOIOCTLCMD)
+		lock_kernel();
+		ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg));
+		unlock_kernel();
 		return ret;
 		return ret;
-
-	return compat_blkdev_driver_ioctl(inode, file, disk, cmd, arg);
+	default:
+		if (disk->fops->compat_ioctl)
+			ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg);
+		if (ret == -ENOIOCTLCMD)
+			ret = compat_blkdev_driver_ioctl(bdev, mode, cmd, arg);
+		return ret;
+	}
 }
 }

+ 89 - 84
block/ioctl.c

@@ -201,97 +201,41 @@ static int put_u64(unsigned long arg, u64 val)
 	return put_user(val, (u64 __user *)arg);
 	return put_user(val, (u64 __user *)arg);
 }
 }
 
 
-static int blkdev_locked_ioctl(struct file *file, struct block_device *bdev,
-				unsigned cmd, unsigned long arg)
-{
-	struct backing_dev_info *bdi;
-	int ret, n;
-
-	switch (cmd) {
-	case BLKRAGET:
-	case BLKFRAGET:
-		if (!arg)
-			return -EINVAL;
-		bdi = blk_get_backing_dev_info(bdev);
-		if (bdi == NULL)
-			return -ENOTTY;
-		return put_long(arg, (bdi->ra_pages * PAGE_CACHE_SIZE) / 512);
-	case BLKROGET:
-		return put_int(arg, bdev_read_only(bdev) != 0);
-	case BLKBSZGET: /* get the logical block size (cf. BLKSSZGET) */
-		return put_int(arg, block_size(bdev));
-	case BLKSSZGET: /* get block device hardware sector size */
-		return put_int(arg, bdev_hardsect_size(bdev));
-	case BLKSECTGET:
-		return put_ushort(arg, bdev_get_queue(bdev)->max_sectors);
-	case BLKRASET:
-	case BLKFRASET:
-		if(!capable(CAP_SYS_ADMIN))
-			return -EACCES;
-		bdi = blk_get_backing_dev_info(bdev);
-		if (bdi == NULL)
-			return -ENOTTY;
-		bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE;
-		return 0;
-	case BLKBSZSET:
-		/* set the logical block size */
-		if (!capable(CAP_SYS_ADMIN))
-			return -EACCES;
-		if (!arg)
-			return -EINVAL;
-		if (get_user(n, (int __user *) arg))
-			return -EFAULT;
-		if (bd_claim(bdev, file) < 0)
-			return -EBUSY;
-		ret = set_blocksize(bdev, n);
-		bd_release(bdev);
-		return ret;
-	case BLKPG:
-		return blkpg_ioctl(bdev, (struct blkpg_ioctl_arg __user *) arg);
-	case BLKRRPART:
-		return blkdev_reread_part(bdev);
-	case BLKGETSIZE:
-		if ((bdev->bd_inode->i_size >> 9) > ~0UL)
-			return -EFBIG;
-		return put_ulong(arg, bdev->bd_inode->i_size >> 9);
-	case BLKGETSIZE64:
-		return put_u64(arg, bdev->bd_inode->i_size);
-	case BLKTRACESTART:
-	case BLKTRACESTOP:
-	case BLKTRACESETUP:
-	case BLKTRACETEARDOWN:
-		return blk_trace_ioctl(bdev, cmd, (char __user *) arg);
-	}
-	return -ENOIOCTLCMD;
-}
-
-int blkdev_driver_ioctl(struct inode *inode, struct file *file,
-			struct gendisk *disk, unsigned cmd, unsigned long arg)
+int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
+			unsigned cmd, unsigned long arg)
 {
 {
+	struct gendisk *disk = bdev->bd_disk;
 	int ret;
 	int ret;
-	if (disk->fops->unlocked_ioctl)
-		return disk->fops->unlocked_ioctl(file, cmd, arg);
 
 
-	if (disk->fops->ioctl) {
+	if (disk->fops->ioctl)
+		return disk->fops->ioctl(bdev, mode, cmd, arg);
+
+	if (disk->fops->locked_ioctl) {
 		lock_kernel();
 		lock_kernel();
-		ret = disk->fops->ioctl(inode, file, cmd, arg);
+		ret = disk->fops->locked_ioctl(bdev, mode, cmd, arg);
 		unlock_kernel();
 		unlock_kernel();
 		return ret;
 		return ret;
 	}
 	}
 
 
 	return -ENOTTY;
 	return -ENOTTY;
 }
 }
-EXPORT_SYMBOL_GPL(blkdev_driver_ioctl);
+/*
+ * For the record: _GPL here is only because somebody decided to slap it
+ * on the previous export.  Sheer idiocy, since it wasn't copyrightable
+ * at all and could be open-coded without any exports by anybody who cares.
+ */
+EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl);
 
 
 /*
 /*
  * always keep this in sync with compat_blkdev_ioctl() and
  * always keep this in sync with compat_blkdev_ioctl() and
  * compat_blkdev_locked_ioctl()
  * compat_blkdev_locked_ioctl()
  */
  */
-int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
+int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
 			unsigned long arg)
 			unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	struct gendisk *disk = bdev->bd_disk;
+	struct backing_dev_info *bdi;
+	loff_t size;
 	int ret, n;
 	int ret, n;
 
 
 	switch(cmd) {
 	switch(cmd) {
@@ -299,7 +243,7 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
 		if (!capable(CAP_SYS_ADMIN))
 		if (!capable(CAP_SYS_ADMIN))
 			return -EACCES;
 			return -EACCES;
 
 
-		ret = blkdev_driver_ioctl(inode, file, disk, cmd, arg);
+		ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
 		/* -EINVAL to handle old uncorrected drivers */
 		/* -EINVAL to handle old uncorrected drivers */
 		if (ret != -EINVAL && ret != -ENOTTY)
 		if (ret != -EINVAL && ret != -ENOTTY)
 			return ret;
 			return ret;
@@ -311,7 +255,7 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
 		return 0;
 		return 0;
 
 
 	case BLKROSET:
 	case BLKROSET:
-		ret = blkdev_driver_ioctl(inode, file, disk, cmd, arg);
+		ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
 		/* -EINVAL to handle old uncorrected drivers */
 		/* -EINVAL to handle old uncorrected drivers */
 		if (ret != -EINVAL && ret != -ENOTTY)
 		if (ret != -EINVAL && ret != -ENOTTY)
 			return ret;
 			return ret;
@@ -327,7 +271,7 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
 	case BLKDISCARD: {
 	case BLKDISCARD: {
 		uint64_t range[2];
 		uint64_t range[2];
 
 
-		if (!(file->f_mode & FMODE_WRITE))
+		if (!(mode & FMODE_WRITE))
 			return -EBADF;
 			return -EBADF;
 
 
 		if (copy_from_user(range, (void __user *)arg, sizeof(range)))
 		if (copy_from_user(range, (void __user *)arg, sizeof(range)))
@@ -357,14 +301,75 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
 			return -EFAULT;
 			return -EFAULT;
 		return 0;
 		return 0;
 	}
 	}
-	}
-
-	lock_kernel();
-	ret = blkdev_locked_ioctl(file, bdev, cmd, arg);
-	unlock_kernel();
-	if (ret != -ENOIOCTLCMD)
+	case BLKRAGET:
+	case BLKFRAGET:
+		if (!arg)
+			return -EINVAL;
+		bdi = blk_get_backing_dev_info(bdev);
+		if (bdi == NULL)
+			return -ENOTTY;
+		return put_long(arg, (bdi->ra_pages * PAGE_CACHE_SIZE) / 512);
+	case BLKROGET:
+		return put_int(arg, bdev_read_only(bdev) != 0);
+	case BLKBSZGET: /* get the logical block size (cf. BLKSSZGET) */
+		return put_int(arg, block_size(bdev));
+	case BLKSSZGET: /* get block device hardware sector size */
+		return put_int(arg, bdev_hardsect_size(bdev));
+	case BLKSECTGET:
+		return put_ushort(arg, bdev_get_queue(bdev)->max_sectors);
+	case BLKRASET:
+	case BLKFRASET:
+		if(!capable(CAP_SYS_ADMIN))
+			return -EACCES;
+		bdi = blk_get_backing_dev_info(bdev);
+		if (bdi == NULL)
+			return -ENOTTY;
+		lock_kernel();
+		bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE;
+		unlock_kernel();
+		return 0;
+	case BLKBSZSET:
+		/* set the logical block size */
+		if (!capable(CAP_SYS_ADMIN))
+			return -EACCES;
+		if (!arg)
+			return -EINVAL;
+		if (get_user(n, (int __user *) arg))
+			return -EFAULT;
+		if (!(mode & FMODE_EXCL) && bd_claim(bdev, &bdev) < 0)
+			return -EBUSY;
+		ret = set_blocksize(bdev, n);
+		if (!(mode & FMODE_EXCL))
+			bd_release(bdev);
 		return ret;
 		return ret;
-
-	return blkdev_driver_ioctl(inode, file, disk, cmd, arg);
+	case BLKPG:
+		lock_kernel();
+		ret = blkpg_ioctl(bdev, (struct blkpg_ioctl_arg __user *) arg);
+		unlock_kernel();
+		break;
+	case BLKRRPART:
+		lock_kernel();
+		ret = blkdev_reread_part(bdev);
+		unlock_kernel();
+		break;
+	case BLKGETSIZE:
+		size = bdev->bd_inode->i_size;
+		if ((size >> 9) > ~0UL)
+			return -EFBIG;
+		return put_ulong(arg, size >> 9);
+	case BLKGETSIZE64:
+		return put_u64(arg, bdev->bd_inode->i_size);
+	case BLKTRACESTART:
+	case BLKTRACESTOP:
+	case BLKTRACESETUP:
+	case BLKTRACETEARDOWN:
+		lock_kernel();
+		ret = blk_trace_ioctl(bdev, cmd, (char __user *) arg);
+		unlock_kernel();
+		break;
+	default:
+		ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
+	}
+	return ret;
 }
 }
 EXPORT_SYMBOL_GPL(blkdev_ioctl);
 EXPORT_SYMBOL_GPL(blkdev_ioctl);

+ 14 - 19
block/scsi_ioctl.c

@@ -190,12 +190,11 @@ void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
 EXPORT_SYMBOL_GPL(blk_set_cmd_filter_defaults);
 EXPORT_SYMBOL_GPL(blk_set_cmd_filter_defaults);
 
 
 static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq,
 static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq,
-			     struct sg_io_hdr *hdr, struct file *file)
+			     struct sg_io_hdr *hdr, fmode_t mode)
 {
 {
 	if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len))
 	if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len))
 		return -EFAULT;
 		return -EFAULT;
-	if (blk_verify_command(&q->cmd_filter, rq->cmd,
-			       file->f_mode & FMODE_WRITE))
+	if (blk_verify_command(&q->cmd_filter, rq->cmd, mode & FMODE_WRITE))
 		return -EPERM;
 		return -EPERM;
 
 
 	/*
 	/*
@@ -260,8 +259,8 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr,
 	return r;
 	return r;
 }
 }
 
 
-static int sg_io(struct file *file, struct request_queue *q,
-		struct gendisk *bd_disk, struct sg_io_hdr *hdr)
+static int sg_io(struct request_queue *q, struct gendisk *bd_disk,
+		struct sg_io_hdr *hdr, fmode_t mode)
 {
 {
 	unsigned long start_time;
 	unsigned long start_time;
 	int writing = 0, ret = 0;
 	int writing = 0, ret = 0;
@@ -293,7 +292,7 @@ static int sg_io(struct file *file, struct request_queue *q,
 	if (!rq)
 	if (!rq)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	if (blk_fill_sghdr_rq(q, rq, hdr, file)) {
+	if (blk_fill_sghdr_rq(q, rq, hdr, mode)) {
 		blk_put_request(rq);
 		blk_put_request(rq);
 		return -EFAULT;
 		return -EFAULT;
 	}
 	}
@@ -380,11 +379,11 @@ out:
  *      bytes in one int) where the lowest byte is the SCSI status.
  *      bytes in one int) where the lowest byte is the SCSI status.
  */
  */
 #define OMAX_SB_LEN 16          /* For backward compatibility */
 #define OMAX_SB_LEN 16          /* For backward compatibility */
-int sg_scsi_ioctl(struct file *file, struct request_queue *q,
-		  struct gendisk *disk, struct scsi_ioctl_command __user *sic)
+int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode,
+		struct scsi_ioctl_command __user *sic)
 {
 {
 	struct request *rq;
 	struct request *rq;
-	int err, write_perm = 0;
+	int err;
 	unsigned int in_len, out_len, bytes, opcode, cmdlen;
 	unsigned int in_len, out_len, bytes, opcode, cmdlen;
 	char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE];
 	char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE];
 
 
@@ -426,11 +425,7 @@ int sg_scsi_ioctl(struct file *file, struct request_queue *q,
 	if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len))
 	if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len))
 		goto error;
 		goto error;
 
 
-	/* scsi_ioctl passes NULL */
-	if (file && (file->f_mode & FMODE_WRITE))
-		write_perm = 1;
-
-	err = blk_verify_command(&q->cmd_filter, rq->cmd, write_perm);
+	err = blk_verify_command(&q->cmd_filter, rq->cmd, mode & FMODE_WRITE);
 	if (err)
 	if (err)
 		goto error;
 		goto error;
 
 
@@ -522,8 +517,8 @@ static inline int blk_send_start_stop(struct request_queue *q,
 	return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data);
 	return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data);
 }
 }
 
 
-int scsi_cmd_ioctl(struct file *file, struct request_queue *q,
-		   struct gendisk *bd_disk, unsigned int cmd, void __user *arg)
+int scsi_cmd_ioctl(struct request_queue *q, struct gendisk *bd_disk, fmode_t mode,
+		   unsigned int cmd, void __user *arg)
 {
 {
 	int err;
 	int err;
 
 
@@ -564,7 +559,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q,
 			err = -EFAULT;
 			err = -EFAULT;
 			if (copy_from_user(&hdr, arg, sizeof(hdr)))
 			if (copy_from_user(&hdr, arg, sizeof(hdr)))
 				break;
 				break;
-			err = sg_io(file, q, bd_disk, &hdr);
+			err = sg_io(q, bd_disk, &hdr, mode);
 			if (err == -EFAULT)
 			if (err == -EFAULT)
 				break;
 				break;
 
 
@@ -612,7 +607,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q,
 			hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd;
 			hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd;
 			hdr.cmd_len = sizeof(cgc.cmd);
 			hdr.cmd_len = sizeof(cgc.cmd);
 
 
-			err = sg_io(file, q, bd_disk, &hdr);
+			err = sg_io(q, bd_disk, &hdr, mode);
 			if (err == -EFAULT)
 			if (err == -EFAULT)
 				break;
 				break;
 
 
@@ -636,7 +631,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q,
 			if (!arg)
 			if (!arg)
 				break;
 				break;
 
 
-			err = sg_scsi_ioctl(file, q, bd_disk, arg);
+			err = sg_scsi_ioctl(q, bd_disk, mode, arg);
 			break;
 			break;
 		case CDROMCLOSETRAY:
 		case CDROMCLOSETRAY:
 			err = blk_send_start_stop(q, bd_disk, 0x03);
 			err = blk_send_start_stop(q, bd_disk, 0x03);

+ 3 - 3
drivers/block/DAC960.c

@@ -72,9 +72,9 @@ static long disk_size(DAC960_Controller_T *p, int drive_nr)
 	}
 	}
 }
 }
 
 
-static int DAC960_open(struct inode *inode, struct file *file)
+static int DAC960_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	DAC960_Controller_T *p = disk->queue->queuedata;
 	DAC960_Controller_T *p = disk->queue->queuedata;
 	int drive_nr = (long)disk->private_data;
 	int drive_nr = (long)disk->private_data;
 
 
@@ -89,7 +89,7 @@ static int DAC960_open(struct inode *inode, struct file *file)
 			return -ENXIO;
 			return -ENXIO;
 	}
 	}
 
 
-	check_disk_change(inode->i_bdev);
+	check_disk_change(bdev);
 
 
 	if (!get_capacity(p->disks[drive_nr]))
 	if (!get_capacity(p->disks[drive_nr]))
 		return -ENXIO;
 		return -ENXIO;

+ 24 - 22
drivers/block/amiflop.c

@@ -1437,10 +1437,11 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return 0;
 	return 0;
 }
 }
 
 
-static int fd_ioctl(struct inode *inode, struct file *filp,
+static int fd_ioctl(struct block_device *bdev, fmode_t mode,
 		    unsigned int cmd, unsigned long param)
 		    unsigned int cmd, unsigned long param)
 {
 {
-	int drive = iminor(inode) & 3;
+	struct amiga_floppy_struct *p = bdev->bd_disk->private_data;
+	int drive = p - unit;
 	static struct floppy_struct getprm;
 	static struct floppy_struct getprm;
 	void __user *argp = (void __user *)param;
 	void __user *argp = (void __user *)param;
 
 
@@ -1451,7 +1452,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
 			rel_fdc();
 			rel_fdc();
 			return -EBUSY;
 			return -EBUSY;
 		}
 		}
-		fsync_bdev(inode->i_bdev);
+		fsync_bdev(bdev);
 		if (fd_motor_on(drive) == 0) {
 		if (fd_motor_on(drive) == 0) {
 			rel_fdc();
 			rel_fdc();
 			return -ENODEV;
 			return -ENODEV;
@@ -1464,12 +1465,12 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
 		rel_fdc();
 		rel_fdc();
 		break;
 		break;
 	case FDFMTTRK:
 	case FDFMTTRK:
-		if (param < unit[drive].type->tracks * unit[drive].type->heads)
+		if (param < p->type->tracks * p->type->heads)
 		{
 		{
 			get_fdc(drive);
 			get_fdc(drive);
 			if (fd_seek(drive,param) != 0){
 			if (fd_seek(drive,param) != 0){
-				memset(unit[drive].trackbuf, FD_FILL_BYTE,
-				       unit[drive].dtype->sects * unit[drive].type->sect_mult * 512);
+				memset(p->trackbuf, FD_FILL_BYTE,
+				       p->dtype->sects * p->type->sect_mult * 512);
 				non_int_flush_track(drive);
 				non_int_flush_track(drive);
 			}
 			}
 			floppy_off(drive);
 			floppy_off(drive);
@@ -1480,14 +1481,14 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
 		break;
 		break;
 	case FDFMTEND:
 	case FDFMTEND:
 		floppy_off(drive);
 		floppy_off(drive);
-		invalidate_bdev(inode->i_bdev);
+		invalidate_bdev(bdev);
 		break;
 		break;
 	case FDGETPRM:
 	case FDGETPRM:
 		memset((void *)&getprm, 0, sizeof (getprm));
 		memset((void *)&getprm, 0, sizeof (getprm));
-		getprm.track=unit[drive].type->tracks;
-		getprm.head=unit[drive].type->heads;
-		getprm.sect=unit[drive].dtype->sects * unit[drive].type->sect_mult;
-		getprm.size=unit[drive].blocks;
+		getprm.track=p->type->tracks;
+		getprm.head=p->type->heads;
+		getprm.sect=p->dtype->sects * p->type->sect_mult;
+		getprm.size=p->blocks;
 		if (copy_to_user(argp, &getprm, sizeof(struct floppy_struct)))
 		if (copy_to_user(argp, &getprm, sizeof(struct floppy_struct)))
 			return -EFAULT;
 			return -EFAULT;
 		break;
 		break;
@@ -1500,10 +1501,10 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
 		break;
 		break;
 #ifdef RAW_IOCTL
 #ifdef RAW_IOCTL
 	case IOCTL_RAW_TRACK:
 	case IOCTL_RAW_TRACK:
-		if (copy_to_user(argp, raw_buf, unit[drive].type->read_size))
+		if (copy_to_user(argp, raw_buf, p->type->read_size))
 			return -EFAULT;
 			return -EFAULT;
 		else
 		else
-			return unit[drive].type->read_size;
+			return p->type->read_size;
 #endif
 #endif
 	default:
 	default:
 		printk(KERN_DEBUG "fd_ioctl: unknown cmd %d for drive %d.",
 		printk(KERN_DEBUG "fd_ioctl: unknown cmd %d for drive %d.",
@@ -1548,10 +1549,10 @@ static void fd_probe(int dev)
  * /dev/PS0 etc), and disallows simultaneous access to the same
  * /dev/PS0 etc), and disallows simultaneous access to the same
  * drive with different device numbers.
  * drive with different device numbers.
  */
  */
-static int floppy_open(struct inode *inode, struct file *filp)
+static int floppy_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	int drive = iminor(inode) & 3;
-	int system =  (iminor(inode) & 4) >> 2;
+	int drive = MINOR(bdev->bd_dev) & 3;
+	int system =  (MINOR(bdev->bd_dev) & 4) >> 2;
 	int old_dev;
 	int old_dev;
 	unsigned long flags;
 	unsigned long flags;
 
 
@@ -1560,9 +1561,9 @@ static int floppy_open(struct inode *inode, struct file *filp)
 	if (fd_ref[drive] && old_dev != system)
 	if (fd_ref[drive] && old_dev != system)
 		return -EBUSY;
 		return -EBUSY;
 
 
-	if (filp && filp->f_mode & 3) {
-		check_disk_change(inode->i_bdev);
-		if (filp->f_mode & 2 ) {
+	if (mode & (FMODE_READ|FMODE_WRITE)) {
+		check_disk_change(bdev);
+		if (mode & FMODE_WRITE) {
 			int wrprot;
 			int wrprot;
 
 
 			get_fdc(drive);
 			get_fdc(drive);
@@ -1592,9 +1593,10 @@ static int floppy_open(struct inode *inode, struct file *filp)
 	return 0;
 	return 0;
 }
 }
 
 
-static int floppy_release(struct inode * inode, struct file * filp)
+static int floppy_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	int drive = iminor(inode) & 3;
+	struct amiga_floppy_struct *p = disk->private_data;
+	int drive = p - unit;
 
 
 	if (unit[drive].dirty == 1) {
 	if (unit[drive].dirty == 1) {
 		del_timer (flush_track_timer + drive);
 		del_timer (flush_track_timer + drive);
@@ -1650,7 +1652,7 @@ static struct block_device_operations floppy_fops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= floppy_open,
 	.open		= floppy_open,
 	.release	= floppy_release,
 	.release	= floppy_release,
-	.ioctl		= fd_ioctl,
+	.locked_ioctl	= fd_ioctl,
 	.getgeo		= fd_getgeo,
 	.getgeo		= fd_getgeo,
 	.media_changed	= amiga_floppy_change,
 	.media_changed	= amiga_floppy_change,
 };
 };

+ 4 - 8
drivers/block/aoe/aoeblk.c

@@ -118,13 +118,11 @@ aoedisk_rm_sysfs(struct aoedev *d)
 }
 }
 
 
 static int
 static int
-aoeblk_open(struct inode *inode, struct file *filp)
+aoeblk_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct aoedev *d;
+	struct aoedev *d = bdev->bd_disk->private_data;
 	ulong flags;
 	ulong flags;
 
 
-	d = inode->i_bdev->bd_disk->private_data;
-
 	spin_lock_irqsave(&d->lock, flags);
 	spin_lock_irqsave(&d->lock, flags);
 	if (d->flags & DEVFL_UP) {
 	if (d->flags & DEVFL_UP) {
 		d->nopen++;
 		d->nopen++;
@@ -136,13 +134,11 @@ aoeblk_open(struct inode *inode, struct file *filp)
 }
 }
 
 
 static int
 static int
-aoeblk_release(struct inode *inode, struct file *filp)
+aoeblk_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct aoedev *d;
+	struct aoedev *d = disk->private_data;
 	ulong flags;
 	ulong flags;
 
 
-	d = inode->i_bdev->bd_disk->private_data;
-
 	spin_lock_irqsave(&d->lock, flags);
 	spin_lock_irqsave(&d->lock, flags);
 
 
 	if (--d->nopen == 0) {
 	if (--d->nopen == 0) {

+ 18 - 19
drivers/block/ataflop.c

@@ -361,13 +361,13 @@ static void finish_fdc( void );
 static void finish_fdc_done( int dummy );
 static void finish_fdc_done( int dummy );
 static void setup_req_params( int drive );
 static void setup_req_params( int drive );
 static void redo_fd_request( void);
 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, fmode_t mode, unsigned int
                      cmd, unsigned long param);
                      cmd, unsigned long param);
 static void fd_probe( int drive );
 static void fd_probe( int drive );
 static int fd_test_drive_present( int drive );
 static int fd_test_drive_present( int drive );
 static void config_types( void );
 static void config_types( void );
-static int floppy_open( struct inode *inode, struct file *filp );
-static int floppy_release( struct inode * inode, struct file * filp );
+static int floppy_open(struct block_device *bdev, fmode_t mode);
+static int floppy_release(struct gendisk *disk, fmode_t mode);
 
 
 /************************* End of Prototypes **************************/
 /************************* End of Prototypes **************************/
 
 
@@ -1483,10 +1483,10 @@ void do_fd_request(struct request_queue * q)
 	atari_enable_irq( IRQ_MFP_FDC );
 	atari_enable_irq( IRQ_MFP_FDC );
 }
 }
 
 
-static int fd_ioctl(struct inode *inode, struct file *filp,
+static int fd_ioctl(struct block_device *bdev, fmode_t mode,
 		    unsigned int cmd, unsigned long param)
 		    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;
 	struct atari_floppy_struct *floppy = disk->private_data;
 	int drive = floppy - unit;
 	int drive = floppy - unit;
 	int type = floppy->type;
 	int type = floppy->type;
@@ -1661,7 +1661,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
 		/* invalidate the buffer track to force a reread */
 		/* invalidate the buffer track to force a reread */
 		BufferDrive = -1;
 		BufferDrive = -1;
 		set_bit(drive, &fake_change);
 		set_bit(drive, &fake_change);
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 		return 0;
 		return 0;
 	default:
 	default:
 		return -EINVAL;
 		return -EINVAL;
@@ -1804,37 +1804,36 @@ static void __init config_types( void )
  * drive with different device numbers.
  * drive with different device numbers.
  */
  */
 
 
-static int floppy_open( struct inode *inode, struct file *filp )
+static int floppy_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data;
-	int type  = iminor(inode) >> 2;
+	struct atari_floppy_struct *p = bdev->bd_disk->private_data;
+	int type  = MINOR(bdev->bd_dev) >> 2;
 
 
 	DPRINT(("fd_open: type=%d\n",type));
 	DPRINT(("fd_open: type=%d\n",type));
 	if (p->ref && p->type != type)
 	if (p->ref && p->type != type)
 		return -EBUSY;
 		return -EBUSY;
 
 
-	if (p->ref == -1 || (p->ref && filp->f_flags & O_EXCL))
+	if (p->ref == -1 || (p->ref && mode & FMODE_EXCL))
 		return -EBUSY;
 		return -EBUSY;
 
 
-	if (filp->f_flags & O_EXCL)
+	if (mode & FMODE_EXCL)
 		p->ref = -1;
 		p->ref = -1;
 	else
 	else
 		p->ref++;
 		p->ref++;
 
 
 	p->type = type;
 	p->type = type;
 
 
-	if (filp->f_flags & O_NDELAY)
+	if (mode & FMODE_NDELAY)
 		return 0;
 		return 0;
 
 
-	if (filp->f_mode & 3) {
-		check_disk_change(inode->i_bdev);
-		if (filp->f_mode & 2) {
+	if (mode & (FMODE_READ|FMODE_WRITE)) {
+		check_disk_change(bdev);
+		if (mode & FMODE_WRITE) {
 			if (p->wpstat) {
 			if (p->wpstat) {
 				if (p->ref < 0)
 				if (p->ref < 0)
 					p->ref = 0;
 					p->ref = 0;
 				else
 				else
 					p->ref--;
 					p->ref--;
-				floppy_release(inode, filp);
 				return -EROFS;
 				return -EROFS;
 			}
 			}
 		}
 		}
@@ -1843,9 +1842,9 @@ static int floppy_open( struct inode *inode, struct file *filp )
 }
 }
 
 
 
 
-static int floppy_release( struct inode * inode, struct file * filp )
+static int floppy_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data;
+	struct atari_floppy_struct *p = disk->private_data;
 	if (p->ref < 0)
 	if (p->ref < 0)
 		p->ref = 0;
 		p->ref = 0;
 	else if (!p->ref--) {
 	else if (!p->ref--) {
@@ -1859,7 +1858,7 @@ static struct block_device_operations floppy_fops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= floppy_open,
 	.open		= floppy_open,
 	.release	= floppy_release,
 	.release	= floppy_release,
-	.ioctl		= fd_ioctl,
+	.locked_ioctl	= fd_ioctl,
 	.media_changed	= check_floppy_change,
 	.media_changed	= check_floppy_change,
 	.revalidate_disk= floppy_revalidate,
 	.revalidate_disk= floppy_revalidate,
 };
 };

+ 2 - 3
drivers/block/brd.c

@@ -340,11 +340,10 @@ static int brd_direct_access (struct block_device *bdev, sector_t sector,
 }
 }
 #endif
 #endif
 
 
-static int brd_ioctl(struct inode *inode, struct file *file,
+static int brd_ioctl(struct block_device *bdev, fmode_t mode,
 			unsigned int cmd, unsigned long arg)
 			unsigned int cmd, unsigned long arg)
 {
 {
 	int error;
 	int error;
-	struct block_device *bdev = inode->i_bdev;
 	struct brd_device *brd = bdev->bd_disk->private_data;
 	struct brd_device *brd = bdev->bd_disk->private_data;
 
 
 	if (cmd != BLKFLSBUF)
 	if (cmd != BLKFLSBUF)
@@ -376,7 +375,7 @@ static int brd_ioctl(struct inode *inode, struct file *file,
 
 
 static struct block_device_operations brd_fops = {
 static struct block_device_operations brd_fops = {
 	.owner =		THIS_MODULE,
 	.owner =		THIS_MODULE,
-	.ioctl =		brd_ioctl,
+	.locked_ioctl =		brd_ioctl,
 #ifdef CONFIG_BLK_DEV_XIP
 #ifdef CONFIG_BLK_DEV_XIP
 	.direct_access =	brd_direct_access,
 	.direct_access =	brd_direct_access,
 #endif
 #endif

+ 36 - 35
drivers/block/cciss.c

@@ -152,9 +152,9 @@ static ctlr_info_t *hba[MAX_CTLR];
 
 
 static void do_cciss_request(struct request_queue *q);
 static void do_cciss_request(struct request_queue *q);
 static irqreturn_t do_cciss_intr(int irq, void *dev_id);
 static irqreturn_t do_cciss_intr(int irq, void *dev_id);
-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_open(struct block_device *bdev, fmode_t mode);
+static int cciss_release(struct gendisk *disk, fmode_t mode);
+static int cciss_ioctl(struct block_device *bdev, fmode_t mode,
 		       unsigned int cmd, unsigned long arg);
 		       unsigned int cmd, unsigned long arg);
 static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 
 
@@ -192,14 +192,15 @@ static void cciss_procinit(int i)
 #endif				/* CONFIG_PROC_FS */
 #endif				/* CONFIG_PROC_FS */
 
 
 #ifdef CONFIG_COMPAT
 #ifdef CONFIG_COMPAT
-static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg);
+static int cciss_compat_ioctl(struct block_device *, fmode_t,
+			      unsigned, unsigned long);
 #endif
 #endif
 
 
 static struct block_device_operations cciss_fops = {
 static struct block_device_operations cciss_fops = {
 	.owner = THIS_MODULE,
 	.owner = THIS_MODULE,
 	.open = cciss_open,
 	.open = cciss_open,
 	.release = cciss_release,
 	.release = cciss_release,
-	.ioctl = cciss_ioctl,
+	.locked_ioctl = cciss_ioctl,
 	.getgeo = cciss_getgeo,
 	.getgeo = cciss_getgeo,
 #ifdef CONFIG_COMPAT
 #ifdef CONFIG_COMPAT
 	.compat_ioctl = cciss_compat_ioctl,
 	.compat_ioctl = cciss_compat_ioctl,
@@ -547,13 +548,13 @@ static inline drive_info_struct *get_drv(struct gendisk *disk)
 /*
 /*
  * Open.  Make sure the device is really there.
  * Open.  Make sure the device is really there.
  */
  */
-static int cciss_open(struct inode *inode, struct file *filep)
+static int cciss_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-	drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
+	ctlr_info_t *host = get_host(bdev->bd_disk);
+	drive_info_struct *drv = get_drv(bdev->bd_disk);
 
 
 #ifdef CCISS_DEBUG
 #ifdef CCISS_DEBUG
-	printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name);
+	printk(KERN_DEBUG "cciss_open %s\n", bdev->bd_disk->disk_name);
 #endif				/* CCISS_DEBUG */
 #endif				/* CCISS_DEBUG */
 
 
 	if (host->busy_initializing || drv->busy_configuring)
 	if (host->busy_initializing || drv->busy_configuring)
@@ -567,9 +568,9 @@ static int cciss_open(struct inode *inode, struct file *filep)
 	 * for "raw controller".
 	 * for "raw controller".
 	 */
 	 */
 	if (drv->heads == 0) {
 	if (drv->heads == 0) {
-		if (iminor(inode) != 0) {	/* not node 0? */
+		if (MINOR(bdev->bd_dev) != 0) {	/* not node 0? */
 			/* if not node 0 make sure it is a partition = 0 */
 			/* if not node 0 make sure it is a partition = 0 */
-			if (iminor(inode) & 0x0f) {
+			if (MINOR(bdev->bd_dev) & 0x0f) {
 				return -ENXIO;
 				return -ENXIO;
 				/* if it is, make sure we have a LUN ID */
 				/* if it is, make sure we have a LUN ID */
 			} else if (drv->LunID == 0) {
 			} else if (drv->LunID == 0) {
@@ -587,14 +588,13 @@ static int cciss_open(struct inode *inode, struct file *filep)
 /*
 /*
  * Close.  Sync first.
  * Close.  Sync first.
  */
  */
-static int cciss_release(struct inode *inode, struct file *filep)
+static int cciss_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-	drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
+	ctlr_info_t *host = get_host(disk);
+	drive_info_struct *drv = get_drv(disk);
 
 
 #ifdef CCISS_DEBUG
 #ifdef CCISS_DEBUG
-	printk(KERN_DEBUG "cciss_release %s\n",
-	       inode->i_bdev->bd_disk->disk_name);
+	printk(KERN_DEBUG "cciss_release %s\n", disk->disk_name);
 #endif				/* CCISS_DEBUG */
 #endif				/* CCISS_DEBUG */
 
 
 	drv->usage_count--;
 	drv->usage_count--;
@@ -604,21 +604,23 @@ static int cciss_release(struct inode *inode, struct file *filep)
 
 
 #ifdef CONFIG_COMPAT
 #ifdef CONFIG_COMPAT
 
 
-static int do_ioctl(struct file *f, unsigned cmd, unsigned long arg)
+static int do_ioctl(struct block_device *bdev, fmode_t mode,
+		    unsigned cmd, unsigned long arg)
 {
 {
 	int ret;
 	int ret;
 	lock_kernel();
 	lock_kernel();
-	ret = cciss_ioctl(f->f_path.dentry->d_inode, f, cmd, arg);
+	ret = cciss_ioctl(bdev, mode, cmd, arg);
 	unlock_kernel();
 	unlock_kernel();
 	return ret;
 	return ret;
 }
 }
 
 
-static int cciss_ioctl32_passthru(struct file *f, unsigned cmd,
-				  unsigned long arg);
-static int cciss_ioctl32_big_passthru(struct file *f, unsigned cmd,
-				      unsigned long arg);
+static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode,
+				  unsigned cmd, unsigned long arg);
+static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode,
+				      unsigned cmd, unsigned long arg);
 
 
-static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg)
+static int cciss_compat_ioctl(struct block_device *bdev, fmode_t mode,
+			      unsigned cmd, unsigned long arg)
 {
 {
 	switch (cmd) {
 	switch (cmd) {
 	case CCISS_GETPCIINFO:
 	case CCISS_GETPCIINFO:
@@ -636,20 +638,20 @@ static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg)
 	case CCISS_REGNEWD:
 	case CCISS_REGNEWD:
 	case CCISS_RESCANDISK:
 	case CCISS_RESCANDISK:
 	case CCISS_GETLUNINFO:
 	case CCISS_GETLUNINFO:
-		return do_ioctl(f, cmd, arg);
+		return do_ioctl(bdev, mode, cmd, arg);
 
 
 	case CCISS_PASSTHRU32:
 	case CCISS_PASSTHRU32:
-		return cciss_ioctl32_passthru(f, cmd, arg);
+		return cciss_ioctl32_passthru(bdev, mode, cmd, arg);
 	case CCISS_BIG_PASSTHRU32:
 	case CCISS_BIG_PASSTHRU32:
-		return cciss_ioctl32_big_passthru(f, cmd, arg);
+		return cciss_ioctl32_big_passthru(bdev, mode, cmd, arg);
 
 
 	default:
 	default:
 		return -ENOIOCTLCMD;
 		return -ENOIOCTLCMD;
 	}
 	}
 }
 }
 
 
-static int cciss_ioctl32_passthru(struct file *f, unsigned cmd,
-				  unsigned long arg)
+static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode,
+				  unsigned cmd, unsigned long arg)
 {
 {
 	IOCTL32_Command_struct __user *arg32 =
 	IOCTL32_Command_struct __user *arg32 =
 	    (IOCTL32_Command_struct __user *) arg;
 	    (IOCTL32_Command_struct __user *) arg;
@@ -676,7 +678,7 @@ static int cciss_ioctl32_passthru(struct file *f, unsigned cmd,
 	if (err)
 	if (err)
 		return -EFAULT;
 		return -EFAULT;
 
 
-	err = do_ioctl(f, CCISS_PASSTHRU, (unsigned long)p);
+	err = do_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p);
 	if (err)
 	if (err)
 		return err;
 		return err;
 	err |=
 	err |=
@@ -687,8 +689,8 @@ static int cciss_ioctl32_passthru(struct file *f, unsigned cmd,
 	return err;
 	return err;
 }
 }
 
 
-static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd,
-				      unsigned long arg)
+static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode,
+				      unsigned cmd, unsigned long arg)
 {
 {
 	BIG_IOCTL32_Command_struct __user *arg32 =
 	BIG_IOCTL32_Command_struct __user *arg32 =
 	    (BIG_IOCTL32_Command_struct __user *) arg;
 	    (BIG_IOCTL32_Command_struct __user *) arg;
@@ -717,7 +719,7 @@ static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd,
 	if (err)
 	if (err)
 		return -EFAULT;
 		return -EFAULT;
 
 
-	err = do_ioctl(file, CCISS_BIG_PASSTHRU, (unsigned long)p);
+	err = do_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p);
 	if (err)
 	if (err)
 		return err;
 		return err;
 	err |=
 	err |=
@@ -745,10 +747,9 @@ static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 /*
 /*
  * ioctl
  * ioctl
  */
  */
-static int cciss_ioctl(struct inode *inode, struct file *filep,
+static int cciss_ioctl(struct block_device *bdev, fmode_t mode,
 		       unsigned int cmd, unsigned long arg)
 		       unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	struct gendisk *disk = bdev->bd_disk;
 	ctlr_info_t *host = get_host(disk);
 	ctlr_info_t *host = get_host(disk);
 	drive_info_struct *drv = get_drv(disk);
 	drive_info_struct *drv = get_drv(disk);
@@ -1232,7 +1233,7 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
 	case SG_EMULATED_HOST:
 	case SG_EMULATED_HOST:
 	case SG_IO:
 	case SG_IO:
 	case SCSI_IOCTL_SEND_COMMAND:
 	case SCSI_IOCTL_SEND_COMMAND:
-		return scsi_cmd_ioctl(filep, disk->queue, disk, cmd, argp);
+		return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp);
 
 
 	/* scsi_cmd_ioctl would normally handle these, below, but */
 	/* scsi_cmd_ioctl would normally handle these, below, but */
 	/* they aren't a good fit for cciss, as CD-ROMs are */
 	/* they aren't a good fit for cciss, as CD-ROMs are */

+ 14 - 14
drivers/block/cpqarray.c

@@ -156,9 +156,9 @@ static int sendcmd(
 	unsigned int blkcnt,
 	unsigned int blkcnt,
 	unsigned int log_unit );
 	unsigned int log_unit );
 
 
-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_open(struct block_device *bdev, fmode_t mode);
+static int ida_release(struct gendisk *disk, fmode_t mode);
+static int ida_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg);
 static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io);
 static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io);
 
 
@@ -197,7 +197,7 @@ static struct block_device_operations ida_fops  = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= ida_open,
 	.open		= ida_open,
 	.release	= ida_release,
 	.release	= ida_release,
-	.ioctl		= ida_ioctl,
+	.locked_ioctl	= ida_ioctl,
 	.getgeo		= ida_getgeo,
 	.getgeo		= ida_getgeo,
 	.revalidate_disk= ida_revalidate,
 	.revalidate_disk= ida_revalidate,
 };
 };
@@ -818,12 +818,12 @@ DBGINFO(
 /*
 /*
  * Open.  Make sure the device is really there.
  * Open.  Make sure the device is really there.
  */
  */
-static int ida_open(struct inode *inode, struct file *filep)
+static int ida_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	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);
 
 
-	DBGINFO(printk("ida_open %s\n", inode->i_bdev->bd_disk->disk_name));
+	DBGINFO(printk("ida_open %s\n", bdev->bd_disk->disk_name));
 	/*
 	/*
 	 * Root is allowed to open raw volume zero even if it's not configured
 	 * Root is allowed to open raw volume zero even if it's not configured
 	 * so array config can still work.  I don't think I really like this,
 	 * so array config can still work.  I don't think I really like this,
@@ -843,9 +843,9 @@ static int ida_open(struct inode *inode, struct file *filep)
 /*
 /*
  * Close.  Sync first.
  * Close.  Sync first.
  */
  */
-static int ida_release(struct inode *inode, struct file *filep)
+static int ida_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
+	ctlr_info_t *host = get_host(disk);
 	host->usage_count--;
 	host->usage_count--;
 	return 0;
 	return 0;
 }
 }
@@ -1128,10 +1128,10 @@ static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo)
  *  ida_ioctl does some miscellaneous stuff like reporting drive geometry,
  *  ida_ioctl does some miscellaneous stuff like reporting drive geometry,
  *  setting readahead and submitting commands from userspace to the controller.
  *  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, fmode_t mode, 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 error;
 	ida_ioctl_t __user *io = (ida_ioctl_t __user *)arg;
 	ida_ioctl_t __user *io = (ida_ioctl_t __user *)arg;
 	ida_ioctl_t *my_io;
 	ida_ioctl_t *my_io;
@@ -1165,7 +1165,7 @@ out_passthru:
 		put_user(host->ctlr_sig, (int __user *)arg);
 		put_user(host->ctlr_sig, (int __user *)arg);
 		return 0;
 		return 0;
 	case IDAREVALIDATEVOLS:
 	case IDAREVALIDATEVOLS:
-		if (iminor(inode) != 0)
+		if (MINOR(bdev->bd_dev) != 0)
 			return -ENXIO;
 			return -ENXIO;
 		return revalidate_allvol(host);
 		return revalidate_allvol(host);
 	case IDADRIVERVERSION:
 	case IDADRIVERVERSION:

+ 24 - 30
drivers/block/floppy.c

@@ -3450,14 +3450,14 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return 0;
 	return 0;
 }
 }
 
 
-static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
+static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
 		    unsigned long param)
 		    unsigned long param)
 {
 {
-#define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
+#define FD_IOCTL_ALLOWED (mode & (FMODE_WRITE|FMODE_WRITE_IOCTL))
 #define OUT(c,x) case c: outparam = (const char *) (x); break
 #define OUT(c,x) case c: outparam = (const char *) (x); break
 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
 #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 type = ITYPE(UDRS->fd_device);
 	int type = ITYPE(UDRS->fd_device);
 	int i;
 	int i;
 	int ret;
 	int ret;
@@ -3516,11 +3516,11 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
 			current_type[drive] = NULL;
 			current_type[drive] = NULL;
 			floppy_sizes[drive] = MAX_DISK_SIZE << 1;
 			floppy_sizes[drive] = MAX_DISK_SIZE << 1;
 			UDRS->keep_data = 0;
 			UDRS->keep_data = 0;
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 		case FDSETPRM:
 		case FDSETPRM:
 		case FDDEFPRM:
 		case FDDEFPRM:
 			return set_geometry(cmd, &inparam.g,
 			return set_geometry(cmd, &inparam.g,
-					    drive, type, inode->i_bdev);
+					    drive, type, bdev);
 		case FDGETPRM:
 		case FDGETPRM:
 			ECALL(get_floppy_geometry(drive, type,
 			ECALL(get_floppy_geometry(drive, type,
 						  (struct floppy_struct **)
 						  (struct floppy_struct **)
@@ -3551,7 +3551,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
 		case FDFMTEND:
 		case FDFMTEND:
 		case FDFLUSH:
 		case FDFLUSH:
 			LOCK_FDC(drive, 1);
 			LOCK_FDC(drive, 1);
-			return invalidate_drive(inode->i_bdev);
+			return invalidate_drive(bdev);
 
 
 		case FDSETEMSGTRESH:
 		case FDSETEMSGTRESH:
 			UDP->max_errors.reporting =
 			UDP->max_errors.reporting =
@@ -3659,9 +3659,9 @@ static void __init config_types(void)
 		printk("\n");
 		printk("\n");
 }
 }
 
 
-static int floppy_release(struct inode *inode, struct file *filp)
+static int floppy_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
+	int drive = (long)disk->private_data;
 
 
 	mutex_lock(&open_lock);
 	mutex_lock(&open_lock);
 	if (UDRS->fd_ref < 0)
 	if (UDRS->fd_ref < 0)
@@ -3682,18 +3682,17 @@ static int floppy_release(struct inode *inode, struct file *filp)
  * /dev/PS0 etc), and disallows simultaneous access to the same
  * /dev/PS0 etc), and disallows simultaneous access to the same
  * drive with different device numbers.
  * drive with different device numbers.
  */
  */
-static int floppy_open(struct inode *inode, struct file *filp)
+static int floppy_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	int drive = (long)inode->i_bdev->bd_disk->private_data;
-	int old_dev;
+	int drive = (long)bdev->bd_disk->private_data;
+	int old_dev, new_dev;
 	int try;
 	int try;
 	int res = -EBUSY;
 	int res = -EBUSY;
 	char *tmp;
 	char *tmp;
 
 
-	filp->private_data = (void *)0;
 	mutex_lock(&open_lock);
 	mutex_lock(&open_lock);
 	old_dev = UDRS->fd_device;
 	old_dev = UDRS->fd_device;
-	if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
+	if (opened_bdev[drive] && opened_bdev[drive] != bdev)
 		goto out2;
 		goto out2;
 
 
 	if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
 	if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
@@ -3701,15 +3700,15 @@ static int floppy_open(struct inode *inode, struct file *filp)
 		USETF(FD_VERIFY);
 		USETF(FD_VERIFY);
 	}
 	}
 
 
-	if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
+	if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (mode & FMODE_EXCL)))
 		goto out2;
 		goto out2;
 
 
-	if (filp->f_flags & O_EXCL)
+	if (mode & FMODE_EXCL)
 		UDRS->fd_ref = -1;
 		UDRS->fd_ref = -1;
 	else
 	else
 		UDRS->fd_ref++;
 		UDRS->fd_ref++;
 
 
-	opened_bdev[drive] = inode->i_bdev;
+	opened_bdev[drive] = bdev;
 
 
 	res = -ENXIO;
 	res = -ENXIO;
 
 
@@ -3744,31 +3743,26 @@ static int floppy_open(struct inode *inode, struct file *filp)
 		}
 		}
 	}
 	}
 
 
-	UDRS->fd_device = iminor(inode);
-	set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
-	if (old_dev != -1 && old_dev != iminor(inode)) {
+	new_dev = MINOR(bdev->bd_dev);
+	UDRS->fd_device = new_dev;
+	set_capacity(disks[drive], floppy_sizes[new_dev]);
+	if (old_dev != -1 && old_dev != new_dev) {
 		if (buffer_drive == drive)
 		if (buffer_drive == drive)
 			buffer_track = -1;
 			buffer_track = -1;
 	}
 	}
 
 
-	/* Allow ioctls if we have write-permissions even if read-only open.
-	 * Needed so that programs such as fdrawcmd still can work on write
-	 * protected disks */
-	if ((filp->f_mode & FMODE_WRITE) || !file_permission(filp, MAY_WRITE))
-		filp->private_data = (void *)8;
-
 	if (UFDCS->rawcmd == 1)
 	if (UFDCS->rawcmd == 1)
 		UFDCS->rawcmd = 2;
 		UFDCS->rawcmd = 2;
 
 
-	if (!(filp->f_flags & O_NDELAY)) {
-		if (filp->f_mode & 3) {
+	if (!(mode & FMODE_NDELAY)) {
+		if (mode & (FMODE_READ|FMODE_WRITE)) {
 			UDRS->last_checked = 0;
 			UDRS->last_checked = 0;
-			check_disk_change(inode->i_bdev);
+			check_disk_change(bdev);
 			if (UTESTF(FD_DISK_CHANGED))
 			if (UTESTF(FD_DISK_CHANGED))
 				goto out;
 				goto out;
 		}
 		}
 		res = -EROFS;
 		res = -EROFS;
-		if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE)))
+		if ((mode & FMODE_WRITE) && !(UTESTF(FD_DISK_WRITABLE)))
 			goto out;
 			goto out;
 	}
 	}
 	mutex_unlock(&open_lock);
 	mutex_unlock(&open_lock);
@@ -3911,7 +3905,7 @@ static struct block_device_operations floppy_fops = {
 	.owner			= THIS_MODULE,
 	.owner			= THIS_MODULE,
 	.open			= floppy_open,
 	.open			= floppy_open,
 	.release		= floppy_release,
 	.release		= floppy_release,
-	.ioctl			= fd_ioctl,
+	.locked_ioctl		= fd_ioctl,
 	.getgeo			= fd_getgeo,
 	.getgeo			= fd_getgeo,
 	.media_changed		= check_floppy_change,
 	.media_changed		= check_floppy_change,
 	.revalidate_disk	= floppy_revalidate,
 	.revalidate_disk	= floppy_revalidate,

+ 30 - 29
drivers/block/loop.c

@@ -210,7 +210,7 @@ lo_do_transfer(struct loop_device *lo, int cmd,
  * space operations write_begin and write_end.
  * space operations write_begin and write_end.
  */
  */
 static int do_lo_send_aops(struct loop_device *lo, struct bio_vec *bvec,
 static int do_lo_send_aops(struct loop_device *lo, struct bio_vec *bvec,
-		int bsize, loff_t pos, struct page *unused)
+		loff_t pos, struct page *unused)
 {
 {
 	struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */
 	struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */
 	struct address_space *mapping = file->f_mapping;
 	struct address_space *mapping = file->f_mapping;
@@ -302,7 +302,7 @@ static int __do_lo_send_write(struct file *file,
  * filesystems.
  * filesystems.
  */
  */
 static int do_lo_send_direct_write(struct loop_device *lo,
 static int do_lo_send_direct_write(struct loop_device *lo,
-		struct bio_vec *bvec, int bsize, loff_t pos, struct page *page)
+		struct bio_vec *bvec, loff_t pos, struct page *page)
 {
 {
 	ssize_t bw = __do_lo_send_write(lo->lo_backing_file,
 	ssize_t bw = __do_lo_send_write(lo->lo_backing_file,
 			kmap(bvec->bv_page) + bvec->bv_offset,
 			kmap(bvec->bv_page) + bvec->bv_offset,
@@ -326,7 +326,7 @@ static int do_lo_send_direct_write(struct loop_device *lo,
  * destination pages of the backing file.
  * destination pages of the backing file.
  */
  */
 static int do_lo_send_write(struct loop_device *lo, struct bio_vec *bvec,
 static int do_lo_send_write(struct loop_device *lo, struct bio_vec *bvec,
-		int bsize, loff_t pos, struct page *page)
+		loff_t pos, struct page *page)
 {
 {
 	int ret = lo_do_transfer(lo, WRITE, page, 0, bvec->bv_page,
 	int ret = lo_do_transfer(lo, WRITE, page, 0, bvec->bv_page,
 			bvec->bv_offset, bvec->bv_len, pos >> 9);
 			bvec->bv_offset, bvec->bv_len, pos >> 9);
@@ -341,10 +341,9 @@ static int do_lo_send_write(struct loop_device *lo, struct bio_vec *bvec,
 	return ret;
 	return ret;
 }
 }
 
 
-static int lo_send(struct loop_device *lo, struct bio *bio, int bsize,
-		loff_t pos)
+static int lo_send(struct loop_device *lo, struct bio *bio, loff_t pos)
 {
 {
-	int (*do_lo_send)(struct loop_device *, struct bio_vec *, int, loff_t,
+	int (*do_lo_send)(struct loop_device *, struct bio_vec *, loff_t,
 			struct page *page);
 			struct page *page);
 	struct bio_vec *bvec;
 	struct bio_vec *bvec;
 	struct page *page = NULL;
 	struct page *page = NULL;
@@ -362,7 +361,7 @@ static int lo_send(struct loop_device *lo, struct bio *bio, int bsize,
 		}
 		}
 	}
 	}
 	bio_for_each_segment(bvec, bio, i) {
 	bio_for_each_segment(bvec, bio, i) {
-		ret = do_lo_send(lo, bvec, bsize, pos, page);
+		ret = do_lo_send(lo, bvec, pos, page);
 		if (ret < 0)
 		if (ret < 0)
 			break;
 			break;
 		pos += bvec->bv_len;
 		pos += bvec->bv_len;
@@ -478,7 +477,7 @@ static int do_bio_filebacked(struct loop_device *lo, struct bio *bio)
 
 
 	pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset;
 	pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset;
 	if (bio_rw(bio) == WRITE)
 	if (bio_rw(bio) == WRITE)
-		ret = lo_send(lo, bio, lo->lo_blocksize, pos);
+		ret = lo_send(lo, bio, pos);
 	else
 	else
 		ret = lo_receive(lo, bio, lo->lo_blocksize, pos);
 		ret = lo_receive(lo, bio, lo->lo_blocksize, pos);
 	return ret;
 	return ret;
@@ -652,8 +651,8 @@ static void do_loop_switch(struct loop_device *lo, struct switch_request *p)
  * This can only work if the loop device is used read-only, and if the
  * This can only work if the loop device is used read-only, and if the
  * new backing store is the same size and type as the old backing store.
  * new backing store is the same size and type as the old backing store.
  */
  */
-static int loop_change_fd(struct loop_device *lo, struct file *lo_file,
-		       struct block_device *bdev, unsigned int arg)
+static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+			  unsigned int arg)
 {
 {
 	struct file	*file, *old_file;
 	struct file	*file, *old_file;
 	struct inode	*inode;
 	struct inode	*inode;
@@ -712,7 +711,7 @@ static inline int is_loop_device(struct file *file)
 	return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
 	return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
 }
 }
 
 
-static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
+static int loop_set_fd(struct loop_device *lo, fmode_t mode,
 		       struct block_device *bdev, unsigned int arg)
 		       struct block_device *bdev, unsigned int arg)
 {
 {
 	struct file	*file, *f;
 	struct file	*file, *f;
@@ -740,7 +739,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
 	while (is_loop_device(f)) {
 	while (is_loop_device(f)) {
 		struct loop_device *l;
 		struct loop_device *l;
 
 
-		if (f->f_mapping->host->i_rdev == lo_file->f_mapping->host->i_rdev)
+		if (f->f_mapping->host->i_bdev == bdev)
 			goto out_putf;
 			goto out_putf;
 
 
 		l = f->f_mapping->host->i_bdev->bd_disk->private_data;
 		l = f->f_mapping->host->i_bdev->bd_disk->private_data;
@@ -786,7 +785,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
 		goto out_putf;
 		goto out_putf;
 	}
 	}
 
 
-	if (!(lo_file->f_mode & FMODE_WRITE))
+	if (!(mode & FMODE_WRITE))
 		lo_flags |= LO_FLAGS_READ_ONLY;
 		lo_flags |= LO_FLAGS_READ_ONLY;
 
 
 	set_device_ro(bdev, (lo_flags & LO_FLAGS_READ_ONLY) != 0);
 	set_device_ro(bdev, (lo_flags & LO_FLAGS_READ_ONLY) != 0);
@@ -918,9 +917,11 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
 	memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE);
 	memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE);
 	memset(lo->lo_crypt_name, 0, LO_NAME_SIZE);
 	memset(lo->lo_crypt_name, 0, LO_NAME_SIZE);
 	memset(lo->lo_file_name, 0, LO_NAME_SIZE);
 	memset(lo->lo_file_name, 0, LO_NAME_SIZE);
-	invalidate_bdev(bdev);
+	if (bdev)
+		invalidate_bdev(bdev);
 	set_capacity(lo->lo_disk, 0);
 	set_capacity(lo->lo_disk, 0);
-	bd_set_size(bdev, 0);
+	if (bdev)
+		bd_set_size(bdev, 0);
 	mapping_set_gfp_mask(filp->f_mapping, gfp);
 	mapping_set_gfp_mask(filp->f_mapping, gfp);
 	lo->lo_state = Lo_unbound;
 	lo->lo_state = Lo_unbound;
 	fput(filp);
 	fput(filp);
@@ -1137,22 +1138,22 @@ loop_get_status64(struct loop_device *lo, struct loop_info64 __user *arg) {
 	return err;
 	return err;
 }
 }
 
 
-static int lo_ioctl(struct inode * inode, struct file * file,
+static int lo_ioctl(struct block_device *bdev, fmode_t mode,
 	unsigned int cmd, unsigned long arg)
 	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;
 	int err;
 
 
 	mutex_lock(&lo->lo_ctl_mutex);
 	mutex_lock(&lo->lo_ctl_mutex);
 	switch (cmd) {
 	switch (cmd) {
 	case LOOP_SET_FD:
 	case LOOP_SET_FD:
-		err = loop_set_fd(lo, file, inode->i_bdev, arg);
+		err = loop_set_fd(lo, mode, bdev, arg);
 		break;
 		break;
 	case LOOP_CHANGE_FD:
 	case LOOP_CHANGE_FD:
-		err = loop_change_fd(lo, file, inode->i_bdev, arg);
+		err = loop_change_fd(lo, bdev, arg);
 		break;
 		break;
 	case LOOP_CLR_FD:
 	case LOOP_CLR_FD:
-		err = loop_clr_fd(lo, inode->i_bdev);
+		err = loop_clr_fd(lo, bdev);
 		break;
 		break;
 	case LOOP_SET_STATUS:
 	case LOOP_SET_STATUS:
 		err = loop_set_status_old(lo, (struct loop_info __user *) arg);
 		err = loop_set_status_old(lo, (struct loop_info __user *) arg);
@@ -1292,10 +1293,10 @@ loop_get_status_compat(struct loop_device *lo,
 	return err;
 	return err;
 }
 }
 
 
-static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode,
+			   unsigned int cmd, unsigned long arg)
 {
 {
-	struct inode *inode = file->f_path.dentry->d_inode;
-	struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct loop_device *lo = bdev->bd_disk->private_data;
 	int err;
 	int err;
 
 
 	switch(cmd) {
 	switch(cmd) {
@@ -1317,7 +1318,7 @@ static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a
 		arg = (unsigned long) compat_ptr(arg);
 		arg = (unsigned long) compat_ptr(arg);
 	case LOOP_SET_FD:
 	case LOOP_SET_FD:
 	case LOOP_CHANGE_FD:
 	case LOOP_CHANGE_FD:
-		err = lo_ioctl(inode, file, cmd, arg);
+		err = lo_ioctl(bdev, mode, cmd, arg);
 		break;
 		break;
 	default:
 	default:
 		err = -ENOIOCTLCMD;
 		err = -ENOIOCTLCMD;
@@ -1327,9 +1328,9 @@ static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a
 }
 }
 #endif
 #endif
 
 
-static int lo_open(struct inode *inode, struct file *file)
+static int lo_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct loop_device *lo = bdev->bd_disk->private_data;
 
 
 	mutex_lock(&lo->lo_ctl_mutex);
 	mutex_lock(&lo->lo_ctl_mutex);
 	lo->lo_refcnt++;
 	lo->lo_refcnt++;
@@ -1338,15 +1339,15 @@ static int lo_open(struct inode *inode, struct file *file)
 	return 0;
 	return 0;
 }
 }
 
 
-static int lo_release(struct inode *inode, struct file *file)
+static int lo_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
+	struct loop_device *lo = disk->private_data;
 
 
 	mutex_lock(&lo->lo_ctl_mutex);
 	mutex_lock(&lo->lo_ctl_mutex);
 	--lo->lo_refcnt;
 	--lo->lo_refcnt;
 
 
 	if ((lo->lo_flags & LO_FLAGS_AUTOCLEAR) && !lo->lo_refcnt)
 	if ((lo->lo_flags & LO_FLAGS_AUTOCLEAR) && !lo->lo_refcnt)
-		loop_clr_fd(lo, inode->i_bdev);
+		loop_clr_fd(lo, NULL);
 
 
 	mutex_unlock(&lo->lo_ctl_mutex);
 	mutex_unlock(&lo->lo_ctl_mutex);
 
 

+ 14 - 14
drivers/block/nbd.c

@@ -557,10 +557,11 @@ static void do_nbd_request(struct request_queue * q)
 	}
 	}
 }
 }
 
 
-static int nbd_ioctl(struct inode *inode, struct file *file,
+static int nbd_ioctl(struct block_device *bdev, fmode_t mode,
 		     unsigned int cmd, unsigned long arg)
 		     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;
+	struct file *file;
 	int error;
 	int error;
 	struct request sreq ;
 	struct request sreq ;
 	struct task_struct *thread;
 	struct task_struct *thread;
@@ -612,8 +613,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
 		error = -EINVAL;
 		error = -EINVAL;
 		file = fget(arg);
 		file = fget(arg);
 		if (file) {
 		if (file) {
-			struct block_device *bdev = inode->i_bdev;
-			inode = file->f_path.dentry->d_inode;
+			struct inode *inode = file->f_path.dentry->d_inode;
 			if (S_ISSOCK(inode->i_mode)) {
 			if (S_ISSOCK(inode->i_mode)) {
 				lo->file = file;
 				lo->file = file;
 				lo->sock = SOCKET_I(inode);
 				lo->sock = SOCKET_I(inode);
@@ -628,14 +628,14 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
 	case NBD_SET_BLKSIZE:
 	case NBD_SET_BLKSIZE:
 		lo->blksize = arg;
 		lo->blksize = arg;
 		lo->bytesize &= ~(lo->blksize-1);
 		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);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 		return 0;
 	case NBD_SET_SIZE:
 	case NBD_SET_SIZE:
 		lo->bytesize = arg & ~(lo->blksize-1);
 		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);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 		return 0;
 	case NBD_SET_TIMEOUT:
 	case NBD_SET_TIMEOUT:
@@ -643,8 +643,8 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
 		return 0;
 		return 0;
 	case NBD_SET_SIZE_BLOCKS:
 	case NBD_SET_SIZE_BLOCKS:
 		lo->bytesize = ((u64) arg) * lo->blksize;
 		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);
 		set_capacity(lo->disk, lo->bytesize >> 9);
 		return 0;
 		return 0;
 	case NBD_DO_IT:
 	case NBD_DO_IT:
@@ -666,10 +666,10 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
 		if (file)
 		if (file)
 			fput(file);
 			fput(file);
 		lo->bytesize = 0;
 		lo->bytesize = 0;
-		inode->i_bdev->bd_inode->i_size = 0;
+		bdev->bd_inode->i_size = 0;
 		set_capacity(lo->disk, 0);
 		set_capacity(lo->disk, 0);
 		if (max_part > 0)
 		if (max_part > 0)
-			ioctl_by_bdev(inode->i_bdev, BLKRRPART, 0);
+			ioctl_by_bdev(bdev, BLKRRPART, 0);
 		return lo->harderror;
 		return lo->harderror;
 	case NBD_CLEAR_QUE:
 	case NBD_CLEAR_QUE:
 		/*
 		/*
@@ -680,7 +680,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
 		return 0;
 		return 0;
 	case NBD_PRINT_DEBUG:
 	case NBD_PRINT_DEBUG:
 		printk(KERN_INFO "%s: next = %p, prev = %p, head = %p\n",
 		printk(KERN_INFO "%s: next = %p, prev = %p, head = %p\n",
-			inode->i_bdev->bd_disk->disk_name,
+			bdev->bd_disk->disk_name,
 			lo->queue_head.next, lo->queue_head.prev,
 			lo->queue_head.next, lo->queue_head.prev,
 			&lo->queue_head);
 			&lo->queue_head);
 		return 0;
 		return 0;
@@ -691,7 +691,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
 static struct block_device_operations nbd_fops =
 static struct block_device_operations nbd_fops =
 {
 {
 	.owner =	THIS_MODULE,
 	.owner =	THIS_MODULE,
-	.ioctl =	nbd_ioctl,
+	.locked_ioctl =	nbd_ioctl,
 };
 };
 
 
 /*
 /*

+ 11 - 10
drivers/block/paride/pcd.c

@@ -223,23 +223,24 @@ static int pcd_warned;		/* Have we logged a phase warning ? */
 
 
 /* kernel glue structures */
 /* kernel glue structures */
 
 
-static int pcd_block_open(struct inode *inode, struct file *file)
+static int pcd_block_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-	return cdrom_open(&cd->info, inode, file);
+	struct pcd_unit *cd = bdev->bd_disk->private_data;
+	return cdrom_open(&cd->info, bdev, mode);
 }
 }
 
 
-static int pcd_block_release(struct inode *inode, struct file *file)
+static int pcd_block_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-	return cdrom_release(&cd->info, file);
+	struct pcd_unit *cd = disk->private_data;
+	cdrom_release(&cd->info, mode);
+	return 0;
 }
 }
 
 
-static int pcd_block_ioctl(struct inode *inode, struct file *file,
+static int pcd_block_ioctl(struct block_device *bdev, fmode_t mode,
 				unsigned cmd, unsigned long arg)
 				unsigned cmd, unsigned long arg)
 {
 {
-	struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-	return cdrom_ioctl(file, &cd->info, inode, cmd, arg);
+	struct pcd_unit *cd = bdev->bd_disk->private_data;
+	return cdrom_ioctl(&cd->info, bdev, mode, cmd, arg);
 }
 }
 
 
 static int pcd_block_media_changed(struct gendisk *disk)
 static int pcd_block_media_changed(struct gendisk *disk)
@@ -252,7 +253,7 @@ static struct block_device_operations pcd_bdops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= pcd_block_open,
 	.open		= pcd_block_open,
 	.release	= pcd_block_release,
 	.release	= pcd_block_release,
-	.ioctl		= pcd_block_ioctl,
+	.locked_ioctl	= pcd_block_ioctl,
 	.media_changed	= pcd_block_media_changed,
 	.media_changed	= pcd_block_media_changed,
 };
 };
 
 

+ 7 - 7
drivers/block/paride/pd.c

@@ -728,9 +728,9 @@ static int pd_special_command(struct pd_unit *disk,
 
 
 /* kernel glue structures */
 /* kernel glue structures */
 
 
-static int pd_open(struct inode *inode, struct file *file)
+static int pd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
+	struct pd_unit *disk = bdev->bd_disk->private_data;
 
 
 	disk->access++;
 	disk->access++;
 
 
@@ -758,10 +758,10 @@ static int pd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return 0;
 	return 0;
 }
 }
 
 
-static int pd_ioctl(struct inode *inode, struct file *file,
+static int pd_ioctl(struct block_device *bdev, fmode_t mode,
 	 unsigned int cmd, unsigned long arg)
 	 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;
 
 
 	switch (cmd) {
 	switch (cmd) {
 	case CDROMEJECT:
 	case CDROMEJECT:
@@ -773,9 +773,9 @@ static int pd_ioctl(struct inode *inode, struct file *file,
 	}
 	}
 }
 }
 
 
-static int pd_release(struct inode *inode, struct file *file)
+static int pd_release(struct gendisk *p, fmode_t mode)
 {
 {
-	struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
+	struct pd_unit *disk = p->private_data;
 
 
 	if (!--disk->access && disk->removable)
 	if (!--disk->access && disk->removable)
 		pd_special_command(disk, pd_door_unlock);
 		pd_special_command(disk, pd_door_unlock);
@@ -809,7 +809,7 @@ static struct block_device_operations pd_fops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= pd_open,
 	.open		= pd_open,
 	.release	= pd_release,
 	.release	= pd_release,
-	.ioctl		= pd_ioctl,
+	.locked_ioctl	= pd_ioctl,
 	.getgeo		= pd_getgeo,
 	.getgeo		= pd_getgeo,
 	.media_changed	= pd_check_media,
 	.media_changed	= pd_check_media,
 	.revalidate_disk= pd_revalidate
 	.revalidate_disk= pd_revalidate

+ 11 - 11
drivers/block/paride/pf.c

@@ -201,13 +201,13 @@ module_param_array(drive3, int, NULL, 0);
 #define ATAPI_READ_10		0x28
 #define ATAPI_READ_10		0x28
 #define ATAPI_WRITE_10		0x2a
 #define ATAPI_WRITE_10		0x2a
 
 
-static int pf_open(struct inode *inode, struct file *file);
+static int pf_open(struct block_device *bdev, fmode_t mode);
 static void do_pf_request(struct request_queue * q);
 static void do_pf_request(struct request_queue * q);
-static int pf_ioctl(struct inode *inode, struct file *file,
+static int pf_ioctl(struct block_device *bdev, fmode_t mode,
 		    unsigned int cmd, unsigned long arg);
 		    unsigned int cmd, unsigned long arg);
 static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 
 
-static int pf_release(struct inode *inode, struct file *file);
+static int pf_release(struct gendisk *disk, fmode_t mode);
 
 
 static int pf_detect(void);
 static int pf_detect(void);
 static void do_pf_read(void);
 static void do_pf_read(void);
@@ -266,7 +266,7 @@ static struct block_device_operations pf_fops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= pf_open,
 	.open		= pf_open,
 	.release	= pf_release,
 	.release	= pf_release,
-	.ioctl		= pf_ioctl,
+	.locked_ioctl	= pf_ioctl,
 	.getgeo		= pf_getgeo,
 	.getgeo		= pf_getgeo,
 	.media_changed	= pf_check_media,
 	.media_changed	= pf_check_media,
 };
 };
@@ -296,16 +296,16 @@ static void __init pf_init_units(void)
 	}
 	}
 }
 }
 
 
-static int pf_open(struct inode *inode, struct file *file)
+static int pf_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
+	struct pf_unit *pf = bdev->bd_disk->private_data;
 
 
 	pf_identify(pf);
 	pf_identify(pf);
 
 
 	if (pf->media_status == PF_NM)
 	if (pf->media_status == PF_NM)
 		return -ENODEV;
 		return -ENODEV;
 
 
-	if ((pf->media_status == PF_RO) && (file->f_mode & 2))
+	if ((pf->media_status == PF_RO) && (mode & FMODE_WRITE))
 		return -EROFS;
 		return -EROFS;
 
 
 	pf->access++;
 	pf->access++;
@@ -333,9 +333,9 @@ static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return 0;
 	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, fmode_t mode, 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;
 
 
 	if (cmd != CDROMEJECT)
 	if (cmd != CDROMEJECT)
 		return -EINVAL;
 		return -EINVAL;
@@ -346,9 +346,9 @@ static int pf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
 	return 0;
 	return 0;
 }
 }
 
 
-static int pf_release(struct inode *inode, struct file *file)
+static int pf_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
+	struct pf_unit *pf = disk->private_data;
 
 
 	if (pf->access <= 0)
 	if (pf->access <= 0)
 		return -EINVAL;
 		return -EINVAL;

+ 1 - 1
drivers/block/paride/pt.c

@@ -667,7 +667,7 @@ static int pt_open(struct inode *inode, struct file *file)
 		goto out;
 		goto out;
 
 
 	err = -EROFS;
 	err = -EROFS;
-	if ((!(tape->flags & PT_WRITE_OK)) && (file->f_mode & 2))
+	if ((!(tape->flags & PT_WRITE_OK)) && (file->f_mode & FMODE_WRITE))
 		goto out;
 		goto out;
 
 
 	if (!(iminor(inode) & 128))
 	if (!(iminor(inode) & 128))

+ 28 - 28
drivers/block/pktcdvd.c

@@ -2320,7 +2320,7 @@ static int pkt_open_write(struct pktcdvd_device *pd)
 /*
 /*
  * called at open time.
  * called at open time.
  */
  */
-static int pkt_open_dev(struct pktcdvd_device *pd, int write)
+static int pkt_open_dev(struct pktcdvd_device *pd, fmode_t write)
 {
 {
 	int ret;
 	int ret;
 	long lba;
 	long lba;
@@ -2332,7 +2332,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, int write)
 	 * so bdget() can't fail.
 	 * so bdget() can't fail.
 	 */
 	 */
 	bdget(pd->bdev->bd_dev);
 	bdget(pd->bdev->bd_dev);
-	if ((ret = blkdev_get(pd->bdev, FMODE_READ, O_RDONLY)))
+	if ((ret = blkdev_get(pd->bdev, FMODE_READ)))
 		goto out;
 		goto out;
 
 
 	if ((ret = bd_claim(pd->bdev, pd)))
 	if ((ret = bd_claim(pd->bdev, pd)))
@@ -2381,7 +2381,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, int write)
 out_unclaim:
 out_unclaim:
 	bd_release(pd->bdev);
 	bd_release(pd->bdev);
 out_putdev:
 out_putdev:
-	blkdev_put(pd->bdev);
+	blkdev_put(pd->bdev, FMODE_READ);
 out:
 out:
 	return ret;
 	return ret;
 }
 }
@@ -2399,7 +2399,7 @@ static void pkt_release_dev(struct pktcdvd_device *pd, int flush)
 
 
 	pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
 	pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
 	bd_release(pd->bdev);
 	bd_release(pd->bdev);
-	blkdev_put(pd->bdev);
+	blkdev_put(pd->bdev, FMODE_READ);
 
 
 	pkt_shrink_pktlist(pd);
 	pkt_shrink_pktlist(pd);
 }
 }
@@ -2411,7 +2411,7 @@ static struct pktcdvd_device *pkt_find_dev_from_minor(int dev_minor)
 	return pkt_devs[dev_minor];
 	return pkt_devs[dev_minor];
 }
 }
 
 
-static int pkt_open(struct inode *inode, struct file *file)
+static int pkt_open(struct block_device *bdev, fmode_t mode)
 {
 {
 	struct pktcdvd_device *pd = NULL;
 	struct pktcdvd_device *pd = NULL;
 	int ret;
 	int ret;
@@ -2419,7 +2419,7 @@ static int pkt_open(struct inode *inode, struct file *file)
 	VPRINTK(DRIVER_NAME": entering open\n");
 	VPRINTK(DRIVER_NAME": entering open\n");
 
 
 	mutex_lock(&ctl_mutex);
 	mutex_lock(&ctl_mutex);
-	pd = pkt_find_dev_from_minor(iminor(inode));
+	pd = pkt_find_dev_from_minor(MINOR(bdev->bd_dev));
 	if (!pd) {
 	if (!pd) {
 		ret = -ENODEV;
 		ret = -ENODEV;
 		goto out;
 		goto out;
@@ -2428,20 +2428,20 @@ static int pkt_open(struct inode *inode, struct file *file)
 
 
 	pd->refcnt++;
 	pd->refcnt++;
 	if (pd->refcnt > 1) {
 	if (pd->refcnt > 1) {
-		if ((file->f_mode & FMODE_WRITE) &&
+		if ((mode & FMODE_WRITE) &&
 		    !test_bit(PACKET_WRITABLE, &pd->flags)) {
 		    !test_bit(PACKET_WRITABLE, &pd->flags)) {
 			ret = -EBUSY;
 			ret = -EBUSY;
 			goto out_dec;
 			goto out_dec;
 		}
 		}
 	} else {
 	} else {
-		ret = pkt_open_dev(pd, file->f_mode & FMODE_WRITE);
+		ret = pkt_open_dev(pd, mode & FMODE_WRITE);
 		if (ret)
 		if (ret)
 			goto out_dec;
 			goto out_dec;
 		/*
 		/*
 		 * needed here as well, since ext2 (among others) may change
 		 * needed here as well, since ext2 (among others) may change
 		 * the blocksize at mount time
 		 * the blocksize at mount time
 		 */
 		 */
-		set_blocksize(inode->i_bdev, CD_FRAMESIZE);
+		set_blocksize(bdev, CD_FRAMESIZE);
 	}
 	}
 
 
 	mutex_unlock(&ctl_mutex);
 	mutex_unlock(&ctl_mutex);
@@ -2455,9 +2455,9 @@ out:
 	return ret;
 	return ret;
 }
 }
 
 
-static int pkt_close(struct inode *inode, struct file *file)
+static int pkt_close(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct pktcdvd_device *pd = inode->i_bdev->bd_disk->private_data;
+	struct pktcdvd_device *pd = disk->private_data;
 	int ret = 0;
 	int ret = 0;
 
 
 	mutex_lock(&ctl_mutex);
 	mutex_lock(&ctl_mutex);
@@ -2765,7 +2765,7 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev)
 	bdev = bdget(dev);
 	bdev = bdget(dev);
 	if (!bdev)
 	if (!bdev)
 		return -ENOMEM;
 		return -ENOMEM;
-	ret = blkdev_get(bdev, FMODE_READ, O_RDONLY | O_NONBLOCK);
+	ret = blkdev_get(bdev, FMODE_READ | FMODE_NDELAY);
 	if (ret)
 	if (ret)
 		return ret;
 		return ret;
 
 
@@ -2790,19 +2790,28 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev)
 	return 0;
 	return 0;
 
 
 out_mem:
 out_mem:
-	blkdev_put(bdev);
+	blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 	/* This is safe: open() is still holding a reference. */
 	/* This is safe: open() is still holding a reference. */
 	module_put(THIS_MODULE);
 	module_put(THIS_MODULE);
 	return ret;
 	return ret;
 }
 }
 
 
-static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
 {
 {
-	struct pktcdvd_device *pd = inode->i_bdev->bd_disk->private_data;
+	struct pktcdvd_device *pd = bdev->bd_disk->private_data;
 
 
-	VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd, imajor(inode), iminor(inode));
+	VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd,
+		MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev));
 
 
 	switch (cmd) {
 	switch (cmd) {
+	case CDROMEJECT:
+		/*
+		 * The door gets locked when the device is opened, so we
+		 * have to unlock it or else the eject command fails.
+		 */
+		if (pd->refcnt == 1)
+			pkt_lock_door(pd, 0);
+		/* fallthru */
 	/*
 	/*
 	 * forward selected CDROM ioctls to CD-ROM, for UDF
 	 * forward selected CDROM ioctls to CD-ROM, for UDF
 	 */
 	 */
@@ -2811,16 +2820,7 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u
 	case CDROM_LAST_WRITTEN:
 	case CDROM_LAST_WRITTEN:
 	case CDROM_SEND_PACKET:
 	case CDROM_SEND_PACKET:
 	case SCSI_IOCTL_SEND_COMMAND:
 	case SCSI_IOCTL_SEND_COMMAND:
-		return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg);
-
-	case CDROMEJECT:
-		/*
-		 * The door gets locked when the device is opened, so we
-		 * have to unlock it or else the eject command fails.
-		 */
-		if (pd->refcnt == 1)
-			pkt_lock_door(pd, 0);
-		return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg);
+		return __blkdev_driver_ioctl(pd->bdev, mode, cmd, arg);
 
 
 	default:
 	default:
 		VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd);
 		VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd);
@@ -2849,7 +2849,7 @@ static struct block_device_operations pktcdvd_ops = {
 	.owner =		THIS_MODULE,
 	.owner =		THIS_MODULE,
 	.open =			pkt_open,
 	.open =			pkt_open,
 	.release =		pkt_close,
 	.release =		pkt_close,
-	.ioctl =		pkt_ioctl,
+	.locked_ioctl =		pkt_ioctl,
 	.media_changed =	pkt_media_changed,
 	.media_changed =	pkt_media_changed,
 };
 };
 
 
@@ -2975,7 +2975,7 @@ static int pkt_remove_dev(dev_t pkt_dev)
 	pkt_debugfs_dev_remove(pd);
 	pkt_debugfs_dev_remove(pd);
 	pkt_sysfs_dev_remove(pd);
 	pkt_sysfs_dev_remove(pd);
 
 
-	blkdev_put(pd->bdev);
+	blkdev_put(pd->bdev, FMODE_READ|FMODE_WRITE);
 
 
 	remove_proc_entry(pd->name, pkt_proc);
 	remove_proc_entry(pd->name, pkt_proc);
 	DPRINTK(DRIVER_NAME": writer %s unmapped\n", pd->name);
 	DPRINTK(DRIVER_NAME": writer %s unmapped\n", pd->name);

+ 16 - 16
drivers/block/swim3.c

@@ -244,10 +244,10 @@ static int grab_drive(struct floppy_state *fs, enum swim_state state,
 		      int interruptible);
 		      int interruptible);
 static void release_drive(struct floppy_state *fs);
 static void release_drive(struct floppy_state *fs);
 static int fd_eject(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, fmode_t mode,
 			unsigned int cmd, unsigned long param);
 			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);
+static int floppy_open(struct block_device *bdev, fmode_t mode);
+static int floppy_release(struct gendisk *disk, fmode_t mode);
 static int floppy_check_change(struct gendisk *disk);
 static int floppy_check_change(struct gendisk *disk);
 static int floppy_revalidate(struct gendisk *disk);
 static int floppy_revalidate(struct gendisk *disk);
 
 
@@ -839,10 +839,10 @@ static int fd_eject(struct floppy_state *fs)
 static struct floppy_struct floppy_type =
 static struct floppy_struct floppy_type =
 	{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL };	/*  7 1.44MB 3.5"   */
 	{ 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, fmode_t mode,
 			unsigned int cmd, unsigned long param)
 			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;
 	int err;
 		
 		
 	if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
 	if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
@@ -868,9 +868,9 @@ static int floppy_ioctl(struct inode *inode, struct file *filp,
 	return -ENOTTY;
 	return -ENOTTY;
 }
 }
 
 
-static int floppy_open(struct inode *inode, struct file *filp)
+static int floppy_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = bdev->bd_disk->private_data;
 	struct swim3 __iomem *sw = fs->swim3;
 	struct swim3 __iomem *sw = fs->swim3;
 	int n, err = 0;
 	int n, err = 0;
 
 
@@ -904,17 +904,17 @@ static int floppy_open(struct inode *inode, struct file *filp)
 		swim3_action(fs, SETMFM);
 		swim3_action(fs, SETMFM);
 		swim3_select(fs, RELAX);
 		swim3_select(fs, RELAX);
 
 
-	} else if (fs->ref_count == -1 || filp->f_flags & O_EXCL)
+	} else if (fs->ref_count == -1 || mode & FMODE_EXCL)
 		return -EBUSY;
 		return -EBUSY;
 
 
-	if (err == 0 && (filp->f_flags & O_NDELAY) == 0
-	    && (filp->f_mode & 3)) {
-		check_disk_change(inode->i_bdev);
+	if (err == 0 && (mode & FMODE_NDELAY) == 0
+	    && (mode & (FMODE_READ|FMODE_WRITE))) {
+		check_disk_change(bdev);
 		if (fs->ejected)
 		if (fs->ejected)
 			err = -ENXIO;
 			err = -ENXIO;
 	}
 	}
 
 
-	if (err == 0 && (filp->f_mode & 2)) {
+	if (err == 0 && (mode & FMODE_WRITE)) {
 		if (fs->write_prot < 0)
 		if (fs->write_prot < 0)
 			fs->write_prot = swim3_readbit(fs, WRITE_PROT);
 			fs->write_prot = swim3_readbit(fs, WRITE_PROT);
 		if (fs->write_prot)
 		if (fs->write_prot)
@@ -930,7 +930,7 @@ static int floppy_open(struct inode *inode, struct file *filp)
 		return err;
 		return err;
 	}
 	}
 
 
-	if (filp->f_flags & O_EXCL)
+	if (mode & FMODE_EXCL)
 		fs->ref_count = -1;
 		fs->ref_count = -1;
 	else
 	else
 		++fs->ref_count;
 		++fs->ref_count;
@@ -938,9 +938,9 @@ static int floppy_open(struct inode *inode, struct file *filp)
 	return 0;
 	return 0;
 }
 }
 
 
-static int floppy_release(struct inode *inode, struct file *filp)
+static int floppy_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
+	struct floppy_state *fs = disk->private_data;
 	struct swim3 __iomem *sw = fs->swim3;
 	struct swim3 __iomem *sw = fs->swim3;
 	if (fs->ref_count > 0 && --fs->ref_count == 0) {
 	if (fs->ref_count > 0 && --fs->ref_count == 0) {
 		swim3_action(fs, MOTOR_OFF);
 		swim3_action(fs, MOTOR_OFF);
@@ -1000,7 +1000,7 @@ static int floppy_revalidate(struct gendisk *disk)
 static struct block_device_operations floppy_fops = {
 static struct block_device_operations floppy_fops = {
 	.open		= floppy_open,
 	.open		= floppy_open,
 	.release	= floppy_release,
 	.release	= floppy_release,
-	.ioctl		= floppy_ioctl,
+	.locked_ioctl	= floppy_ioctl,
 	.media_changed	= floppy_check_change,
 	.media_changed	= floppy_check_change,
 	.revalidate_disk= floppy_revalidate,
 	.revalidate_disk= floppy_revalidate,
 };
 };

+ 10 - 12
drivers/block/ub.c

@@ -1667,10 +1667,9 @@ static void ub_revalidate(struct ub_dev *sc, struct ub_lun *lun)
  * This is mostly needed to keep refcounting, but also to support
  * This is mostly needed to keep refcounting, but also to support
  * media checks on removable media drives.
  * media checks on removable media drives.
  */
  */
-static int ub_bd_open(struct inode *inode, struct file *filp)
+static int ub_bd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
-	struct ub_lun *lun = disk->private_data;
+	struct ub_lun *lun = bdev->bd_disk->private_data;
 	struct ub_dev *sc = lun->udev;
 	struct ub_dev *sc = lun->udev;
 	unsigned long flags;
 	unsigned long flags;
 	int rc;
 	int rc;
@@ -1684,19 +1683,19 @@ static int ub_bd_open(struct inode *inode, struct file *filp)
 	spin_unlock_irqrestore(&ub_lock, flags);
 	spin_unlock_irqrestore(&ub_lock, flags);
 
 
 	if (lun->removable || lun->readonly)
 	if (lun->removable || lun->readonly)
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 
 
 	/*
 	/*
 	 * The sd.c considers ->media_present and ->changed not equivalent,
 	 * The sd.c considers ->media_present and ->changed not equivalent,
 	 * under some pretty murky conditions (a failure of READ CAPACITY).
 	 * under some pretty murky conditions (a failure of READ CAPACITY).
 	 * We may need it one day.
 	 * We may need it one day.
 	 */
 	 */
-	if (lun->removable && lun->changed && !(filp->f_flags & O_NDELAY)) {
+	if (lun->removable && lun->changed && !(mode & FMODE_NDELAY)) {
 		rc = -ENOMEDIUM;
 		rc = -ENOMEDIUM;
 		goto err_open;
 		goto err_open;
 	}
 	}
 
 
-	if (lun->readonly && (filp->f_mode & FMODE_WRITE)) {
+	if (lun->readonly && (mode & FMODE_WRITE)) {
 		rc = -EROFS;
 		rc = -EROFS;
 		goto err_open;
 		goto err_open;
 	}
 	}
@@ -1710,9 +1709,8 @@ err_open:
 
 
 /*
 /*
  */
  */
-static int ub_bd_release(struct inode *inode, struct file *filp)
+static int ub_bd_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct ub_lun *lun = disk->private_data;
 	struct ub_lun *lun = disk->private_data;
 	struct ub_dev *sc = lun->udev;
 	struct ub_dev *sc = lun->udev;
 
 
@@ -1723,13 +1721,13 @@ static int ub_bd_release(struct inode *inode, struct file *filp)
 /*
 /*
  * The ioctl interface.
  * The ioctl interface.
  */
  */
-static int ub_bd_ioctl(struct inode *inode, struct file *filp,
+static int ub_bd_ioctl(struct block_device *bdev, fmode_t mode,
     unsigned int cmd, unsigned long arg)
     unsigned int cmd, unsigned long arg)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	void __user *usermem = (void __user *) arg;
 	void __user *usermem = (void __user *) arg;
 
 
-	return scsi_cmd_ioctl(filp, disk->queue, disk, cmd, usermem);
+	return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem);
 }
 }
 
 
 /*
 /*
@@ -1793,7 +1791,7 @@ static struct block_device_operations ub_bd_fops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= ub_bd_open,
 	.open		= ub_bd_open,
 	.release	= ub_bd_release,
 	.release	= ub_bd_release,
-	.ioctl		= ub_bd_ioctl,
+	.locked_ioctl	= ub_bd_ioctl,
 	.media_changed	= ub_bd_media_changed,
 	.media_changed	= ub_bd_media_changed,
 	.revalidate_disk = ub_bd_revalidate,
 	.revalidate_disk = ub_bd_revalidate,
 };
 };

+ 5 - 5
drivers/block/viodasd.c

@@ -130,15 +130,15 @@ struct viodasd_device {
 /*
 /*
  * External open entry point.
  * External open entry point.
  */
  */
-static int viodasd_open(struct inode *ino, struct file *fil)
+static int viodasd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct viodasd_device *d = ino->i_bdev->bd_disk->private_data;
+	struct viodasd_device *d = bdev->bd_disk->private_data;
 	HvLpEvent_Rc hvrc;
 	HvLpEvent_Rc hvrc;
 	struct viodasd_waitevent we;
 	struct viodasd_waitevent we;
 	u16 flags = 0;
 	u16 flags = 0;
 
 
 	if (d->read_only) {
 	if (d->read_only) {
-		if ((fil != NULL) && (fil->f_mode & FMODE_WRITE))
+		if (mode & FMODE_WRITE)
 			return -EROFS;
 			return -EROFS;
 		flags = vioblockflags_ro;
 		flags = vioblockflags_ro;
 	}
 	}
@@ -179,9 +179,9 @@ static int viodasd_open(struct inode *ino, struct file *fil)
 /*
 /*
  * External release entry point.
  * External release entry point.
  */
  */
-static int viodasd_release(struct inode *ino, struct file *fil)
+static int viodasd_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct viodasd_device *d = ino->i_bdev->bd_disk->private_data;
+	struct viodasd_device *d = disk->private_data;
 	HvLpEvent_Rc hvrc;
 	HvLpEvent_Rc hvrc;
 
 
 	/* Send the event to OS/400.  We DON'T expect a response */
 	/* Send the event to OS/400.  We DON'T expect a response */

+ 4 - 4
drivers/block/virtio_blk.c

@@ -146,11 +146,11 @@ static void do_virtblk_request(struct request_queue *q)
 		vblk->vq->vq_ops->kick(vblk->vq);
 		vblk->vq->vq_ops->kick(vblk->vq);
 }
 }
 
 
-static int virtblk_ioctl(struct inode *inode, struct file *filp,
+static int virtblk_ioctl(struct block_device *bdev, fmode_t mode,
 			 unsigned cmd, unsigned long data)
 			 unsigned cmd, unsigned long data)
 {
 {
-	return scsi_cmd_ioctl(filp, inode->i_bdev->bd_disk->queue,
-			      inode->i_bdev->bd_disk, cmd,
+	return scsi_cmd_ioctl(bdev->bd_disk->queue,
+			      bdev->bd_disk, mode, cmd,
 			      (void __user *)data);
 			      (void __user *)data);
 }
 }
 
 
@@ -180,7 +180,7 @@ static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo)
 }
 }
 
 
 static struct block_device_operations virtblk_fops = {
 static struct block_device_operations virtblk_fops = {
-	.ioctl  = virtblk_ioctl,
+	.locked_ioctl = virtblk_ioctl,
 	.owner  = THIS_MODULE,
 	.owner  = THIS_MODULE,
 	.getgeo = virtblk_getgeo,
 	.getgeo = virtblk_getgeo,
 };
 };

+ 2 - 2
drivers/block/xd.c

@@ -132,7 +132,7 @@ static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 
 
 static struct block_device_operations xd_fops = {
 static struct block_device_operations xd_fops = {
 	.owner	= THIS_MODULE,
 	.owner	= THIS_MODULE,
-	.ioctl	= xd_ioctl,
+	.locked_ioctl	= xd_ioctl,
 	.getgeo = xd_getgeo,
 	.getgeo = xd_getgeo,
 };
 };
 static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int);
 static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int);
@@ -343,7 +343,7 @@ static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 }
 }
 
 
 /* xd_ioctl: handle device ioctl's */
 /* 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, fmode_t mode, u_int cmd, u_long arg)
 {
 {
 	switch (cmd) {
 	switch (cmd) {
 		case HDIO_SET_DMA:
 		case HDIO_SET_DMA:

+ 1 - 1
drivers/block/xd.h

@@ -105,7 +105,7 @@ static u_char xd_detect (u_char *controller, unsigned int *address);
 static u_char xd_initdrives (void (*init_drive)(u_char drive));
 static u_char xd_initdrives (void (*init_drive)(u_char drive));
 
 
 static void do_xd_request (struct request_queue * q);
 static void do_xd_request (struct request_queue * 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,fmode_t mode,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 int xd_readwrite (u_char operation,XD_INFO *disk,char *buffer,u_int block,u_int count);
 static void xd_recalibrate (u_char drive);
 static void xd_recalibrate (u_char drive);
 
 

+ 7 - 8
drivers/block/xen-blkfront.c

@@ -156,11 +156,10 @@ static int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg)
 	return 0;
 	return 0;
 }
 }
 
 
-static int blkif_ioctl(struct inode *inode, struct file *filep,
+static int blkif_ioctl(struct block_device *bdev, fmode_t mode,
 		       unsigned command, unsigned long argument)
 		       unsigned command, unsigned long argument)
 {
 {
-	struct blkfront_info *info =
-		inode->i_bdev->bd_disk->private_data;
+	struct blkfront_info *info = bdev->bd_disk->private_data;
 	int i;
 	int i;
 
 
 	dev_dbg(&info->xbdev->dev, "command: 0x%x, argument: 0x%lx\n",
 	dev_dbg(&info->xbdev->dev, "command: 0x%x, argument: 0x%lx\n",
@@ -1014,16 +1013,16 @@ static int blkfront_is_ready(struct xenbus_device *dev)
 	return info->is_ready;
 	return info->is_ready;
 }
 }
 
 
-static int blkif_open(struct inode *inode, struct file *filep)
+static int blkif_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct blkfront_info *info = inode->i_bdev->bd_disk->private_data;
+	struct blkfront_info *info = bdev->bd_disk->private_data;
 	info->users++;
 	info->users++;
 	return 0;
 	return 0;
 }
 }
 
 
-static int blkif_release(struct inode *inode, struct file *filep)
+static int blkif_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct blkfront_info *info = inode->i_bdev->bd_disk->private_data;
+	struct blkfront_info *info = disk->private_data;
 	info->users--;
 	info->users--;
 	if (info->users == 0) {
 	if (info->users == 0) {
 		/* Check whether we have been instructed to close.  We will
 		/* Check whether we have been instructed to close.  We will
@@ -1044,7 +1043,7 @@ static struct block_device_operations xlvbd_block_fops =
 	.open = blkif_open,
 	.open = blkif_open,
 	.release = blkif_release,
 	.release = blkif_release,
 	.getgeo = blkif_getgeo,
 	.getgeo = blkif_getgeo,
-	.ioctl = blkif_ioctl,
+	.locked_ioctl = blkif_ioctl,
 };
 };
 
 
 
 

+ 5 - 6
drivers/block/xsysace.c

@@ -870,25 +870,24 @@ static int ace_revalidate_disk(struct gendisk *gd)
 	return ace->id_result;
 	return ace->id_result;
 }
 }
 
 
-static int ace_open(struct inode *inode, struct file *filp)
+static int ace_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct ace_device *ace = inode->i_bdev->bd_disk->private_data;
+	struct ace_device *ace = bdev->bd_disk->private_data;
 	unsigned long flags;
 	unsigned long flags;
 
 
 	dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1);
 	dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1);
 
 
-	filp->private_data = ace;
 	spin_lock_irqsave(&ace->lock, flags);
 	spin_lock_irqsave(&ace->lock, flags);
 	ace->users++;
 	ace->users++;
 	spin_unlock_irqrestore(&ace->lock, flags);
 	spin_unlock_irqrestore(&ace->lock, flags);
 
 
-	check_disk_change(inode->i_bdev);
+	check_disk_change(bdev);
 	return 0;
 	return 0;
 }
 }
 
 
-static int ace_release(struct inode *inode, struct file *filp)
+static int ace_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct ace_device *ace = inode->i_bdev->bd_disk->private_data;
+	struct ace_device *ace = disk->private_data;
 	unsigned long flags;
 	unsigned long flags;
 	u16 val;
 	u16 val;
 
 

+ 3 - 4
drivers/block/z2ram.c

@@ -137,8 +137,7 @@ get_chipram( void )
     return;
     return;
 }
 }
 
 
-static int
-z2_open( struct inode *inode, struct file *filp )
+static int z2_open(struct block_device *bdev, fmode_t mode)
 {
 {
     int device;
     int device;
     int max_z2_map = ( Z2RAM_SIZE / Z2RAM_CHUNKSIZE ) *
     int max_z2_map = ( Z2RAM_SIZE / Z2RAM_CHUNKSIZE ) *
@@ -147,7 +146,7 @@ z2_open( struct inode *inode, struct file *filp )
 	sizeof( z2ram_map[0] );
 	sizeof( z2ram_map[0] );
     int rc = -ENOMEM;
     int rc = -ENOMEM;
 
 
-    device = iminor(inode);
+    device = MINOR(bdev->bd_dev);
 
 
     if ( current_device != -1 && current_device != device )
     if ( current_device != -1 && current_device != device )
     {
     {
@@ -299,7 +298,7 @@ err_out:
 }
 }
 
 
 static int
 static int
-z2_release( struct inode *inode, struct file *filp )
+z2_release(struct gendisk *disk, fmode_t mode)
 {
 {
     if ( current_device == -1 )
     if ( current_device == -1 )
 	return 0;     
 	return 0;     

+ 11 - 12
drivers/cdrom/cdrom.c

@@ -973,7 +973,7 @@ static int cdrom_close_write(struct cdrom_device_info *cdi)
  * is in their own interest: device control becomes a lot easier
  * is in their own interest: device control becomes a lot easier
  * this way.
  * this way.
  */
  */
-int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
+int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev, fmode_t mode)
 {
 {
 	int ret;
 	int ret;
 
 
@@ -982,14 +982,14 @@ int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
 	/* if this was a O_NONBLOCK open and we should honor the flags,
 	/* if this was a O_NONBLOCK open and we should honor the flags,
 	 * do a quick open without drive/disc integrity checks. */
 	 * do a quick open without drive/disc integrity checks. */
 	cdi->use_count++;
 	cdi->use_count++;
-	if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) {
+	if ((mode & FMODE_NDELAY) && (cdi->options & CDO_USE_FFLAGS)) {
 		ret = cdi->ops->open(cdi, 1);
 		ret = cdi->ops->open(cdi, 1);
 	} else {
 	} else {
 		ret = open_for_data(cdi);
 		ret = open_for_data(cdi);
 		if (ret)
 		if (ret)
 			goto err;
 			goto err;
 		cdrom_mmc3_profile(cdi);
 		cdrom_mmc3_profile(cdi);
-		if (fp->f_mode & FMODE_WRITE) {
+		if (mode & FMODE_WRITE) {
 			ret = -EROFS;
 			ret = -EROFS;
 			if (cdrom_open_write(cdi))
 			if (cdrom_open_write(cdi))
 				goto err_release;
 				goto err_release;
@@ -1007,7 +1007,7 @@ int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
 			cdi->name, cdi->use_count);
 			cdi->name, cdi->use_count);
 	/* Do this on open.  Don't wait for mount, because they might
 	/* Do this on open.  Don't wait for mount, because they might
 	    not be mounting, but opening with O_NONBLOCK */
 	    not be mounting, but opening with O_NONBLOCK */
-	check_disk_change(ip->i_bdev);
+	check_disk_change(bdev);
 	return 0;
 	return 0;
 err_release:
 err_release:
 	if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
 	if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
@@ -1184,7 +1184,7 @@ static int check_for_audio_disc(struct cdrom_device_info * cdi,
 	return 0;
 	return 0;
 }
 }
 
 
-int cdrom_release(struct cdrom_device_info *cdi, struct file *fp)
+void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode)
 {
 {
 	struct cdrom_device_ops *cdo = cdi->ops;
 	struct cdrom_device_ops *cdo = cdi->ops;
 	int opened_for_data;
 	int opened_for_data;
@@ -1205,7 +1205,7 @@ int cdrom_release(struct cdrom_device_info *cdi, struct file *fp)
 	}
 	}
 
 
 	opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
 	opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
-		!(fp && fp->f_flags & O_NONBLOCK);
+		!(mode & FMODE_NDELAY);
 
 
 	/*
 	/*
 	 * flush cache on last write release
 	 * flush cache on last write release
@@ -1219,7 +1219,6 @@ int cdrom_release(struct cdrom_device_info *cdi, struct file *fp)
 		    cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
 		    cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
 			cdo->tray_move(cdi, 1);
 			cdo->tray_move(cdi, 1);
 	}
 	}
-	return 0;
 }
 }
 
 
 static int cdrom_read_mech_status(struct cdrom_device_info *cdi, 
 static int cdrom_read_mech_status(struct cdrom_device_info *cdi, 
@@ -2662,17 +2661,17 @@ static int cdrom_ioctl_audioctl(struct cdrom_device_info *cdi,
  * these days.
  * these days.
  * ATAPI / SCSI specific code now mainly resides in mmc_ioctl().
  * ATAPI / SCSI specific code now mainly resides in mmc_ioctl().
  */
  */
-int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi,
-		struct inode *ip, unsigned int cmd, unsigned long arg)
+int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,
+		fmode_t mode, unsigned int cmd, unsigned long arg)
 {
 {
 	void __user *argp = (void __user *)arg;
 	void __user *argp = (void __user *)arg;
 	int ret;
 	int ret;
-	struct gendisk *disk = ip->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 
 
 	/*
 	/*
 	 * Try the generic SCSI command ioctl's first.
 	 * Try the generic SCSI command ioctl's first.
 	 */
 	 */
-	ret = scsi_cmd_ioctl(file, disk->queue, disk, cmd, argp);
+	ret = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp);
 	if (ret != -ENOTTY)
 	if (ret != -ENOTTY)
 		return ret;
 		return ret;
 
 
@@ -2696,7 +2695,7 @@ int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi,
 	case CDROM_SELECT_DISC:
 	case CDROM_SELECT_DISC:
 		return cdrom_ioctl_select_disc(cdi, arg);
 		return cdrom_ioctl_select_disc(cdi, arg);
 	case CDROMRESET:
 	case CDROMRESET:
-		return cdrom_ioctl_reset(cdi, ip->i_bdev);
+		return cdrom_ioctl_reset(cdi, bdev);
 	case CDROM_LOCKDOOR:
 	case CDROM_LOCKDOOR:
 		return cdrom_ioctl_lock_door(cdi, arg);
 		return cdrom_ioctl_lock_door(cdi, arg);
 	case CDROM_DEBUG:
 	case CDROM_DEBUG:

+ 7 - 7
drivers/cdrom/gdrom.c

@@ -490,14 +490,14 @@ static struct cdrom_device_ops gdrom_ops = {
 	.n_minors		= 1,
 	.n_minors		= 1,
 };
 };
 
 
-static int gdrom_bdops_open(struct inode *inode, struct file *file)
+static int gdrom_bdops_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	return cdrom_open(gd.cd_info, inode, file);
+	return cdrom_open(gd.cd_info, bdev, mode);
 }
 }
 
 
-static int gdrom_bdops_release(struct inode *inode, struct file *file)
+static int gdrom_bdops_release(struct block_device *bdev, fmode_t mode)
 {
 {
-	return cdrom_release(gd.cd_info, file);
+	return cdrom_release(gd.cd_info, mode);
 }
 }
 
 
 static int gdrom_bdops_mediachanged(struct gendisk *disk)
 static int gdrom_bdops_mediachanged(struct gendisk *disk)
@@ -505,10 +505,10 @@ static int gdrom_bdops_mediachanged(struct gendisk *disk)
 	return cdrom_media_changed(gd.cd_info);
 	return cdrom_media_changed(gd.cd_info);
 }
 }
 
 
-static int gdrom_bdops_ioctl(struct inode *inode, struct file *file,
+static int gdrom_bdops_ioctl(struct block_device *bdev, fmode_t mode,
 	unsigned cmd, unsigned long arg)
 	unsigned cmd, unsigned long arg)
 {
 {
-	return cdrom_ioctl(file, gd.cd_info, inode, cmd, arg);
+	return cdrom_ioctl(gd.cd_info, bdev, mode, cmd, arg);
 }
 }
 
 
 static struct block_device_operations gdrom_bdops = {
 static struct block_device_operations gdrom_bdops = {
@@ -516,7 +516,7 @@ static struct block_device_operations gdrom_bdops = {
 	.open			= gdrom_bdops_open,
 	.open			= gdrom_bdops_open,
 	.release		= gdrom_bdops_release,
 	.release		= gdrom_bdops_release,
 	.media_changed		= gdrom_bdops_mediachanged,
 	.media_changed		= gdrom_bdops_mediachanged,
-	.ioctl			= gdrom_bdops_ioctl,
+	.locked_ioctl		= gdrom_bdops_ioctl,
 };
 };
 
 
 static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id)
 static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id)

+ 11 - 10
drivers/cdrom/viocd.c

@@ -151,23 +151,24 @@ static const struct file_operations proc_viocd_operations = {
 	.release	= single_release,
 	.release	= single_release,
 };
 };
 
 
-static int viocd_blk_open(struct inode *inode, struct file *file)
+static int viocd_blk_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct disk_info *di = inode->i_bdev->bd_disk->private_data;
-	return cdrom_open(&di->viocd_info, inode, file);
+	struct disk_info *di = bdev->bd_disk->private_data;
+	return cdrom_open(&di->viocd_info, bdev, mode);
 }
 }
 
 
-static int viocd_blk_release(struct inode *inode, struct file *file)
+static int viocd_blk_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct disk_info *di = inode->i_bdev->bd_disk->private_data;
-	return cdrom_release(&di->viocd_info, file);
+	struct disk_info *di = disk->private_data;
+	cdrom_release(&di->viocd_info, mode);
+	return 0;
 }
 }
 
 
-static int viocd_blk_ioctl(struct inode *inode, struct file *file,
+static int viocd_blk_ioctl(struct block_device *bdev, fmode_t mode,
 		unsigned cmd, unsigned long arg)
 		unsigned cmd, unsigned long arg)
 {
 {
-	struct disk_info *di = inode->i_bdev->bd_disk->private_data;
-	return cdrom_ioctl(file, &di->viocd_info, inode, cmd, arg);
+	struct disk_info *di = bdev->bd_disk->private_data;
+	return cdrom_ioctl(&di->viocd_info, bdev, mode, cmd, arg);
 }
 }
 
 
 static int viocd_blk_media_changed(struct gendisk *disk)
 static int viocd_blk_media_changed(struct gendisk *disk)
@@ -180,7 +181,7 @@ struct block_device_operations viocd_fops = {
 	.owner =		THIS_MODULE,
 	.owner =		THIS_MODULE,
 	.open =			viocd_blk_open,
 	.open =			viocd_blk_open,
 	.release =		viocd_blk_release,
 	.release =		viocd_blk_release,
-	.ioctl =		viocd_blk_ioctl,
+	.locked_ioctl =		viocd_blk_ioctl,
 	.media_changed =	viocd_blk_media_changed,
 	.media_changed =	viocd_blk_media_changed,
 };
 };
 
 

+ 3 - 3
drivers/char/nvram.c

@@ -338,7 +338,7 @@ nvram_open(struct inode *inode, struct file *file)
 
 
 	if ((nvram_open_cnt && (file->f_flags & O_EXCL)) ||
 	if ((nvram_open_cnt && (file->f_flags & O_EXCL)) ||
 	    (nvram_open_mode & NVRAM_EXCL) ||
 	    (nvram_open_mode & NVRAM_EXCL) ||
-	    ((file->f_mode & 2) && (nvram_open_mode & NVRAM_WRITE))) {
+	    ((file->f_mode & FMODE_WRITE) && (nvram_open_mode & NVRAM_WRITE))) {
 		spin_unlock(&nvram_state_lock);
 		spin_unlock(&nvram_state_lock);
 		unlock_kernel();
 		unlock_kernel();
 		return -EBUSY;
 		return -EBUSY;
@@ -346,7 +346,7 @@ nvram_open(struct inode *inode, struct file *file)
 
 
 	if (file->f_flags & O_EXCL)
 	if (file->f_flags & O_EXCL)
 		nvram_open_mode |= NVRAM_EXCL;
 		nvram_open_mode |= NVRAM_EXCL;
-	if (file->f_mode & 2)
+	if (file->f_mode & FMODE_WRITE)
 		nvram_open_mode |= NVRAM_WRITE;
 		nvram_open_mode |= NVRAM_WRITE;
 	nvram_open_cnt++;
 	nvram_open_cnt++;
 
 
@@ -366,7 +366,7 @@ nvram_release(struct inode *inode, struct file *file)
 	/* if only one instance is open, clear the EXCL bit */
 	/* if only one instance is open, clear the EXCL bit */
 	if (nvram_open_mode & NVRAM_EXCL)
 	if (nvram_open_mode & NVRAM_EXCL)
 		nvram_open_mode &= ~NVRAM_EXCL;
 		nvram_open_mode &= ~NVRAM_EXCL;
-	if (file->f_mode & 2)
+	if (file->f_mode & FMODE_WRITE)
 		nvram_open_mode &= ~NVRAM_WRITE;
 		nvram_open_mode &= ~NVRAM_WRITE;
 
 
 	spin_unlock(&nvram_state_lock);
 	spin_unlock(&nvram_state_lock);

+ 4 - 4
drivers/char/raw.c

@@ -65,7 +65,7 @@ static int raw_open(struct inode *inode, struct file *filp)
 	if (!bdev)
 	if (!bdev)
 		goto out;
 		goto out;
 	igrab(bdev->bd_inode);
 	igrab(bdev->bd_inode);
-	err = blkdev_get(bdev, filp->f_mode, 0);
+	err = blkdev_get(bdev, filp->f_mode);
 	if (err)
 	if (err)
 		goto out;
 		goto out;
 	err = bd_claim(bdev, raw_open);
 	err = bd_claim(bdev, raw_open);
@@ -87,7 +87,7 @@ static int raw_open(struct inode *inode, struct file *filp)
 out2:
 out2:
 	bd_release(bdev);
 	bd_release(bdev);
 out1:
 out1:
-	blkdev_put(bdev);
+	blkdev_put(bdev, filp->f_mode);
 out:
 out:
 	mutex_unlock(&raw_mutex);
 	mutex_unlock(&raw_mutex);
 	return err;
 	return err;
@@ -112,7 +112,7 @@ static int raw_release(struct inode *inode, struct file *filp)
 	mutex_unlock(&raw_mutex);
 	mutex_unlock(&raw_mutex);
 
 
 	bd_release(bdev);
 	bd_release(bdev);
-	blkdev_put(bdev);
+	blkdev_put(bdev, filp->f_mode);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -125,7 +125,7 @@ raw_ioctl(struct inode *inode, struct file *filp,
 {
 {
 	struct block_device *bdev = filp->private_data;
 	struct block_device *bdev = filp->private_data;
 
 
-	return blkdev_ioctl(bdev->bd_inode, NULL, command, arg);
+	return blkdev_ioctl(bdev, 0, command, arg);
 }
 }
 
 
 static void bind_device(struct raw_config_request *rq)
 static void bind_device(struct raw_config_request *rq)

+ 9 - 13
drivers/ide/ide-cd.c

@@ -2089,17 +2089,15 @@ static ide_driver_t ide_cdrom_driver = {
 #endif
 #endif
 };
 };
 
 
-static int idecd_open(struct inode *inode, struct file *file)
+static int idecd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
-	struct cdrom_info *info;
+	struct cdrom_info *info = ide_cd_get(bdev->bd_disk);
 	int rc = -ENOMEM;
 	int rc = -ENOMEM;
 
 
-	info = ide_cd_get(disk);
 	if (!info)
 	if (!info)
 		return -ENXIO;
 		return -ENXIO;
 
 
-	rc = cdrom_open(&info->devinfo, inode, file);
+	rc = cdrom_open(&info->devinfo, bdev, mode);
 
 
 	if (rc < 0)
 	if (rc < 0)
 		ide_cd_put(info);
 		ide_cd_put(info);
@@ -2107,12 +2105,11 @@ static int idecd_open(struct inode *inode, struct file *file)
 	return rc;
 	return rc;
 }
 }
 
 
-static int idecd_release(struct inode *inode, struct file *file)
+static int idecd_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct cdrom_info *info = ide_drv_g(disk, cdrom_info);
 	struct cdrom_info *info = ide_drv_g(disk, cdrom_info);
 
 
-	cdrom_release(&info->devinfo, file);
+	cdrom_release(&info->devinfo, mode);
 
 
 	ide_cd_put(info);
 	ide_cd_put(info);
 
 
@@ -2158,10 +2155,9 @@ static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg)
 	return 0;
 	return 0;
 }
 }
 
 
-static int idecd_ioctl(struct inode *inode, struct file *file,
+static int idecd_ioctl(struct block_device *bdev, fmode_t mode,
 			unsigned int cmd, unsigned long arg)
 			unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info);
 	struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info);
 	int err;
 	int err;
 
 
@@ -2174,9 +2170,9 @@ static int idecd_ioctl(struct inode *inode, struct file *file,
 		break;
 		break;
 	}
 	}
 
 
-	err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
+	err = generic_ide_ioctl(info->drive, bdev, cmd, arg);
 	if (err == -EINVAL)
 	if (err == -EINVAL)
-		err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg);
+		err = cdrom_ioctl(&info->devinfo, bdev, mode, cmd, arg);
 
 
 	return err;
 	return err;
 }
 }
@@ -2201,7 +2197,7 @@ static struct block_device_operations idecd_ops = {
 	.owner			= THIS_MODULE,
 	.owner			= THIS_MODULE,
 	.open			= idecd_open,
 	.open			= idecd_open,
 	.release		= idecd_release,
 	.release		= idecd_release,
-	.ioctl			= idecd_ioctl,
+	.locked_ioctl		= idecd_ioctl,
 	.media_changed		= idecd_media_changed,
 	.media_changed		= idecd_media_changed,
 	.revalidate_disk	= idecd_revalidate_disk
 	.revalidate_disk	= idecd_revalidate_disk
 };
 };

+ 1 - 1
drivers/ide/ide-disk.h

@@ -13,7 +13,7 @@ ide_decl_devset(wcache);
 ide_decl_devset(acoustic);
 ide_decl_devset(acoustic);
 
 
 /* ide-disk_ioctl.c */
 /* ide-disk_ioctl.c */
-int ide_disk_ioctl(ide_drive_t *, struct inode *, struct file *, unsigned int,
+int ide_disk_ioctl(ide_drive_t *, struct block_device *, fmode_t, unsigned int,
 		   unsigned long);
 		   unsigned long);
 
 
 #ifdef CONFIG_IDE_PROC_FS
 #ifdef CONFIG_IDE_PROC_FS

+ 2 - 3
drivers/ide/ide-disk_ioctl.c

@@ -13,15 +13,14 @@ static const struct ide_ioctl_devset ide_disk_ioctl_settings[] = {
 { 0 }
 { 0 }
 };
 };
 
 
-int ide_disk_ioctl(ide_drive_t *drive, struct inode *inode, struct file *file,
+int ide_disk_ioctl(ide_drive_t *drive, struct block_device *bdev, fmode_t mode,
 		   unsigned int cmd, unsigned long arg)
 		   unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	int err;
 	int err;
 
 
 	err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings);
 	err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings);
 	if (err != -EOPNOTSUPP)
 	if (err != -EOPNOTSUPP)
 		return err;
 		return err;
 
 
-	return generic_ide_ioctl(drive, file, bdev, cmd, arg);
+	return generic_ide_ioctl(drive, bdev, cmd, arg);
 }
 }

+ 2 - 2
drivers/ide/ide-floppy.h

@@ -23,8 +23,8 @@ void ide_floppy_create_mode_sense_cmd(struct ide_atapi_pc *, u8);
 void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *);
 void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *);
 
 
 /* ide-floppy_ioctl.c */
 /* ide-floppy_ioctl.c */
-int ide_floppy_ioctl(ide_drive_t *, struct inode *, struct file *, unsigned int,
-		     unsigned long);
+int ide_floppy_ioctl(ide_drive_t *, struct block_device *, fmode_t,
+		     unsigned int, unsigned long);
 
 
 #ifdef CONFIG_IDE_PROC_FS
 #ifdef CONFIG_IDE_PROC_FS
 /* ide-floppy_proc.c */
 /* ide-floppy_proc.c */

+ 8 - 9
drivers/ide/ide-floppy_ioctl.c

@@ -241,7 +241,7 @@ static int ide_floppy_lockdoor(ide_drive_t *drive, struct ide_atapi_pc *pc,
 	return 0;
 	return 0;
 }
 }
 
 
-static int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file,
+static int ide_floppy_format_ioctl(ide_drive_t *drive, fmode_t mode,
 				   unsigned int cmd, void __user *argp)
 				   unsigned int cmd, void __user *argp)
 {
 {
 	switch (cmd) {
 	switch (cmd) {
@@ -250,7 +250,7 @@ static int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file,
 	case IDEFLOPPY_IOCTL_FORMAT_GET_CAPACITY:
 	case IDEFLOPPY_IOCTL_FORMAT_GET_CAPACITY:
 		return ide_floppy_get_format_capacities(drive, argp);
 		return ide_floppy_get_format_capacities(drive, argp);
 	case IDEFLOPPY_IOCTL_FORMAT_START:
 	case IDEFLOPPY_IOCTL_FORMAT_START:
-		if (!(file->f_mode & 2))
+		if (!(mode & FMODE_WRITE))
 			return -EPERM;
 			return -EPERM;
 		return ide_floppy_format_unit(drive, (int __user *)argp);
 		return ide_floppy_format_unit(drive, (int __user *)argp);
 	case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS:
 	case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS:
@@ -260,10 +260,9 @@ static int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file,
 	}
 	}
 }
 }
 
 
-int ide_floppy_ioctl(ide_drive_t *drive, struct inode *inode,
-		     struct file *file, unsigned int cmd, unsigned long arg)
+int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev,
+		     fmode_t mode, unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct ide_atapi_pc pc;
 	struct ide_atapi_pc pc;
 	void __user *argp = (void __user *)arg;
 	void __user *argp = (void __user *)arg;
 	int err;
 	int err;
@@ -271,7 +270,7 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct inode *inode,
 	if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR)
 	if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR)
 		return ide_floppy_lockdoor(drive, &pc, arg, cmd);
 		return ide_floppy_lockdoor(drive, &pc, arg, cmd);
 
 
-	err = ide_floppy_format_ioctl(drive, file, cmd, argp);
+	err = ide_floppy_format_ioctl(drive, mode, cmd, argp);
 	if (err != -ENOTTY)
 	if (err != -ENOTTY)
 		return err;
 		return err;
 
 
@@ -280,11 +279,11 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct inode *inode,
 	 * and CDROM_SEND_PACKET (legacy) ioctls
 	 * and CDROM_SEND_PACKET (legacy) ioctls
 	 */
 	 */
 	if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND)
 	if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND)
-		err = scsi_cmd_ioctl(file, bdev->bd_disk->queue,
-					bdev->bd_disk, cmd, argp);
+		err = scsi_cmd_ioctl(bdev->bd_disk->queue, bdev->bd_disk,
+				mode, cmd, argp);
 
 
 	if (err == -ENOTTY)
 	if (err == -ENOTTY)
-		err = generic_ide_ioctl(drive, file, bdev, cmd, arg);
+		err = generic_ide_ioctl(drive, bdev, cmd, arg);
 
 
 	return err;
 	return err;
 }
 }

+ 9 - 11
drivers/ide/ide-gd.c

@@ -169,9 +169,9 @@ static ide_driver_t ide_gd_driver = {
 #endif
 #endif
 };
 };
 
 
-static int ide_gd_open(struct inode *inode, struct file *filp)
+static int ide_gd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct ide_disk_obj *idkp;
 	struct ide_disk_obj *idkp;
 	ide_drive_t *drive;
 	ide_drive_t *drive;
 	int ret = 0;
 	int ret = 0;
@@ -197,12 +197,12 @@ static int ide_gd_open(struct inode *inode, struct file *filp)
 		 * unreadable disk, so that we can get the format capacity
 		 * unreadable disk, so that we can get the format capacity
 		 * of the drive or begin the format - Sam
 		 * of the drive or begin the format - Sam
 		 */
 		 */
-		if (ret && (filp->f_flags & O_NDELAY) == 0) {
+		if (ret && (mode & FMODE_NDELAY) == 0) {
 			ret = -EIO;
 			ret = -EIO;
 			goto out_put_idkp;
 			goto out_put_idkp;
 		}
 		}
 
 
-		if ((drive->dev_flags & IDE_DFLAG_WP) && (filp->f_mode & 2)) {
+		if ((drive->dev_flags & IDE_DFLAG_WP) && (mode & FMODE_WRITE)) {
 			ret = -EROFS;
 			ret = -EROFS;
 			goto out_put_idkp;
 			goto out_put_idkp;
 		}
 		}
@@ -214,7 +214,7 @@ static int ide_gd_open(struct inode *inode, struct file *filp)
 		 */
 		 */
 		drive->disk_ops->set_doorlock(drive, disk, 1);
 		drive->disk_ops->set_doorlock(drive, disk, 1);
 		drive->dev_flags |= IDE_DFLAG_MEDIA_CHANGED;
 		drive->dev_flags |= IDE_DFLAG_MEDIA_CHANGED;
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 	} else if (drive->dev_flags & IDE_DFLAG_FORMAT_IN_PROGRESS) {
 	} else if (drive->dev_flags & IDE_DFLAG_FORMAT_IN_PROGRESS) {
 		ret = -EBUSY;
 		ret = -EBUSY;
 		goto out_put_idkp;
 		goto out_put_idkp;
@@ -227,9 +227,8 @@ out_put_idkp:
 	return ret;
 	return ret;
 }
 }
 
 
-static int ide_gd_release(struct inode *inode, struct file *filp)
+static int ide_gd_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);
 	struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);
 	ide_drive_t *drive = idkp->drive;
 	ide_drive_t *drive = idkp->drive;
 
 
@@ -286,21 +285,20 @@ static int ide_gd_revalidate_disk(struct gendisk *disk)
 	return 0;
 	return 0;
 }
 }
 
 
-static int ide_gd_ioctl(struct inode *inode, struct file *file,
+static int ide_gd_ioctl(struct block_device *bdev, fmode_t mode,
 			     unsigned int cmd, unsigned long arg)
 			     unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct ide_disk_obj *idkp = ide_drv_g(bdev->bd_disk, ide_disk_obj);
 	struct ide_disk_obj *idkp = ide_drv_g(bdev->bd_disk, ide_disk_obj);
 	ide_drive_t *drive = idkp->drive;
 	ide_drive_t *drive = idkp->drive;
 
 
-	return drive->disk_ops->ioctl(drive, inode, file, cmd, arg);
+	return drive->disk_ops->ioctl(drive, bdev, mode, cmd, arg);
 }
 }
 
 
 static struct block_device_operations ide_gd_ops = {
 static struct block_device_operations ide_gd_ops = {
 	.owner			= THIS_MODULE,
 	.owner			= THIS_MODULE,
 	.open			= ide_gd_open,
 	.open			= ide_gd_open,
 	.release		= ide_gd_release,
 	.release		= ide_gd_release,
-	.ioctl			= ide_gd_ioctl,
+	.locked_ioctl		= ide_gd_ioctl,
 	.getgeo			= ide_gd_getgeo,
 	.getgeo			= ide_gd_getgeo,
 	.media_changed		= ide_gd_media_changed,
 	.media_changed		= ide_gd_media_changed,
 	.revalidate_disk	= ide_gd_revalidate_disk
 	.revalidate_disk	= ide_gd_revalidate_disk

+ 1 - 2
drivers/ide/ide-ioctls.c

@@ -240,8 +240,7 @@ static int generic_drive_reset(ide_drive_t *drive)
 	return ret;
 	return ret;
 }
 }
 
 
-int generic_ide_ioctl(ide_drive_t *drive, struct file *file,
-		      struct block_device *bdev,
+int generic_ide_ioctl(ide_drive_t *drive, struct block_device *bdev,
 		      unsigned int cmd, unsigned long arg)
 		      unsigned int cmd, unsigned long arg)
 {
 {
 	int err;
 	int err;

+ 6 - 11
drivers/ide/ide-tape.c

@@ -2340,35 +2340,30 @@ static const struct file_operations idetape_fops = {
 	.release	= idetape_chrdev_release,
 	.release	= idetape_chrdev_release,
 };
 };
 
 
-static int idetape_open(struct inode *inode, struct file *filp)
+static int idetape_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
-	struct ide_tape_obj *tape;
+	struct ide_tape_obj *tape = ide_tape_get(bdev->bd_disk);
 
 
-	tape = ide_tape_get(disk);
 	if (!tape)
 	if (!tape)
 		return -ENXIO;
 		return -ENXIO;
 
 
 	return 0;
 	return 0;
 }
 }
 
 
-static int idetape_release(struct inode *inode, struct file *filp)
+static int idetape_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj);
 	struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj);
 
 
 	ide_tape_put(tape);
 	ide_tape_put(tape);
-
 	return 0;
 	return 0;
 }
 }
 
 
-static int idetape_ioctl(struct inode *inode, struct file *file,
+static int idetape_ioctl(struct block_device *bdev, fmode_t mode,
 			unsigned int cmd, unsigned long arg)
 			unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct ide_tape_obj *tape = ide_drv_g(bdev->bd_disk, ide_tape_obj);
 	struct ide_tape_obj *tape = ide_drv_g(bdev->bd_disk, ide_tape_obj);
 	ide_drive_t *drive = tape->drive;
 	ide_drive_t *drive = tape->drive;
-	int err = generic_ide_ioctl(drive, file, bdev, cmd, arg);
+	int err = generic_ide_ioctl(drive, bdev, cmd, arg);
 	if (err == -EINVAL)
 	if (err == -EINVAL)
 		err = idetape_blkdev_ioctl(drive, cmd, arg);
 		err = idetape_blkdev_ioctl(drive, cmd, arg);
 	return err;
 	return err;
@@ -2378,7 +2373,7 @@ static struct block_device_operations idetape_block_ops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= idetape_open,
 	.open		= idetape_open,
 	.release	= idetape_release,
 	.release	= idetape_release,
-	.ioctl		= idetape_ioctl,
+	.locked_ioctl	= idetape_ioctl,
 };
 };
 
 
 static int ide_tape_probe(ide_drive_t *drive)
 static int ide_tape_probe(ide_drive_t *drive)

+ 2 - 2
drivers/md/dm-ioctl.c

@@ -988,9 +988,9 @@ static int dev_wait(struct dm_ioctl *param, size_t param_size)
 	return r;
 	return r;
 }
 }
 
 
-static inline int get_mode(struct dm_ioctl *param)
+static inline fmode_t get_mode(struct dm_ioctl *param)
 {
 {
-	int mode = FMODE_READ | FMODE_WRITE;
+	fmode_t mode = FMODE_READ | FMODE_WRITE;
 
 
 	if (param->flags & DM_READONLY_FLAG)
 	if (param->flags & DM_READONLY_FLAG)
 		mode = FMODE_READ;
 		mode = FMODE_READ;

+ 2 - 11
drivers/md/dm-linear.c

@@ -110,20 +110,11 @@ static int linear_status(struct dm_target *ti, status_type_t type,
 	return 0;
 	return 0;
 }
 }
 
 
-static int linear_ioctl(struct dm_target *ti, struct inode *inode,
-			struct file *filp, unsigned int cmd,
+static int linear_ioctl(struct dm_target *ti, unsigned int cmd,
 			unsigned long arg)
 			unsigned long arg)
 {
 {
 	struct linear_c *lc = (struct linear_c *) ti->private;
 	struct linear_c *lc = (struct linear_c *) ti->private;
-	struct block_device *bdev = lc->dev->bdev;
-	struct file fake_file = {};
-	struct dentry fake_dentry = {};
-
-	fake_file.f_mode = lc->dev->mode;
-	fake_file.f_path.dentry = &fake_dentry;
-	fake_dentry.d_inode = bdev->bd_inode;
-
-	return blkdev_driver_ioctl(bdev->bd_inode, &fake_file, bdev->bd_disk, cmd, arg);
+	return __blkdev_driver_ioctl(lc->dev->bdev, lc->dev->mode, cmd, arg);
 }
 }
 
 
 static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
 static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,

+ 4 - 10
drivers/md/dm-mpath.c

@@ -1396,19 +1396,15 @@ error:
 	return -EINVAL;
 	return -EINVAL;
 }
 }
 
 
-static int multipath_ioctl(struct dm_target *ti, struct inode *inode,
-			   struct file *filp, unsigned int cmd,
+static int multipath_ioctl(struct dm_target *ti, unsigned int cmd,
 			   unsigned long arg)
 			   unsigned long arg)
 {
 {
 	struct multipath *m = (struct multipath *) ti->private;
 	struct multipath *m = (struct multipath *) ti->private;
 	struct block_device *bdev = NULL;
 	struct block_device *bdev = NULL;
+	fmode_t mode = 0;
 	unsigned long flags;
 	unsigned long flags;
-	struct file fake_file = {};
-	struct dentry fake_dentry = {};
 	int r = 0;
 	int r = 0;
 
 
-	fake_file.f_path.dentry = &fake_dentry;
-
 	spin_lock_irqsave(&m->lock, flags);
 	spin_lock_irqsave(&m->lock, flags);
 
 
 	if (!m->current_pgpath)
 	if (!m->current_pgpath)
@@ -1416,8 +1412,7 @@ static int multipath_ioctl(struct dm_target *ti, struct inode *inode,
 
 
 	if (m->current_pgpath) {
 	if (m->current_pgpath) {
 		bdev = m->current_pgpath->path.dev->bdev;
 		bdev = m->current_pgpath->path.dev->bdev;
-		fake_dentry.d_inode = bdev->bd_inode;
-		fake_file.f_mode = m->current_pgpath->path.dev->mode;
+		mode = m->current_pgpath->path.dev->mode;
 	}
 	}
 
 
 	if (m->queue_io)
 	if (m->queue_io)
@@ -1427,8 +1422,7 @@ static int multipath_ioctl(struct dm_target *ti, struct inode *inode,
 
 
 	spin_unlock_irqrestore(&m->lock, flags);
 	spin_unlock_irqrestore(&m->lock, flags);
 
 
-	return r ? : blkdev_driver_ioctl(bdev->bd_inode, &fake_file,
-					 bdev->bd_disk, cmd, arg);
+	return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg);
 }
 }
 
 
 /*-----------------------------------------------------------------
 /*-----------------------------------------------------------------

+ 8 - 8
drivers/md/dm-table.c

@@ -43,7 +43,7 @@ struct dm_table {
 	 * device.  This should be a combination of FMODE_READ
 	 * device.  This should be a combination of FMODE_READ
 	 * and FMODE_WRITE.
 	 * and FMODE_WRITE.
 	 */
 	 */
-	int mode;
+	fmode_t mode;
 
 
 	/* a list of devices used by this table */
 	/* a list of devices used by this table */
 	struct list_head devices;
 	struct list_head devices;
@@ -217,7 +217,7 @@ static int alloc_targets(struct dm_table *t, unsigned int num)
 	return 0;
 	return 0;
 }
 }
 
 
-int dm_table_create(struct dm_table **result, int mode,
+int dm_table_create(struct dm_table **result, fmode_t mode,
 		    unsigned num_targets, struct mapped_device *md)
 		    unsigned num_targets, struct mapped_device *md)
 {
 {
 	struct dm_table *t = kzalloc(sizeof(*t), GFP_KERNEL);
 	struct dm_table *t = kzalloc(sizeof(*t), GFP_KERNEL);
@@ -344,7 +344,7 @@ static int open_dev(struct dm_dev_internal *d, dev_t dev,
 		return PTR_ERR(bdev);
 		return PTR_ERR(bdev);
 	r = bd_claim_by_disk(bdev, _claim_ptr, dm_disk(md));
 	r = bd_claim_by_disk(bdev, _claim_ptr, dm_disk(md));
 	if (r)
 	if (r)
-		blkdev_put(bdev);
+		blkdev_put(bdev, d->dm_dev.mode);
 	else
 	else
 		d->dm_dev.bdev = bdev;
 		d->dm_dev.bdev = bdev;
 	return r;
 	return r;
@@ -359,7 +359,7 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md)
 		return;
 		return;
 
 
 	bd_release_from_disk(d->dm_dev.bdev, dm_disk(md));
 	bd_release_from_disk(d->dm_dev.bdev, dm_disk(md));
-	blkdev_put(d->dm_dev.bdev);
+	blkdev_put(d->dm_dev.bdev, d->dm_dev.mode);
 	d->dm_dev.bdev = NULL;
 	d->dm_dev.bdev = NULL;
 }
 }
 
 
@@ -382,7 +382,7 @@ static int check_device_area(struct dm_dev_internal *dd, sector_t start,
  * careful to leave things as they were if we fail to reopen the
  * careful to leave things as they were if we fail to reopen the
  * device.
  * device.
  */
  */
-static int upgrade_mode(struct dm_dev_internal *dd, int new_mode,
+static int upgrade_mode(struct dm_dev_internal *dd, fmode_t new_mode,
 			struct mapped_device *md)
 			struct mapped_device *md)
 {
 {
 	int r;
 	int r;
@@ -408,7 +408,7 @@ static int upgrade_mode(struct dm_dev_internal *dd, int new_mode,
  */
  */
 static int __table_get_device(struct dm_table *t, struct dm_target *ti,
 static int __table_get_device(struct dm_table *t, struct dm_target *ti,
 			      const char *path, sector_t start, sector_t len,
 			      const char *path, sector_t start, sector_t len,
-			      int mode, struct dm_dev **result)
+			      fmode_t mode, struct dm_dev **result)
 {
 {
 	int r;
 	int r;
 	dev_t uninitialized_var(dev);
 	dev_t uninitialized_var(dev);
@@ -528,7 +528,7 @@ void dm_set_device_limits(struct dm_target *ti, struct block_device *bdev)
 EXPORT_SYMBOL_GPL(dm_set_device_limits);
 EXPORT_SYMBOL_GPL(dm_set_device_limits);
 
 
 int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
 int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
-		  sector_t len, int mode, struct dm_dev **result)
+		  sector_t len, fmode_t mode, struct dm_dev **result)
 {
 {
 	int r = __table_get_device(ti->table, ti, path,
 	int r = __table_get_device(ti->table, ti, path,
 				   start, len, mode, result);
 				   start, len, mode, result);
@@ -878,7 +878,7 @@ struct list_head *dm_table_get_devices(struct dm_table *t)
 	return &t->devices;
 	return &t->devices;
 }
 }
 
 
-int dm_table_get_mode(struct dm_table *t)
+fmode_t dm_table_get_mode(struct dm_table *t)
 {
 {
 	return t->mode;
 	return t->mode;
 }
 }

+ 8 - 19
drivers/md/dm.c

@@ -21,7 +21,6 @@
 #include <linux/idr.h>
 #include <linux/idr.h>
 #include <linux/hdreg.h>
 #include <linux/hdreg.h>
 #include <linux/blktrace_api.h>
 #include <linux/blktrace_api.h>
-#include <linux/smp_lock.h>
 
 
 #define DM_MSG_PREFIX "core"
 #define DM_MSG_PREFIX "core"
 
 
@@ -248,13 +247,13 @@ static void __exit dm_exit(void)
 /*
 /*
  * Block device functions
  * Block device functions
  */
  */
-static int dm_blk_open(struct inode *inode, struct file *file)
+static int dm_blk_open(struct block_device *bdev, fmode_t mode)
 {
 {
 	struct mapped_device *md;
 	struct mapped_device *md;
 
 
 	spin_lock(&_minor_lock);
 	spin_lock(&_minor_lock);
 
 
-	md = inode->i_bdev->bd_disk->private_data;
+	md = bdev->bd_disk->private_data;
 	if (!md)
 	if (!md)
 		goto out;
 		goto out;
 
 
@@ -273,11 +272,9 @@ out:
 	return md ? 0 : -ENXIO;
 	return md ? 0 : -ENXIO;
 }
 }
 
 
-static int dm_blk_close(struct inode *inode, struct file *file)
+static int dm_blk_close(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct mapped_device *md;
-
-	md = inode->i_bdev->bd_disk->private_data;
+	struct mapped_device *md = disk->private_data;
 	atomic_dec(&md->open_count);
 	atomic_dec(&md->open_count);
 	dm_put(md);
 	dm_put(md);
 	return 0;
 	return 0;
@@ -314,21 +311,14 @@ static int dm_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return dm_get_geometry(md, geo);
 	return dm_get_geometry(md, geo);
 }
 }
 
 
-static int dm_blk_ioctl(struct inode *inode, struct file *file,
+static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode,
 			unsigned int cmd, unsigned long arg)
 			unsigned int cmd, unsigned long arg)
 {
 {
-	struct mapped_device *md;
-	struct dm_table *map;
+	struct mapped_device *md = bdev->bd_disk->private_data;
+	struct dm_table *map = dm_get_table(md);
 	struct dm_target *tgt;
 	struct dm_target *tgt;
 	int r = -ENOTTY;
 	int r = -ENOTTY;
 
 
-	/* We don't really need this lock, but we do need 'inode'. */
-	unlock_kernel();
-
-	md = inode->i_bdev->bd_disk->private_data;
-
-	map = dm_get_table(md);
-
 	if (!map || !dm_table_get_size(map))
 	if (!map || !dm_table_get_size(map))
 		goto out;
 		goto out;
 
 
@@ -344,12 +334,11 @@ static int dm_blk_ioctl(struct inode *inode, struct file *file,
 	}
 	}
 
 
 	if (tgt->type->ioctl)
 	if (tgt->type->ioctl)
-		r = tgt->type->ioctl(tgt, inode, file, cmd, arg);
+		r = tgt->type->ioctl(tgt, cmd, arg);
 
 
 out:
 out:
 	dm_table_put(map);
 	dm_table_put(map);
 
 
-	lock_kernel();
 	return r;
 	return r;
 }
 }
 
 

+ 10 - 10
drivers/md/md.c

@@ -1520,7 +1520,7 @@ static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared)
 	if (err) {
 	if (err) {
 		printk(KERN_ERR "md: could not bd_claim %s.\n",
 		printk(KERN_ERR "md: could not bd_claim %s.\n",
 			bdevname(bdev, b));
 			bdevname(bdev, b));
-		blkdev_put(bdev);
+		blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 		return err;
 		return err;
 	}
 	}
 	if (!shared)
 	if (!shared)
@@ -1536,7 +1536,7 @@ static void unlock_rdev(mdk_rdev_t *rdev)
 	if (!bdev)
 	if (!bdev)
 		MD_BUG();
 		MD_BUG();
 	bd_release(bdev);
 	bd_release(bdev);
-	blkdev_put(bdev);
+	blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 }
 }
 
 
 void md_autodetect_dev(dev_t dev);
 void md_autodetect_dev(dev_t dev);
@@ -4785,7 +4785,7 @@ static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return 0;
 	return 0;
 }
 }
 
 
-static int md_ioctl(struct inode *inode, struct file *file,
+static int md_ioctl(struct block_device *bdev, fmode_t mode,
 			unsigned int cmd, unsigned long arg)
 			unsigned int cmd, unsigned long arg)
 {
 {
 	int err = 0;
 	int err = 0;
@@ -4823,7 +4823,7 @@ static int md_ioctl(struct inode *inode, struct file *file,
 	 * Commands creating/starting a new array:
 	 * Commands creating/starting a new array:
 	 */
 	 */
 
 
-	mddev = inode->i_bdev->bd_disk->private_data;
+	mddev = bdev->bd_disk->private_data;
 
 
 	if (!mddev) {
 	if (!mddev) {
 		BUG();
 		BUG();
@@ -4996,13 +4996,13 @@ abort:
 	return err;
 	return err;
 }
 }
 
 
-static int md_open(struct inode *inode, struct file *file)
+static int md_open(struct block_device *bdev, fmode_t mode)
 {
 {
 	/*
 	/*
 	 * Succeed if we can lock the mddev, which confirms that
 	 * Succeed if we can lock the mddev, which confirms that
 	 * it isn't being stopped right now.
 	 * it isn't being stopped right now.
 	 */
 	 */
-	mddev_t *mddev = inode->i_bdev->bd_disk->private_data;
+	mddev_t *mddev = bdev->bd_disk->private_data;
 	int err;
 	int err;
 
 
 	if ((err = mutex_lock_interruptible_nested(&mddev->reconfig_mutex, 1)))
 	if ((err = mutex_lock_interruptible_nested(&mddev->reconfig_mutex, 1)))
@@ -5013,14 +5013,14 @@ static int md_open(struct inode *inode, struct file *file)
 	atomic_inc(&mddev->openers);
 	atomic_inc(&mddev->openers);
 	mddev_unlock(mddev);
 	mddev_unlock(mddev);
 
 
-	check_disk_change(inode->i_bdev);
+	check_disk_change(bdev);
  out:
  out:
 	return err;
 	return err;
 }
 }
 
 
-static int md_release(struct inode *inode, struct file * file)
+static int md_release(struct gendisk *disk, fmode_t mode)
 {
 {
- 	mddev_t *mddev = inode->i_bdev->bd_disk->private_data;
+ 	mddev_t *mddev = disk->private_data;
 
 
 	BUG_ON(!mddev);
 	BUG_ON(!mddev);
 	atomic_dec(&mddev->openers);
 	atomic_dec(&mddev->openers);
@@ -5048,7 +5048,7 @@ static struct block_device_operations md_fops =
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= md_open,
 	.open		= md_open,
 	.release	= md_release,
 	.release	= md_release,
-	.ioctl		= md_ioctl,
+	.locked_ioctl	= md_ioctl,
 	.getgeo		= md_getgeo,
 	.getgeo		= md_getgeo,
 	.media_changed	= md_media_changed,
 	.media_changed	= md_media_changed,
 	.revalidate_disk= md_revalidate,
 	.revalidate_disk= md_revalidate,

+ 4 - 5
drivers/memstick/core/mspro_block.c

@@ -172,9 +172,9 @@ static int mspro_block_complete_req(struct memstick_dev *card, int error);
 
 
 /*** Block device ***/
 /*** Block device ***/
 
 
-static int mspro_block_bd_open(struct inode *inode, struct file *filp)
+static int mspro_block_bd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct mspro_block_data *msb = disk->private_data;
 	struct mspro_block_data *msb = disk->private_data;
 	int rc = -ENXIO;
 	int rc = -ENXIO;
 
 
@@ -182,7 +182,7 @@ static int mspro_block_bd_open(struct inode *inode, struct file *filp)
 
 
 	if (msb && msb->card) {
 	if (msb && msb->card) {
 		msb->usage_count++;
 		msb->usage_count++;
-		if ((filp->f_mode & FMODE_WRITE) && msb->read_only)
+		if ((mode & FMODE_WRITE) && msb->read_only)
 			rc = -EROFS;
 			rc = -EROFS;
 		else
 		else
 			rc = 0;
 			rc = 0;
@@ -218,9 +218,8 @@ static int mspro_block_disk_release(struct gendisk *disk)
 	return 0;
 	return 0;
 }
 }
 
 
-static int mspro_block_bd_release(struct inode *inode, struct file *filp)
+static int mspro_block_bd_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	return mspro_block_disk_release(disk);
 	return mspro_block_disk_release(disk);
 }
 }
 
 

+ 6 - 7
drivers/message/i2o/i2o_block.c

@@ -575,9 +575,9 @@ static void i2o_block_biosparam(unsigned long capacity, unsigned short *cyls,
  *
  *
  *	Returns 0 on success or negative error code on failure.
  *	Returns 0 on success or negative error code on failure.
  */
  */
-static int i2o_block_open(struct inode *inode, struct file *file)
+static int i2o_block_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct i2o_block_device *dev = inode->i_bdev->bd_disk->private_data;
+	struct i2o_block_device *dev = bdev->bd_disk->private_data;
 
 
 	if (!dev->i2o_dev)
 	if (!dev->i2o_dev)
 		return -ENODEV;
 		return -ENODEV;
@@ -604,9 +604,8 @@ static int i2o_block_open(struct inode *inode, struct file *file)
  *
  *
  *	Returns 0 on success or negative error code on failure.
  *	Returns 0 on success or negative error code on failure.
  */
  */
-static int i2o_block_release(struct inode *inode, struct file *file)
+static int i2o_block_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct i2o_block_device *dev = disk->private_data;
 	struct i2o_block_device *dev = disk->private_data;
 	u8 operation;
 	u8 operation;
 
 
@@ -653,10 +652,10 @@ static int i2o_block_getgeo(struct block_device *bdev, struct hd_geometry *geo)
  *
  *
  *	Return 0 on success or negative error on failure.
  *	Return 0 on success or negative error on failure.
  */
  */
-static int i2o_block_ioctl(struct inode *inode, struct file *file,
+static int i2o_block_ioctl(struct block_device *bdev, fmode_t mode,
 			   unsigned int cmd, unsigned long arg)
 			   unsigned int cmd, unsigned long arg)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct i2o_block_device *dev = disk->private_data;
 	struct i2o_block_device *dev = disk->private_data;
 
 
 	/* Anyone capable of this syscall can do *real bad* things */
 	/* Anyone capable of this syscall can do *real bad* things */
@@ -933,7 +932,7 @@ static struct block_device_operations i2o_block_fops = {
 	.owner = THIS_MODULE,
 	.owner = THIS_MODULE,
 	.open = i2o_block_open,
 	.open = i2o_block_open,
 	.release = i2o_block_release,
 	.release = i2o_block_release,
-	.ioctl = i2o_block_ioctl,
+	.locked_ioctl = i2o_block_ioctl,
 	.getgeo = i2o_block_getgeo,
 	.getgeo = i2o_block_getgeo,
 	.media_changed = i2o_block_media_changed
 	.media_changed = i2o_block_media_changed
 };
 };

+ 6 - 7
drivers/mmc/card/block.c

@@ -92,18 +92,17 @@ static void mmc_blk_put(struct mmc_blk_data *md)
 	mutex_unlock(&open_lock);
 	mutex_unlock(&open_lock);
 }
 }
 
 
-static int mmc_blk_open(struct inode *inode, struct file *filp)
+static int mmc_blk_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct mmc_blk_data *md;
+	struct mmc_blk_data *md = mmc_blk_get(bdev->bd_disk);
 	int ret = -ENXIO;
 	int ret = -ENXIO;
 
 
-	md = mmc_blk_get(inode->i_bdev->bd_disk);
 	if (md) {
 	if (md) {
 		if (md->usage == 2)
 		if (md->usage == 2)
-			check_disk_change(inode->i_bdev);
+			check_disk_change(bdev);
 		ret = 0;
 		ret = 0;
 
 
-		if ((filp->f_mode & FMODE_WRITE) && md->read_only) {
+		if ((mode & FMODE_WRITE) && md->read_only) {
 			mmc_blk_put(md);
 			mmc_blk_put(md);
 			ret = -EROFS;
 			ret = -EROFS;
 		}
 		}
@@ -112,9 +111,9 @@ static int mmc_blk_open(struct inode *inode, struct file *filp)
 	return ret;
 	return ret;
 }
 }
 
 
-static int mmc_blk_release(struct inode *inode, struct file *filp)
+static int mmc_blk_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct mmc_blk_data *md = inode->i_bdev->bd_disk->private_data;
+	struct mmc_blk_data *md = disk->private_data;
 
 
 	mmc_blk_put(md);
 	mmc_blk_put(md);
 	return 0;
 	return 0;

+ 2 - 2
drivers/mtd/devices/block2mtd.c

@@ -224,7 +224,7 @@ static void block2mtd_free_device(struct block2mtd_dev *dev)
 	if (dev->blkdev) {
 	if (dev->blkdev) {
 		invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
 		invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
 					0, -1);
 					0, -1);
-		close_bdev_excl(dev->blkdev);
+		close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE);
 	}
 	}
 
 
 	kfree(dev);
 	kfree(dev);
@@ -246,7 +246,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
 		return NULL;
 		return NULL;
 
 
 	/* Get a handle on the device */
 	/* Get a handle on the device */
-	bdev = open_bdev_excl(devname, O_RDWR, NULL);
+	bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL);
 #ifndef MODULE
 #ifndef MODULE
 	if (IS_ERR(bdev)) {
 	if (IS_ERR(bdev)) {
 
 

+ 9 - 15
drivers/mtd/mtd_blkdevs.c

@@ -133,15 +133,12 @@ static void mtd_blktrans_request(struct request_queue *rq)
 }
 }
 
 
 
 
-static int blktrans_open(struct inode *i, struct file *f)
+static int blktrans_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct mtd_blktrans_dev *dev;
-	struct mtd_blktrans_ops *tr;
+	struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data;
+	struct mtd_blktrans_ops *tr = dev->tr;
 	int ret = -ENODEV;
 	int ret = -ENODEV;
 
 
-	dev = i->i_bdev->bd_disk->private_data;
-	tr = dev->tr;
-
 	if (!try_module_get(dev->mtd->owner))
 	if (!try_module_get(dev->mtd->owner))
 		goto out;
 		goto out;
 
 
@@ -164,15 +161,12 @@ static int blktrans_open(struct inode *i, struct file *f)
 	return ret;
 	return ret;
 }
 }
 
 
-static int blktrans_release(struct inode *i, struct file *f)
+static int blktrans_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct mtd_blktrans_dev *dev;
-	struct mtd_blktrans_ops *tr;
+	struct mtd_blktrans_dev *dev = disk->private_data;
+	struct mtd_blktrans_ops *tr = dev->tr;
 	int ret = 0;
 	int ret = 0;
 
 
-	dev = i->i_bdev->bd_disk->private_data;
-	tr = dev->tr;
-
 	if (tr->release)
 	if (tr->release)
 		ret = tr->release(dev);
 		ret = tr->release(dev);
 
 
@@ -194,10 +188,10 @@ static int blktrans_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return -ENOTTY;
 	return -ENOTTY;
 }
 }
 
 
-static int blktrans_ioctl(struct inode *inode, struct file *file,
+static int blktrans_ioctl(struct block_device *bdev, fmode_t mode,
 			      unsigned int cmd, unsigned long arg)
 			      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;
 	struct mtd_blktrans_ops *tr = dev->tr;
 
 
 	switch (cmd) {
 	switch (cmd) {
@@ -215,7 +209,7 @@ static struct block_device_operations mtd_blktrans_ops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= blktrans_open,
 	.open		= blktrans_open,
 	.release	= blktrans_release,
 	.release	= blktrans_release,
-	.ioctl		= blktrans_ioctl,
+	.locked_ioctl	= blktrans_ioctl,
 	.getgeo		= blktrans_getgeo,
 	.getgeo		= blktrans_getgeo,
 };
 };
 
 

+ 5 - 5
drivers/mtd/mtdchar.c

@@ -96,7 +96,7 @@ static int mtd_open(struct inode *inode, struct file *file)
 		return -ENODEV;
 		return -ENODEV;
 
 
 	/* You can't open the RO devices RW */
 	/* You can't open the RO devices RW */
-	if ((file->f_mode & 2) && (minor & 1))
+	if ((file->f_mode & FMODE_WRITE) && (minor & 1))
 		return -EACCES;
 		return -EACCES;
 
 
 	lock_kernel();
 	lock_kernel();
@@ -114,7 +114,7 @@ static int mtd_open(struct inode *inode, struct file *file)
 	}
 	}
 
 
 	/* You can't open it RW if it's not a writeable device */
 	/* You can't open it RW if it's not a writeable device */
-	if ((file->f_mode & 2) && !(mtd->flags & MTD_WRITEABLE)) {
+	if ((file->f_mode & FMODE_WRITE) && !(mtd->flags & MTD_WRITEABLE)) {
 		put_mtd_device(mtd);
 		put_mtd_device(mtd);
 		ret = -EACCES;
 		ret = -EACCES;
 		goto out;
 		goto out;
@@ -144,7 +144,7 @@ static int mtd_close(struct inode *inode, struct file *file)
 	DEBUG(MTD_DEBUG_LEVEL0, "MTD_close\n");
 	DEBUG(MTD_DEBUG_LEVEL0, "MTD_close\n");
 
 
 	/* Only sync if opened RW */
 	/* Only sync if opened RW */
-	if ((file->f_mode & 2) && mtd->sync)
+	if ((file->f_mode & FMODE_WRITE) && mtd->sync)
 		mtd->sync(mtd);
 		mtd->sync(mtd);
 
 
 	put_mtd_device(mtd);
 	put_mtd_device(mtd);
@@ -443,7 +443,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file,
 	{
 	{
 		struct erase_info *erase;
 		struct erase_info *erase;
 
 
-		if(!(file->f_mode & 2))
+		if(!(file->f_mode & FMODE_WRITE))
 			return -EPERM;
 			return -EPERM;
 
 
 		erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL);
 		erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL);
@@ -497,7 +497,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file,
 		struct mtd_oob_buf __user *user_buf = argp;
 		struct mtd_oob_buf __user *user_buf = argp;
 	        uint32_t retlen;
 	        uint32_t retlen;
 
 
-		if(!(file->f_mode & 2))
+		if(!(file->f_mode & FMODE_WRITE))
 			return -EPERM;
 			return -EPERM;
 
 
 		if (copy_from_user(&buf, argp, sizeof(struct mtd_oob_buf)))
 		if (copy_from_user(&buf, argp, sizeof(struct mtd_oob_buf)))

+ 1 - 1
drivers/parisc/eisa_eeprom.c

@@ -86,7 +86,7 @@ static int eisa_eeprom_open(struct inode *inode, struct file *file)
 {
 {
 	cycle_kernel_lock();
 	cycle_kernel_lock();
 
 
-	if (file->f_mode & 2)
+	if (file->f_mode & FMODE_WRITE)
 		return -EINVAL;
 		return -EINVAL;
    
    
 	return 0;
 	return 0;

+ 4 - 7
drivers/s390/block/dasd.c

@@ -2011,10 +2011,9 @@ static void dasd_flush_request_queue(struct dasd_block *block)
 	spin_unlock_irq(&block->request_queue_lock);
 	spin_unlock_irq(&block->request_queue_lock);
 }
 }
 
 
-static int dasd_open(struct inode *inp, struct file *filp)
+static int dasd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inp->i_bdev->bd_disk;
-	struct dasd_block *block = disk->private_data;
+	struct dasd_block *block = bdev->bd_disk->private_data;
 	struct dasd_device *base = block->base;
 	struct dasd_device *base = block->base;
 	int rc;
 	int rc;
 
 
@@ -2052,9 +2051,8 @@ unlock:
 	return rc;
 	return rc;
 }
 }
 
 
-static int dasd_release(struct inode *inp, struct file *filp)
+static int dasd_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inp->i_bdev->bd_disk;
 	struct dasd_block *block = disk->private_data;
 	struct dasd_block *block = disk->private_data;
 
 
 	atomic_dec(&block->open_count);
 	atomic_dec(&block->open_count);
@@ -2089,8 +2087,7 @@ dasd_device_operations = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= dasd_open,
 	.open		= dasd_open,
 	.release	= dasd_release,
 	.release	= dasd_release,
-	.ioctl		= dasd_ioctl,
-	.compat_ioctl	= dasd_compat_ioctl,
+	.locked_ioctl	= dasd_ioctl,
 	.getgeo		= dasd_getgeo,
 	.getgeo		= dasd_getgeo,
 };
 };
 
 

+ 2 - 2
drivers/s390/block/dasd_genhd.c

@@ -99,7 +99,7 @@ int dasd_scan_partitions(struct dasd_block *block)
 	struct block_device *bdev;
 	struct block_device *bdev;
 
 
 	bdev = bdget_disk(block->gdp, 0);
 	bdev = bdget_disk(block->gdp, 0);
-	if (!bdev || blkdev_get(bdev, FMODE_READ, 1) < 0)
+	if (!bdev || blkdev_get(bdev, FMODE_READ) < 0)
 		return -ENODEV;
 		return -ENODEV;
 	/*
 	/*
 	 * See fs/partition/check.c:register_disk,rescan_partitions
 	 * See fs/partition/check.c:register_disk,rescan_partitions
@@ -152,7 +152,7 @@ void dasd_destroy_partitions(struct dasd_block *block)
 
 
 	invalidate_partition(block->gdp, 0);
 	invalidate_partition(block->gdp, 0);
 	/* Matching blkdev_put to the blkdev_get in dasd_scan_partitions. */
 	/* Matching blkdev_put to the blkdev_get in dasd_scan_partitions. */
-	blkdev_put(bdev);
+	blkdev_put(bdev, FMODE_READ);
 	set_capacity(block->gdp, 0);
 	set_capacity(block->gdp, 0);
 }
 }
 
 

+ 1 - 2
drivers/s390/block/dasd_int.h

@@ -610,8 +610,7 @@ int dasd_scan_partitions(struct dasd_block *);
 void dasd_destroy_partitions(struct dasd_block *);
 void dasd_destroy_partitions(struct dasd_block *);
 
 
 /* externals in dasd_ioctl.c */
 /* externals in dasd_ioctl.c */
-int  dasd_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
-long dasd_compat_ioctl(struct file *, unsigned int, unsigned long);
+int  dasd_ioctl(struct block_device *, fmode_t, unsigned int, unsigned long);
 
 
 /* externals in dasd_proc.c */
 /* externals in dasd_proc.c */
 int dasd_proc_init(void);
 int dasd_proc_init(void);

+ 1 - 14
drivers/s390/block/dasd_ioctl.c

@@ -366,10 +366,9 @@ static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd,
 }
 }
 
 
 int
 int
-dasd_ioctl(struct inode *inode, struct file *file,
+dasd_ioctl(struct block_device *bdev, fmode_t mode,
 	   unsigned int cmd, unsigned long arg)
 	   unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct dasd_block *block = bdev->bd_disk->private_data;
 	struct dasd_block *block = bdev->bd_disk->private_data;
 	void __user *argp = (void __user *)arg;
 	void __user *argp = (void __user *)arg;
 
 
@@ -421,15 +420,3 @@ dasd_ioctl(struct inode *inode, struct file *file,
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
 }
 }
-
-long
-dasd_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
-{
-	int rval;
-
-	lock_kernel();
-	rval = dasd_ioctl(filp->f_path.dentry->d_inode, filp, cmd, arg);
-	unlock_kernel();
-
-	return (rval == -EINVAL) ? -ENOIOCTLCMD : rval;
-}

+ 8 - 9
drivers/s390/block/dcssblk.c

@@ -31,8 +31,8 @@
 #define PRINT_WARN(x...)  printk(KERN_WARNING DCSSBLK_NAME " warning: " x)
 #define PRINT_WARN(x...)  printk(KERN_WARNING DCSSBLK_NAME " warning: " x)
 #define PRINT_ERR(x...)	  printk(KERN_ERR DCSSBLK_NAME " error: " x)
 #define PRINT_ERR(x...)	  printk(KERN_ERR DCSSBLK_NAME " error: " x)
 
 
-static int dcssblk_open(struct inode *inode, struct file *filp);
-static int dcssblk_release(struct inode *inode, struct file *filp);
+static int dcssblk_open(struct block_device *bdev, fmode_t mode);
+static int dcssblk_release(struct gendisk *disk, fmode_t mode);
 static int dcssblk_make_request(struct request_queue *q, struct bio *bio);
 static int dcssblk_make_request(struct request_queue *q, struct bio *bio);
 static int dcssblk_direct_access(struct block_device *bdev, sector_t secnum,
 static int dcssblk_direct_access(struct block_device *bdev, sector_t secnum,
 				 void **kaddr, unsigned long *pfn);
 				 void **kaddr, unsigned long *pfn);
@@ -776,32 +776,31 @@ out_buf:
 }
 }
 
 
 static int
 static int
-dcssblk_open(struct inode *inode, struct file *filp)
+dcssblk_open(struct block_device *bdev, fmode_t mode)
 {
 {
 	struct dcssblk_dev_info *dev_info;
 	struct dcssblk_dev_info *dev_info;
 	int rc;
 	int rc;
 
 
-	dev_info = inode->i_bdev->bd_disk->private_data;
+	dev_info = bdev->bd_disk->private_data;
 	if (NULL == dev_info) {
 	if (NULL == dev_info) {
 		rc = -ENODEV;
 		rc = -ENODEV;
 		goto out;
 		goto out;
 	}
 	}
 	atomic_inc(&dev_info->use_count);
 	atomic_inc(&dev_info->use_count);
-	inode->i_bdev->bd_block_size = 4096;
+	bdev->bd_block_size = 4096;
 	rc = 0;
 	rc = 0;
 out:
 out:
 	return rc;
 	return rc;
 }
 }
 
 
 static int
 static int
-dcssblk_release(struct inode *inode, struct file *filp)
+dcssblk_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct dcssblk_dev_info *dev_info;
+	struct dcssblk_dev_info *dev_info = disk->private_data;
 	struct segment_info *entry;
 	struct segment_info *entry;
 	int rc;
 	int rc;
 
 
-	dev_info = inode->i_bdev->bd_disk->private_data;
-	if (NULL == dev_info) {
+	if (!dev_info) {
 		rc = -ENODEV;
 		rc = -ENODEV;
 		goto out;
 		goto out;
 	}
 	}

+ 11 - 14
drivers/s390/char/tape_block.c

@@ -43,9 +43,9 @@
 /*
 /*
  * file operation structure for tape block frontend
  * file operation structure for tape block frontend
  */
  */
-static int tapeblock_open(struct inode *, struct file *);
-static int tapeblock_release(struct inode *, struct file *);
-static int tapeblock_ioctl(struct inode *, struct file *, unsigned int,
+static int tapeblock_open(struct block_device *, fmode_t);
+static int tapeblock_release(struct gendisk *, fmode_t);
+static int tapeblock_ioctl(struct block_device *, fmode_t, unsigned int,
 				unsigned long);
 				unsigned long);
 static int tapeblock_medium_changed(struct gendisk *);
 static int tapeblock_medium_changed(struct gendisk *);
 static int tapeblock_revalidate_disk(struct gendisk *);
 static int tapeblock_revalidate_disk(struct gendisk *);
@@ -54,7 +54,7 @@ static struct block_device_operations tapeblock_fops = {
 	.owner		 = THIS_MODULE,
 	.owner		 = THIS_MODULE,
 	.open		 = tapeblock_open,
 	.open		 = tapeblock_open,
 	.release	 = tapeblock_release,
 	.release	 = tapeblock_release,
-	.ioctl           = tapeblock_ioctl,
+	.locked_ioctl           = tapeblock_ioctl,
 	.media_changed   = tapeblock_medium_changed,
 	.media_changed   = tapeblock_medium_changed,
 	.revalidate_disk = tapeblock_revalidate_disk,
 	.revalidate_disk = tapeblock_revalidate_disk,
 };
 };
@@ -364,13 +364,12 @@ tapeblock_medium_changed(struct gendisk *disk)
  * Block frontend tape device open function.
  * Block frontend tape device open function.
  */
  */
 static int
 static int
-tapeblock_open(struct inode *inode, struct file *filp)
+tapeblock_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *	disk;
+	struct gendisk *	disk = bdev->bd_disk;
 	struct tape_device *	device;
 	struct tape_device *	device;
 	int			rc;
 	int			rc;
 
 
-	disk   = inode->i_bdev->bd_disk;
 	device = tape_get_device_reference(disk->private_data);
 	device = tape_get_device_reference(disk->private_data);
 
 
 	if (device->required_tapemarks) {
 	if (device->required_tapemarks) {
@@ -410,9 +409,8 @@ release:
  *       we just get the pointer here and release the reference.
  *       we just get the pointer here and release the reference.
  */
  */
 static int
 static int
-tapeblock_release(struct inode *inode, struct file *filp)
+tapeblock_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct tape_device *device = disk->private_data;
 	struct tape_device *device = disk->private_data;
 
 
 	tape_state_set(device, TS_IN_USE);
 	tape_state_set(device, TS_IN_USE);
@@ -427,22 +425,21 @@ tapeblock_release(struct inode *inode, struct file *filp)
  */
  */
 static int
 static int
 tapeblock_ioctl(
 tapeblock_ioctl(
-	struct inode *		inode,
-	struct file *		file,
+	struct block_device *	bdev,
+	fmode_t			mode,
 	unsigned int		command,
 	unsigned int		command,
 	unsigned long		arg
 	unsigned long		arg
 ) {
 ) {
 	int rc;
 	int rc;
 	int minor;
 	int minor;
-	struct gendisk *disk;
+	struct gendisk *disk = bdev->bd_disk;
 	struct tape_device *device;
 	struct tape_device *device;
 
 
 	rc     = 0;
 	rc     = 0;
-	disk   = inode->i_bdev->bd_disk;
 	BUG_ON(!disk);
 	BUG_ON(!disk);
 	device = disk->private_data;
 	device = disk->private_data;
 	BUG_ON(!device);
 	BUG_ON(!device);
-	minor  = iminor(inode);
+	minor  = MINOR(bdev->bd_dev);
 
 
 	DBF_LH(6, "tapeblock_ioctl(0x%0x)\n", command);
 	DBF_LH(6, "tapeblock_ioctl(0x%0x)\n", command);
 	DBF_LH(6, "device = %d:%d\n", tapeblock_major, minor);
 	DBF_LH(6, "device = %d:%d\n", tapeblock_major, minor);

+ 8 - 14
drivers/scsi/ide-scsi.c

@@ -452,40 +452,34 @@ static ide_driver_t idescsi_driver = {
 #endif
 #endif
 };
 };
 
 
-static int idescsi_ide_open(struct inode *inode, struct file *filp)
+static int idescsi_ide_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
-	struct ide_scsi_obj *scsi;
+	struct ide_scsi_obj *scsi = ide_scsi_get(bdev->bd_disk);
 
 
-	if (!(scsi = ide_scsi_get(disk)))
+	if (!scsi)
 		return -ENXIO;
 		return -ENXIO;
 
 
 	return 0;
 	return 0;
 }
 }
 
 
-static int idescsi_ide_release(struct inode *inode, struct file *filp)
+static int idescsi_ide_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
-	struct ide_scsi_obj *scsi = ide_scsi_g(disk);
-
-	ide_scsi_put(scsi);
-
+	ide_scsi_put(ide_scsi_g(disk));
 	return 0;
 	return 0;
 }
 }
 
 
-static int idescsi_ide_ioctl(struct inode *inode, struct file *file,
+static int idescsi_ide_ioctl(struct block_device *bdev, fmode_t mode,
 			unsigned int cmd, unsigned long arg)
 			unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct ide_scsi_obj *scsi = ide_scsi_g(bdev->bd_disk);
 	struct ide_scsi_obj *scsi = ide_scsi_g(bdev->bd_disk);
-	return generic_ide_ioctl(scsi->drive, file, bdev, cmd, arg);
+	return generic_ide_ioctl(scsi->drive, bdev, cmd, arg);
 }
 }
 
 
 static struct block_device_operations idescsi_ops = {
 static struct block_device_operations idescsi_ops = {
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= idescsi_ide_open,
 	.open		= idescsi_ide_open,
 	.release	= idescsi_ide_release,
 	.release	= idescsi_ide_release,
-	.ioctl		= idescsi_ide_ioctl,
+	.locked_ioctl	= idescsi_ide_ioctl,
 };
 };
 
 
 static int idescsi_slave_configure(struct scsi_device * sdp)
 static int idescsi_slave_configure(struct scsi_device * sdp)

+ 3 - 3
drivers/scsi/scsi_ioctl.c

@@ -237,7 +237,7 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
 	case SCSI_IOCTL_SEND_COMMAND:
 	case SCSI_IOCTL_SEND_COMMAND:
 		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
 		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
 			return -EACCES;
 			return -EACCES;
-		return sg_scsi_ioctl(NULL, sdev->request_queue, NULL, arg);
+		return sg_scsi_ioctl(sdev->request_queue, NULL, 0, arg);
 	case SCSI_IOCTL_DOORLOCK:
 	case SCSI_IOCTL_DOORLOCK:
 		return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT);
 		return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT);
 	case SCSI_IOCTL_DOORUNLOCK:
 	case SCSI_IOCTL_DOORUNLOCK:
@@ -277,14 +277,14 @@ EXPORT_SYMBOL(scsi_ioctl);
  * @filp: either NULL or a &struct file which must have the O_NONBLOCK flag.
  * @filp: either NULL or a &struct file which must have the O_NONBLOCK flag.
  */
  */
 int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd,
 int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd,
-			    void __user *arg, struct file *filp)
+			    void __user *arg, int ndelay)
 {
 {
 	int val, result;
 	int val, result;
 
 
 	/* The first set of iocts may be executed even if we're doing
 	/* The first set of iocts may be executed even if we're doing
 	 * error processing, as long as the device was opened
 	 * error processing, as long as the device was opened
 	 * non-blocking */
 	 * non-blocking */
-	if (filp && (filp->f_flags & O_NONBLOCK)) {
+	if (ndelay) {
 		if (scsi_host_in_recovery(sdev->host))
 		if (scsi_host_in_recovery(sdev->host))
 			return -ENODEV;
 			return -ENODEV;
 	} else if (!scsi_block_when_processing_errors(sdev))
 	} else if (!scsi_block_when_processing_errors(sdev))

+ 15 - 20
drivers/scsi/sd.c

@@ -609,17 +609,15 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
  *	In the latter case @inode and @filp carry an abridged amount
  *	In the latter case @inode and @filp carry an abridged amount
  *	of information as noted above.
  *	of information as noted above.
  **/
  **/
-static int sd_open(struct inode *inode, struct file *filp)
+static int sd_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
-	struct scsi_disk *sdkp;
+	struct scsi_disk *sdkp = scsi_disk_get(bdev->bd_disk);
 	struct scsi_device *sdev;
 	struct scsi_device *sdev;
 	int retval;
 	int retval;
 
 
-	if (!(sdkp = scsi_disk_get(disk)))
+	if (!sdkp)
 		return -ENXIO;
 		return -ENXIO;
 
 
-
 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n"));
 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n"));
 
 
 	sdev = sdkp->device;
 	sdev = sdkp->device;
@@ -633,14 +631,13 @@ static int sd_open(struct inode *inode, struct file *filp)
 		goto error_out;
 		goto error_out;
 
 
 	if (sdev->removable || sdkp->write_prot)
 	if (sdev->removable || sdkp->write_prot)
-		check_disk_change(inode->i_bdev);
+		check_disk_change(bdev);
 
 
 	/*
 	/*
 	 * If the drive is empty, just let the open fail.
 	 * If the drive is empty, just let the open fail.
 	 */
 	 */
 	retval = -ENOMEDIUM;
 	retval = -ENOMEDIUM;
-	if (sdev->removable && !sdkp->media_present &&
-	    !(filp->f_flags & O_NDELAY))
+	if (sdev->removable && !sdkp->media_present && !(mode & FMODE_NDELAY))
 		goto error_out;
 		goto error_out;
 
 
 	/*
 	/*
@@ -648,7 +645,7 @@ static int sd_open(struct inode *inode, struct file *filp)
 	 * if the user expects to be able to write to the thing.
 	 * if the user expects to be able to write to the thing.
 	 */
 	 */
 	retval = -EROFS;
 	retval = -EROFS;
-	if (sdkp->write_prot && (filp->f_mode & FMODE_WRITE))
+	if (sdkp->write_prot && (mode & FMODE_WRITE))
 		goto error_out;
 		goto error_out;
 
 
 	/*
 	/*
@@ -684,9 +681,8 @@ error_out:
  *	Note: may block (uninterruptible) if error recovery is underway
  *	Note: may block (uninterruptible) if error recovery is underway
  *	on this disk.
  *	on this disk.
  **/
  **/
-static int sd_release(struct inode *inode, struct file *filp)
+static int sd_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct scsi_disk *sdkp = scsi_disk(disk);
 	struct scsi_disk *sdkp = scsi_disk(disk);
 	struct scsi_device *sdev = sdkp->device;
 	struct scsi_device *sdev = sdkp->device;
 
 
@@ -743,10 +739,9 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
  *	Note: most ioctls are forward onto the block subsystem or further
  *	Note: most ioctls are forward onto the block subsystem or further
  *	down in the scsi subsystem.
  *	down in the scsi subsystem.
  **/
  **/
-static int sd_ioctl(struct inode * inode, struct file * filp, 
+static int sd_ioctl(struct block_device *bdev, fmode_t mode,
 		    unsigned int cmd, unsigned long arg)
 		    unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = inode->i_bdev;
 	struct gendisk *disk = bdev->bd_disk;
 	struct gendisk *disk = bdev->bd_disk;
 	struct scsi_device *sdp = scsi_disk(disk)->device;
 	struct scsi_device *sdp = scsi_disk(disk)->device;
 	void __user *p = (void __user *)arg;
 	void __user *p = (void __user *)arg;
@@ -761,7 +756,8 @@ static int sd_ioctl(struct inode * inode, struct file * filp,
 	 * may try and take the device offline, in which case all further
 	 * may try and take the device offline, in which case all further
 	 * access to the device is prohibited.
 	 * access to the device is prohibited.
 	 */
 	 */
-	error = scsi_nonblockable_ioctl(sdp, cmd, p, filp);
+	error = scsi_nonblockable_ioctl(sdp, cmd, p,
+					(mode & FMODE_NDELAY_NOW) != 0);
 	if (!scsi_block_when_processing_errors(sdp) || !error)
 	if (!scsi_block_when_processing_errors(sdp) || !error)
 		return error;
 		return error;
 
 
@@ -775,7 +771,7 @@ static int sd_ioctl(struct inode * inode, struct file * filp,
 		case SCSI_IOCTL_GET_BUS_NUMBER:
 		case SCSI_IOCTL_GET_BUS_NUMBER:
 			return scsi_ioctl(sdp, cmd, p);
 			return scsi_ioctl(sdp, cmd, p);
 		default:
 		default:
-			error = scsi_cmd_ioctl(filp, disk->queue, disk, cmd, p);
+			error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p);
 			if (error != -ENOTTY)
 			if (error != -ENOTTY)
 				return error;
 				return error;
 	}
 	}
@@ -928,11 +924,10 @@ static void sd_rescan(struct device *dev)
  * This gets directly called from VFS. When the ioctl 
  * This gets directly called from VFS. When the ioctl 
  * is not recognized we go back to the other translation paths. 
  * is not recognized we go back to the other translation paths. 
  */
  */
-static long sd_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode,
+			   unsigned int cmd, unsigned long arg)
 {
 {
-	struct block_device *bdev = file->f_path.dentry->d_inode->i_bdev;
-	struct gendisk *disk = bdev->bd_disk;
-	struct scsi_device *sdev = scsi_disk(disk)->device;
+	struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device;
 
 
 	/*
 	/*
 	 * If we are in the middle of error recovery, don't let anyone
 	 * If we are in the middle of error recovery, don't let anyone
@@ -962,7 +957,7 @@ static struct block_device_operations sd_fops = {
 	.owner			= THIS_MODULE,
 	.owner			= THIS_MODULE,
 	.open			= sd_open,
 	.open			= sd_open,
 	.release		= sd_release,
 	.release		= sd_release,
-	.ioctl			= sd_ioctl,
+	.locked_ioctl		= sd_ioctl,
 	.getgeo			= sd_getgeo,
 	.getgeo			= sd_getgeo,
 #ifdef CONFIG_COMPAT
 #ifdef CONFIG_COMPAT
 	.compat_ioctl		= sd_compat_ioctl,
 	.compat_ioctl		= sd_compat_ioctl,

+ 1 - 1
drivers/scsi/sg.c

@@ -1059,7 +1059,7 @@ sg_ioctl(struct inode *inode, struct file *filp,
 			if (sg_allow_access(filp, &opcode))
 			if (sg_allow_access(filp, &opcode))
 				return -EPERM;
 				return -EPERM;
 		}
 		}
-		return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p);
+		return sg_scsi_ioctl(sdp->device->request_queue, NULL, filp->f_mode, p);
 	case SG_SET_DEBUG:
 	case SG_SET_DEBUG:
 		result = get_user(val, ip);
 		result = get_user(val, ip);
 		if (result)
 		if (result)

+ 17 - 23
drivers/scsi/sr.c

@@ -471,38 +471,31 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq)
 	return scsi_prep_return(q, rq, ret);
 	return scsi_prep_return(q, rq, ret);
 }
 }
 
 
-static int sr_block_open(struct inode *inode, struct file *file)
+static int sr_block_open(struct block_device *bdev, fmode_t mode)
 {
 {
-	struct gendisk *disk = inode->i_bdev->bd_disk;
-	struct scsi_cd *cd;
-	int ret = 0;
-
-	if(!(cd = scsi_cd_get(disk)))
-		return -ENXIO;
-
-	if((ret = cdrom_open(&cd->cdi, inode, file)) != 0)
-		scsi_cd_put(cd);
+	struct scsi_cd *cd = scsi_cd_get(bdev->bd_disk);
+	int ret = -ENXIO;
 
 
+	if (cd) {
+		ret = cdrom_open(&cd->cdi, bdev, mode);
+		if (ret)
+			scsi_cd_put(cd);
+	}
 	return ret;
 	return ret;
 }
 }
 
 
-static int sr_block_release(struct inode *inode, struct file *file)
+static int sr_block_release(struct gendisk *disk, fmode_t mode)
 {
 {
-	int ret;
-	struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-	ret = cdrom_release(&cd->cdi, file);
-	if(ret)
-		return ret;
-	
+	struct scsi_cd *cd = scsi_cd(disk);
+	cdrom_release(&cd->cdi, mode);
 	scsi_cd_put(cd);
 	scsi_cd_put(cd);
-
 	return 0;
 	return 0;
 }
 }
 
 
-static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
+static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
 			  unsigned long arg)
 			  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;
 	struct scsi_device *sdev = cd->device;
 	void __user *argp = (void __user *)arg;
 	void __user *argp = (void __user *)arg;
 	int ret;
 	int ret;
@@ -517,7 +510,7 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
 		return scsi_ioctl(sdev, cmd, argp);
 		return scsi_ioctl(sdev, cmd, argp);
 	}
 	}
 
 
-	ret = cdrom_ioctl(file, &cd->cdi, inode, cmd, arg);
+	ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg);
 	if (ret != -ENOSYS)
 	if (ret != -ENOSYS)
 		return ret;
 		return ret;
 
 
@@ -527,7 +520,8 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
 	 * case fall through to scsi_ioctl, which will return ENDOEV again
 	 * case fall through to scsi_ioctl, which will return ENDOEV again
 	 * if it doesn't recognise the ioctl
 	 * if it doesn't recognise the ioctl
 	 */
 	 */
-	ret = scsi_nonblockable_ioctl(sdev, cmd, argp, NULL);
+	ret = scsi_nonblockable_ioctl(sdev, cmd, argp,
+					(mode & FMODE_NDELAY_NOW) != 0);
 	if (ret != -ENODEV)
 	if (ret != -ENODEV)
 		return ret;
 		return ret;
 	return scsi_ioctl(sdev, cmd, argp);
 	return scsi_ioctl(sdev, cmd, argp);
@@ -544,7 +538,7 @@ static struct block_device_operations sr_bdops =
 	.owner		= THIS_MODULE,
 	.owner		= THIS_MODULE,
 	.open		= sr_block_open,
 	.open		= sr_block_open,
 	.release	= sr_block_release,
 	.release	= sr_block_release,
-	.ioctl		= sr_block_ioctl,
+	.locked_ioctl	= sr_block_ioctl,
 	.media_changed	= sr_block_media_changed,
 	.media_changed	= sr_block_media_changed,
 	/* 
 	/* 
 	 * No compat_ioctl for now because sr_block_ioctl never
 	 * No compat_ioctl for now because sr_block_ioctl never

+ 4 - 3
drivers/scsi/st.c

@@ -3263,7 +3263,8 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
 	 * may try and take the device offline, in which case all further
 	 * may try and take the device offline, in which case all further
 	 * access to the device is prohibited.
 	 * access to the device is prohibited.
 	 */
 	 */
-	retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p, file);
+	retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p,
+					file->f_flags & O_NDELAY);
 	if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV)
 	if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV)
 		goto out;
 		goto out;
 	retval = 0;
 	retval = 0;
@@ -3567,8 +3568,8 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
 			    !capable(CAP_SYS_RAWIO))
 			    !capable(CAP_SYS_RAWIO))
 				i = -EPERM;
 				i = -EPERM;
 			else
 			else
-				i = scsi_cmd_ioctl(file, STp->disk->queue,
-						   STp->disk, cmd_in, p);
+				i = scsi_cmd_ioctl(STp->disk->queue, STp->disk,
+						   file->f_mode, cmd_in, p);
 			if (i != -ENOTTY)
 			if (i != -ENOTTY)
 				return i;
 				return i;
 			break;
 			break;

+ 49 - 62
fs/block_dev.c

@@ -840,13 +840,12 @@ EXPORT_SYMBOL_GPL(bd_release_from_disk);
  * to be used for internal purposes.  If you ever need it - reconsider
  * to be used for internal purposes.  If you ever need it - reconsider
  * your API.
  * your API.
  */
  */
-struct block_device *open_by_devnum(dev_t dev, unsigned mode)
+struct block_device *open_by_devnum(dev_t dev, fmode_t mode)
 {
 {
 	struct block_device *bdev = bdget(dev);
 	struct block_device *bdev = bdget(dev);
 	int err = -ENOMEM;
 	int err = -ENOMEM;
-	int flags = mode & FMODE_WRITE ? O_RDWR : O_RDONLY;
 	if (bdev)
 	if (bdev)
-		err = blkdev_get(bdev, mode, flags);
+		err = blkdev_get(bdev, mode);
 	return err ? ERR_PTR(err) : bdev;
 	return err ? ERR_PTR(err) : bdev;
 }
 }
 
 
@@ -975,9 +974,7 @@ void bd_set_size(struct block_device *bdev, loff_t size)
 }
 }
 EXPORT_SYMBOL(bd_set_size);
 EXPORT_SYMBOL(bd_set_size);
 
 
-static int __blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags,
-			int for_part);
-static int __blkdev_put(struct block_device *bdev, int for_part);
+static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
 
 
 /*
 /*
  * bd_mutex locking:
  * bd_mutex locking:
@@ -986,7 +983,7 @@ static int __blkdev_put(struct block_device *bdev, int for_part);
  *    mutex_lock_nested(whole->bd_mutex, 1)
  *    mutex_lock_nested(whole->bd_mutex, 1)
  */
  */
 
 
-static int do_open(struct block_device *bdev, struct file *file, int for_part)
+static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
 {
 {
 	struct gendisk *disk;
 	struct gendisk *disk;
 	struct hd_struct *part = NULL;
 	struct hd_struct *part = NULL;
@@ -994,9 +991,9 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
 	int partno;
 	int partno;
 	int perm = 0;
 	int perm = 0;
 
 
-	if (file->f_mode & FMODE_READ)
+	if (mode & FMODE_READ)
 		perm |= MAY_READ;
 		perm |= MAY_READ;
-	if (file->f_mode & FMODE_WRITE)
+	if (mode & FMODE_WRITE)
 		perm |= MAY_WRITE;
 		perm |= MAY_WRITE;
 	/*
 	/*
 	 * hooks: /n/, see "layering violations".
 	 * hooks: /n/, see "layering violations".
@@ -1008,7 +1005,6 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
 	}
 	}
 
 
 	ret = -ENXIO;
 	ret = -ENXIO;
-	file->f_mapping = bdev->bd_inode->i_mapping;
 
 
 	lock_kernel();
 	lock_kernel();
 
 
@@ -1027,7 +1023,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
 		if (!partno) {
 		if (!partno) {
 			struct backing_dev_info *bdi;
 			struct backing_dev_info *bdi;
 			if (disk->fops->open) {
 			if (disk->fops->open) {
-				ret = disk->fops->open(bdev->bd_inode, file);
+				ret = disk->fops->open(bdev, mode);
 				if (ret)
 				if (ret)
 					goto out_clear;
 					goto out_clear;
 			}
 			}
@@ -1047,7 +1043,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
 			if (!whole)
 			if (!whole)
 				goto out_clear;
 				goto out_clear;
 			BUG_ON(for_part);
 			BUG_ON(for_part);
-			ret = __blkdev_get(whole, file->f_mode, file->f_flags, 1);
+			ret = __blkdev_get(whole, mode, 1);
 			if (ret)
 			if (ret)
 				goto out_clear;
 				goto out_clear;
 			bdev->bd_contains = whole;
 			bdev->bd_contains = whole;
@@ -1068,7 +1064,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
 		disk = NULL;
 		disk = NULL;
 		if (bdev->bd_contains == bdev) {
 		if (bdev->bd_contains == bdev) {
 			if (bdev->bd_disk->fops->open) {
 			if (bdev->bd_disk->fops->open) {
-				ret = bdev->bd_disk->fops->open(bdev->bd_inode, file);
+				ret = bdev->bd_disk->fops->open(bdev, mode);
 				if (ret)
 				if (ret)
 					goto out_unlock_bdev;
 					goto out_unlock_bdev;
 			}
 			}
@@ -1088,7 +1084,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
 	bdev->bd_part = NULL;
 	bdev->bd_part = NULL;
 	bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
 	bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
 	if (bdev != bdev->bd_contains)
 	if (bdev != bdev->bd_contains)
-		__blkdev_put(bdev->bd_contains, 1);
+		__blkdev_put(bdev->bd_contains, mode, 1);
 	bdev->bd_contains = NULL;
 	bdev->bd_contains = NULL;
  out_unlock_bdev:
  out_unlock_bdev:
 	mutex_unlock(&bdev->bd_mutex);
 	mutex_unlock(&bdev->bd_mutex);
@@ -1104,28 +1100,9 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
 	return ret;
 	return ret;
 }
 }
 
 
-static int __blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags,
-			int for_part)
+int blkdev_get(struct block_device *bdev, fmode_t mode)
 {
 {
-	/*
-	 * This crockload is due to bad choice of ->open() type.
-	 * It will go away.
-	 * For now, block device ->open() routine must _not_
-	 * examine anything in 'inode' argument except ->i_rdev.
-	 */
-	struct file fake_file = {};
-	struct dentry fake_dentry = {};
-	fake_file.f_mode = mode;
-	fake_file.f_flags = flags;
-	fake_file.f_path.dentry = &fake_dentry;
-	fake_dentry.d_inode = bdev->bd_inode;
-
-	return do_open(bdev, &fake_file, for_part);
-}
-
-int blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags)
-{
-	return __blkdev_get(bdev, mode, flags, 0);
+	return __blkdev_get(bdev, mode, 0);
 }
 }
 EXPORT_SYMBOL(blkdev_get);
 EXPORT_SYMBOL(blkdev_get);
 
 
@@ -1142,28 +1119,36 @@ static int blkdev_open(struct inode * inode, struct file * filp)
 	 */
 	 */
 	filp->f_flags |= O_LARGEFILE;
 	filp->f_flags |= O_LARGEFILE;
 
 
+	if (filp->f_flags & O_NDELAY)
+		filp->f_mode |= FMODE_NDELAY;
+	if (filp->f_flags & O_EXCL)
+		filp->f_mode |= FMODE_EXCL;
+	if ((filp->f_flags & O_ACCMODE) == 3)
+		filp->f_mode |= FMODE_WRITE_IOCTL;
+
 	bdev = bd_acquire(inode);
 	bdev = bd_acquire(inode);
 	if (bdev == NULL)
 	if (bdev == NULL)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	res = do_open(bdev, filp, 0);
+	filp->f_mapping = bdev->bd_inode->i_mapping;
+
+	res = blkdev_get(bdev, filp->f_mode);
 	if (res)
 	if (res)
 		return res;
 		return res;
 
 
-	if (!(filp->f_flags & O_EXCL) )
+	if (!(filp->f_mode & FMODE_EXCL))
 		return 0;
 		return 0;
 
 
 	if (!(res = bd_claim(bdev, filp)))
 	if (!(res = bd_claim(bdev, filp)))
 		return 0;
 		return 0;
 
 
-	blkdev_put(bdev);
+	blkdev_put(bdev, filp->f_mode);
 	return res;
 	return res;
 }
 }
 
 
-static int __blkdev_put(struct block_device *bdev, int for_part)
+static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
 {
 {
 	int ret = 0;
 	int ret = 0;
-	struct inode *bd_inode = bdev->bd_inode;
 	struct gendisk *disk = bdev->bd_disk;
 	struct gendisk *disk = bdev->bd_disk;
 	struct block_device *victim = NULL;
 	struct block_device *victim = NULL;
 
 
@@ -1178,7 +1163,7 @@ static int __blkdev_put(struct block_device *bdev, int for_part)
 	}
 	}
 	if (bdev->bd_contains == bdev) {
 	if (bdev->bd_contains == bdev) {
 		if (disk->fops->release)
 		if (disk->fops->release)
-			ret = disk->fops->release(bd_inode, NULL);
+			ret = disk->fops->release(disk, mode);
 	}
 	}
 	if (!bdev->bd_openers) {
 	if (!bdev->bd_openers) {
 		struct module *owner = disk->fops->owner;
 		struct module *owner = disk->fops->owner;
@@ -1197,13 +1182,13 @@ static int __blkdev_put(struct block_device *bdev, int for_part)
 	mutex_unlock(&bdev->bd_mutex);
 	mutex_unlock(&bdev->bd_mutex);
 	bdput(bdev);
 	bdput(bdev);
 	if (victim)
 	if (victim)
-		__blkdev_put(victim, 1);
+		__blkdev_put(victim, mode, 1);
 	return ret;
 	return ret;
 }
 }
 
 
-int blkdev_put(struct block_device *bdev)
+int blkdev_put(struct block_device *bdev, fmode_t mode)
 {
 {
-	return __blkdev_put(bdev, 0);
+	return __blkdev_put(bdev, mode, 0);
 }
 }
 EXPORT_SYMBOL(blkdev_put);
 EXPORT_SYMBOL(blkdev_put);
 
 
@@ -1212,12 +1197,16 @@ static int blkdev_close(struct inode * inode, struct file * filp)
 	struct block_device *bdev = I_BDEV(filp->f_mapping->host);
 	struct block_device *bdev = I_BDEV(filp->f_mapping->host);
 	if (bdev->bd_holder == filp)
 	if (bdev->bd_holder == filp)
 		bd_release(bdev);
 		bd_release(bdev);
-	return blkdev_put(bdev);
+	return blkdev_put(bdev, filp->f_mode);
 }
 }
 
 
 static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
 {
-	return blkdev_ioctl(file->f_mapping->host, file, cmd, arg);
+	struct block_device *bdev = I_BDEV(file->f_mapping->host);
+	fmode_t mode = file->f_mode;
+	if (file->f_flags & O_NDELAY)
+		mode |= FMODE_NDELAY_NOW;
+	return blkdev_ioctl(bdev, mode, cmd, arg);
 }
 }
 
 
 static const struct address_space_operations def_blk_aops = {
 static const struct address_space_operations def_blk_aops = {
@@ -1253,7 +1242,7 @@ int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg)
 	int res;
 	int res;
 	mm_segment_t old_fs = get_fs();
 	mm_segment_t old_fs = get_fs();
 	set_fs(KERNEL_DS);
 	set_fs(KERNEL_DS);
-	res = blkdev_ioctl(bdev->bd_inode, NULL, cmd, arg);
+	res = blkdev_ioctl(bdev, 0, cmd, arg);
 	set_fs(old_fs);
 	set_fs(old_fs);
 	return res;
 	return res;
 }
 }
@@ -1303,32 +1292,29 @@ fail:
 EXPORT_SYMBOL(lookup_bdev);
 EXPORT_SYMBOL(lookup_bdev);
 
 
 /**
 /**
- * open_bdev_excl  -  open a block device by name and set it up for use
+ * open_bdev_exclusive  -  open a block device by name and set it up for use
  *
  *
  * @path:	special file representing the block device
  * @path:	special file representing the block device
- * @flags:	%MS_RDONLY for opening read-only
+ * @mode:	FMODE_... combination to pass be used
  * @holder:	owner for exclusion
  * @holder:	owner for exclusion
  *
  *
  * Open the blockdevice described by the special file at @path, claim it
  * Open the blockdevice described by the special file at @path, claim it
  * for the @holder.
  * for the @holder.
  */
  */
-struct block_device *open_bdev_excl(const char *path, int flags, void *holder)
+struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *holder)
 {
 {
 	struct block_device *bdev;
 	struct block_device *bdev;
-	mode_t mode = FMODE_READ;
 	int error = 0;
 	int error = 0;
 
 
 	bdev = lookup_bdev(path);
 	bdev = lookup_bdev(path);
 	if (IS_ERR(bdev))
 	if (IS_ERR(bdev))
 		return bdev;
 		return bdev;
 
 
-	if (!(flags & MS_RDONLY))
-		mode |= FMODE_WRITE;
-	error = blkdev_get(bdev, mode, 0);
+	error = blkdev_get(bdev, mode);
 	if (error)
 	if (error)
 		return ERR_PTR(error);
 		return ERR_PTR(error);
 	error = -EACCES;
 	error = -EACCES;
-	if (!(flags & MS_RDONLY) && bdev_read_only(bdev))
+	if ((mode & FMODE_WRITE) && bdev_read_only(bdev))
 		goto blkdev_put;
 		goto blkdev_put;
 	error = bd_claim(bdev, holder);
 	error = bd_claim(bdev, holder);
 	if (error)
 	if (error)
@@ -1337,26 +1323,27 @@ struct block_device *open_bdev_excl(const char *path, int flags, void *holder)
 	return bdev;
 	return bdev;
 	
 	
 blkdev_put:
 blkdev_put:
-	blkdev_put(bdev);
+	blkdev_put(bdev, mode);
 	return ERR_PTR(error);
 	return ERR_PTR(error);
 }
 }
 
 
-EXPORT_SYMBOL(open_bdev_excl);
+EXPORT_SYMBOL(open_bdev_exclusive);
 
 
 /**
 /**
- * close_bdev_excl  -  release a blockdevice openen by open_bdev_excl()
+ * close_bdev_exclusive  -  close a blockdevice opened by open_bdev_exclusive()
  *
  *
  * @bdev:	blockdevice to close
  * @bdev:	blockdevice to close
+ * @mode:	mode, must match that used to open.
  *
  *
- * This is the counterpart to open_bdev_excl().
+ * This is the counterpart to open_bdev_exclusive().
  */
  */
-void close_bdev_excl(struct block_device *bdev)
+void close_bdev_exclusive(struct block_device *bdev, fmode_t mode)
 {
 {
 	bd_release(bdev);
 	bd_release(bdev);
-	blkdev_put(bdev);
+	blkdev_put(bdev, mode);
 }
 }
 
 
-EXPORT_SYMBOL(close_bdev_excl);
+EXPORT_SYMBOL(close_bdev_exclusive);
 
 
 int __invalidate_device(struct block_device *bdev)
 int __invalidate_device(struct block_device *bdev)
 {
 {

+ 1 - 0
fs/ext2/xip.c

@@ -11,6 +11,7 @@
 #include <linux/buffer_head.h>
 #include <linux/buffer_head.h>
 #include <linux/ext2_fs_sb.h>
 #include <linux/ext2_fs_sb.h>
 #include <linux/ext2_fs.h>
 #include <linux/ext2_fs.h>
+#include <linux/blkdev.h>
 #include "ext2.h"
 #include "ext2.h"
 #include "xip.h"
 #include "xip.h"
 
 

+ 2 - 2
fs/ext3/super.c

@@ -347,7 +347,7 @@ fail:
 static int ext3_blkdev_put(struct block_device *bdev)
 static int ext3_blkdev_put(struct block_device *bdev)
 {
 {
 	bd_release(bdev);
 	bd_release(bdev);
-	return blkdev_put(bdev);
+	return blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 }
 }
 
 
 static int ext3_blkdev_remove(struct ext3_sb_info *sbi)
 static int ext3_blkdev_remove(struct ext3_sb_info *sbi)
@@ -2067,7 +2067,7 @@ static journal_t *ext3_get_dev_journal(struct super_block *sb,
 	if (bd_claim(bdev, sb)) {
 	if (bd_claim(bdev, sb)) {
 		printk(KERN_ERR
 		printk(KERN_ERR
 		        "EXT3: failed to claim external journal device.\n");
 		        "EXT3: failed to claim external journal device.\n");
-		blkdev_put(bdev);
+		blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 		return NULL;
 		return NULL;
 	}
 	}
 
 

+ 2 - 2
fs/ext4/super.c

@@ -399,7 +399,7 @@ fail:
 static int ext4_blkdev_put(struct block_device *bdev)
 static int ext4_blkdev_put(struct block_device *bdev)
 {
 {
 	bd_release(bdev);
 	bd_release(bdev);
-	return blkdev_put(bdev);
+	return blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 }
 }
 
 
 static int ext4_blkdev_remove(struct ext4_sb_info *sbi)
 static int ext4_blkdev_remove(struct ext4_sb_info *sbi)
@@ -2553,7 +2553,7 @@ static journal_t *ext4_get_dev_journal(struct super_block *sb,
 	if (bd_claim(bdev, sb)) {
 	if (bd_claim(bdev, sb)) {
 		printk(KERN_ERR
 		printk(KERN_ERR
 			"EXT4: failed to claim external journal device.\n");
 			"EXT4: failed to claim external journal device.\n");
-		blkdev_put(bdev);
+		blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 		return NULL;
 		return NULL;
 	}
 	}
 
 

+ 3 - 3
fs/fifo.c

@@ -51,7 +51,7 @@ static int fifo_open(struct inode *inode, struct file *filp)
 	filp->f_mode &= (FMODE_READ | FMODE_WRITE);
 	filp->f_mode &= (FMODE_READ | FMODE_WRITE);
 
 
 	switch (filp->f_mode) {
 	switch (filp->f_mode) {
-	case 1:
+	case FMODE_READ:
 	/*
 	/*
 	 *  O_RDONLY
 	 *  O_RDONLY
 	 *  POSIX.1 says that O_NONBLOCK means return with the FIFO
 	 *  POSIX.1 says that O_NONBLOCK means return with the FIFO
@@ -76,7 +76,7 @@ static int fifo_open(struct inode *inode, struct file *filp)
 		}
 		}
 		break;
 		break;
 	
 	
-	case 2:
+	case FMODE_WRITE:
 	/*
 	/*
 	 *  O_WRONLY
 	 *  O_WRONLY
 	 *  POSIX.1 says that O_NONBLOCK means return -1 with
 	 *  POSIX.1 says that O_NONBLOCK means return -1 with
@@ -98,7 +98,7 @@ static int fifo_open(struct inode *inode, struct file *filp)
 		}
 		}
 		break;
 		break;
 	
 	
-	case 3:
+	case FMODE_READ | FMODE_WRITE:
 	/*
 	/*
 	 *  O_RDWR
 	 *  O_RDWR
 	 *  POSIX.1 leaves this case "undefined" when O_NONBLOCK is set.
 	 *  POSIX.1 leaves this case "undefined" when O_NONBLOCK is set.

+ 2 - 2
fs/file_table.c

@@ -161,7 +161,7 @@ EXPORT_SYMBOL(get_empty_filp);
  * code should be moved into this function.
  * code should be moved into this function.
  */
  */
 struct file *alloc_file(struct vfsmount *mnt, struct dentry *dentry,
 struct file *alloc_file(struct vfsmount *mnt, struct dentry *dentry,
-		mode_t mode, const struct file_operations *fop)
+		fmode_t mode, const struct file_operations *fop)
 {
 {
 	struct file *file;
 	struct file *file;
 	struct path;
 	struct path;
@@ -193,7 +193,7 @@ EXPORT_SYMBOL(alloc_file);
  * of this should be moving to alloc_file().
  * of this should be moving to alloc_file().
  */
  */
 int init_file(struct file *file, struct vfsmount *mnt, struct dentry *dentry,
 int init_file(struct file *file, struct vfsmount *mnt, struct dentry *dentry,
-	   mode_t mode, const struct file_operations *fop)
+	   fmode_t mode, const struct file_operations *fop)
 {
 {
 	int error = 0;
 	int error = 0;
 	file->f_path.dentry = dentry;
 	file->f_path.dentry = dentry;

+ 3 - 2
fs/hostfs/hostfs_kern.c

@@ -20,7 +20,7 @@
 struct hostfs_inode_info {
 struct hostfs_inode_info {
 	char *host_filename;
 	char *host_filename;
 	int fd;
 	int fd;
-	int mode;
+	fmode_t mode;
 	struct inode vfs_inode;
 	struct inode vfs_inode;
 };
 };
 
 
@@ -373,7 +373,8 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir)
 int hostfs_file_open(struct inode *ino, struct file *file)
 int hostfs_file_open(struct inode *ino, struct file *file)
 {
 {
 	char *name;
 	char *name;
-	int mode = 0, r = 0, w = 0, fd;
+	fmode_t mode = 0;
+	int r = 0, w = 0, fd;
 
 
 	mode = file->f_mode & (FMODE_READ | FMODE_WRITE);
 	mode = file->f_mode & (FMODE_READ | FMODE_WRITE);
 	if ((mode & HOSTFS_I(ino)->mode) == mode)
 	if ((mode & HOSTFS_I(ino)->mode) == mode)

+ 2 - 2
fs/jfs/jfs_logmgr.c

@@ -1168,7 +1168,7 @@ journal_found:
 	bd_release(bdev);
 	bd_release(bdev);
 
 
       close:		/* close external log device */
       close:		/* close external log device */
-	blkdev_put(bdev);
+	blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 
 
       free:		/* free log descriptor */
       free:		/* free log descriptor */
 	mutex_unlock(&jfs_log_mutex);
 	mutex_unlock(&jfs_log_mutex);
@@ -1514,7 +1514,7 @@ int lmLogClose(struct super_block *sb)
 	rc = lmLogShutdown(log);
 	rc = lmLogShutdown(log);
 
 
 	bd_release(bdev);
 	bd_release(bdev);
-	blkdev_put(bdev);
+	blkdev_put(bdev, FMODE_READ|FMODE_WRITE);
 
 
 	kfree(log);
 	kfree(log);
 
 

+ 2 - 1
fs/locks.c

@@ -1580,7 +1580,8 @@ asmlinkage long sys_flock(unsigned int fd, unsigned int cmd)
 	cmd &= ~LOCK_NB;
 	cmd &= ~LOCK_NB;
 	unlock = (cmd == LOCK_UN);
 	unlock = (cmd == LOCK_UN);
 
 
-	if (!unlock && !(cmd & LOCK_MAND) && !(filp->f_mode & 3))
+	if (!unlock && !(cmd & LOCK_MAND) &&
+	    !(filp->f_mode & (FMODE_READ|FMODE_WRITE)))
 		goto out_putf;
 		goto out_putf;
 
 
 	error = flock_make_lock(filp, &lock, cmd);
 	error = flock_make_lock(filp, &lock, cmd);

+ 3 - 3
fs/ocfs2/cluster/heartbeat.c

@@ -976,7 +976,7 @@ static void o2hb_region_release(struct config_item *item)
 	}
 	}
 
 
 	if (reg->hr_bdev)
 	if (reg->hr_bdev)
-		blkdev_put(reg->hr_bdev);
+		blkdev_put(reg->hr_bdev, FMODE_READ|FMODE_WRITE);
 
 
 	if (reg->hr_slots)
 	if (reg->hr_slots)
 		kfree(reg->hr_slots);
 		kfree(reg->hr_slots);
@@ -1268,7 +1268,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg,
 		goto out;
 		goto out;
 
 
 	reg->hr_bdev = I_BDEV(filp->f_mapping->host);
 	reg->hr_bdev = I_BDEV(filp->f_mapping->host);
-	ret = blkdev_get(reg->hr_bdev, FMODE_WRITE | FMODE_READ, 0);
+	ret = blkdev_get(reg->hr_bdev, FMODE_WRITE | FMODE_READ);
 	if (ret) {
 	if (ret) {
 		reg->hr_bdev = NULL;
 		reg->hr_bdev = NULL;
 		goto out;
 		goto out;
@@ -1358,7 +1358,7 @@ out:
 		iput(inode);
 		iput(inode);
 	if (ret < 0) {
 	if (ret < 0) {
 		if (reg->hr_bdev) {
 		if (reg->hr_bdev) {
-			blkdev_put(reg->hr_bdev);
+			blkdev_put(reg->hr_bdev, FMODE_READ|FMODE_WRITE);
 			reg->hr_bdev = NULL;
 			reg->hr_bdev = NULL;
 		}
 		}
 	}
 	}

+ 1 - 1
fs/open.c

@@ -798,7 +798,7 @@ static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
 	int error;
 	int error;
 
 
 	f->f_flags = flags;
 	f->f_flags = flags;
-	f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK |
+	f->f_mode = (__force fmode_t)((flags+1) & O_ACCMODE) | FMODE_LSEEK |
 				FMODE_PREAD | FMODE_PWRITE;
 				FMODE_PREAD | FMODE_PWRITE;
 	inode = dentry->d_inode;
 	inode = dentry->d_inode;
 	if (f->f_mode & FMODE_WRITE) {
 	if (f->f_mode & FMODE_WRITE) {

+ 2 - 2
fs/partitions/check.c

@@ -485,10 +485,10 @@ void register_disk(struct gendisk *disk)
 		goto exit;
 		goto exit;
 
 
 	bdev->bd_invalidated = 1;
 	bdev->bd_invalidated = 1;
-	err = blkdev_get(bdev, FMODE_READ, 0);
+	err = blkdev_get(bdev, FMODE_READ);
 	if (err < 0)
 	if (err < 0)
 		goto exit;
 		goto exit;
-	blkdev_put(bdev);
+	blkdev_put(bdev, FMODE_READ);
 
 
 exit:
 exit:
 	/* announce disk after possible partitions are created */
 	/* announce disk after possible partitions are created */

+ 2 - 2
fs/proc/base.c

@@ -1712,9 +1712,9 @@ static struct dentry *proc_fd_instantiate(struct inode *dir,
 	file = fcheck_files(files, fd);
 	file = fcheck_files(files, fd);
 	if (!file)
 	if (!file)
 		goto out_unlock;
 		goto out_unlock;
-	if (file->f_mode & 1)
+	if (file->f_mode & FMODE_READ)
 		inode->i_mode |= S_IRUSR | S_IXUSR;
 		inode->i_mode |= S_IRUSR | S_IXUSR;
-	if (file->f_mode & 2)
+	if (file->f_mode & FMODE_WRITE)
 		inode->i_mode |= S_IWUSR | S_IXUSR;
 		inode->i_mode |= S_IWUSR | S_IXUSR;
 	spin_unlock(&files->file_lock);
 	spin_unlock(&files->file_lock);
 	put_files_struct(files);
 	put_files_struct(files);

+ 7 - 4
fs/reiserfs/journal.c

@@ -2575,7 +2575,7 @@ static int release_journal_dev(struct super_block *super,
 	if (journal->j_dev_bd != NULL) {
 	if (journal->j_dev_bd != NULL) {
 		if (journal->j_dev_bd->bd_dev != super->s_dev)
 		if (journal->j_dev_bd->bd_dev != super->s_dev)
 			bd_release(journal->j_dev_bd);
 			bd_release(journal->j_dev_bd);
-		result = blkdev_put(journal->j_dev_bd);
+		result = blkdev_put(journal->j_dev_bd, journal->j_dev_mode);
 		journal->j_dev_bd = NULL;
 		journal->j_dev_bd = NULL;
 	}
 	}
 
 
@@ -2593,7 +2593,7 @@ static int journal_init_dev(struct super_block *super,
 {
 {
 	int result;
 	int result;
 	dev_t jdev;
 	dev_t jdev;
-	int blkdev_mode = FMODE_READ | FMODE_WRITE;
+	fmode_t blkdev_mode = FMODE_READ | FMODE_WRITE;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 
 
 	result = 0;
 	result = 0;
@@ -2608,6 +2608,7 @@ static int journal_init_dev(struct super_block *super,
 	/* there is no "jdev" option and journal is on separate device */
 	/* there is no "jdev" option and journal is on separate device */
 	if ((!jdev_name || !jdev_name[0])) {
 	if ((!jdev_name || !jdev_name[0])) {
 		journal->j_dev_bd = open_by_devnum(jdev, blkdev_mode);
 		journal->j_dev_bd = open_by_devnum(jdev, blkdev_mode);
+		journal->j_dev_mode = blkdev_mode;
 		if (IS_ERR(journal->j_dev_bd)) {
 		if (IS_ERR(journal->j_dev_bd)) {
 			result = PTR_ERR(journal->j_dev_bd);
 			result = PTR_ERR(journal->j_dev_bd);
 			journal->j_dev_bd = NULL;
 			journal->j_dev_bd = NULL;
@@ -2618,7 +2619,7 @@ static int journal_init_dev(struct super_block *super,
 		} else if (jdev != super->s_dev) {
 		} else if (jdev != super->s_dev) {
 			result = bd_claim(journal->j_dev_bd, journal);
 			result = bd_claim(journal->j_dev_bd, journal);
 			if (result) {
 			if (result) {
-				blkdev_put(journal->j_dev_bd);
+				blkdev_put(journal->j_dev_bd, blkdev_mode);
 				return result;
 				return result;
 			}
 			}
 
 
@@ -2628,7 +2629,9 @@ static int journal_init_dev(struct super_block *super,
 		return 0;
 		return 0;
 	}
 	}
 
 
-	journal->j_dev_bd = open_bdev_excl(jdev_name, 0, journal);
+	journal->j_dev_mode = blkdev_mode;
+	journal->j_dev_bd = open_bdev_exclusive(jdev_name,
+						blkdev_mode, journal);
 	if (IS_ERR(journal->j_dev_bd)) {
 	if (IS_ERR(journal->j_dev_bd)) {
 		result = PTR_ERR(journal->j_dev_bd);
 		result = PTR_ERR(journal->j_dev_bd);
 		journal->j_dev_bd = NULL;
 		journal->j_dev_bd = NULL;

+ 10 - 4
fs/super.c

@@ -755,9 +755,13 @@ int get_sb_bdev(struct file_system_type *fs_type,
 {
 {
 	struct block_device *bdev;
 	struct block_device *bdev;
 	struct super_block *s;
 	struct super_block *s;
+	fmode_t mode = FMODE_READ;
 	int error = 0;
 	int error = 0;
 
 
-	bdev = open_bdev_excl(dev_name, flags, fs_type);
+	if (!(flags & MS_RDONLY))
+		mode |= FMODE_WRITE;
+
+	bdev = open_bdev_exclusive(dev_name, mode, fs_type);
 	if (IS_ERR(bdev))
 	if (IS_ERR(bdev))
 		return PTR_ERR(bdev);
 		return PTR_ERR(bdev);
 
 
@@ -780,11 +784,12 @@ int get_sb_bdev(struct file_system_type *fs_type,
 			goto error_bdev;
 			goto error_bdev;
 		}
 		}
 
 
-		close_bdev_excl(bdev);
+		close_bdev_exclusive(bdev, mode);
 	} else {
 	} else {
 		char b[BDEVNAME_SIZE];
 		char b[BDEVNAME_SIZE];
 
 
 		s->s_flags = flags;
 		s->s_flags = flags;
+		s->s_mode = mode;
 		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
 		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
 		sb_set_blocksize(s, block_size(bdev));
 		sb_set_blocksize(s, block_size(bdev));
 		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
 		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
@@ -802,7 +807,7 @@ int get_sb_bdev(struct file_system_type *fs_type,
 error_s:
 error_s:
 	error = PTR_ERR(s);
 	error = PTR_ERR(s);
 error_bdev:
 error_bdev:
-	close_bdev_excl(bdev);
+	close_bdev_exclusive(bdev, mode);
 error:
 error:
 	return error;
 	return error;
 }
 }
@@ -812,10 +817,11 @@ EXPORT_SYMBOL(get_sb_bdev);
 void kill_block_super(struct super_block *sb)
 void kill_block_super(struct super_block *sb)
 {
 {
 	struct block_device *bdev = sb->s_bdev;
 	struct block_device *bdev = sb->s_bdev;
+	fmode_t mode = sb->s_mode;
 
 
 	generic_shutdown_super(sb);
 	generic_shutdown_super(sb);
 	sync_blockdev(bdev);
 	sync_blockdev(bdev);
-	close_bdev_excl(bdev);
+	close_bdev_exclusive(bdev, mode);
 }
 }
 
 
 EXPORT_SYMBOL(kill_block_super);
 EXPORT_SYMBOL(kill_block_super);

+ 2 - 2
fs/xfs/linux-2.6/xfs_super.c

@@ -589,7 +589,7 @@ xfs_blkdev_get(
 {
 {
 	int			error = 0;
 	int			error = 0;
 
 
-	*bdevp = open_bdev_excl(name, 0, mp);
+	*bdevp = open_bdev_exclusive(name, FMODE_READ|FMODE_WRITE, mp);
 	if (IS_ERR(*bdevp)) {
 	if (IS_ERR(*bdevp)) {
 		error = PTR_ERR(*bdevp);
 		error = PTR_ERR(*bdevp);
 		printk("XFS: Invalid device [%s], error=%d\n", name, error);
 		printk("XFS: Invalid device [%s], error=%d\n", name, error);
@@ -603,7 +603,7 @@ xfs_blkdev_put(
 	struct block_device	*bdev)
 	struct block_device	*bdev)
 {
 {
 	if (bdev)
 	if (bdev)
-		close_bdev_excl(bdev);
+		close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE);
 }
 }
 
 
 /*
 /*

+ 22 - 5
include/linux/blkdev.h

@@ -717,10 +717,10 @@ extern void blk_plug_device(struct request_queue *);
 extern void blk_plug_device_unlocked(struct request_queue *);
 extern void blk_plug_device_unlocked(struct request_queue *);
 extern int blk_remove_plug(struct request_queue *);
 extern int blk_remove_plug(struct request_queue *);
 extern void blk_recount_segments(struct request_queue *, struct bio *);
 extern void blk_recount_segments(struct request_queue *, struct bio *);
-extern int scsi_cmd_ioctl(struct file *, struct request_queue *,
-			  struct gendisk *, unsigned int, void __user *);
-extern int sg_scsi_ioctl(struct file *, struct request_queue *,
-		struct gendisk *, struct scsi_ioctl_command __user *);
+extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t,
+			  unsigned int, void __user *);
+extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t,
+			 struct scsi_ioctl_command __user *);
 
 
 /*
 /*
  * Temporary export, until SCSI gets fixed up.
  * Temporary export, until SCSI gets fixed up.
@@ -910,7 +910,8 @@ static inline int sb_issue_discard(struct super_block *sb,
 * command filter functions
 * command filter functions
 */
 */
 extern int blk_verify_command(struct blk_cmd_filter *filter,
 extern int blk_verify_command(struct blk_cmd_filter *filter,
-			      unsigned char *cmd, int has_write_perm);
+			      unsigned char *cmd, fmode_t has_write_perm);
+extern void blk_unregister_filter(struct gendisk *disk);
 extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter);
 extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter);
 
 
 #define MAX_PHYS_SEGMENTS 128
 #define MAX_PHYS_SEGMENTS 128
@@ -1056,6 +1057,22 @@ static inline int blk_integrity_rq(struct request *rq)
 
 
 #endif /* CONFIG_BLK_DEV_INTEGRITY */
 #endif /* CONFIG_BLK_DEV_INTEGRITY */
 
 
+struct block_device_operations {
+	int (*open) (struct block_device *, fmode_t);
+	int (*release) (struct gendisk *, fmode_t);
+	int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
+	int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
+	int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
+	int (*direct_access) (struct block_device *, sector_t,
+						void **, unsigned long *);
+	int (*media_changed) (struct gendisk *);
+	int (*revalidate_disk) (struct gendisk *);
+	int (*getgeo)(struct block_device *, struct hd_geometry *);
+	struct module *owner;
+};
+
+extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int,
+				 unsigned long);
 #else /* CONFIG_BLOCK */
 #else /* CONFIG_BLOCK */
 /*
 /*
  * stubs for when the block layer is configured out
  * stubs for when the block layer is configured out

+ 5 - 5
include/linux/cdrom.h

@@ -987,11 +987,11 @@ struct cdrom_device_ops {
 };
 };
 
 
 /* the general block_device operations structure: */
 /* the general block_device operations structure: */
-extern int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip,
-			struct file *fp);
-extern int cdrom_release(struct cdrom_device_info *cdi, struct file *fp);
-extern int cdrom_ioctl(struct file *file, struct cdrom_device_info *cdi,
-		struct inode *ip, unsigned int cmd, unsigned long arg);
+extern int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev,
+			fmode_t mode);
+extern void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode);
+extern int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,
+		       fmode_t mode, unsigned int cmd, unsigned long arg);
 extern int cdrom_media_changed(struct cdrom_device_info *);
 extern int cdrom_media_changed(struct cdrom_device_info *);
 
 
 extern int register_cdrom(struct cdrom_device_info *cdi);
 extern int register_cdrom(struct cdrom_device_info *cdi);

+ 5 - 6
include/linux/device-mapper.h

@@ -69,8 +69,7 @@ typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type,
 
 
 typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv);
 typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv);
 
 
-typedef int (*dm_ioctl_fn) (struct dm_target *ti, struct inode *inode,
-			    struct file *filp, unsigned int cmd,
+typedef int (*dm_ioctl_fn) (struct dm_target *ti, unsigned int cmd,
 			    unsigned long arg);
 			    unsigned long arg);
 
 
 typedef int (*dm_merge_fn) (struct dm_target *ti, struct bvec_merge_data *bvm,
 typedef int (*dm_merge_fn) (struct dm_target *ti, struct bvec_merge_data *bvm,
@@ -85,7 +84,7 @@ void dm_set_device_limits(struct dm_target *ti, struct block_device *bdev);
 
 
 struct dm_dev {
 struct dm_dev {
 	struct block_device *bdev;
 	struct block_device *bdev;
-	int mode;
+	fmode_t mode;
 	char name[16];
 	char name[16];
 };
 };
 
 
@@ -95,7 +94,7 @@ struct dm_dev {
  * FIXME: too many arguments.
  * FIXME: too many arguments.
  */
  */
 int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
 int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
-		  sector_t len, int mode, struct dm_dev **result);
+		  sector_t len, fmode_t mode, struct dm_dev **result);
 void dm_put_device(struct dm_target *ti, struct dm_dev *d);
 void dm_put_device(struct dm_target *ti, struct dm_dev *d);
 
 
 /*
 /*
@@ -223,7 +222,7 @@ int dm_set_geometry(struct mapped_device *md, struct hd_geometry *geo);
 /*
 /*
  * First create an empty table.
  * First create an empty table.
  */
  */
-int dm_table_create(struct dm_table **result, int mode,
+int dm_table_create(struct dm_table **result, fmode_t mode,
 		    unsigned num_targets, struct mapped_device *md);
 		    unsigned num_targets, struct mapped_device *md);
 
 
 /*
 /*
@@ -254,7 +253,7 @@ void dm_table_put(struct dm_table *t);
  */
  */
 sector_t dm_table_get_size(struct dm_table *t);
 sector_t dm_table_get_size(struct dm_table *t);
 unsigned int dm_table_get_num_targets(struct dm_table *t);
 unsigned int dm_table_get_num_targets(struct dm_table *t);
-int dm_table_get_mode(struct dm_table *t);
+fmode_t dm_table_get_mode(struct dm_table *t);
 struct mapped_device *dm_table_get_md(struct dm_table *t);
 struct mapped_device *dm_table_get_md(struct dm_table *t);
 
 
 /*
 /*

+ 2 - 2
include/linux/file.h

@@ -19,10 +19,10 @@ struct file_operations;
 struct vfsmount;
 struct vfsmount;
 struct dentry;
 struct dentry;
 extern int init_file(struct file *, struct vfsmount *mnt,
 extern int init_file(struct file *, struct vfsmount *mnt,
-		struct dentry *dentry, mode_t mode,
+		struct dentry *dentry, fmode_t mode,
 		const struct file_operations *fop);
 		const struct file_operations *fop);
 extern struct file *alloc_file(struct vfsmount *, struct dentry *dentry,
 extern struct file *alloc_file(struct vfsmount *, struct dentry *dentry,
-		mode_t mode, const struct file_operations *fop);
+		fmode_t mode, const struct file_operations *fop);
 
 
 static inline void fput_light(struct file *file, int fput_needed)
 static inline void fput_light(struct file *file, int fput_needed)
 {
 {

+ 20 - 29
include/linux/fs.h

@@ -63,18 +63,23 @@ extern int dir_notify_enable;
 #define MAY_ACCESS 16
 #define MAY_ACCESS 16
 #define MAY_OPEN 32
 #define MAY_OPEN 32
 
 
-#define FMODE_READ 1
-#define FMODE_WRITE 2
+#define FMODE_READ ((__force fmode_t)1)
+#define FMODE_WRITE ((__force fmode_t)2)
 
 
 /* Internal kernel extensions */
 /* Internal kernel extensions */
-#define FMODE_LSEEK	4
-#define FMODE_PREAD	8
+#define FMODE_LSEEK	((__force fmode_t)4)
+#define FMODE_PREAD	((__force fmode_t)8)
 #define FMODE_PWRITE	FMODE_PREAD	/* These go hand in hand */
 #define FMODE_PWRITE	FMODE_PREAD	/* These go hand in hand */
 
 
 /* File is being opened for execution. Primary users of this flag are
 /* File is being opened for execution. Primary users of this flag are
    distributed filesystems that can use it to achieve correct ETXTBUSY
    distributed filesystems that can use it to achieve correct ETXTBUSY
    behavior for cross-node execution/opening_for_writing of files */
    behavior for cross-node execution/opening_for_writing of files */
-#define FMODE_EXEC	16
+#define FMODE_EXEC	((__force fmode_t)16)
+
+#define FMODE_NDELAY	((__force fmode_t)32)
+#define FMODE_EXCL	((__force fmode_t)64)
+#define FMODE_WRITE_IOCTL	((__force fmode_t)128)
+#define FMODE_NDELAY_NOW	((__force fmode_t)256)
 
 
 #define RW_MASK		1
 #define RW_MASK		1
 #define RWA_MASK	2
 #define RWA_MASK	2
@@ -825,7 +830,7 @@ struct file {
 	const struct file_operations	*f_op;
 	const struct file_operations	*f_op;
 	atomic_long_t		f_count;
 	atomic_long_t		f_count;
 	unsigned int 		f_flags;
 	unsigned int 		f_flags;
-	mode_t			f_mode;
+	fmode_t			f_mode;
 	loff_t			f_pos;
 	loff_t			f_pos;
 	struct fown_struct	f_owner;
 	struct fown_struct	f_owner;
 	unsigned int		f_uid, f_gid;
 	unsigned int		f_uid, f_gid;
@@ -1152,6 +1157,7 @@ struct super_block {
 	char s_id[32];				/* Informational name */
 	char s_id[32];				/* Informational name */
 
 
 	void 			*s_fs_info;	/* Filesystem private info */
 	void 			*s_fs_info;	/* Filesystem private info */
+	fmode_t			s_mode;
 
 
 	/*
 	/*
 	 * The next field is for VFS *only*. No filesystems have any business
 	 * The next field is for VFS *only*. No filesystems have any business
@@ -1266,20 +1272,7 @@ int generic_osync_inode(struct inode *, struct address_space *, int);
  * to have different dirent layouts depending on the binary type.
  * to have different dirent layouts depending on the binary type.
  */
  */
 typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
 typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
-
-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);
-	long (*unlocked_ioctl) (struct file *, unsigned, unsigned long);
-	long (*compat_ioctl) (struct file *, unsigned, unsigned long);
-	int (*direct_access) (struct block_device *, sector_t,
-						void **, unsigned long *);
-	int (*media_changed) (struct gendisk *);
-	int (*revalidate_disk) (struct gendisk *);
-	int (*getgeo)(struct block_device *, struct hd_geometry *);
-	struct module *owner;
-};
+struct block_device_operations;
 
 
 /* These macros are for out of kernel modules to test that
 /* These macros are for out of kernel modules to test that
  * the kernel supports the unlocked_ioctl and compat_ioctl
  * the kernel supports the unlocked_ioctl and compat_ioctl
@@ -1713,7 +1706,7 @@ extern struct block_device *bdget(dev_t);
 extern void bd_set_size(struct block_device *, loff_t size);
 extern void bd_set_size(struct block_device *, loff_t size);
 extern void bd_forget(struct inode *inode);
 extern void bd_forget(struct inode *inode);
 extern void bdput(struct block_device *);
 extern void bdput(struct block_device *);
-extern struct block_device *open_by_devnum(dev_t, unsigned);
+extern struct block_device *open_by_devnum(dev_t, fmode_t);
 #else
 #else
 static inline void bd_forget(struct inode *inode) {}
 static inline void bd_forget(struct inode *inode) {}
 #endif
 #endif
@@ -1723,13 +1716,10 @@ extern const struct file_operations bad_sock_fops;
 extern const struct file_operations def_fifo_fops;
 extern const struct file_operations def_fifo_fops;
 #ifdef CONFIG_BLOCK
 #ifdef CONFIG_BLOCK
 extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
 extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
-extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long);
-extern int blkdev_driver_ioctl(struct inode *inode, struct file *file,
-			       struct gendisk *disk, unsigned cmd,
-			       unsigned long arg);
+extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long);
 extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long);
 extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long);
-extern int blkdev_get(struct block_device *, mode_t, unsigned);
-extern int blkdev_put(struct block_device *);
+extern int blkdev_get(struct block_device *, fmode_t);
+extern int blkdev_put(struct block_device *, fmode_t);
 extern int bd_claim(struct block_device *, void *);
 extern int bd_claim(struct block_device *, void *);
 extern void bd_release(struct block_device *);
 extern void bd_release(struct block_device *);
 #ifdef CONFIG_SYSFS
 #ifdef CONFIG_SYSFS
@@ -1760,9 +1750,10 @@ extern void chrdev_show(struct seq_file *,off_t);
 extern const char *__bdevname(dev_t, char *buffer);
 extern const char *__bdevname(dev_t, char *buffer);
 extern const char *bdevname(struct block_device *bdev, char *buffer);
 extern const char *bdevname(struct block_device *bdev, char *buffer);
 extern struct block_device *lookup_bdev(const char *);
 extern struct block_device *lookup_bdev(const char *);
-extern struct block_device *open_bdev_excl(const char *, int, void *);
-extern void close_bdev_excl(struct block_device *);
+extern struct block_device *open_bdev_exclusive(const char *, fmode_t, void *);
+extern void close_bdev_exclusive(struct block_device *, fmode_t);
 extern void blkdev_show(struct seq_file *,off_t);
 extern void blkdev_show(struct seq_file *,off_t);
+
 #else
 #else
 #define BLKDEV_MAJOR_HASH_SIZE	0
 #define BLKDEV_MAJOR_HASH_SIZE	0
 #endif
 #endif

+ 1 - 1
include/linux/fsnotify.h

@@ -188,7 +188,7 @@ static inline void fsnotify_close(struct file *file)
 	struct dentry *dentry = file->f_path.dentry;
 	struct dentry *dentry = file->f_path.dentry;
 	struct inode *inode = dentry->d_inode;
 	struct inode *inode = dentry->d_inode;
 	const char *name = dentry->d_name.name;
 	const char *name = dentry->d_name.name;
-	mode_t mode = file->f_mode;
+	fmode_t mode = file->f_mode;
 	u32 mask = (mode & FMODE_WRITE) ? IN_CLOSE_WRITE : IN_CLOSE_NOWRITE;
 	u32 mask = (mode & FMODE_WRITE) ? IN_CLOSE_WRITE : IN_CLOSE_NOWRITE;
 
 
 	if (S_ISDIR(inode->i_mode))
 	if (S_ISDIR(inode->i_mode))

+ 3 - 4
include/linux/ide.h

@@ -474,8 +474,8 @@ struct ide_disk_ops {
 	ide_startstop_t	(*do_request)(struct ide_drive_s *, struct request *,
 	ide_startstop_t	(*do_request)(struct ide_drive_s *, struct request *,
 				      sector_t);
 				      sector_t);
 	int		(*end_request)(struct ide_drive_s *, int, int);
 	int		(*end_request)(struct ide_drive_s *, int, int);
-	int		(*ioctl)(struct ide_drive_s *, struct inode *,
-				 struct file *, unsigned int, unsigned long);
+	int		(*ioctl)(struct ide_drive_s *, struct block_device *,
+				 fmode_t, unsigned int, unsigned long);
 };
 };
 
 
 /* ATAPI device flags */
 /* ATAPI device flags */
@@ -1158,8 +1158,7 @@ struct ide_ioctl_devset {
 int ide_setting_ioctl(ide_drive_t *, struct block_device *, unsigned int,
 int ide_setting_ioctl(ide_drive_t *, struct block_device *, unsigned int,
 		      unsigned long, const struct ide_ioctl_devset *);
 		      unsigned long, const struct ide_ioctl_devset *);
 
 
-int generic_ide_ioctl(ide_drive_t *, struct file *, struct block_device *,
-		      unsigned, unsigned long);
+int generic_ide_ioctl(ide_drive_t *, struct block_device *, unsigned, unsigned long);
 
 
 extern int ide_vlb_clk;
 extern int ide_vlb_clk;
 extern int ide_pci_clk;
 extern int ide_pci_clk;

+ 1 - 0
include/linux/reiserfs_fs_sb.h

@@ -178,6 +178,7 @@ struct reiserfs_journal {
 	struct reiserfs_journal_cnode *j_first;	/*  oldest journal block.  start here for traverse */
 	struct reiserfs_journal_cnode *j_first;	/*  oldest journal block.  start here for traverse */
 
 
 	struct block_device *j_dev_bd;
 	struct block_device *j_dev_bd;
+	fmode_t j_dev_mode;
 	int j_1st_reserved_block;	/* first block on s_dev of reserved area journal */
 	int j_1st_reserved_block;	/* first block on s_dev of reserved area journal */
 
 
 	unsigned long j_state;
 	unsigned long j_state;

+ 1 - 0
include/linux/types.h

@@ -190,6 +190,7 @@ typedef __u32 __bitwise __wsum;
 
 
 #ifdef __KERNEL__
 #ifdef __KERNEL__
 typedef unsigned __bitwise__ gfp_t;
 typedef unsigned __bitwise__ gfp_t;
+typedef unsigned __bitwise__ fmode_t;
 
 
 #ifdef CONFIG_PHYS_ADDR_T_64BIT
 #ifdef CONFIG_PHYS_ADDR_T_64BIT
 typedef u64 phys_addr_t;
 typedef u64 phys_addr_t;

+ 1 - 1
include/scsi/scsi_ioctl.h

@@ -42,7 +42,7 @@ typedef struct scsi_fctargaddress {
 
 
 extern int scsi_ioctl(struct scsi_device *, int, void __user *);
 extern int scsi_ioctl(struct scsi_device *, int, void __user *);
 extern int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd,
 extern int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd,
-				   void __user *arg, struct file *filp);
+				   void __user *arg, int ndelay);
 
 
 #endif /* __KERNEL__ */
 #endif /* __KERNEL__ */
 #endif /* _SCSI_IOCTL_H */
 #endif /* _SCSI_IOCTL_H */

+ 1 - 1
ipc/shm.c

@@ -817,7 +817,7 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr)
 	struct ipc_namespace *ns;
 	struct ipc_namespace *ns;
 	struct shm_file_data *sfd;
 	struct shm_file_data *sfd;
 	struct path path;
 	struct path path;
-	mode_t f_mode;
+	fmode_t f_mode;
 
 
 	err = -EINVAL;
 	err = -EINVAL;
 	if (shmid < 0)
 	if (shmid < 0)

+ 1 - 1
kernel/power/disk.c

@@ -651,7 +651,7 @@ static int software_resume(void)
 	pr_debug("PM: Preparing processes for restore.\n");
 	pr_debug("PM: Preparing processes for restore.\n");
 	error = prepare_processes();
 	error = prepare_processes();
 	if (error) {
 	if (error) {
-		swsusp_close();
+		swsusp_close(FMODE_READ);
 		goto Done;
 		goto Done;
 	}
 	}
 
 

+ 1 - 1
kernel/power/power.h

@@ -153,7 +153,7 @@ extern int swsusp_shrink_memory(void);
 extern void swsusp_free(void);
 extern void swsusp_free(void);
 extern int swsusp_read(unsigned int *flags_p);
 extern int swsusp_read(unsigned int *flags_p);
 extern int swsusp_write(unsigned int flags);
 extern int swsusp_write(unsigned int flags);
-extern void swsusp_close(void);
+extern void swsusp_close(fmode_t);
 
 
 struct timeval;
 struct timeval;
 /* kernel/power/swsusp.c */
 /* kernel/power/swsusp.c */

+ 7 - 7
kernel/power/swap.c

@@ -172,13 +172,13 @@ static int swsusp_swap_check(void) /* This is called before saving image */
 		return res;
 		return res;
 
 
 	root_swap = res;
 	root_swap = res;
-	res = blkdev_get(resume_bdev, FMODE_WRITE, O_RDWR);
+	res = blkdev_get(resume_bdev, FMODE_WRITE);
 	if (res)
 	if (res)
 		return res;
 		return res;
 
 
 	res = set_blocksize(resume_bdev, PAGE_SIZE);
 	res = set_blocksize(resume_bdev, PAGE_SIZE);
 	if (res < 0)
 	if (res < 0)
-		blkdev_put(resume_bdev);
+		blkdev_put(resume_bdev, FMODE_WRITE);
 
 
 	return res;
 	return res;
 }
 }
@@ -426,7 +426,7 @@ int swsusp_write(unsigned int flags)
 
 
 	release_swap_writer(&handle);
 	release_swap_writer(&handle);
  out:
  out:
-	swsusp_close();
+	swsusp_close(FMODE_WRITE);
 	return error;
 	return error;
 }
 }
 
 
@@ -574,7 +574,7 @@ int swsusp_read(unsigned int *flags_p)
 		error = load_image(&handle, &snapshot, header->pages - 1);
 		error = load_image(&handle, &snapshot, header->pages - 1);
 	release_swap_reader(&handle);
 	release_swap_reader(&handle);
 
 
-	blkdev_put(resume_bdev);
+	blkdev_put(resume_bdev, FMODE_READ);
 
 
 	if (!error)
 	if (!error)
 		pr_debug("PM: Image successfully loaded\n");
 		pr_debug("PM: Image successfully loaded\n");
@@ -609,7 +609,7 @@ int swsusp_check(void)
 			return -EINVAL;
 			return -EINVAL;
 		}
 		}
 		if (error)
 		if (error)
-			blkdev_put(resume_bdev);
+			blkdev_put(resume_bdev, FMODE_READ);
 		else
 		else
 			pr_debug("PM: Signature found, resuming\n");
 			pr_debug("PM: Signature found, resuming\n");
 	} else {
 	} else {
@@ -626,14 +626,14 @@ int swsusp_check(void)
  *	swsusp_close - close swap device.
  *	swsusp_close - close swap device.
  */
  */
 
 
-void swsusp_close(void)
+void swsusp_close(fmode_t mode)
 {
 {
 	if (IS_ERR(resume_bdev)) {
 	if (IS_ERR(resume_bdev)) {
 		pr_debug("PM: Image device not initialised\n");
 		pr_debug("PM: Image device not initialised\n");
 		return;
 		return;
 	}
 	}
 
 
-	blkdev_put(resume_bdev);
+	blkdev_put(resume_bdev, mode); /* move up */
 }
 }
 
 
 static int swsusp_header_init(void)
 static int swsusp_header_init(void)

+ 1 - 1
sound/core/oss/pcm_oss.c

@@ -2283,7 +2283,7 @@ static int snd_pcm_oss_open_file(struct file *file,
 	int idx, err;
 	int idx, err;
 	struct snd_pcm_oss_file *pcm_oss_file;
 	struct snd_pcm_oss_file *pcm_oss_file;
 	struct snd_pcm_substream *substream;
 	struct snd_pcm_substream *substream;
-	unsigned int f_mode = file->f_mode;
+	fmode_t f_mode = file->f_mode;
 
 
 	if (rpcm_oss_file)
 	if (rpcm_oss_file)
 		*rpcm_oss_file = NULL;
 		*rpcm_oss_file = NULL;

+ 1 - 1
sound/oss/au1550_ac97.c

@@ -93,7 +93,7 @@ static struct au1550_state {
 	spinlock_t      lock;
 	spinlock_t      lock;
 	struct mutex open_mutex;
 	struct mutex open_mutex;
 	struct mutex sem;
 	struct mutex sem;
-	mode_t          open_mode;
+	fmode_t          open_mode;
 	wait_queue_head_t open_wait;
 	wait_queue_head_t open_wait;
 
 
 	struct dmabuf {
 	struct dmabuf {

Some files were not shown because too many files changed in this diff