diff options
107 files changed, 868 insertions, 1002 deletions
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index b58fb8941d8d..0a868118cf06 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c | |||
| @@ -98,9 +98,9 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data) | |||
| 98 | 98 | ||
| 99 | static DEFINE_MUTEX(ubd_lock); | 99 | static DEFINE_MUTEX(ubd_lock); |
| 100 | 100 | ||
| 101 | static int ubd_open(struct inode * inode, struct file * filp); | 101 | static int ubd_open(struct block_device *bdev, fmode_t mode); |
| 102 | static int ubd_release(struct inode * inode, struct file * file); | 102 | static int ubd_release(struct gendisk *disk, fmode_t mode); |
| 103 | static int ubd_ioctl(struct inode * inode, struct file * file, | 103 | static int ubd_ioctl(struct block_device *bdev, fmode_t mode, |
| 104 | unsigned int cmd, unsigned long arg); | 104 | unsigned int cmd, unsigned long arg); |
| 105 | static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 105 | static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
| 106 | 106 | ||
| @@ -1112,9 +1112,9 @@ static int __init ubd_driver_init(void){ | |||
| 1112 | 1112 | ||
| 1113 | device_initcall(ubd_driver_init); | 1113 | device_initcall(ubd_driver_init); |
| 1114 | 1114 | ||
| 1115 | static int ubd_open(struct inode *inode, struct file *filp) | 1115 | static int ubd_open(struct block_device *bdev, fmode_t mode) |
| 1116 | { | 1116 | { |
| 1117 | struct gendisk *disk = inode->i_bdev->bd_disk; | 1117 | struct gendisk *disk = bdev->bd_disk; |
| 1118 | struct ubd *ubd_dev = disk->private_data; | 1118 | struct ubd *ubd_dev = disk->private_data; |
| 1119 | int err = 0; | 1119 | int err = 0; |
| 1120 | 1120 | ||
| @@ -1131,7 +1131,7 @@ static int ubd_open(struct inode *inode, struct file *filp) | |||
| 1131 | 1131 | ||
| 1132 | /* This should no more be needed. And it didn't work anyway to exclude | 1132 | /* This should no more be needed. And it didn't work anyway to exclude |
| 1133 | * read-write remounting of filesystems.*/ | 1133 | * read-write remounting of filesystems.*/ |
| 1134 | /*if((filp->f_mode & FMODE_WRITE) && !ubd_dev->openflags.w){ | 1134 | /*if((mode & FMODE_WRITE) && !ubd_dev->openflags.w){ |
| 1135 | if(--ubd_dev->count == 0) ubd_close_dev(ubd_dev); | 1135 | if(--ubd_dev->count == 0) ubd_close_dev(ubd_dev); |
| 1136 | err = -EROFS; | 1136 | err = -EROFS; |
| 1137 | }*/ | 1137 | }*/ |
| @@ -1139,9 +1139,8 @@ static int ubd_open(struct inode *inode, struct file *filp) | |||
| 1139 | return err; | 1139 | return err; |
| 1140 | } | 1140 | } |
| 1141 | 1141 | ||
| 1142 | static int ubd_release(struct inode * inode, struct file * file) | 1142 | static int ubd_release(struct gendisk *disk, fmode_t mode) |
| 1143 | { | 1143 | { |
| 1144 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 1145 | struct ubd *ubd_dev = disk->private_data; | 1144 | struct ubd *ubd_dev = disk->private_data; |
| 1146 | 1145 | ||
| 1147 | if(--ubd_dev->count == 0) | 1146 | if(--ubd_dev->count == 0) |
| @@ -1306,10 +1305,10 @@ static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 1306 | return 0; | 1305 | return 0; |
| 1307 | } | 1306 | } |
| 1308 | 1307 | ||
| 1309 | static int ubd_ioctl(struct inode * inode, struct file * file, | 1308 | static int ubd_ioctl(struct block_device *bdev, fmode_t mode, |
| 1310 | unsigned int cmd, unsigned long arg) | 1309 | unsigned int cmd, unsigned long arg) |
| 1311 | { | 1310 | { |
| 1312 | struct ubd *ubd_dev = inode->i_bdev->bd_disk->private_data; | 1311 | struct ubd *ubd_dev = bdev->bd_disk->private_data; |
| 1313 | struct hd_driveid ubd_id = { | 1312 | struct hd_driveid ubd_id = { |
| 1314 | .cyls = 0, | 1313 | .cyls = 0, |
| 1315 | .heads = 128, | 1314 | .heads = 128, |
diff --git a/block/bsg.c b/block/bsg.c index 034112bfe1f3..e8bd2475682a 100644 --- a/block/bsg.c +++ b/block/bsg.c | |||
| @@ -173,7 +173,7 @@ unlock: | |||
| 173 | 173 | ||
| 174 | static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq, | 174 | static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq, |
| 175 | struct sg_io_v4 *hdr, struct bsg_device *bd, | 175 | struct sg_io_v4 *hdr, struct bsg_device *bd, |
| 176 | int has_write_perm) | 176 | fmode_t has_write_perm) |
| 177 | { | 177 | { |
| 178 | if (hdr->request_len > BLK_MAX_CDB) { | 178 | if (hdr->request_len > BLK_MAX_CDB) { |
| 179 | rq->cmd = kzalloc(hdr->request_len, GFP_KERNEL); | 179 | 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) | |||
| 242 | * map sg_io_v4 to a request. | 242 | * map sg_io_v4 to a request. |
| 243 | */ | 243 | */ |
| 244 | static struct request * | 244 | static struct request * |
| 245 | bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, int has_write_perm) | 245 | bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm) |
| 246 | { | 246 | { |
| 247 | struct request_queue *q = bd->queue; | 247 | struct request_queue *q = bd->queue; |
| 248 | struct request *rq, *next_rq = NULL; | 248 | struct request *rq, *next_rq = NULL; |
| @@ -601,7 +601,8 @@ bsg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) | |||
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | static int __bsg_write(struct bsg_device *bd, const char __user *buf, | 603 | static int __bsg_write(struct bsg_device *bd, const char __user *buf, |
| 604 | size_t count, ssize_t *bytes_written, int has_write_perm) | 604 | size_t count, ssize_t *bytes_written, |
| 605 | fmode_t has_write_perm) | ||
| 605 | { | 606 | { |
| 606 | struct bsg_command *bc; | 607 | struct bsg_command *bc; |
| 607 | struct request *rq; | 608 | struct request *rq; |
| @@ -913,7 +914,7 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 913 | case SG_EMULATED_HOST: | 914 | case SG_EMULATED_HOST: |
| 914 | case SCSI_IOCTL_SEND_COMMAND: { | 915 | case SCSI_IOCTL_SEND_COMMAND: { |
| 915 | void __user *uarg = (void __user *) arg; | 916 | void __user *uarg = (void __user *) arg; |
| 916 | return scsi_cmd_ioctl(file, bd->queue, NULL, cmd, uarg); | 917 | return scsi_cmd_ioctl(bd->queue, NULL, file->f_mode, cmd, uarg); |
| 917 | } | 918 | } |
| 918 | case SG_IO: { | 919 | case SG_IO: { |
| 919 | struct request *rq; | 920 | struct request *rq; |
diff --git a/block/cmd-filter.c b/block/cmd-filter.c index e669aed4c6bc..504b275e1b90 100644 --- a/block/cmd-filter.c +++ b/block/cmd-filter.c | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | #include <linux/cdrom.h> | 27 | #include <linux/cdrom.h> |
| 28 | 28 | ||
| 29 | int blk_verify_command(struct blk_cmd_filter *filter, | 29 | int blk_verify_command(struct blk_cmd_filter *filter, |
| 30 | unsigned char *cmd, int has_write_perm) | 30 | unsigned char *cmd, fmode_t has_write_perm) |
| 31 | { | 31 | { |
| 32 | /* root can do any command. */ | 32 | /* root can do any command. */ |
| 33 | if (capable(CAP_SYS_RAWIO)) | 33 | if (capable(CAP_SYS_RAWIO)) |
diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index 1e559fba7bdf..3098c92402fd 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c | |||
| @@ -71,8 +71,8 @@ static int compat_hdio_getgeo(struct gendisk *disk, struct block_device *bdev, | |||
| 71 | return ret; | 71 | return ret; |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | static int compat_hdio_ioctl(struct inode *inode, struct file *file, | 74 | static int compat_hdio_ioctl(struct block_device *bdev, fmode_t mode, |
| 75 | struct gendisk *disk, unsigned int cmd, unsigned long arg) | 75 | unsigned int cmd, unsigned long arg) |
| 76 | { | 76 | { |
| 77 | mm_segment_t old_fs = get_fs(); | 77 | mm_segment_t old_fs = get_fs(); |
| 78 | unsigned long kval; | 78 | unsigned long kval; |
| @@ -80,7 +80,7 @@ static int compat_hdio_ioctl(struct inode *inode, struct file *file, | |||
| 80 | int error; | 80 | int error; |
| 81 | 81 | ||
| 82 | set_fs(KERNEL_DS); | 82 | set_fs(KERNEL_DS); |
| 83 | error = blkdev_driver_ioctl(inode, file, disk, | 83 | error = __blkdev_driver_ioctl(bdev, mode, |
| 84 | cmd, (unsigned long)(&kval)); | 84 | cmd, (unsigned long)(&kval)); |
| 85 | set_fs(old_fs); | 85 | set_fs(old_fs); |
| 86 | 86 | ||
| @@ -111,8 +111,8 @@ struct compat_cdrom_generic_command { | |||
| 111 | compat_caddr_t reserved[1]; | 111 | compat_caddr_t reserved[1]; |
| 112 | }; | 112 | }; |
| 113 | 113 | ||
| 114 | static int compat_cdrom_read_audio(struct inode *inode, struct file *file, | 114 | static int compat_cdrom_read_audio(struct block_device *bdev, fmode_t mode, |
| 115 | struct gendisk *disk, unsigned int cmd, unsigned long arg) | 115 | unsigned int cmd, unsigned long arg) |
| 116 | { | 116 | { |
| 117 | struct cdrom_read_audio __user *cdread_audio; | 117 | struct cdrom_read_audio __user *cdread_audio; |
| 118 | struct compat_cdrom_read_audio __user *cdread_audio32; | 118 | struct compat_cdrom_read_audio __user *cdread_audio32; |
| @@ -134,12 +134,12 @@ static int compat_cdrom_read_audio(struct inode *inode, struct file *file, | |||
| 134 | if (put_user(datap, &cdread_audio->buf)) | 134 | if (put_user(datap, &cdread_audio->buf)) |
| 135 | return -EFAULT; | 135 | return -EFAULT; |
| 136 | 136 | ||
| 137 | return blkdev_driver_ioctl(inode, file, disk, cmd, | 137 | return __blkdev_driver_ioctl(bdev, mode, cmd, |
| 138 | (unsigned long)cdread_audio); | 138 | (unsigned long)cdread_audio); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | static int compat_cdrom_generic_command(struct inode *inode, struct file *file, | 141 | static int compat_cdrom_generic_command(struct block_device *bdev, fmode_t mode, |
| 142 | struct gendisk *disk, unsigned int cmd, unsigned long arg) | 142 | unsigned int cmd, unsigned long arg) |
| 143 | { | 143 | { |
| 144 | struct cdrom_generic_command __user *cgc; | 144 | struct cdrom_generic_command __user *cgc; |
| 145 | struct compat_cdrom_generic_command __user *cgc32; | 145 | struct compat_cdrom_generic_command __user *cgc32; |
| @@ -167,7 +167,7 @@ static int compat_cdrom_generic_command(struct inode *inode, struct file *file, | |||
| 167 | put_user(compat_ptr(data), &cgc->reserved[0])) | 167 | put_user(compat_ptr(data), &cgc->reserved[0])) |
| 168 | return -EFAULT; | 168 | return -EFAULT; |
| 169 | 169 | ||
| 170 | return blkdev_driver_ioctl(inode, file, disk, cmd, (unsigned long)cgc); | 170 | return __blkdev_driver_ioctl(bdev, mode, cmd, (unsigned long)cgc); |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | struct compat_blkpg_ioctl_arg { | 173 | struct compat_blkpg_ioctl_arg { |
| @@ -177,7 +177,7 @@ struct compat_blkpg_ioctl_arg { | |||
| 177 | compat_caddr_t data; | 177 | compat_caddr_t data; |
| 178 | }; | 178 | }; |
| 179 | 179 | ||
| 180 | static int compat_blkpg_ioctl(struct inode *inode, struct file *file, | 180 | static int compat_blkpg_ioctl(struct block_device *bdev, fmode_t mode, |
| 181 | unsigned int cmd, struct compat_blkpg_ioctl_arg __user *ua32) | 181 | unsigned int cmd, struct compat_blkpg_ioctl_arg __user *ua32) |
| 182 | { | 182 | { |
| 183 | struct blkpg_ioctl_arg __user *a = compat_alloc_user_space(sizeof(*a)); | 183 | 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, | |||
| 196 | if (err) | 196 | if (err) |
| 197 | return err; | 197 | return err; |
| 198 | 198 | ||
| 199 | return blkdev_ioctl(inode, file, cmd, (unsigned long)a); | 199 | return blkdev_ioctl(bdev, mode, cmd, (unsigned long)a); |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | #define BLKBSZGET_32 _IOR(0x12, 112, int) | 202 | #define BLKBSZGET_32 _IOR(0x12, 112, int) |
| @@ -308,8 +308,8 @@ static struct { | |||
| 308 | 308 | ||
| 309 | #define NR_FD_IOCTL_TRANS ARRAY_SIZE(fd_ioctl_trans_table) | 309 | #define NR_FD_IOCTL_TRANS ARRAY_SIZE(fd_ioctl_trans_table) |
| 310 | 310 | ||
| 311 | static int compat_fd_ioctl(struct inode *inode, struct file *file, | 311 | static int compat_fd_ioctl(struct block_device *bdev, fmode_t mode, |
| 312 | struct gendisk *disk, unsigned int cmd, unsigned long arg) | 312 | unsigned int cmd, unsigned long arg) |
| 313 | { | 313 | { |
| 314 | mm_segment_t old_fs = get_fs(); | 314 | mm_segment_t old_fs = get_fs(); |
| 315 | void *karg = NULL; | 315 | void *karg = NULL; |
| @@ -413,7 +413,7 @@ static int compat_fd_ioctl(struct inode *inode, struct file *file, | |||
| 413 | return -EINVAL; | 413 | return -EINVAL; |
| 414 | } | 414 | } |
| 415 | set_fs(KERNEL_DS); | 415 | set_fs(KERNEL_DS); |
| 416 | err = blkdev_driver_ioctl(inode, file, disk, kcmd, (unsigned long)karg); | 416 | err = __blkdev_driver_ioctl(bdev, mode, kcmd, (unsigned long)karg); |
| 417 | set_fs(old_fs); | 417 | set_fs(old_fs); |
| 418 | if (err) | 418 | if (err) |
| 419 | goto out; | 419 | goto out; |
| @@ -579,8 +579,8 @@ static int compat_blk_trace_setup(struct block_device *bdev, char __user *arg) | |||
| 579 | return 0; | 579 | return 0; |
| 580 | } | 580 | } |
| 581 | 581 | ||
| 582 | static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file, | 582 | static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, |
| 583 | struct gendisk *disk, unsigned cmd, unsigned long arg) | 583 | unsigned cmd, unsigned long arg) |
| 584 | { | 584 | { |
| 585 | int ret; | 585 | int ret; |
| 586 | 586 | ||
| @@ -596,7 +596,7 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file, | |||
| 596 | case HDIO_GET_ACOUSTIC: | 596 | case HDIO_GET_ACOUSTIC: |
| 597 | case HDIO_GET_ADDRESS: | 597 | case HDIO_GET_ADDRESS: |
| 598 | case HDIO_GET_BUSSTATE: | 598 | case HDIO_GET_BUSSTATE: |
| 599 | return compat_hdio_ioctl(inode, file, disk, cmd, arg); | 599 | return compat_hdio_ioctl(bdev, mode, cmd, arg); |
| 600 | case FDSETPRM32: | 600 | case FDSETPRM32: |
| 601 | case FDDEFPRM32: | 601 | case FDDEFPRM32: |
| 602 | case FDGETPRM32: | 602 | case FDGETPRM32: |
| @@ -606,11 +606,11 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file, | |||
| 606 | case FDPOLLDRVSTAT32: | 606 | case FDPOLLDRVSTAT32: |
| 607 | case FDGETFDCSTAT32: | 607 | case FDGETFDCSTAT32: |
| 608 | case FDWERRORGET32: | 608 | case FDWERRORGET32: |
| 609 | return compat_fd_ioctl(inode, file, disk, cmd, arg); | 609 | return compat_fd_ioctl(bdev, mode, cmd, arg); |
| 610 | case CDROMREADAUDIO: | 610 | case CDROMREADAUDIO: |
| 611 | return compat_cdrom_read_audio(inode, file, disk, cmd, arg); | 611 | return compat_cdrom_read_audio(bdev, mode, cmd, arg); |
| 612 | case CDROM_SEND_PACKET: | 612 | case CDROM_SEND_PACKET: |
| 613 | return compat_cdrom_generic_command(inode, file, disk, cmd, arg); | 613 | return compat_cdrom_generic_command(bdev, mode, cmd, arg); |
| 614 | 614 | ||
| 615 | /* | 615 | /* |
| 616 | * No handler required for the ones below, we just need to | 616 | * 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, | |||
| 679 | case DVD_WRITE_STRUCT: | 679 | case DVD_WRITE_STRUCT: |
| 680 | case DVD_AUTH: | 680 | case DVD_AUTH: |
| 681 | arg = (unsigned long)compat_ptr(arg); | 681 | arg = (unsigned long)compat_ptr(arg); |
| 682 | /* These intepret arg as an unsigned long, not as a pointer, | ||
| 683 | * so we must not do compat_ptr() conversion. */ | ||
| 684 | case HDIO_SET_MULTCOUNT: | ||
| 685 | case HDIO_SET_UNMASKINTR: | ||
| 686 | case HDIO_SET_KEEPSETTINGS: | ||
| 687 | case HDIO_SET_32BIT: | ||
| 688 | case HDIO_SET_NOWERR: | ||
| 689 | case HDIO_SET_DMA: | ||
| 690 | case HDIO_SET_PIO_MODE: | ||
| 691 | case HDIO_SET_NICE: | ||
| 692 | case HDIO_SET_WCACHE: | ||
| 693 | case HDIO_SET_ACOUSTIC: | ||
| 694 | case HDIO_SET_BUSSTATE: | ||
| 695 | case HDIO_SET_ADDRESS: | ||
| 696 | case CDROMEJECT_SW: | ||
| 697 | case CDROM_SET_OPTIONS: | ||
| 698 | case CDROM_CLEAR_OPTIONS: | ||
| 699 | case CDROM_SELECT_SPEED: | ||
| 700 | case CDROM_SELECT_DISC: | ||
| 701 | case CDROM_MEDIA_CHANGED: | ||
| 702 | case CDROM_DRIVE_STATUS: | ||
| 703 | case CDROM_LOCKDOOR: | ||
| 704 | case CDROM_DEBUG: | ||
| 705 | break; | 682 | break; |
| 706 | default: | 683 | default: |
| 707 | /* unknown ioctl number */ | 684 | /* unknown ioctl number */ |
| 708 | return -ENOIOCTLCMD; | 685 | return -ENOIOCTLCMD; |
| 709 | } | 686 | } |
| 710 | 687 | ||
| 711 | if (disk->fops->unlocked_ioctl) | 688 | return __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
| 712 | return disk->fops->unlocked_ioctl(file, cmd, arg); | ||
| 713 | |||
| 714 | if (disk->fops->ioctl) { | ||
| 715 | lock_kernel(); | ||
| 716 | ret = disk->fops->ioctl(inode, file, cmd, arg); | ||
| 717 | unlock_kernel(); | ||
| 718 | return ret; | ||
| 719 | } | ||
| 720 | |||
| 721 | return -ENOTTY; | ||
| 722 | } | 689 | } |
| 723 | 690 | ||
| 724 | static int compat_blkdev_locked_ioctl(struct inode *inode, struct file *file, | 691 | /* Most of the generic ioctls are handled in the normal fallback path. |
| 725 | struct block_device *bdev, | 692 | This assumes the blkdev's low level compat_ioctl always returns |
| 726 | unsigned cmd, unsigned long arg) | 693 | ENOIOCTLCMD for unknown ioctls. */ |
| 694 | long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) | ||
| 727 | { | 695 | { |
| 696 | int ret = -ENOIOCTLCMD; | ||
| 697 | struct inode *inode = file->f_mapping->host; | ||
| 698 | struct block_device *bdev = inode->i_bdev; | ||
| 699 | struct gendisk *disk = bdev->bd_disk; | ||
| 700 | fmode_t mode = file->f_mode; | ||
| 728 | struct backing_dev_info *bdi; | 701 | struct backing_dev_info *bdi; |
| 702 | loff_t size; | ||
| 703 | |||
| 704 | if (file->f_flags & O_NDELAY) | ||
| 705 | mode |= FMODE_NDELAY_NOW; | ||
| 729 | 706 | ||
| 730 | switch (cmd) { | 707 | switch (cmd) { |
| 708 | case HDIO_GETGEO: | ||
| 709 | return compat_hdio_getgeo(disk, bdev, compat_ptr(arg)); | ||
| 710 | case BLKFLSBUF: | ||
| 711 | case BLKROSET: | ||
| 712 | case BLKDISCARD: | ||
| 713 | /* | ||
| 714 | * the ones below are implemented in blkdev_locked_ioctl, | ||
| 715 | * but we call blkdev_ioctl, which gets the lock for us | ||
| 716 | */ | ||
| 717 | case BLKRRPART: | ||
| 718 | return blkdev_ioctl(bdev, mode, cmd, | ||
| 719 | (unsigned long)compat_ptr(arg)); | ||
| 720 | case BLKBSZSET_32: | ||
| 721 | return blkdev_ioctl(bdev, mode, BLKBSZSET, | ||
| 722 | (unsigned long)compat_ptr(arg)); | ||
| 723 | case BLKPG: | ||
| 724 | return compat_blkpg_ioctl(bdev, mode, cmd, compat_ptr(arg)); | ||
| 731 | case BLKRAGET: | 725 | case BLKRAGET: |
| 732 | case BLKFRAGET: | 726 | case BLKFRAGET: |
| 733 | if (!arg) | 727 | if (!arg) |
| @@ -753,65 +747,36 @@ static int compat_blkdev_locked_ioctl(struct inode *inode, struct file *file, | |||
| 753 | bdi = blk_get_backing_dev_info(bdev); | 747 | bdi = blk_get_backing_dev_info(bdev); |
| 754 | if (bdi == NULL) | 748 | if (bdi == NULL) |
| 755 | return -ENOTTY; | 749 | return -ENOTTY; |
| 750 | lock_kernel(); | ||
| 756 | bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE; | 751 | bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE; |
| 752 | unlock_kernel(); | ||
| 757 | return 0; | 753 | return 0; |
| 758 | case BLKGETSIZE: | 754 | case BLKGETSIZE: |
| 759 | if ((bdev->bd_inode->i_size >> 9) > ~0UL) | 755 | size = bdev->bd_inode->i_size; |
| 756 | if ((size >> 9) > ~0UL) | ||
| 760 | return -EFBIG; | 757 | return -EFBIG; |
| 761 | return compat_put_ulong(arg, bdev->bd_inode->i_size >> 9); | 758 | return compat_put_ulong(arg, size >> 9); |
| 762 | 759 | ||
| 763 | case BLKGETSIZE64_32: | 760 | case BLKGETSIZE64_32: |
| 764 | return compat_put_u64(arg, bdev->bd_inode->i_size); | 761 | return compat_put_u64(arg, bdev->bd_inode->i_size); |
| 765 | 762 | ||
| 766 | case BLKTRACESETUP32: | 763 | case BLKTRACESETUP32: |
| 767 | return compat_blk_trace_setup(bdev, compat_ptr(arg)); | 764 | lock_kernel(); |
| 765 | ret = compat_blk_trace_setup(bdev, compat_ptr(arg)); | ||
| 766 | unlock_kernel(); | ||
| 767 | return ret; | ||
| 768 | case BLKTRACESTART: /* compatible */ | 768 | case BLKTRACESTART: /* compatible */ |
| 769 | case BLKTRACESTOP: /* compatible */ | 769 | case BLKTRACESTOP: /* compatible */ |
| 770 | case BLKTRACETEARDOWN: /* compatible */ | 770 | case BLKTRACETEARDOWN: /* compatible */ |
| 771 | return blk_trace_ioctl(bdev, cmd, compat_ptr(arg)); | 771 | lock_kernel(); |
| 772 | } | 772 | ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg)); |
| 773 | return -ENOIOCTLCMD; | 773 | unlock_kernel(); |
| 774 | } | ||
| 775 | |||
| 776 | /* Most of the generic ioctls are handled in the normal fallback path. | ||
| 777 | This assumes the blkdev's low level compat_ioctl always returns | ||
| 778 | ENOIOCTLCMD for unknown ioctls. */ | ||
| 779 | long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) | ||
| 780 | { | ||
| 781 | int ret = -ENOIOCTLCMD; | ||
| 782 | struct inode *inode = file->f_mapping->host; | ||
| 783 | struct block_device *bdev = inode->i_bdev; | ||
| 784 | struct gendisk *disk = bdev->bd_disk; | ||
| 785 | |||
| 786 | switch (cmd) { | ||
| 787 | case HDIO_GETGEO: | ||
| 788 | return compat_hdio_getgeo(disk, bdev, compat_ptr(arg)); | ||
| 789 | case BLKFLSBUF: | ||
| 790 | case BLKROSET: | ||
| 791 | case BLKDISCARD: | ||
| 792 | /* | ||
| 793 | * the ones below are implemented in blkdev_locked_ioctl, | ||
| 794 | * but we call blkdev_ioctl, which gets the lock for us | ||
| 795 | */ | ||
| 796 | case BLKRRPART: | ||
| 797 | return blkdev_ioctl(inode, file, cmd, | ||
| 798 | (unsigned long)compat_ptr(arg)); | ||
| 799 | case BLKBSZSET_32: | ||
| 800 | return blkdev_ioctl(inode, file, BLKBSZSET, | ||
| 801 | (unsigned long)compat_ptr(arg)); | ||
| 802 | case BLKPG: | ||
| 803 | return compat_blkpg_ioctl(inode, file, cmd, compat_ptr(arg)); | ||
| 804 | } | ||
| 805 | |||
| 806 | lock_kernel(); | ||
| 807 | ret = compat_blkdev_locked_ioctl(inode, file, bdev, cmd, arg); | ||
| 808 | /* FIXME: why do we assume -> compat_ioctl needs the BKL? */ | ||
| 809 | if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) | ||
| 810 | ret = disk->fops->compat_ioctl(file, cmd, arg); | ||
| 811 | unlock_kernel(); | ||
| 812 | |||
| 813 | if (ret != -ENOIOCTLCMD) | ||
| 814 | return ret; | 774 | return ret; |
| 815 | 775 | default: | |
| 816 | return compat_blkdev_driver_ioctl(inode, file, disk, cmd, arg); | 776 | if (disk->fops->compat_ioctl) |
| 777 | ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); | ||
| 778 | if (ret == -ENOIOCTLCMD) | ||
| 779 | ret = compat_blkdev_driver_ioctl(bdev, mode, cmd, arg); | ||
| 780 | return ret; | ||
| 781 | } | ||
| 817 | } | 782 | } |
diff --git a/block/ioctl.c b/block/ioctl.c index 38bee321e1fa..c832d639b6e2 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
| @@ -201,97 +201,41 @@ static int put_u64(unsigned long arg, u64 val) | |||
| 201 | return put_user(val, (u64 __user *)arg); | 201 | return put_user(val, (u64 __user *)arg); |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | static int blkdev_locked_ioctl(struct file *file, struct block_device *bdev, | 204 | int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, |
| 205 | unsigned cmd, unsigned long arg) | 205 | unsigned cmd, unsigned long arg) |
| 206 | { | ||
| 207 | struct backing_dev_info *bdi; | ||
| 208 | int ret, n; | ||
| 209 | |||
| 210 | switch (cmd) { | ||
| 211 | case BLKRAGET: | ||
| 212 | case BLKFRAGET: | ||
| 213 | if (!arg) | ||
| 214 | return -EINVAL; | ||
| 215 | bdi = blk_get_backing_dev_info(bdev); | ||
| 216 | if (bdi == NULL) | ||
| 217 | return -ENOTTY; | ||
| 218 | return put_long(arg, (bdi->ra_pages * PAGE_CACHE_SIZE) / 512); | ||
| 219 | case BLKROGET: | ||
| 220 | return put_int(arg, bdev_read_only(bdev) != 0); | ||
| 221 | case BLKBSZGET: /* get the logical block size (cf. BLKSSZGET) */ | ||
| 222 | return put_int(arg, block_size(bdev)); | ||
| 223 | case BLKSSZGET: /* get block device hardware sector size */ | ||
| 224 | return put_int(arg, bdev_hardsect_size(bdev)); | ||
| 225 | case BLKSECTGET: | ||
| 226 | return put_ushort(arg, bdev_get_queue(bdev)->max_sectors); | ||
| 227 | case BLKRASET: | ||
| 228 | case BLKFRASET: | ||
| 229 | if(!capable(CAP_SYS_ADMIN)) | ||
| 230 | return -EACCES; | ||
| 231 | bdi = blk_get_backing_dev_info(bdev); | ||
| 232 | if (bdi == NULL) | ||
| 233 | return -ENOTTY; | ||
| 234 | bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE; | ||
| 235 | return 0; | ||
| 236 | case BLKBSZSET: | ||
| 237 | /* set the logical block size */ | ||
| 238 | if (!capable(CAP_SYS_ADMIN)) | ||
| 239 | return -EACCES; | ||
| 240 | if (!arg) | ||
| 241 | return -EINVAL; | ||
| 242 | if (get_user(n, (int __user *) arg)) | ||
| 243 | return -EFAULT; | ||
| 244 | if (bd_claim(bdev, file) < 0) | ||
| 245 | return -EBUSY; | ||
| 246 | ret = set_blocksize(bdev, n); | ||
| 247 | bd_release(bdev); | ||
| 248 | return ret; | ||
| 249 | case BLKPG: | ||
| 250 | return blkpg_ioctl(bdev, (struct blkpg_ioctl_arg __user *) arg); | ||
| 251 | case BLKRRPART: | ||
| 252 | return blkdev_reread_part(bdev); | ||
| 253 | case BLKGETSIZE: | ||
| 254 | if ((bdev->bd_inode->i_size >> 9) > ~0UL) | ||
| 255 | return -EFBIG; | ||
| 256 | return put_ulong(arg, bdev->bd_inode->i_size >> 9); | ||
| 257 | case BLKGETSIZE64: | ||
| 258 | return put_u64(arg, bdev->bd_inode->i_size); | ||
| 259 | case BLKTRACESTART: | ||
| 260 | case BLKTRACESTOP: | ||
| 261 | case BLKTRACESETUP: | ||
| 262 | case BLKTRACETEARDOWN: | ||
| 263 | return blk_trace_ioctl(bdev, cmd, (char __user *) arg); | ||
| 264 | } | ||
| 265 | return -ENOIOCTLCMD; | ||
| 266 | } | ||
| 267 | |||
| 268 | int blkdev_driver_ioctl(struct inode *inode, struct file *file, | ||
| 269 | struct gendisk *disk, unsigned cmd, unsigned long arg) | ||
| 270 | { | 206 | { |
| 207 | struct gendisk *disk = bdev->bd_disk; | ||
| 271 | int ret; | 208 | int ret; |
| 272 | if (disk->fops->unlocked_ioctl) | ||
| 273 | return disk->fops->unlocked_ioctl(file, cmd, arg); | ||
| 274 | 209 | ||
| 275 | if (disk->fops->ioctl) { | 210 | if (disk->fops->ioctl) |
| 211 | return disk->fops->ioctl(bdev, mode, cmd, arg); | ||
| 212 | |||
| 213 | if (disk->fops->locked_ioctl) { | ||
| 276 | lock_kernel(); | 214 | lock_kernel(); |
| 277 | ret = disk->fops->ioctl(inode, file, cmd, arg); | 215 | ret = disk->fops->locked_ioctl(bdev, mode, cmd, arg); |
| 278 | unlock_kernel(); | 216 | unlock_kernel(); |
| 279 | return ret; | 217 | return ret; |
| 280 | } | 218 | } |
| 281 | 219 | ||
| 282 | return -ENOTTY; | 220 | return -ENOTTY; |
| 283 | } | 221 | } |
| 284 | EXPORT_SYMBOL_GPL(blkdev_driver_ioctl); | 222 | /* |
| 223 | * For the record: _GPL here is only because somebody decided to slap it | ||
| 224 | * on the previous export. Sheer idiocy, since it wasn't copyrightable | ||
| 225 | * at all and could be open-coded without any exports by anybody who cares. | ||
| 226 | */ | ||
| 227 | EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl); | ||
| 285 | 228 | ||
| 286 | /* | 229 | /* |
| 287 | * always keep this in sync with compat_blkdev_ioctl() and | 230 | * always keep this in sync with compat_blkdev_ioctl() and |
| 288 | * compat_blkdev_locked_ioctl() | 231 | * compat_blkdev_locked_ioctl() |
| 289 | */ | 232 | */ |
| 290 | int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | 233 | int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, |
| 291 | unsigned long arg) | 234 | unsigned long arg) |
| 292 | { | 235 | { |
| 293 | struct block_device *bdev = inode->i_bdev; | ||
| 294 | struct gendisk *disk = bdev->bd_disk; | 236 | struct gendisk *disk = bdev->bd_disk; |
| 237 | struct backing_dev_info *bdi; | ||
| 238 | loff_t size; | ||
| 295 | int ret, n; | 239 | int ret, n; |
| 296 | 240 | ||
| 297 | switch(cmd) { | 241 | switch(cmd) { |
| @@ -299,7 +243,7 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 299 | if (!capable(CAP_SYS_ADMIN)) | 243 | if (!capable(CAP_SYS_ADMIN)) |
| 300 | return -EACCES; | 244 | return -EACCES; |
| 301 | 245 | ||
| 302 | ret = blkdev_driver_ioctl(inode, file, disk, cmd, arg); | 246 | ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
| 303 | /* -EINVAL to handle old uncorrected drivers */ | 247 | /* -EINVAL to handle old uncorrected drivers */ |
| 304 | if (ret != -EINVAL && ret != -ENOTTY) | 248 | if (ret != -EINVAL && ret != -ENOTTY) |
| 305 | return ret; | 249 | return ret; |
| @@ -311,7 +255,7 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 311 | return 0; | 255 | return 0; |
| 312 | 256 | ||
| 313 | case BLKROSET: | 257 | case BLKROSET: |
| 314 | ret = blkdev_driver_ioctl(inode, file, disk, cmd, arg); | 258 | ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
| 315 | /* -EINVAL to handle old uncorrected drivers */ | 259 | /* -EINVAL to handle old uncorrected drivers */ |
| 316 | if (ret != -EINVAL && ret != -ENOTTY) | 260 | if (ret != -EINVAL && ret != -ENOTTY) |
| 317 | return ret; | 261 | return ret; |
| @@ -327,7 +271,7 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 327 | case BLKDISCARD: { | 271 | case BLKDISCARD: { |
| 328 | uint64_t range[2]; | 272 | uint64_t range[2]; |
| 329 | 273 | ||
| 330 | if (!(file->f_mode & FMODE_WRITE)) | 274 | if (!(mode & FMODE_WRITE)) |
| 331 | return -EBADF; | 275 | return -EBADF; |
| 332 | 276 | ||
| 333 | if (copy_from_user(range, (void __user *)arg, sizeof(range))) | 277 | 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, | |||
| 357 | return -EFAULT; | 301 | return -EFAULT; |
| 358 | return 0; | 302 | return 0; |
| 359 | } | 303 | } |
| 360 | } | 304 | case BLKRAGET: |
| 361 | 305 | case BLKFRAGET: | |
| 362 | lock_kernel(); | 306 | if (!arg) |
| 363 | ret = blkdev_locked_ioctl(file, bdev, cmd, arg); | 307 | return -EINVAL; |
| 364 | unlock_kernel(); | 308 | bdi = blk_get_backing_dev_info(bdev); |
| 365 | if (ret != -ENOIOCTLCMD) | 309 | if (bdi == NULL) |
| 310 | return -ENOTTY; | ||
| 311 | return put_long(arg, (bdi->ra_pages * PAGE_CACHE_SIZE) / 512); | ||
| 312 | case BLKROGET: | ||
| 313 | return put_int(arg, bdev_read_only(bdev) != 0); | ||
| 314 | case BLKBSZGET: /* get the logical block size (cf. BLKSSZGET) */ | ||
| 315 | return put_int(arg, block_size(bdev)); | ||
| 316 | case BLKSSZGET: /* get block device hardware sector size */ | ||
| 317 | return put_int(arg, bdev_hardsect_size(bdev)); | ||
| 318 | case BLKSECTGET: | ||
| 319 | return put_ushort(arg, bdev_get_queue(bdev)->max_sectors); | ||
| 320 | case BLKRASET: | ||
| 321 | case BLKFRASET: | ||
| 322 | if(!capable(CAP_SYS_ADMIN)) | ||
| 323 | return -EACCES; | ||
| 324 | bdi = blk_get_backing_dev_info(bdev); | ||
| 325 | if (bdi == NULL) | ||
| 326 | return -ENOTTY; | ||
| 327 | lock_kernel(); | ||
| 328 | bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE; | ||
| 329 | unlock_kernel(); | ||
| 330 | return 0; | ||
| 331 | case BLKBSZSET: | ||
| 332 | /* set the logical block size */ | ||
| 333 | if (!capable(CAP_SYS_ADMIN)) | ||
| 334 | return -EACCES; | ||
| 335 | if (!arg) | ||
| 336 | return -EINVAL; | ||
| 337 | if (get_user(n, (int __user *) arg)) | ||
| 338 | return -EFAULT; | ||
| 339 | if (!(mode & FMODE_EXCL) && bd_claim(bdev, &bdev) < 0) | ||
| 340 | return -EBUSY; | ||
| 341 | ret = set_blocksize(bdev, n); | ||
| 342 | if (!(mode & FMODE_EXCL)) | ||
| 343 | bd_release(bdev); | ||
| 366 | return ret; | 344 | return ret; |
| 367 | 345 | case BLKPG: | |
| 368 | return blkdev_driver_ioctl(inode, file, disk, cmd, arg); | 346 | lock_kernel(); |
| 347 | ret = blkpg_ioctl(bdev, (struct blkpg_ioctl_arg __user *) arg); | ||
| 348 | unlock_kernel(); | ||
| 349 | break; | ||
| 350 | case BLKRRPART: | ||
| 351 | lock_kernel(); | ||
| 352 | ret = blkdev_reread_part(bdev); | ||
| 353 | unlock_kernel(); | ||
| 354 | break; | ||
| 355 | case BLKGETSIZE: | ||
| 356 | size = bdev->bd_inode->i_size; | ||
| 357 | if ((size >> 9) > ~0UL) | ||
| 358 | return -EFBIG; | ||
| 359 | return put_ulong(arg, size >> 9); | ||
| 360 | case BLKGETSIZE64: | ||
| 361 | return put_u64(arg, bdev->bd_inode->i_size); | ||
| 362 | case BLKTRACESTART: | ||
| 363 | case BLKTRACESTOP: | ||
| 364 | case BLKTRACESETUP: | ||
| 365 | case BLKTRACETEARDOWN: | ||
| 366 | lock_kernel(); | ||
| 367 | ret = blk_trace_ioctl(bdev, cmd, (char __user *) arg); | ||
| 368 | unlock_kernel(); | ||
| 369 | break; | ||
| 370 | default: | ||
| 371 | ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); | ||
| 372 | } | ||
| 373 | return ret; | ||
| 369 | } | 374 | } |
| 370 | EXPORT_SYMBOL_GPL(blkdev_ioctl); | 375 | EXPORT_SYMBOL_GPL(blkdev_ioctl); |
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index c34272a348fe..5963cf91a3a0 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c | |||
| @@ -190,12 +190,11 @@ void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter) | |||
| 190 | EXPORT_SYMBOL_GPL(blk_set_cmd_filter_defaults); | 190 | EXPORT_SYMBOL_GPL(blk_set_cmd_filter_defaults); |
| 191 | 191 | ||
| 192 | static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, | 192 | static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, |
| 193 | struct sg_io_hdr *hdr, struct file *file) | 193 | struct sg_io_hdr *hdr, fmode_t mode) |
| 194 | { | 194 | { |
| 195 | if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len)) | 195 | if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len)) |
| 196 | return -EFAULT; | 196 | return -EFAULT; |
| 197 | if (blk_verify_command(&q->cmd_filter, rq->cmd, | 197 | if (blk_verify_command(&q->cmd_filter, rq->cmd, mode & FMODE_WRITE)) |
| 198 | file->f_mode & FMODE_WRITE)) | ||
| 199 | return -EPERM; | 198 | return -EPERM; |
| 200 | 199 | ||
| 201 | /* | 200 | /* |
| @@ -260,8 +259,8 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, | |||
| 260 | return r; | 259 | return r; |
| 261 | } | 260 | } |
| 262 | 261 | ||
| 263 | static int sg_io(struct file *file, struct request_queue *q, | 262 | static int sg_io(struct request_queue *q, struct gendisk *bd_disk, |
| 264 | struct gendisk *bd_disk, struct sg_io_hdr *hdr) | 263 | struct sg_io_hdr *hdr, fmode_t mode) |
| 265 | { | 264 | { |
| 266 | unsigned long start_time; | 265 | unsigned long start_time; |
| 267 | int writing = 0, ret = 0; | 266 | int writing = 0, ret = 0; |
| @@ -293,7 +292,7 @@ static int sg_io(struct file *file, struct request_queue *q, | |||
| 293 | if (!rq) | 292 | if (!rq) |
| 294 | return -ENOMEM; | 293 | return -ENOMEM; |
| 295 | 294 | ||
| 296 | if (blk_fill_sghdr_rq(q, rq, hdr, file)) { | 295 | if (blk_fill_sghdr_rq(q, rq, hdr, mode)) { |
| 297 | blk_put_request(rq); | 296 | blk_put_request(rq); |
| 298 | return -EFAULT; | 297 | return -EFAULT; |
| 299 | } | 298 | } |
| @@ -380,11 +379,11 @@ out: | |||
| 380 | * bytes in one int) where the lowest byte is the SCSI status. | 379 | * bytes in one int) where the lowest byte is the SCSI status. |
| 381 | */ | 380 | */ |
| 382 | #define OMAX_SB_LEN 16 /* For backward compatibility */ | 381 | #define OMAX_SB_LEN 16 /* For backward compatibility */ |
| 383 | int sg_scsi_ioctl(struct file *file, struct request_queue *q, | 382 | int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, |
| 384 | struct gendisk *disk, struct scsi_ioctl_command __user *sic) | 383 | struct scsi_ioctl_command __user *sic) |
| 385 | { | 384 | { |
| 386 | struct request *rq; | 385 | struct request *rq; |
| 387 | int err, write_perm = 0; | 386 | int err; |
| 388 | unsigned int in_len, out_len, bytes, opcode, cmdlen; | 387 | unsigned int in_len, out_len, bytes, opcode, cmdlen; |
| 389 | char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE]; | 388 | char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE]; |
| 390 | 389 | ||
| @@ -426,11 +425,7 @@ int sg_scsi_ioctl(struct file *file, struct request_queue *q, | |||
| 426 | if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) | 425 | if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) |
| 427 | goto error; | 426 | goto error; |
| 428 | 427 | ||
| 429 | /* scsi_ioctl passes NULL */ | 428 | err = blk_verify_command(&q->cmd_filter, rq->cmd, mode & FMODE_WRITE); |
| 430 | if (file && (file->f_mode & FMODE_WRITE)) | ||
| 431 | write_perm = 1; | ||
| 432 | |||
| 433 | err = blk_verify_command(&q->cmd_filter, rq->cmd, write_perm); | ||
| 434 | if (err) | 429 | if (err) |
| 435 | goto error; | 430 | goto error; |
| 436 | 431 | ||
| @@ -522,8 +517,8 @@ static inline int blk_send_start_stop(struct request_queue *q, | |||
| 522 | return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data); | 517 | return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data); |
| 523 | } | 518 | } |
| 524 | 519 | ||
| 525 | int scsi_cmd_ioctl(struct file *file, struct request_queue *q, | 520 | int scsi_cmd_ioctl(struct request_queue *q, struct gendisk *bd_disk, fmode_t mode, |
| 526 | struct gendisk *bd_disk, unsigned int cmd, void __user *arg) | 521 | unsigned int cmd, void __user *arg) |
| 527 | { | 522 | { |
| 528 | int err; | 523 | int err; |
| 529 | 524 | ||
| @@ -564,7 +559,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q, | |||
| 564 | err = -EFAULT; | 559 | err = -EFAULT; |
| 565 | if (copy_from_user(&hdr, arg, sizeof(hdr))) | 560 | if (copy_from_user(&hdr, arg, sizeof(hdr))) |
| 566 | break; | 561 | break; |
| 567 | err = sg_io(file, q, bd_disk, &hdr); | 562 | err = sg_io(q, bd_disk, &hdr, mode); |
| 568 | if (err == -EFAULT) | 563 | if (err == -EFAULT) |
| 569 | break; | 564 | break; |
| 570 | 565 | ||
| @@ -612,7 +607,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q, | |||
| 612 | hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd; | 607 | hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd; |
| 613 | hdr.cmd_len = sizeof(cgc.cmd); | 608 | hdr.cmd_len = sizeof(cgc.cmd); |
| 614 | 609 | ||
| 615 | err = sg_io(file, q, bd_disk, &hdr); | 610 | err = sg_io(q, bd_disk, &hdr, mode); |
| 616 | if (err == -EFAULT) | 611 | if (err == -EFAULT) |
| 617 | break; | 612 | break; |
| 618 | 613 | ||
| @@ -636,7 +631,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q, | |||
| 636 | if (!arg) | 631 | if (!arg) |
| 637 | break; | 632 | break; |
| 638 | 633 | ||
| 639 | err = sg_scsi_ioctl(file, q, bd_disk, arg); | 634 | err = sg_scsi_ioctl(q, bd_disk, mode, arg); |
| 640 | break; | 635 | break; |
| 641 | case CDROMCLOSETRAY: | 636 | case CDROMCLOSETRAY: |
| 642 | err = blk_send_start_stop(q, bd_disk, 0x03); | 637 | err = blk_send_start_stop(q, bd_disk, 0x03); |
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index a002a381df92..f6a337c34ac4 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c | |||
| @@ -72,9 +72,9 @@ static long disk_size(DAC960_Controller_T *p, int drive_nr) | |||
| 72 | } | 72 | } |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | static int DAC960_open(struct inode *inode, struct file *file) | 75 | static int DAC960_open(struct block_device *bdev, fmode_t mode) |
| 76 | { | 76 | { |
| 77 | struct gendisk *disk = inode->i_bdev->bd_disk; | 77 | struct gendisk *disk = bdev->bd_disk; |
| 78 | DAC960_Controller_T *p = disk->queue->queuedata; | 78 | DAC960_Controller_T *p = disk->queue->queuedata; |
| 79 | int drive_nr = (long)disk->private_data; | 79 | int drive_nr = (long)disk->private_data; |
| 80 | 80 | ||
| @@ -89,7 +89,7 @@ static int DAC960_open(struct inode *inode, struct file *file) | |||
| 89 | return -ENXIO; | 89 | return -ENXIO; |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | check_disk_change(inode->i_bdev); | 92 | check_disk_change(bdev); |
| 93 | 93 | ||
| 94 | if (!get_capacity(p->disks[drive_nr])) | 94 | if (!get_capacity(p->disks[drive_nr])) |
| 95 | return -ENXIO; | 95 | return -ENXIO; |
diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c index 7516baff3bb9..4b1d4ac960f1 100644 --- a/drivers/block/amiflop.c +++ b/drivers/block/amiflop.c | |||
| @@ -1437,10 +1437,11 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 1437 | return 0; | 1437 | return 0; |
| 1438 | } | 1438 | } |
| 1439 | 1439 | ||
| 1440 | static int fd_ioctl(struct inode *inode, struct file *filp, | 1440 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, |
| 1441 | unsigned int cmd, unsigned long param) | 1441 | unsigned int cmd, unsigned long param) |
| 1442 | { | 1442 | { |
| 1443 | int drive = iminor(inode) & 3; | 1443 | struct amiga_floppy_struct *p = bdev->bd_disk->private_data; |
| 1444 | int drive = p - unit; | ||
| 1444 | static struct floppy_struct getprm; | 1445 | static struct floppy_struct getprm; |
| 1445 | void __user *argp = (void __user *)param; | 1446 | void __user *argp = (void __user *)param; |
| 1446 | 1447 | ||
| @@ -1451,7 +1452,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp, | |||
| 1451 | rel_fdc(); | 1452 | rel_fdc(); |
| 1452 | return -EBUSY; | 1453 | return -EBUSY; |
| 1453 | } | 1454 | } |
| 1454 | fsync_bdev(inode->i_bdev); | 1455 | fsync_bdev(bdev); |
| 1455 | if (fd_motor_on(drive) == 0) { | 1456 | if (fd_motor_on(drive) == 0) { |
| 1456 | rel_fdc(); | 1457 | rel_fdc(); |
| 1457 | return -ENODEV; | 1458 | return -ENODEV; |
| @@ -1464,12 +1465,12 @@ static int fd_ioctl(struct inode *inode, struct file *filp, | |||
| 1464 | rel_fdc(); | 1465 | rel_fdc(); |
| 1465 | break; | 1466 | break; |
| 1466 | case FDFMTTRK: | 1467 | case FDFMTTRK: |
| 1467 | if (param < unit[drive].type->tracks * unit[drive].type->heads) | 1468 | if (param < p->type->tracks * p->type->heads) |
| 1468 | { | 1469 | { |
| 1469 | get_fdc(drive); | 1470 | get_fdc(drive); |
| 1470 | if (fd_seek(drive,param) != 0){ | 1471 | if (fd_seek(drive,param) != 0){ |
| 1471 | memset(unit[drive].trackbuf, FD_FILL_BYTE, | 1472 | memset(p->trackbuf, FD_FILL_BYTE, |
| 1472 | unit[drive].dtype->sects * unit[drive].type->sect_mult * 512); | 1473 | p->dtype->sects * p->type->sect_mult * 512); |
| 1473 | non_int_flush_track(drive); | 1474 | non_int_flush_track(drive); |
| 1474 | } | 1475 | } |
| 1475 | floppy_off(drive); | 1476 | floppy_off(drive); |
| @@ -1480,14 +1481,14 @@ static int fd_ioctl(struct inode *inode, struct file *filp, | |||
| 1480 | break; | 1481 | break; |
| 1481 | case FDFMTEND: | 1482 | case FDFMTEND: |
| 1482 | floppy_off(drive); | 1483 | floppy_off(drive); |
| 1483 | invalidate_bdev(inode->i_bdev); | 1484 | invalidate_bdev(bdev); |
| 1484 | break; | 1485 | break; |
| 1485 | case FDGETPRM: | 1486 | case FDGETPRM: |
| 1486 | memset((void *)&getprm, 0, sizeof (getprm)); | 1487 | memset((void *)&getprm, 0, sizeof (getprm)); |
| 1487 | getprm.track=unit[drive].type->tracks; | 1488 | getprm.track=p->type->tracks; |
| 1488 | getprm.head=unit[drive].type->heads; | 1489 | getprm.head=p->type->heads; |
| 1489 | getprm.sect=unit[drive].dtype->sects * unit[drive].type->sect_mult; | 1490 | getprm.sect=p->dtype->sects * p->type->sect_mult; |
| 1490 | getprm.size=unit[drive].blocks; | 1491 | getprm.size=p->blocks; |
| 1491 | if (copy_to_user(argp, &getprm, sizeof(struct floppy_struct))) | 1492 | if (copy_to_user(argp, &getprm, sizeof(struct floppy_struct))) |
| 1492 | return -EFAULT; | 1493 | return -EFAULT; |
| 1493 | break; | 1494 | break; |
| @@ -1500,10 +1501,10 @@ static int fd_ioctl(struct inode *inode, struct file *filp, | |||
| 1500 | break; | 1501 | break; |
| 1501 | #ifdef RAW_IOCTL | 1502 | #ifdef RAW_IOCTL |
| 1502 | case IOCTL_RAW_TRACK: | 1503 | case IOCTL_RAW_TRACK: |
| 1503 | if (copy_to_user(argp, raw_buf, unit[drive].type->read_size)) | 1504 | if (copy_to_user(argp, raw_buf, p->type->read_size)) |
| 1504 | return -EFAULT; | 1505 | return -EFAULT; |
| 1505 | else | 1506 | else |
| 1506 | return unit[drive].type->read_size; | 1507 | return p->type->read_size; |
| 1507 | #endif | 1508 | #endif |
| 1508 | default: | 1509 | default: |
| 1509 | printk(KERN_DEBUG "fd_ioctl: unknown cmd %d for drive %d.", | 1510 | printk(KERN_DEBUG "fd_ioctl: unknown cmd %d for drive %d.", |
| @@ -1548,10 +1549,10 @@ static void fd_probe(int dev) | |||
| 1548 | * /dev/PS0 etc), and disallows simultaneous access to the same | 1549 | * /dev/PS0 etc), and disallows simultaneous access to the same |
| 1549 | * drive with different device numbers. | 1550 | * drive with different device numbers. |
| 1550 | */ | 1551 | */ |
| 1551 | static int floppy_open(struct inode *inode, struct file *filp) | 1552 | static int floppy_open(struct block_device *bdev, fmode_t mode) |
| 1552 | { | 1553 | { |
| 1553 | int drive = iminor(inode) & 3; | 1554 | int drive = MINOR(bdev->bd_dev) & 3; |
| 1554 | int system = (iminor(inode) & 4) >> 2; | 1555 | int system = (MINOR(bdev->bd_dev) & 4) >> 2; |
| 1555 | int old_dev; | 1556 | int old_dev; |
| 1556 | unsigned long flags; | 1557 | unsigned long flags; |
| 1557 | 1558 | ||
| @@ -1560,9 +1561,9 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
| 1560 | if (fd_ref[drive] && old_dev != system) | 1561 | if (fd_ref[drive] && old_dev != system) |
| 1561 | return -EBUSY; | 1562 | return -EBUSY; |
| 1562 | 1563 | ||
| 1563 | if (filp && filp->f_mode & 3) { | 1564 | if (mode & (FMODE_READ|FMODE_WRITE)) { |
| 1564 | check_disk_change(inode->i_bdev); | 1565 | check_disk_change(bdev); |
| 1565 | if (filp->f_mode & 2 ) { | 1566 | if (mode & FMODE_WRITE) { |
| 1566 | int wrprot; | 1567 | int wrprot; |
| 1567 | 1568 | ||
| 1568 | get_fdc(drive); | 1569 | get_fdc(drive); |
| @@ -1592,9 +1593,10 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
| 1592 | return 0; | 1593 | return 0; |
| 1593 | } | 1594 | } |
| 1594 | 1595 | ||
| 1595 | static int floppy_release(struct inode * inode, struct file * filp) | 1596 | static int floppy_release(struct gendisk *disk, fmode_t mode) |
| 1596 | { | 1597 | { |
| 1597 | int drive = iminor(inode) & 3; | 1598 | struct amiga_floppy_struct *p = disk->private_data; |
| 1599 | int drive = p - unit; | ||
| 1598 | 1600 | ||
| 1599 | if (unit[drive].dirty == 1) { | 1601 | if (unit[drive].dirty == 1) { |
| 1600 | del_timer (flush_track_timer + drive); | 1602 | del_timer (flush_track_timer + drive); |
| @@ -1650,7 +1652,7 @@ static struct block_device_operations floppy_fops = { | |||
| 1650 | .owner = THIS_MODULE, | 1652 | .owner = THIS_MODULE, |
| 1651 | .open = floppy_open, | 1653 | .open = floppy_open, |
| 1652 | .release = floppy_release, | 1654 | .release = floppy_release, |
| 1653 | .ioctl = fd_ioctl, | 1655 | .locked_ioctl = fd_ioctl, |
| 1654 | .getgeo = fd_getgeo, | 1656 | .getgeo = fd_getgeo, |
| 1655 | .media_changed = amiga_floppy_change, | 1657 | .media_changed = amiga_floppy_change, |
| 1656 | }; | 1658 | }; |
diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c index d876ad861237..1747dd272cd4 100644 --- a/drivers/block/aoe/aoeblk.c +++ b/drivers/block/aoe/aoeblk.c | |||
| @@ -118,13 +118,11 @@ aoedisk_rm_sysfs(struct aoedev *d) | |||
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | static int | 120 | static int |
| 121 | aoeblk_open(struct inode *inode, struct file *filp) | 121 | aoeblk_open(struct block_device *bdev, fmode_t mode) |
| 122 | { | 122 | { |
| 123 | struct aoedev *d; | 123 | struct aoedev *d = bdev->bd_disk->private_data; |
| 124 | ulong flags; | 124 | ulong flags; |
| 125 | 125 | ||
| 126 | d = inode->i_bdev->bd_disk->private_data; | ||
| 127 | |||
| 128 | spin_lock_irqsave(&d->lock, flags); | 126 | spin_lock_irqsave(&d->lock, flags); |
| 129 | if (d->flags & DEVFL_UP) { | 127 | if (d->flags & DEVFL_UP) { |
| 130 | d->nopen++; | 128 | d->nopen++; |
| @@ -136,13 +134,11 @@ aoeblk_open(struct inode *inode, struct file *filp) | |||
| 136 | } | 134 | } |
| 137 | 135 | ||
| 138 | static int | 136 | static int |
| 139 | aoeblk_release(struct inode *inode, struct file *filp) | 137 | aoeblk_release(struct gendisk *disk, fmode_t mode) |
| 140 | { | 138 | { |
| 141 | struct aoedev *d; | 139 | struct aoedev *d = disk->private_data; |
| 142 | ulong flags; | 140 | ulong flags; |
| 143 | 141 | ||
| 144 | d = inode->i_bdev->bd_disk->private_data; | ||
| 145 | |||
| 146 | spin_lock_irqsave(&d->lock, flags); | 142 | spin_lock_irqsave(&d->lock, flags); |
| 147 | 143 | ||
| 148 | if (--d->nopen == 0) { | 144 | if (--d->nopen == 0) { |
diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c index 432cf4018291..69e1df7dfa14 100644 --- a/drivers/block/ataflop.c +++ b/drivers/block/ataflop.c | |||
| @@ -361,13 +361,13 @@ static void finish_fdc( void ); | |||
| 361 | static void finish_fdc_done( int dummy ); | 361 | static void finish_fdc_done( int dummy ); |
| 362 | static void setup_req_params( int drive ); | 362 | static void setup_req_params( int drive ); |
| 363 | static void redo_fd_request( void); | 363 | static void redo_fd_request( void); |
| 364 | static int fd_ioctl( struct inode *inode, struct file *filp, unsigned int | 364 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int |
| 365 | cmd, unsigned long param); | 365 | cmd, unsigned long param); |
| 366 | static void fd_probe( int drive ); | 366 | static void fd_probe( int drive ); |
| 367 | static int fd_test_drive_present( int drive ); | 367 | static int fd_test_drive_present( int drive ); |
| 368 | static void config_types( void ); | 368 | static void config_types( void ); |
| 369 | static int floppy_open( struct inode *inode, struct file *filp ); | 369 | static int floppy_open(struct block_device *bdev, fmode_t mode); |
| 370 | static int floppy_release( struct inode * inode, struct file * filp ); | 370 | static int floppy_release(struct gendisk *disk, fmode_t mode); |
| 371 | 371 | ||
| 372 | /************************* End of Prototypes **************************/ | 372 | /************************* End of Prototypes **************************/ |
| 373 | 373 | ||
| @@ -1483,10 +1483,10 @@ void do_fd_request(struct request_queue * q) | |||
| 1483 | atari_enable_irq( IRQ_MFP_FDC ); | 1483 | atari_enable_irq( IRQ_MFP_FDC ); |
| 1484 | } | 1484 | } |
| 1485 | 1485 | ||
| 1486 | static int fd_ioctl(struct inode *inode, struct file *filp, | 1486 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, |
| 1487 | unsigned int cmd, unsigned long param) | 1487 | unsigned int cmd, unsigned long param) |
| 1488 | { | 1488 | { |
| 1489 | struct gendisk *disk = inode->i_bdev->bd_disk; | 1489 | struct gendisk *disk = bdev->bd_disk; |
| 1490 | struct atari_floppy_struct *floppy = disk->private_data; | 1490 | struct atari_floppy_struct *floppy = disk->private_data; |
| 1491 | int drive = floppy - unit; | 1491 | int drive = floppy - unit; |
| 1492 | int type = floppy->type; | 1492 | int type = floppy->type; |
| @@ -1661,7 +1661,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp, | |||
| 1661 | /* invalidate the buffer track to force a reread */ | 1661 | /* invalidate the buffer track to force a reread */ |
| 1662 | BufferDrive = -1; | 1662 | BufferDrive = -1; |
| 1663 | set_bit(drive, &fake_change); | 1663 | set_bit(drive, &fake_change); |
| 1664 | check_disk_change(inode->i_bdev); | 1664 | check_disk_change(bdev); |
| 1665 | return 0; | 1665 | return 0; |
| 1666 | default: | 1666 | default: |
| 1667 | return -EINVAL; | 1667 | return -EINVAL; |
| @@ -1804,37 +1804,36 @@ static void __init config_types( void ) | |||
| 1804 | * drive with different device numbers. | 1804 | * drive with different device numbers. |
| 1805 | */ | 1805 | */ |
| 1806 | 1806 | ||
| 1807 | static int floppy_open( struct inode *inode, struct file *filp ) | 1807 | static int floppy_open(struct block_device *bdev, fmode_t mode) |
| 1808 | { | 1808 | { |
| 1809 | struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data; | 1809 | struct atari_floppy_struct *p = bdev->bd_disk->private_data; |
| 1810 | int type = iminor(inode) >> 2; | 1810 | int type = MINOR(bdev->bd_dev) >> 2; |
| 1811 | 1811 | ||
| 1812 | DPRINT(("fd_open: type=%d\n",type)); | 1812 | DPRINT(("fd_open: type=%d\n",type)); |
| 1813 | if (p->ref && p->type != type) | 1813 | if (p->ref && p->type != type) |
| 1814 | return -EBUSY; | 1814 | return -EBUSY; |
| 1815 | 1815 | ||
| 1816 | if (p->ref == -1 || (p->ref && filp->f_flags & O_EXCL)) | 1816 | if (p->ref == -1 || (p->ref && mode & FMODE_EXCL)) |
| 1817 | return -EBUSY; | 1817 | return -EBUSY; |
| 1818 | 1818 | ||
| 1819 | if (filp->f_flags & O_EXCL) | 1819 | if (mode & FMODE_EXCL) |
| 1820 | p->ref = -1; | 1820 | p->ref = -1; |
| 1821 | else | 1821 | else |
| 1822 | p->ref++; | 1822 | p->ref++; |
| 1823 | 1823 | ||
| 1824 | p->type = type; | 1824 | p->type = type; |
| 1825 | 1825 | ||
| 1826 | if (filp->f_flags & O_NDELAY) | 1826 | if (mode & FMODE_NDELAY) |
| 1827 | return 0; | 1827 | return 0; |
| 1828 | 1828 | ||
| 1829 | if (filp->f_mode & 3) { | 1829 | if (mode & (FMODE_READ|FMODE_WRITE)) { |
| 1830 | check_disk_change(inode->i_bdev); | 1830 | check_disk_change(bdev); |
| 1831 | if (filp->f_mode & 2) { | 1831 | if (mode & FMODE_WRITE) { |
| 1832 | if (p->wpstat) { | 1832 | if (p->wpstat) { |
| 1833 | if (p->ref < 0) | 1833 | if (p->ref < 0) |
| 1834 | p->ref = 0; | 1834 | p->ref = 0; |
| 1835 | else | 1835 | else |
| 1836 | p->ref--; | 1836 | p->ref--; |
| 1837 | floppy_release(inode, filp); | ||
| 1838 | return -EROFS; | 1837 | return -EROFS; |
| 1839 | } | 1838 | } |
| 1840 | } | 1839 | } |
| @@ -1843,9 +1842,9 @@ static int floppy_open( struct inode *inode, struct file *filp ) | |||
| 1843 | } | 1842 | } |
| 1844 | 1843 | ||
| 1845 | 1844 | ||
| 1846 | static int floppy_release( struct inode * inode, struct file * filp ) | 1845 | static int floppy_release(struct gendisk *disk, fmode_t mode) |
| 1847 | { | 1846 | { |
| 1848 | struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data; | 1847 | struct atari_floppy_struct *p = disk->private_data; |
| 1849 | if (p->ref < 0) | 1848 | if (p->ref < 0) |
| 1850 | p->ref = 0; | 1849 | p->ref = 0; |
| 1851 | else if (!p->ref--) { | 1850 | else if (!p->ref--) { |
| @@ -1859,7 +1858,7 @@ static struct block_device_operations floppy_fops = { | |||
| 1859 | .owner = THIS_MODULE, | 1858 | .owner = THIS_MODULE, |
| 1860 | .open = floppy_open, | 1859 | .open = floppy_open, |
| 1861 | .release = floppy_release, | 1860 | .release = floppy_release, |
| 1862 | .ioctl = fd_ioctl, | 1861 | .locked_ioctl = fd_ioctl, |
| 1863 | .media_changed = check_floppy_change, | 1862 | .media_changed = check_floppy_change, |
| 1864 | .revalidate_disk= floppy_revalidate, | 1863 | .revalidate_disk= floppy_revalidate, |
| 1865 | }; | 1864 | }; |
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index d070d492e385..bdd4f5f45575 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c | |||
| @@ -340,11 +340,10 @@ static int brd_direct_access (struct block_device *bdev, sector_t sector, | |||
| 340 | } | 340 | } |
| 341 | #endif | 341 | #endif |
| 342 | 342 | ||
| 343 | static int brd_ioctl(struct inode *inode, struct file *file, | 343 | static int brd_ioctl(struct block_device *bdev, fmode_t mode, |
| 344 | unsigned int cmd, unsigned long arg) | 344 | unsigned int cmd, unsigned long arg) |
| 345 | { | 345 | { |
| 346 | int error; | 346 | int error; |
| 347 | struct block_device *bdev = inode->i_bdev; | ||
| 348 | struct brd_device *brd = bdev->bd_disk->private_data; | 347 | struct brd_device *brd = bdev->bd_disk->private_data; |
| 349 | 348 | ||
| 350 | if (cmd != BLKFLSBUF) | 349 | if (cmd != BLKFLSBUF) |
| @@ -376,7 +375,7 @@ static int brd_ioctl(struct inode *inode, struct file *file, | |||
| 376 | 375 | ||
| 377 | static struct block_device_operations brd_fops = { | 376 | static struct block_device_operations brd_fops = { |
| 378 | .owner = THIS_MODULE, | 377 | .owner = THIS_MODULE, |
| 379 | .ioctl = brd_ioctl, | 378 | .locked_ioctl = brd_ioctl, |
| 380 | #ifdef CONFIG_BLK_DEV_XIP | 379 | #ifdef CONFIG_BLK_DEV_XIP |
| 381 | .direct_access = brd_direct_access, | 380 | .direct_access = brd_direct_access, |
| 382 | #endif | 381 | #endif |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 1e1f9153000c..4023885353e0 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -152,9 +152,9 @@ static ctlr_info_t *hba[MAX_CTLR]; | |||
| 152 | 152 | ||
| 153 | static void do_cciss_request(struct request_queue *q); | 153 | static void do_cciss_request(struct request_queue *q); |
| 154 | static irqreturn_t do_cciss_intr(int irq, void *dev_id); | 154 | static irqreturn_t do_cciss_intr(int irq, void *dev_id); |
| 155 | static int cciss_open(struct inode *inode, struct file *filep); | 155 | static int cciss_open(struct block_device *bdev, fmode_t mode); |
| 156 | static int cciss_release(struct inode *inode, struct file *filep); | 156 | static int cciss_release(struct gendisk *disk, fmode_t mode); |
| 157 | static int cciss_ioctl(struct inode *inode, struct file *filep, | 157 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, |
| 158 | unsigned int cmd, unsigned long arg); | 158 | unsigned int cmd, unsigned long arg); |
| 159 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 159 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
| 160 | 160 | ||
| @@ -192,14 +192,15 @@ static void cciss_procinit(int i) | |||
| 192 | #endif /* CONFIG_PROC_FS */ | 192 | #endif /* CONFIG_PROC_FS */ |
| 193 | 193 | ||
| 194 | #ifdef CONFIG_COMPAT | 194 | #ifdef CONFIG_COMPAT |
| 195 | static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg); | 195 | static int cciss_compat_ioctl(struct block_device *, fmode_t, |
| 196 | unsigned, unsigned long); | ||
| 196 | #endif | 197 | #endif |
| 197 | 198 | ||
| 198 | static struct block_device_operations cciss_fops = { | 199 | static struct block_device_operations cciss_fops = { |
| 199 | .owner = THIS_MODULE, | 200 | .owner = THIS_MODULE, |
| 200 | .open = cciss_open, | 201 | .open = cciss_open, |
| 201 | .release = cciss_release, | 202 | .release = cciss_release, |
| 202 | .ioctl = cciss_ioctl, | 203 | .locked_ioctl = cciss_ioctl, |
| 203 | .getgeo = cciss_getgeo, | 204 | .getgeo = cciss_getgeo, |
| 204 | #ifdef CONFIG_COMPAT | 205 | #ifdef CONFIG_COMPAT |
| 205 | .compat_ioctl = cciss_compat_ioctl, | 206 | .compat_ioctl = cciss_compat_ioctl, |
| @@ -547,13 +548,13 @@ static inline drive_info_struct *get_drv(struct gendisk *disk) | |||
| 547 | /* | 548 | /* |
| 548 | * Open. Make sure the device is really there. | 549 | * Open. Make sure the device is really there. |
| 549 | */ | 550 | */ |
| 550 | static int cciss_open(struct inode *inode, struct file *filep) | 551 | static int cciss_open(struct block_device *bdev, fmode_t mode) |
| 551 | { | 552 | { |
| 552 | ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); | 553 | ctlr_info_t *host = get_host(bdev->bd_disk); |
| 553 | drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk); | 554 | drive_info_struct *drv = get_drv(bdev->bd_disk); |
| 554 | 555 | ||
| 555 | #ifdef CCISS_DEBUG | 556 | #ifdef CCISS_DEBUG |
| 556 | printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name); | 557 | printk(KERN_DEBUG "cciss_open %s\n", bdev->bd_disk->disk_name); |
| 557 | #endif /* CCISS_DEBUG */ | 558 | #endif /* CCISS_DEBUG */ |
| 558 | 559 | ||
| 559 | if (host->busy_initializing || drv->busy_configuring) | 560 | if (host->busy_initializing || drv->busy_configuring) |
| @@ -567,9 +568,9 @@ static int cciss_open(struct inode *inode, struct file *filep) | |||
| 567 | * for "raw controller". | 568 | * for "raw controller". |
| 568 | */ | 569 | */ |
| 569 | if (drv->heads == 0) { | 570 | if (drv->heads == 0) { |
| 570 | if (iminor(inode) != 0) { /* not node 0? */ | 571 | if (MINOR(bdev->bd_dev) != 0) { /* not node 0? */ |
| 571 | /* if not node 0 make sure it is a partition = 0 */ | 572 | /* if not node 0 make sure it is a partition = 0 */ |
| 572 | if (iminor(inode) & 0x0f) { | 573 | if (MINOR(bdev->bd_dev) & 0x0f) { |
| 573 | return -ENXIO; | 574 | return -ENXIO; |
| 574 | /* if it is, make sure we have a LUN ID */ | 575 | /* if it is, make sure we have a LUN ID */ |
| 575 | } else if (drv->LunID == 0) { | 576 | } else if (drv->LunID == 0) { |
| @@ -587,14 +588,13 @@ static int cciss_open(struct inode *inode, struct file *filep) | |||
| 587 | /* | 588 | /* |
| 588 | * Close. Sync first. | 589 | * Close. Sync first. |
| 589 | */ | 590 | */ |
| 590 | static int cciss_release(struct inode *inode, struct file *filep) | 591 | static int cciss_release(struct gendisk *disk, fmode_t mode) |
| 591 | { | 592 | { |
| 592 | ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); | 593 | ctlr_info_t *host = get_host(disk); |
| 593 | drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk); | 594 | drive_info_struct *drv = get_drv(disk); |
| 594 | 595 | ||
| 595 | #ifdef CCISS_DEBUG | 596 | #ifdef CCISS_DEBUG |
| 596 | printk(KERN_DEBUG "cciss_release %s\n", | 597 | printk(KERN_DEBUG "cciss_release %s\n", disk->disk_name); |
| 597 | inode->i_bdev->bd_disk->disk_name); | ||
| 598 | #endif /* CCISS_DEBUG */ | 598 | #endif /* CCISS_DEBUG */ |
| 599 | 599 | ||
| 600 | drv->usage_count--; | 600 | drv->usage_count--; |
| @@ -604,21 +604,23 @@ static int cciss_release(struct inode *inode, struct file *filep) | |||
| 604 | 604 | ||
| 605 | #ifdef CONFIG_COMPAT | 605 | #ifdef CONFIG_COMPAT |
| 606 | 606 | ||
| 607 | static int do_ioctl(struct file *f, unsigned cmd, unsigned long arg) | 607 | static int do_ioctl(struct block_device *bdev, fmode_t mode, |
| 608 | unsigned cmd, unsigned long arg) | ||
| 608 | { | 609 | { |
| 609 | int ret; | 610 | int ret; |
| 610 | lock_kernel(); | 611 | lock_kernel(); |
| 611 | ret = cciss_ioctl(f->f_path.dentry->d_inode, f, cmd, arg); | 612 | ret = cciss_ioctl(bdev, mode, cmd, arg); |
| 612 | unlock_kernel(); | 613 | unlock_kernel(); |
| 613 | return ret; | 614 | return ret; |
| 614 | } | 615 | } |
| 615 | 616 | ||
| 616 | static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, | 617 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, |
| 617 | unsigned long arg); | 618 | unsigned cmd, unsigned long arg); |
| 618 | static int cciss_ioctl32_big_passthru(struct file *f, unsigned cmd, | 619 | static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode, |
| 619 | unsigned long arg); | 620 | unsigned cmd, unsigned long arg); |
| 620 | 621 | ||
| 621 | static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg) | 622 | static int cciss_compat_ioctl(struct block_device *bdev, fmode_t mode, |
| 623 | unsigned cmd, unsigned long arg) | ||
| 622 | { | 624 | { |
| 623 | switch (cmd) { | 625 | switch (cmd) { |
| 624 | case CCISS_GETPCIINFO: | 626 | case CCISS_GETPCIINFO: |
| @@ -636,20 +638,20 @@ static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg) | |||
| 636 | case CCISS_REGNEWD: | 638 | case CCISS_REGNEWD: |
| 637 | case CCISS_RESCANDISK: | 639 | case CCISS_RESCANDISK: |
| 638 | case CCISS_GETLUNINFO: | 640 | case CCISS_GETLUNINFO: |
| 639 | return do_ioctl(f, cmd, arg); | 641 | return do_ioctl(bdev, mode, cmd, arg); |
| 640 | 642 | ||
| 641 | case CCISS_PASSTHRU32: | 643 | case CCISS_PASSTHRU32: |
| 642 | return cciss_ioctl32_passthru(f, cmd, arg); | 644 | return cciss_ioctl32_passthru(bdev, mode, cmd, arg); |
| 643 | case CCISS_BIG_PASSTHRU32: | 645 | case CCISS_BIG_PASSTHRU32: |
| 644 | return cciss_ioctl32_big_passthru(f, cmd, arg); | 646 | return cciss_ioctl32_big_passthru(bdev, mode, cmd, arg); |
| 645 | 647 | ||
| 646 | default: | 648 | default: |
| 647 | return -ENOIOCTLCMD; | 649 | return -ENOIOCTLCMD; |
| 648 | } | 650 | } |
| 649 | } | 651 | } |
| 650 | 652 | ||
| 651 | static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, | 653 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, |
| 652 | unsigned long arg) | 654 | unsigned cmd, unsigned long arg) |
| 653 | { | 655 | { |
| 654 | IOCTL32_Command_struct __user *arg32 = | 656 | IOCTL32_Command_struct __user *arg32 = |
| 655 | (IOCTL32_Command_struct __user *) arg; | 657 | (IOCTL32_Command_struct __user *) arg; |
| @@ -676,7 +678,7 @@ static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, | |||
| 676 | if (err) | 678 | if (err) |
| 677 | return -EFAULT; | 679 | return -EFAULT; |
| 678 | 680 | ||
| 679 | err = do_ioctl(f, CCISS_PASSTHRU, (unsigned long)p); | 681 | err = do_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p); |
| 680 | if (err) | 682 | if (err) |
| 681 | return err; | 683 | return err; |
| 682 | err |= | 684 | err |= |
| @@ -687,8 +689,8 @@ static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, | |||
| 687 | return err; | 689 | return err; |
| 688 | } | 690 | } |
| 689 | 691 | ||
| 690 | static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd, | 692 | static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode, |
| 691 | unsigned long arg) | 693 | unsigned cmd, unsigned long arg) |
| 692 | { | 694 | { |
| 693 | BIG_IOCTL32_Command_struct __user *arg32 = | 695 | BIG_IOCTL32_Command_struct __user *arg32 = |
| 694 | (BIG_IOCTL32_Command_struct __user *) arg; | 696 | (BIG_IOCTL32_Command_struct __user *) arg; |
| @@ -717,7 +719,7 @@ static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd, | |||
| 717 | if (err) | 719 | if (err) |
| 718 | return -EFAULT; | 720 | return -EFAULT; |
| 719 | 721 | ||
| 720 | err = do_ioctl(file, CCISS_BIG_PASSTHRU, (unsigned long)p); | 722 | err = do_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p); |
| 721 | if (err) | 723 | if (err) |
| 722 | return err; | 724 | return err; |
| 723 | err |= | 725 | err |= |
| @@ -745,10 +747,9 @@ static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 745 | /* | 747 | /* |
| 746 | * ioctl | 748 | * ioctl |
| 747 | */ | 749 | */ |
| 748 | static int cciss_ioctl(struct inode *inode, struct file *filep, | 750 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, |
| 749 | unsigned int cmd, unsigned long arg) | 751 | unsigned int cmd, unsigned long arg) |
| 750 | { | 752 | { |
| 751 | struct block_device *bdev = inode->i_bdev; | ||
| 752 | struct gendisk *disk = bdev->bd_disk; | 753 | struct gendisk *disk = bdev->bd_disk; |
| 753 | ctlr_info_t *host = get_host(disk); | 754 | ctlr_info_t *host = get_host(disk); |
| 754 | drive_info_struct *drv = get_drv(disk); | 755 | drive_info_struct *drv = get_drv(disk); |
| @@ -1232,7 +1233,7 @@ static int cciss_ioctl(struct inode *inode, struct file *filep, | |||
| 1232 | case SG_EMULATED_HOST: | 1233 | case SG_EMULATED_HOST: |
| 1233 | case SG_IO: | 1234 | case SG_IO: |
| 1234 | case SCSI_IOCTL_SEND_COMMAND: | 1235 | case SCSI_IOCTL_SEND_COMMAND: |
| 1235 | return scsi_cmd_ioctl(filep, disk->queue, disk, cmd, argp); | 1236 | return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp); |
| 1236 | 1237 | ||
| 1237 | /* scsi_cmd_ioctl would normally handle these, below, but */ | 1238 | /* scsi_cmd_ioctl would normally handle these, below, but */ |
| 1238 | /* they aren't a good fit for cciss, as CD-ROMs are */ | 1239 | /* they aren't a good fit for cciss, as CD-ROMs are */ |
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 3d967525e9a9..47d233c6d0b3 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
| @@ -156,9 +156,9 @@ static int sendcmd( | |||
| 156 | unsigned int blkcnt, | 156 | unsigned int blkcnt, |
| 157 | unsigned int log_unit ); | 157 | unsigned int log_unit ); |
| 158 | 158 | ||
| 159 | static int ida_open(struct inode *inode, struct file *filep); | 159 | static int ida_open(struct block_device *bdev, fmode_t mode); |
| 160 | static int ida_release(struct inode *inode, struct file *filep); | 160 | static int ida_release(struct gendisk *disk, fmode_t mode); |
| 161 | static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg); | 161 | static int ida_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg); |
| 162 | static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 162 | static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
| 163 | static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io); | 163 | static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io); |
| 164 | 164 | ||
| @@ -197,7 +197,7 @@ static struct block_device_operations ida_fops = { | |||
| 197 | .owner = THIS_MODULE, | 197 | .owner = THIS_MODULE, |
| 198 | .open = ida_open, | 198 | .open = ida_open, |
| 199 | .release = ida_release, | 199 | .release = ida_release, |
| 200 | .ioctl = ida_ioctl, | 200 | .locked_ioctl = ida_ioctl, |
| 201 | .getgeo = ida_getgeo, | 201 | .getgeo = ida_getgeo, |
| 202 | .revalidate_disk= ida_revalidate, | 202 | .revalidate_disk= ida_revalidate, |
| 203 | }; | 203 | }; |
| @@ -818,12 +818,12 @@ DBGINFO( | |||
| 818 | /* | 818 | /* |
| 819 | * Open. Make sure the device is really there. | 819 | * Open. Make sure the device is really there. |
| 820 | */ | 820 | */ |
| 821 | static int ida_open(struct inode *inode, struct file *filep) | 821 | static int ida_open(struct block_device *bdev, fmode_t mode) |
| 822 | { | 822 | { |
| 823 | drv_info_t *drv = get_drv(inode->i_bdev->bd_disk); | 823 | drv_info_t *drv = get_drv(bdev->bd_disk); |
| 824 | ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); | 824 | ctlr_info_t *host = get_host(bdev->bd_disk); |
| 825 | 825 | ||
| 826 | DBGINFO(printk("ida_open %s\n", inode->i_bdev->bd_disk->disk_name)); | 826 | DBGINFO(printk("ida_open %s\n", bdev->bd_disk->disk_name)); |
| 827 | /* | 827 | /* |
| 828 | * Root is allowed to open raw volume zero even if it's not configured | 828 | * Root is allowed to open raw volume zero even if it's not configured |
| 829 | * so array config can still work. I don't think I really like this, | 829 | * 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) | |||
| 843 | /* | 843 | /* |
| 844 | * Close. Sync first. | 844 | * Close. Sync first. |
| 845 | */ | 845 | */ |
| 846 | static int ida_release(struct inode *inode, struct file *filep) | 846 | static int ida_release(struct gendisk *disk, fmode_t mode) |
| 847 | { | 847 | { |
| 848 | ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); | 848 | ctlr_info_t *host = get_host(disk); |
| 849 | host->usage_count--; | 849 | host->usage_count--; |
| 850 | return 0; | 850 | return 0; |
| 851 | } | 851 | } |
| @@ -1128,10 +1128,10 @@ static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 1128 | * ida_ioctl does some miscellaneous stuff like reporting drive geometry, | 1128 | * ida_ioctl does some miscellaneous stuff like reporting drive geometry, |
| 1129 | * setting readahead and submitting commands from userspace to the controller. | 1129 | * setting readahead and submitting commands from userspace to the controller. |
| 1130 | */ | 1130 | */ |
| 1131 | static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg) | 1131 | static int ida_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) |
| 1132 | { | 1132 | { |
| 1133 | drv_info_t *drv = get_drv(inode->i_bdev->bd_disk); | 1133 | drv_info_t *drv = get_drv(bdev->bd_disk); |
| 1134 | ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); | 1134 | ctlr_info_t *host = get_host(bdev->bd_disk); |
| 1135 | int error; | 1135 | int error; |
| 1136 | ida_ioctl_t __user *io = (ida_ioctl_t __user *)arg; | 1136 | ida_ioctl_t __user *io = (ida_ioctl_t __user *)arg; |
| 1137 | ida_ioctl_t *my_io; | 1137 | ida_ioctl_t *my_io; |
| @@ -1165,7 +1165,7 @@ out_passthru: | |||
| 1165 | put_user(host->ctlr_sig, (int __user *)arg); | 1165 | put_user(host->ctlr_sig, (int __user *)arg); |
| 1166 | return 0; | 1166 | return 0; |
| 1167 | case IDAREVALIDATEVOLS: | 1167 | case IDAREVALIDATEVOLS: |
| 1168 | if (iminor(inode) != 0) | 1168 | if (MINOR(bdev->bd_dev) != 0) |
| 1169 | return -ENXIO; | 1169 | return -ENXIO; |
| 1170 | return revalidate_allvol(host); | 1170 | return revalidate_allvol(host); |
| 1171 | case IDADRIVERVERSION: | 1171 | case IDADRIVERVERSION: |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 2cea27aba9a0..14db747a636e 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
| @@ -3450,14 +3450,14 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 3450 | return 0; | 3450 | return 0; |
| 3451 | } | 3451 | } |
| 3452 | 3452 | ||
| 3453 | static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | 3453 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, |
| 3454 | unsigned long param) | 3454 | unsigned long param) |
| 3455 | { | 3455 | { |
| 3456 | #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data) | 3456 | #define FD_IOCTL_ALLOWED (mode & (FMODE_WRITE|FMODE_WRITE_IOCTL)) |
| 3457 | #define OUT(c,x) case c: outparam = (const char *) (x); break | 3457 | #define OUT(c,x) case c: outparam = (const char *) (x); break |
| 3458 | #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0 | 3458 | #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0 |
| 3459 | 3459 | ||
| 3460 | int drive = (long)inode->i_bdev->bd_disk->private_data; | 3460 | int drive = (long)bdev->bd_disk->private_data; |
| 3461 | int type = ITYPE(UDRS->fd_device); | 3461 | int type = ITYPE(UDRS->fd_device); |
| 3462 | int i; | 3462 | int i; |
| 3463 | int ret; | 3463 | int ret; |
| @@ -3516,11 +3516,11 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
| 3516 | current_type[drive] = NULL; | 3516 | current_type[drive] = NULL; |
| 3517 | floppy_sizes[drive] = MAX_DISK_SIZE << 1; | 3517 | floppy_sizes[drive] = MAX_DISK_SIZE << 1; |
| 3518 | UDRS->keep_data = 0; | 3518 | UDRS->keep_data = 0; |
| 3519 | return invalidate_drive(inode->i_bdev); | 3519 | return invalidate_drive(bdev); |
| 3520 | case FDSETPRM: | 3520 | case FDSETPRM: |
| 3521 | case FDDEFPRM: | 3521 | case FDDEFPRM: |
| 3522 | return set_geometry(cmd, &inparam.g, | 3522 | return set_geometry(cmd, &inparam.g, |
| 3523 | drive, type, inode->i_bdev); | 3523 | drive, type, bdev); |
| 3524 | case FDGETPRM: | 3524 | case FDGETPRM: |
| 3525 | ECALL(get_floppy_geometry(drive, type, | 3525 | ECALL(get_floppy_geometry(drive, type, |
| 3526 | (struct floppy_struct **) | 3526 | (struct floppy_struct **) |
| @@ -3551,7 +3551,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
| 3551 | case FDFMTEND: | 3551 | case FDFMTEND: |
| 3552 | case FDFLUSH: | 3552 | case FDFLUSH: |
| 3553 | LOCK_FDC(drive, 1); | 3553 | LOCK_FDC(drive, 1); |
| 3554 | return invalidate_drive(inode->i_bdev); | 3554 | return invalidate_drive(bdev); |
| 3555 | 3555 | ||
| 3556 | case FDSETEMSGTRESH: | 3556 | case FDSETEMSGTRESH: |
| 3557 | UDP->max_errors.reporting = | 3557 | UDP->max_errors.reporting = |
| @@ -3659,9 +3659,9 @@ static void __init config_types(void) | |||
| 3659 | printk("\n"); | 3659 | printk("\n"); |
| 3660 | } | 3660 | } |
| 3661 | 3661 | ||
| 3662 | static int floppy_release(struct inode *inode, struct file *filp) | 3662 | static int floppy_release(struct gendisk *disk, fmode_t mode) |
| 3663 | { | 3663 | { |
| 3664 | int drive = (long)inode->i_bdev->bd_disk->private_data; | 3664 | int drive = (long)disk->private_data; |
| 3665 | 3665 | ||
| 3666 | mutex_lock(&open_lock); | 3666 | mutex_lock(&open_lock); |
| 3667 | if (UDRS->fd_ref < 0) | 3667 | if (UDRS->fd_ref < 0) |
| @@ -3682,18 +3682,17 @@ static int floppy_release(struct inode *inode, struct file *filp) | |||
| 3682 | * /dev/PS0 etc), and disallows simultaneous access to the same | 3682 | * /dev/PS0 etc), and disallows simultaneous access to the same |
| 3683 | * drive with different device numbers. | 3683 | * drive with different device numbers. |
| 3684 | */ | 3684 | */ |
| 3685 | static int floppy_open(struct inode *inode, struct file *filp) | 3685 | static int floppy_open(struct block_device *bdev, fmode_t mode) |
| 3686 | { | 3686 | { |
| 3687 | int drive = (long)inode->i_bdev->bd_disk->private_data; | 3687 | int drive = (long)bdev->bd_disk->private_data; |
| 3688 | int old_dev; | 3688 | int old_dev, new_dev; |
| 3689 | int try; | 3689 | int try; |
| 3690 | int res = -EBUSY; | 3690 | int res = -EBUSY; |
| 3691 | char *tmp; | 3691 | char *tmp; |
| 3692 | 3692 | ||
| 3693 | filp->private_data = (void *)0; | ||
| 3694 | mutex_lock(&open_lock); | 3693 | mutex_lock(&open_lock); |
| 3695 | old_dev = UDRS->fd_device; | 3694 | old_dev = UDRS->fd_device; |
| 3696 | if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev) | 3695 | if (opened_bdev[drive] && opened_bdev[drive] != bdev) |
| 3697 | goto out2; | 3696 | goto out2; |
| 3698 | 3697 | ||
| 3699 | if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) { | 3698 | if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) { |
| @@ -3701,15 +3700,15 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
| 3701 | USETF(FD_VERIFY); | 3700 | USETF(FD_VERIFY); |
| 3702 | } | 3701 | } |
| 3703 | 3702 | ||
| 3704 | if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL))) | 3703 | if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (mode & FMODE_EXCL))) |
| 3705 | goto out2; | 3704 | goto out2; |
| 3706 | 3705 | ||
| 3707 | if (filp->f_flags & O_EXCL) | 3706 | if (mode & FMODE_EXCL) |
| 3708 | UDRS->fd_ref = -1; | 3707 | UDRS->fd_ref = -1; |
| 3709 | else | 3708 | else |
| 3710 | UDRS->fd_ref++; | 3709 | UDRS->fd_ref++; |
| 3711 | 3710 | ||
| 3712 | opened_bdev[drive] = inode->i_bdev; | 3711 | opened_bdev[drive] = bdev; |
| 3713 | 3712 | ||
| 3714 | res = -ENXIO; | 3713 | res = -ENXIO; |
| 3715 | 3714 | ||
| @@ -3744,31 +3743,26 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
| 3744 | } | 3743 | } |
| 3745 | } | 3744 | } |
| 3746 | 3745 | ||
| 3747 | UDRS->fd_device = iminor(inode); | 3746 | new_dev = MINOR(bdev->bd_dev); |
| 3748 | set_capacity(disks[drive], floppy_sizes[iminor(inode)]); | 3747 | UDRS->fd_device = new_dev; |
| 3749 | if (old_dev != -1 && old_dev != iminor(inode)) { | 3748 | set_capacity(disks[drive], floppy_sizes[new_dev]); |
| 3749 | if (old_dev != -1 && old_dev != new_dev) { | ||
| 3750 | if (buffer_drive == drive) | 3750 | if (buffer_drive == drive) |
| 3751 | buffer_track = -1; | 3751 | buffer_track = -1; |
| 3752 | } | 3752 | } |
| 3753 | 3753 | ||
| 3754 | /* Allow ioctls if we have write-permissions even if read-only open. | ||
| 3755 | * Needed so that programs such as fdrawcmd still can work on write | ||
| 3756 | * protected disks */ | ||
| 3757 | if ((filp->f_mode & FMODE_WRITE) || !file_permission(filp, MAY_WRITE)) | ||
| 3758 | filp->private_data = (void *)8; | ||
| 3759 | |||
| 3760 | if (UFDCS->rawcmd == 1) | 3754 | if (UFDCS->rawcmd == 1) |
| 3761 | UFDCS->rawcmd = 2; | 3755 | UFDCS->rawcmd = 2; |
| 3762 | 3756 | ||
| 3763 | if (!(filp->f_flags & O_NDELAY)) { | 3757 | if (!(mode & FMODE_NDELAY)) { |
| 3764 | if (filp->f_mode & 3) { | 3758 | if (mode & (FMODE_READ|FMODE_WRITE)) { |
| 3765 | UDRS->last_checked = 0; | 3759 | UDRS->last_checked = 0; |
| 3766 | check_disk_change(inode->i_bdev); | 3760 | check_disk_change(bdev); |
| 3767 | if (UTESTF(FD_DISK_CHANGED)) | 3761 | if (UTESTF(FD_DISK_CHANGED)) |
| 3768 | goto out; | 3762 | goto out; |
| 3769 | } | 3763 | } |
| 3770 | res = -EROFS; | 3764 | res = -EROFS; |
| 3771 | if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE))) | 3765 | if ((mode & FMODE_WRITE) && !(UTESTF(FD_DISK_WRITABLE))) |
| 3772 | goto out; | 3766 | goto out; |
| 3773 | } | 3767 | } |
| 3774 | mutex_unlock(&open_lock); | 3768 | mutex_unlock(&open_lock); |
| @@ -3911,7 +3905,7 @@ static struct block_device_operations floppy_fops = { | |||
| 3911 | .owner = THIS_MODULE, | 3905 | .owner = THIS_MODULE, |
| 3912 | .open = floppy_open, | 3906 | .open = floppy_open, |
| 3913 | .release = floppy_release, | 3907 | .release = floppy_release, |
| 3914 | .ioctl = fd_ioctl, | 3908 | .locked_ioctl = fd_ioctl, |
| 3915 | .getgeo = fd_getgeo, | 3909 | .getgeo = fd_getgeo, |
| 3916 | .media_changed = check_floppy_change, | 3910 | .media_changed = check_floppy_change, |
| 3917 | .revalidate_disk = floppy_revalidate, | 3911 | .revalidate_disk = floppy_revalidate, |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index d3a25b027ff9..3f09cd8bcc38 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
| @@ -210,7 +210,7 @@ lo_do_transfer(struct loop_device *lo, int cmd, | |||
| 210 | * space operations write_begin and write_end. | 210 | * space operations write_begin and write_end. |
| 211 | */ | 211 | */ |
| 212 | static int do_lo_send_aops(struct loop_device *lo, struct bio_vec *bvec, | 212 | static int do_lo_send_aops(struct loop_device *lo, struct bio_vec *bvec, |
| 213 | int bsize, loff_t pos, struct page *unused) | 213 | loff_t pos, struct page *unused) |
| 214 | { | 214 | { |
| 215 | struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */ | 215 | struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */ |
| 216 | struct address_space *mapping = file->f_mapping; | 216 | struct address_space *mapping = file->f_mapping; |
| @@ -302,7 +302,7 @@ static int __do_lo_send_write(struct file *file, | |||
| 302 | * filesystems. | 302 | * filesystems. |
| 303 | */ | 303 | */ |
| 304 | static int do_lo_send_direct_write(struct loop_device *lo, | 304 | static int do_lo_send_direct_write(struct loop_device *lo, |
| 305 | struct bio_vec *bvec, int bsize, loff_t pos, struct page *page) | 305 | struct bio_vec *bvec, loff_t pos, struct page *page) |
| 306 | { | 306 | { |
| 307 | ssize_t bw = __do_lo_send_write(lo->lo_backing_file, | 307 | ssize_t bw = __do_lo_send_write(lo->lo_backing_file, |
| 308 | kmap(bvec->bv_page) + bvec->bv_offset, | 308 | kmap(bvec->bv_page) + bvec->bv_offset, |
| @@ -326,7 +326,7 @@ static int do_lo_send_direct_write(struct loop_device *lo, | |||
| 326 | * destination pages of the backing file. | 326 | * destination pages of the backing file. |
| 327 | */ | 327 | */ |
| 328 | static int do_lo_send_write(struct loop_device *lo, struct bio_vec *bvec, | 328 | static int do_lo_send_write(struct loop_device *lo, struct bio_vec *bvec, |
| 329 | int bsize, loff_t pos, struct page *page) | 329 | loff_t pos, struct page *page) |
| 330 | { | 330 | { |
| 331 | int ret = lo_do_transfer(lo, WRITE, page, 0, bvec->bv_page, | 331 | int ret = lo_do_transfer(lo, WRITE, page, 0, bvec->bv_page, |
| 332 | bvec->bv_offset, bvec->bv_len, pos >> 9); | 332 | 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, | |||
| 341 | return ret; | 341 | return ret; |
| 342 | } | 342 | } |
| 343 | 343 | ||
| 344 | static int lo_send(struct loop_device *lo, struct bio *bio, int bsize, | 344 | static int lo_send(struct loop_device *lo, struct bio *bio, loff_t pos) |
| 345 | loff_t pos) | ||
| 346 | { | 345 | { |
| 347 | int (*do_lo_send)(struct loop_device *, struct bio_vec *, int, loff_t, | 346 | int (*do_lo_send)(struct loop_device *, struct bio_vec *, loff_t, |
| 348 | struct page *page); | 347 | struct page *page); |
| 349 | struct bio_vec *bvec; | 348 | struct bio_vec *bvec; |
| 350 | struct page *page = NULL; | 349 | struct page *page = NULL; |
| @@ -362,7 +361,7 @@ static int lo_send(struct loop_device *lo, struct bio *bio, int bsize, | |||
| 362 | } | 361 | } |
| 363 | } | 362 | } |
| 364 | bio_for_each_segment(bvec, bio, i) { | 363 | bio_for_each_segment(bvec, bio, i) { |
| 365 | ret = do_lo_send(lo, bvec, bsize, pos, page); | 364 | ret = do_lo_send(lo, bvec, pos, page); |
| 366 | if (ret < 0) | 365 | if (ret < 0) |
| 367 | break; | 366 | break; |
| 368 | pos += bvec->bv_len; | 367 | pos += bvec->bv_len; |
| @@ -478,7 +477,7 @@ static int do_bio_filebacked(struct loop_device *lo, struct bio *bio) | |||
| 478 | 477 | ||
| 479 | pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset; | 478 | pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset; |
| 480 | if (bio_rw(bio) == WRITE) | 479 | if (bio_rw(bio) == WRITE) |
| 481 | ret = lo_send(lo, bio, lo->lo_blocksize, pos); | 480 | ret = lo_send(lo, bio, pos); |
| 482 | else | 481 | else |
| 483 | ret = lo_receive(lo, bio, lo->lo_blocksize, pos); | 482 | ret = lo_receive(lo, bio, lo->lo_blocksize, pos); |
| 484 | return ret; | 483 | return ret; |
| @@ -652,8 +651,8 @@ static void do_loop_switch(struct loop_device *lo, struct switch_request *p) | |||
| 652 | * This can only work if the loop device is used read-only, and if the | 651 | * This can only work if the loop device is used read-only, and if the |
| 653 | * new backing store is the same size and type as the old backing store. | 652 | * new backing store is the same size and type as the old backing store. |
| 654 | */ | 653 | */ |
| 655 | static int loop_change_fd(struct loop_device *lo, struct file *lo_file, | 654 | static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, |
| 656 | struct block_device *bdev, unsigned int arg) | 655 | unsigned int arg) |
| 657 | { | 656 | { |
| 658 | struct file *file, *old_file; | 657 | struct file *file, *old_file; |
| 659 | struct inode *inode; | 658 | struct inode *inode; |
| @@ -712,7 +711,7 @@ static inline int is_loop_device(struct file *file) | |||
| 712 | return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR; | 711 | return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR; |
| 713 | } | 712 | } |
| 714 | 713 | ||
| 715 | static int loop_set_fd(struct loop_device *lo, struct file *lo_file, | 714 | static int loop_set_fd(struct loop_device *lo, fmode_t mode, |
| 716 | struct block_device *bdev, unsigned int arg) | 715 | struct block_device *bdev, unsigned int arg) |
| 717 | { | 716 | { |
| 718 | struct file *file, *f; | 717 | struct file *file, *f; |
| @@ -740,7 +739,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file, | |||
| 740 | while (is_loop_device(f)) { | 739 | while (is_loop_device(f)) { |
| 741 | struct loop_device *l; | 740 | struct loop_device *l; |
| 742 | 741 | ||
| 743 | if (f->f_mapping->host->i_rdev == lo_file->f_mapping->host->i_rdev) | 742 | if (f->f_mapping->host->i_bdev == bdev) |
| 744 | goto out_putf; | 743 | goto out_putf; |
| 745 | 744 | ||
| 746 | l = f->f_mapping->host->i_bdev->bd_disk->private_data; | 745 | 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, | |||
| 786 | goto out_putf; | 785 | goto out_putf; |
| 787 | } | 786 | } |
| 788 | 787 | ||
| 789 | if (!(lo_file->f_mode & FMODE_WRITE)) | 788 | if (!(mode & FMODE_WRITE)) |
| 790 | lo_flags |= LO_FLAGS_READ_ONLY; | 789 | lo_flags |= LO_FLAGS_READ_ONLY; |
| 791 | 790 | ||
| 792 | set_device_ro(bdev, (lo_flags & LO_FLAGS_READ_ONLY) != 0); | 791 | 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) | |||
| 918 | memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE); | 917 | memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE); |
| 919 | memset(lo->lo_crypt_name, 0, LO_NAME_SIZE); | 918 | memset(lo->lo_crypt_name, 0, LO_NAME_SIZE); |
| 920 | memset(lo->lo_file_name, 0, LO_NAME_SIZE); | 919 | memset(lo->lo_file_name, 0, LO_NAME_SIZE); |
| 921 | invalidate_bdev(bdev); | 920 | if (bdev) |
| 921 | invalidate_bdev(bdev); | ||
| 922 | set_capacity(lo->lo_disk, 0); | 922 | set_capacity(lo->lo_disk, 0); |
| 923 | bd_set_size(bdev, 0); | 923 | if (bdev) |
| 924 | bd_set_size(bdev, 0); | ||
| 924 | mapping_set_gfp_mask(filp->f_mapping, gfp); | 925 | mapping_set_gfp_mask(filp->f_mapping, gfp); |
| 925 | lo->lo_state = Lo_unbound; | 926 | lo->lo_state = Lo_unbound; |
| 926 | fput(filp); | 927 | fput(filp); |
| @@ -1137,22 +1138,22 @@ loop_get_status64(struct loop_device *lo, struct loop_info64 __user *arg) { | |||
| 1137 | return err; | 1138 | return err; |
| 1138 | } | 1139 | } |
| 1139 | 1140 | ||
| 1140 | static int lo_ioctl(struct inode * inode, struct file * file, | 1141 | static int lo_ioctl(struct block_device *bdev, fmode_t mode, |
| 1141 | unsigned int cmd, unsigned long arg) | 1142 | unsigned int cmd, unsigned long arg) |
| 1142 | { | 1143 | { |
| 1143 | struct loop_device *lo = inode->i_bdev->bd_disk->private_data; | 1144 | struct loop_device *lo = bdev->bd_disk->private_data; |
| 1144 | int err; | 1145 | int err; |
| 1145 | 1146 | ||
| 1146 | mutex_lock(&lo->lo_ctl_mutex); | 1147 | mutex_lock(&lo->lo_ctl_mutex); |
| 1147 | switch (cmd) { | 1148 | switch (cmd) { |
| 1148 | case LOOP_SET_FD: | 1149 | case LOOP_SET_FD: |
| 1149 | err = loop_set_fd(lo, file, inode->i_bdev, arg); | 1150 | err = loop_set_fd(lo, mode, bdev, arg); |
| 1150 | break; | 1151 | break; |
| 1151 | case LOOP_CHANGE_FD: | 1152 | case LOOP_CHANGE_FD: |
| 1152 | err = loop_change_fd(lo, file, inode->i_bdev, arg); | 1153 | err = loop_change_fd(lo, bdev, arg); |
| 1153 | break; | 1154 | break; |
| 1154 | case LOOP_CLR_FD: | 1155 | case LOOP_CLR_FD: |
| 1155 | err = loop_clr_fd(lo, inode->i_bdev); | 1156 | err = loop_clr_fd(lo, bdev); |
| 1156 | break; | 1157 | break; |
| 1157 | case LOOP_SET_STATUS: | 1158 | case LOOP_SET_STATUS: |
| 1158 | err = loop_set_status_old(lo, (struct loop_info __user *) arg); | 1159 | err = loop_set_status_old(lo, (struct loop_info __user *) arg); |
| @@ -1292,10 +1293,10 @@ loop_get_status_compat(struct loop_device *lo, | |||
| 1292 | return err; | 1293 | return err; |
| 1293 | } | 1294 | } |
| 1294 | 1295 | ||
| 1295 | static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 1296 | static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode, |
| 1297 | unsigned int cmd, unsigned long arg) | ||
| 1296 | { | 1298 | { |
| 1297 | struct inode *inode = file->f_path.dentry->d_inode; | 1299 | struct loop_device *lo = bdev->bd_disk->private_data; |
| 1298 | struct loop_device *lo = inode->i_bdev->bd_disk->private_data; | ||
| 1299 | int err; | 1300 | int err; |
| 1300 | 1301 | ||
| 1301 | switch(cmd) { | 1302 | switch(cmd) { |
| @@ -1317,7 +1318,7 @@ static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a | |||
| 1317 | arg = (unsigned long) compat_ptr(arg); | 1318 | arg = (unsigned long) compat_ptr(arg); |
| 1318 | case LOOP_SET_FD: | 1319 | case LOOP_SET_FD: |
| 1319 | case LOOP_CHANGE_FD: | 1320 | case LOOP_CHANGE_FD: |
| 1320 | err = lo_ioctl(inode, file, cmd, arg); | 1321 | err = lo_ioctl(bdev, mode, cmd, arg); |
| 1321 | break; | 1322 | break; |
| 1322 | default: | 1323 | default: |
| 1323 | err = -ENOIOCTLCMD; | 1324 | err = -ENOIOCTLCMD; |
| @@ -1327,9 +1328,9 @@ static long lo_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a | |||
| 1327 | } | 1328 | } |
| 1328 | #endif | 1329 | #endif |
| 1329 | 1330 | ||
| 1330 | static int lo_open(struct inode *inode, struct file *file) | 1331 | static int lo_open(struct block_device *bdev, fmode_t mode) |
| 1331 | { | 1332 | { |
| 1332 | struct loop_device *lo = inode->i_bdev->bd_disk->private_data; | 1333 | struct loop_device *lo = bdev->bd_disk->private_data; |
| 1333 | 1334 | ||
| 1334 | mutex_lock(&lo->lo_ctl_mutex); | 1335 | mutex_lock(&lo->lo_ctl_mutex); |
| 1335 | lo->lo_refcnt++; | 1336 | lo->lo_refcnt++; |
| @@ -1338,15 +1339,15 @@ static int lo_open(struct inode *inode, struct file *file) | |||
| 1338 | return 0; | 1339 | return 0; |
| 1339 | } | 1340 | } |
| 1340 | 1341 | ||
| 1341 | static int lo_release(struct inode *inode, struct file *file) | 1342 | static int lo_release(struct gendisk *disk, fmode_t mode) |
| 1342 | { | 1343 | { |
| 1343 | struct loop_device *lo = inode->i_bdev->bd_disk->private_data; | 1344 | struct loop_device *lo = disk->private_data; |
| 1344 | 1345 | ||
| 1345 | mutex_lock(&lo->lo_ctl_mutex); | 1346 | mutex_lock(&lo->lo_ctl_mutex); |
| 1346 | --lo->lo_refcnt; | 1347 | --lo->lo_refcnt; |
| 1347 | 1348 | ||
| 1348 | if ((lo->lo_flags & LO_FLAGS_AUTOCLEAR) && !lo->lo_refcnt) | 1349 | if ((lo->lo_flags & LO_FLAGS_AUTOCLEAR) && !lo->lo_refcnt) |
| 1349 | loop_clr_fd(lo, inode->i_bdev); | 1350 | loop_clr_fd(lo, NULL); |
| 1350 | 1351 | ||
| 1351 | mutex_unlock(&lo->lo_ctl_mutex); | 1352 | mutex_unlock(&lo->lo_ctl_mutex); |
| 1352 | 1353 | ||
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 9034ca585afd..d3a91cacee8c 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
| @@ -557,10 +557,11 @@ static void do_nbd_request(struct request_queue * q) | |||
| 557 | } | 557 | } |
| 558 | } | 558 | } |
| 559 | 559 | ||
| 560 | static int nbd_ioctl(struct inode *inode, struct file *file, | 560 | static int nbd_ioctl(struct block_device *bdev, fmode_t mode, |
| 561 | unsigned int cmd, unsigned long arg) | 561 | unsigned int cmd, unsigned long arg) |
| 562 | { | 562 | { |
| 563 | struct nbd_device *lo = inode->i_bdev->bd_disk->private_data; | 563 | struct nbd_device *lo = bdev->bd_disk->private_data; |
| 564 | struct file *file; | ||
| 564 | int error; | 565 | int error; |
| 565 | struct request sreq ; | 566 | struct request sreq ; |
| 566 | struct task_struct *thread; | 567 | struct task_struct *thread; |
| @@ -612,8 +613,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file, | |||
| 612 | error = -EINVAL; | 613 | error = -EINVAL; |
| 613 | file = fget(arg); | 614 | file = fget(arg); |
| 614 | if (file) { | 615 | if (file) { |
| 615 | struct block_device *bdev = inode->i_bdev; | 616 | struct inode *inode = file->f_path.dentry->d_inode; |
| 616 | inode = file->f_path.dentry->d_inode; | ||
| 617 | if (S_ISSOCK(inode->i_mode)) { | 617 | if (S_ISSOCK(inode->i_mode)) { |
| 618 | lo->file = file; | 618 | lo->file = file; |
| 619 | lo->sock = SOCKET_I(inode); | 619 | lo->sock = SOCKET_I(inode); |
| @@ -628,14 +628,14 @@ static int nbd_ioctl(struct inode *inode, struct file *file, | |||
| 628 | case NBD_SET_BLKSIZE: | 628 | case NBD_SET_BLKSIZE: |
| 629 | lo->blksize = arg; | 629 | lo->blksize = arg; |
| 630 | lo->bytesize &= ~(lo->blksize-1); | 630 | lo->bytesize &= ~(lo->blksize-1); |
| 631 | inode->i_bdev->bd_inode->i_size = lo->bytesize; | 631 | bdev->bd_inode->i_size = lo->bytesize; |
| 632 | set_blocksize(inode->i_bdev, lo->blksize); | 632 | set_blocksize(bdev, lo->blksize); |
| 633 | set_capacity(lo->disk, lo->bytesize >> 9); | 633 | set_capacity(lo->disk, lo->bytesize >> 9); |
| 634 | return 0; | 634 | return 0; |
| 635 | case NBD_SET_SIZE: | 635 | case NBD_SET_SIZE: |
| 636 | lo->bytesize = arg & ~(lo->blksize-1); | 636 | lo->bytesize = arg & ~(lo->blksize-1); |
| 637 | inode->i_bdev->bd_inode->i_size = lo->bytesize; | 637 | bdev->bd_inode->i_size = lo->bytesize; |
| 638 | set_blocksize(inode->i_bdev, lo->blksize); | 638 | set_blocksize(bdev, lo->blksize); |
| 639 | set_capacity(lo->disk, lo->bytesize >> 9); | 639 | set_capacity(lo->disk, lo->bytesize >> 9); |
| 640 | return 0; | 640 | return 0; |
| 641 | case NBD_SET_TIMEOUT: | 641 | case NBD_SET_TIMEOUT: |
| @@ -643,8 +643,8 @@ static int nbd_ioctl(struct inode *inode, struct file *file, | |||
| 643 | return 0; | 643 | return 0; |
| 644 | case NBD_SET_SIZE_BLOCKS: | 644 | case NBD_SET_SIZE_BLOCKS: |
| 645 | lo->bytesize = ((u64) arg) * lo->blksize; | 645 | lo->bytesize = ((u64) arg) * lo->blksize; |
| 646 | inode->i_bdev->bd_inode->i_size = lo->bytesize; | 646 | bdev->bd_inode->i_size = lo->bytesize; |
| 647 | set_blocksize(inode->i_bdev, lo->blksize); | 647 | set_blocksize(bdev, lo->blksize); |
| 648 | set_capacity(lo->disk, lo->bytesize >> 9); | 648 | set_capacity(lo->disk, lo->bytesize >> 9); |
| 649 | return 0; | 649 | return 0; |
| 650 | case NBD_DO_IT: | 650 | case NBD_DO_IT: |
| @@ -666,10 +666,10 @@ static int nbd_ioctl(struct inode *inode, struct file *file, | |||
| 666 | if (file) | 666 | if (file) |
| 667 | fput(file); | 667 | fput(file); |
| 668 | lo->bytesize = 0; | 668 | lo->bytesize = 0; |
| 669 | inode->i_bdev->bd_inode->i_size = 0; | 669 | bdev->bd_inode->i_size = 0; |
| 670 | set_capacity(lo->disk, 0); | 670 | set_capacity(lo->disk, 0); |
| 671 | if (max_part > 0) | 671 | if (max_part > 0) |
| 672 | ioctl_by_bdev(inode->i_bdev, BLKRRPART, 0); | 672 | ioctl_by_bdev(bdev, BLKRRPART, 0); |
| 673 | return lo->harderror; | 673 | return lo->harderror; |
| 674 | case NBD_CLEAR_QUE: | 674 | case NBD_CLEAR_QUE: |
| 675 | /* | 675 | /* |
| @@ -680,7 +680,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file, | |||
| 680 | return 0; | 680 | return 0; |
| 681 | case NBD_PRINT_DEBUG: | 681 | case NBD_PRINT_DEBUG: |
| 682 | printk(KERN_INFO "%s: next = %p, prev = %p, head = %p\n", | 682 | printk(KERN_INFO "%s: next = %p, prev = %p, head = %p\n", |
| 683 | inode->i_bdev->bd_disk->disk_name, | 683 | bdev->bd_disk->disk_name, |
| 684 | lo->queue_head.next, lo->queue_head.prev, | 684 | lo->queue_head.next, lo->queue_head.prev, |
| 685 | &lo->queue_head); | 685 | &lo->queue_head); |
| 686 | return 0; | 686 | return 0; |
| @@ -691,7 +691,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file, | |||
| 691 | static struct block_device_operations nbd_fops = | 691 | static struct block_device_operations nbd_fops = |
| 692 | { | 692 | { |
| 693 | .owner = THIS_MODULE, | 693 | .owner = THIS_MODULE, |
| 694 | .ioctl = nbd_ioctl, | 694 | .locked_ioctl = nbd_ioctl, |
| 695 | }; | 695 | }; |
| 696 | 696 | ||
| 697 | /* | 697 | /* |
diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c index b8a994a2b013..e91d4b4b014f 100644 --- a/drivers/block/paride/pcd.c +++ b/drivers/block/paride/pcd.c | |||
| @@ -223,23 +223,24 @@ static int pcd_warned; /* Have we logged a phase warning ? */ | |||
| 223 | 223 | ||
| 224 | /* kernel glue structures */ | 224 | /* kernel glue structures */ |
| 225 | 225 | ||
| 226 | static int pcd_block_open(struct inode *inode, struct file *file) | 226 | static int pcd_block_open(struct block_device *bdev, fmode_t mode) |
| 227 | { | 227 | { |
| 228 | struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data; | 228 | struct pcd_unit *cd = bdev->bd_disk->private_data; |
| 229 | return cdrom_open(&cd->info, inode, file); | 229 | return cdrom_open(&cd->info, bdev, mode); |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | static int pcd_block_release(struct inode *inode, struct file *file) | 232 | static int pcd_block_release(struct gendisk *disk, fmode_t mode) |
| 233 | { | 233 | { |
| 234 | struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data; | 234 | struct pcd_unit *cd = disk->private_data; |
| 235 | return cdrom_release(&cd->info, file); | 235 | cdrom_release(&cd->info, mode); |
| 236 | return 0; | ||
| 236 | } | 237 | } |
| 237 | 238 | ||
| 238 | static int pcd_block_ioctl(struct inode *inode, struct file *file, | 239 | static int pcd_block_ioctl(struct block_device *bdev, fmode_t mode, |
| 239 | unsigned cmd, unsigned long arg) | 240 | unsigned cmd, unsigned long arg) |
| 240 | { | 241 | { |
| 241 | struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data; | 242 | struct pcd_unit *cd = bdev->bd_disk->private_data; |
| 242 | return cdrom_ioctl(file, &cd->info, inode, cmd, arg); | 243 | return cdrom_ioctl(&cd->info, bdev, mode, cmd, arg); |
| 243 | } | 244 | } |
| 244 | 245 | ||
| 245 | static int pcd_block_media_changed(struct gendisk *disk) | 246 | static int pcd_block_media_changed(struct gendisk *disk) |
| @@ -252,7 +253,7 @@ static struct block_device_operations pcd_bdops = { | |||
| 252 | .owner = THIS_MODULE, | 253 | .owner = THIS_MODULE, |
| 253 | .open = pcd_block_open, | 254 | .open = pcd_block_open, |
| 254 | .release = pcd_block_release, | 255 | .release = pcd_block_release, |
| 255 | .ioctl = pcd_block_ioctl, | 256 | .locked_ioctl = pcd_block_ioctl, |
| 256 | .media_changed = pcd_block_media_changed, | 257 | .media_changed = pcd_block_media_changed, |
| 257 | }; | 258 | }; |
| 258 | 259 | ||
diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index 5fdfa7c888ce..9299455b0af6 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c | |||
| @@ -728,9 +728,9 @@ static int pd_special_command(struct pd_unit *disk, | |||
| 728 | 728 | ||
| 729 | /* kernel glue structures */ | 729 | /* kernel glue structures */ |
| 730 | 730 | ||
| 731 | static int pd_open(struct inode *inode, struct file *file) | 731 | static int pd_open(struct block_device *bdev, fmode_t mode) |
| 732 | { | 732 | { |
| 733 | struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; | 733 | struct pd_unit *disk = bdev->bd_disk->private_data; |
| 734 | 734 | ||
| 735 | disk->access++; | 735 | disk->access++; |
| 736 | 736 | ||
| @@ -758,10 +758,10 @@ static int pd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 758 | return 0; | 758 | return 0; |
| 759 | } | 759 | } |
| 760 | 760 | ||
| 761 | static int pd_ioctl(struct inode *inode, struct file *file, | 761 | static int pd_ioctl(struct block_device *bdev, fmode_t mode, |
| 762 | unsigned int cmd, unsigned long arg) | 762 | unsigned int cmd, unsigned long arg) |
| 763 | { | 763 | { |
| 764 | struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; | 764 | struct pd_unit *disk = bdev->bd_disk->private_data; |
| 765 | 765 | ||
| 766 | switch (cmd) { | 766 | switch (cmd) { |
| 767 | case CDROMEJECT: | 767 | case CDROMEJECT: |
| @@ -773,9 +773,9 @@ static int pd_ioctl(struct inode *inode, struct file *file, | |||
| 773 | } | 773 | } |
| 774 | } | 774 | } |
| 775 | 775 | ||
| 776 | static int pd_release(struct inode *inode, struct file *file) | 776 | static int pd_release(struct gendisk *p, fmode_t mode) |
| 777 | { | 777 | { |
| 778 | struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; | 778 | struct pd_unit *disk = p->private_data; |
| 779 | 779 | ||
| 780 | if (!--disk->access && disk->removable) | 780 | if (!--disk->access && disk->removable) |
| 781 | pd_special_command(disk, pd_door_unlock); | 781 | pd_special_command(disk, pd_door_unlock); |
| @@ -809,7 +809,7 @@ static struct block_device_operations pd_fops = { | |||
| 809 | .owner = THIS_MODULE, | 809 | .owner = THIS_MODULE, |
| 810 | .open = pd_open, | 810 | .open = pd_open, |
| 811 | .release = pd_release, | 811 | .release = pd_release, |
| 812 | .ioctl = pd_ioctl, | 812 | .locked_ioctl = pd_ioctl, |
| 813 | .getgeo = pd_getgeo, | 813 | .getgeo = pd_getgeo, |
| 814 | .media_changed = pd_check_media, | 814 | .media_changed = pd_check_media, |
| 815 | .revalidate_disk= pd_revalidate | 815 | .revalidate_disk= pd_revalidate |
diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c index e7fe6ca97dd8..bef3b997ba3e 100644 --- a/drivers/block/paride/pf.c +++ b/drivers/block/paride/pf.c | |||
| @@ -201,13 +201,13 @@ module_param_array(drive3, int, NULL, 0); | |||
| 201 | #define ATAPI_READ_10 0x28 | 201 | #define ATAPI_READ_10 0x28 |
| 202 | #define ATAPI_WRITE_10 0x2a | 202 | #define ATAPI_WRITE_10 0x2a |
| 203 | 203 | ||
| 204 | static int pf_open(struct inode *inode, struct file *file); | 204 | static int pf_open(struct block_device *bdev, fmode_t mode); |
| 205 | static void do_pf_request(struct request_queue * q); | 205 | static void do_pf_request(struct request_queue * q); |
| 206 | static int pf_ioctl(struct inode *inode, struct file *file, | 206 | static int pf_ioctl(struct block_device *bdev, fmode_t mode, |
| 207 | unsigned int cmd, unsigned long arg); | 207 | unsigned int cmd, unsigned long arg); |
| 208 | static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 208 | static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
| 209 | 209 | ||
| 210 | static int pf_release(struct inode *inode, struct file *file); | 210 | static int pf_release(struct gendisk *disk, fmode_t mode); |
| 211 | 211 | ||
| 212 | static int pf_detect(void); | 212 | static int pf_detect(void); |
| 213 | static void do_pf_read(void); | 213 | static void do_pf_read(void); |
| @@ -266,7 +266,7 @@ static struct block_device_operations pf_fops = { | |||
| 266 | .owner = THIS_MODULE, | 266 | .owner = THIS_MODULE, |
| 267 | .open = pf_open, | 267 | .open = pf_open, |
| 268 | .release = pf_release, | 268 | .release = pf_release, |
| 269 | .ioctl = pf_ioctl, | 269 | .locked_ioctl = pf_ioctl, |
| 270 | .getgeo = pf_getgeo, | 270 | .getgeo = pf_getgeo, |
| 271 | .media_changed = pf_check_media, | 271 | .media_changed = pf_check_media, |
| 272 | }; | 272 | }; |
| @@ -296,16 +296,16 @@ static void __init pf_init_units(void) | |||
| 296 | } | 296 | } |
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | static int pf_open(struct inode *inode, struct file *file) | 299 | static int pf_open(struct block_device *bdev, fmode_t mode) |
| 300 | { | 300 | { |
| 301 | struct pf_unit *pf = inode->i_bdev->bd_disk->private_data; | 301 | struct pf_unit *pf = bdev->bd_disk->private_data; |
| 302 | 302 | ||
| 303 | pf_identify(pf); | 303 | pf_identify(pf); |
| 304 | 304 | ||
| 305 | if (pf->media_status == PF_NM) | 305 | if (pf->media_status == PF_NM) |
| 306 | return -ENODEV; | 306 | return -ENODEV; |
| 307 | 307 | ||
| 308 | if ((pf->media_status == PF_RO) && (file->f_mode & 2)) | 308 | if ((pf->media_status == PF_RO) && (mode & FMODE_WRITE)) |
| 309 | return -EROFS; | 309 | return -EROFS; |
| 310 | 310 | ||
| 311 | pf->access++; | 311 | pf->access++; |
| @@ -333,9 +333,9 @@ static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 333 | return 0; | 333 | return 0; |
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | static int pf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | 336 | static int pf_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) |
| 337 | { | 337 | { |
| 338 | struct pf_unit *pf = inode->i_bdev->bd_disk->private_data; | 338 | struct pf_unit *pf = bdev->bd_disk->private_data; |
| 339 | 339 | ||
| 340 | if (cmd != CDROMEJECT) | 340 | if (cmd != CDROMEJECT) |
| 341 | return -EINVAL; | 341 | return -EINVAL; |
| @@ -346,9 +346,9 @@ static int pf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un | |||
| 346 | return 0; | 346 | return 0; |
| 347 | } | 347 | } |
| 348 | 348 | ||
| 349 | static int pf_release(struct inode *inode, struct file *file) | 349 | static int pf_release(struct gendisk *disk, fmode_t mode) |
| 350 | { | 350 | { |
| 351 | struct pf_unit *pf = inode->i_bdev->bd_disk->private_data; | 351 | struct pf_unit *pf = disk->private_data; |
| 352 | 352 | ||
| 353 | if (pf->access <= 0) | 353 | if (pf->access <= 0) |
| 354 | return -EINVAL; | 354 | return -EINVAL; |
diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c index 5ae229656eaa..1e4006e18f03 100644 --- a/drivers/block/paride/pt.c +++ b/drivers/block/paride/pt.c | |||
| @@ -667,7 +667,7 @@ static int pt_open(struct inode *inode, struct file *file) | |||
| 667 | goto out; | 667 | goto out; |
| 668 | 668 | ||
| 669 | err = -EROFS; | 669 | err = -EROFS; |
| 670 | if ((!(tape->flags & PT_WRITE_OK)) && (file->f_mode & 2)) | 670 | if ((!(tape->flags & PT_WRITE_OK)) && (file->f_mode & FMODE_WRITE)) |
| 671 | goto out; | 671 | goto out; |
| 672 | 672 | ||
| 673 | if (!(iminor(inode) & 128)) | 673 | if (!(iminor(inode) & 128)) |
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 195ca7c720f5..f20bf359b84f 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
| @@ -2320,7 +2320,7 @@ static int pkt_open_write(struct pktcdvd_device *pd) | |||
| 2320 | /* | 2320 | /* |
| 2321 | * called at open time. | 2321 | * called at open time. |
| 2322 | */ | 2322 | */ |
| 2323 | static int pkt_open_dev(struct pktcdvd_device *pd, int write) | 2323 | static int pkt_open_dev(struct pktcdvd_device *pd, fmode_t write) |
| 2324 | { | 2324 | { |
| 2325 | int ret; | 2325 | int ret; |
| 2326 | long lba; | 2326 | long lba; |
| @@ -2332,7 +2332,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, int write) | |||
| 2332 | * so bdget() can't fail. | 2332 | * so bdget() can't fail. |
| 2333 | */ | 2333 | */ |
| 2334 | bdget(pd->bdev->bd_dev); | 2334 | bdget(pd->bdev->bd_dev); |
| 2335 | if ((ret = blkdev_get(pd->bdev, FMODE_READ, O_RDONLY))) | 2335 | if ((ret = blkdev_get(pd->bdev, FMODE_READ))) |
| 2336 | goto out; | 2336 | goto out; |
| 2337 | 2337 | ||
| 2338 | if ((ret = bd_claim(pd->bdev, pd))) | 2338 | if ((ret = bd_claim(pd->bdev, pd))) |
| @@ -2381,7 +2381,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, int write) | |||
| 2381 | out_unclaim: | 2381 | out_unclaim: |
| 2382 | bd_release(pd->bdev); | 2382 | bd_release(pd->bdev); |
| 2383 | out_putdev: | 2383 | out_putdev: |
| 2384 | blkdev_put(pd->bdev); | 2384 | blkdev_put(pd->bdev, FMODE_READ); |
| 2385 | out: | 2385 | out: |
| 2386 | return ret; | 2386 | return ret; |
| 2387 | } | 2387 | } |
| @@ -2399,7 +2399,7 @@ static void pkt_release_dev(struct pktcdvd_device *pd, int flush) | |||
| 2399 | 2399 | ||
| 2400 | pkt_set_speed(pd, MAX_SPEED, MAX_SPEED); | 2400 | pkt_set_speed(pd, MAX_SPEED, MAX_SPEED); |
| 2401 | bd_release(pd->bdev); | 2401 | bd_release(pd->bdev); |
| 2402 | blkdev_put(pd->bdev); | 2402 | blkdev_put(pd->bdev, FMODE_READ); |
| 2403 | 2403 | ||
| 2404 | pkt_shrink_pktlist(pd); | 2404 | pkt_shrink_pktlist(pd); |
| 2405 | } | 2405 | } |
| @@ -2411,7 +2411,7 @@ static struct pktcdvd_device *pkt_find_dev_from_minor(int dev_minor) | |||
| 2411 | return pkt_devs[dev_minor]; | 2411 | return pkt_devs[dev_minor]; |
| 2412 | } | 2412 | } |
| 2413 | 2413 | ||
| 2414 | static int pkt_open(struct inode *inode, struct file *file) | 2414 | static int pkt_open(struct block_device *bdev, fmode_t mode) |
| 2415 | { | 2415 | { |
| 2416 | struct pktcdvd_device *pd = NULL; | 2416 | struct pktcdvd_device *pd = NULL; |
| 2417 | int ret; | 2417 | int ret; |
| @@ -2419,7 +2419,7 @@ static int pkt_open(struct inode *inode, struct file *file) | |||
| 2419 | VPRINTK(DRIVER_NAME": entering open\n"); | 2419 | VPRINTK(DRIVER_NAME": entering open\n"); |
| 2420 | 2420 | ||
| 2421 | mutex_lock(&ctl_mutex); | 2421 | mutex_lock(&ctl_mutex); |
| 2422 | pd = pkt_find_dev_from_minor(iminor(inode)); | 2422 | pd = pkt_find_dev_from_minor(MINOR(bdev->bd_dev)); |
| 2423 | if (!pd) { | 2423 | if (!pd) { |
| 2424 | ret = -ENODEV; | 2424 | ret = -ENODEV; |
| 2425 | goto out; | 2425 | goto out; |
| @@ -2428,20 +2428,20 @@ static int pkt_open(struct inode *inode, struct file *file) | |||
| 2428 | 2428 | ||
| 2429 | pd->refcnt++; | 2429 | pd->refcnt++; |
| 2430 | if (pd->refcnt > 1) { | 2430 | if (pd->refcnt > 1) { |
| 2431 | if ((file->f_mode & FMODE_WRITE) && | 2431 | if ((mode & FMODE_WRITE) && |
| 2432 | !test_bit(PACKET_WRITABLE, &pd->flags)) { | 2432 | !test_bit(PACKET_WRITABLE, &pd->flags)) { |
| 2433 | ret = -EBUSY; | 2433 | ret = -EBUSY; |
| 2434 | goto out_dec; | 2434 | goto out_dec; |
| 2435 | } | 2435 | } |
| 2436 | } else { | 2436 | } else { |
| 2437 | ret = pkt_open_dev(pd, file->f_mode & FMODE_WRITE); | 2437 | ret = pkt_open_dev(pd, mode & FMODE_WRITE); |
| 2438 | if (ret) | 2438 | if (ret) |
| 2439 | goto out_dec; | 2439 | goto out_dec; |
| 2440 | /* | 2440 | /* |
| 2441 | * needed here as well, since ext2 (among others) may change | 2441 | * needed here as well, since ext2 (among others) may change |
| 2442 | * the blocksize at mount time | 2442 | * the blocksize at mount time |
| 2443 | */ | 2443 | */ |
| 2444 | set_blocksize(inode->i_bdev, CD_FRAMESIZE); | 2444 | set_blocksize(bdev, CD_FRAMESIZE); |
| 2445 | } | 2445 | } |
| 2446 | 2446 | ||
| 2447 | mutex_unlock(&ctl_mutex); | 2447 | mutex_unlock(&ctl_mutex); |
| @@ -2455,9 +2455,9 @@ out: | |||
| 2455 | return ret; | 2455 | return ret; |
| 2456 | } | 2456 | } |
| 2457 | 2457 | ||
| 2458 | static int pkt_close(struct inode *inode, struct file *file) | 2458 | static int pkt_close(struct gendisk *disk, fmode_t mode) |
| 2459 | { | 2459 | { |
| 2460 | struct pktcdvd_device *pd = inode->i_bdev->bd_disk->private_data; | 2460 | struct pktcdvd_device *pd = disk->private_data; |
| 2461 | int ret = 0; | 2461 | int ret = 0; |
| 2462 | 2462 | ||
| 2463 | mutex_lock(&ctl_mutex); | 2463 | mutex_lock(&ctl_mutex); |
| @@ -2765,7 +2765,7 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) | |||
| 2765 | bdev = bdget(dev); | 2765 | bdev = bdget(dev); |
| 2766 | if (!bdev) | 2766 | if (!bdev) |
| 2767 | return -ENOMEM; | 2767 | return -ENOMEM; |
| 2768 | ret = blkdev_get(bdev, FMODE_READ, O_RDONLY | O_NONBLOCK); | 2768 | ret = blkdev_get(bdev, FMODE_READ | FMODE_NDELAY); |
| 2769 | if (ret) | 2769 | if (ret) |
| 2770 | return ret; | 2770 | return ret; |
| 2771 | 2771 | ||
| @@ -2790,19 +2790,28 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) | |||
| 2790 | return 0; | 2790 | return 0; |
| 2791 | 2791 | ||
| 2792 | out_mem: | 2792 | out_mem: |
| 2793 | blkdev_put(bdev); | 2793 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 2794 | /* This is safe: open() is still holding a reference. */ | 2794 | /* This is safe: open() is still holding a reference. */ |
| 2795 | module_put(THIS_MODULE); | 2795 | module_put(THIS_MODULE); |
| 2796 | return ret; | 2796 | return ret; |
| 2797 | } | 2797 | } |
| 2798 | 2798 | ||
| 2799 | static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | 2799 | static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) |
| 2800 | { | 2800 | { |
| 2801 | struct pktcdvd_device *pd = inode->i_bdev->bd_disk->private_data; | 2801 | struct pktcdvd_device *pd = bdev->bd_disk->private_data; |
| 2802 | 2802 | ||
| 2803 | VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd, imajor(inode), iminor(inode)); | 2803 | VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd, |
| 2804 | MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev)); | ||
| 2804 | 2805 | ||
| 2805 | switch (cmd) { | 2806 | switch (cmd) { |
| 2807 | case CDROMEJECT: | ||
| 2808 | /* | ||
| 2809 | * The door gets locked when the device is opened, so we | ||
| 2810 | * have to unlock it or else the eject command fails. | ||
| 2811 | */ | ||
| 2812 | if (pd->refcnt == 1) | ||
| 2813 | pkt_lock_door(pd, 0); | ||
| 2814 | /* fallthru */ | ||
| 2806 | /* | 2815 | /* |
| 2807 | * forward selected CDROM ioctls to CD-ROM, for UDF | 2816 | * forward selected CDROM ioctls to CD-ROM, for UDF |
| 2808 | */ | 2817 | */ |
| @@ -2811,16 +2820,7 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u | |||
| 2811 | case CDROM_LAST_WRITTEN: | 2820 | case CDROM_LAST_WRITTEN: |
| 2812 | case CDROM_SEND_PACKET: | 2821 | case CDROM_SEND_PACKET: |
| 2813 | case SCSI_IOCTL_SEND_COMMAND: | 2822 | case SCSI_IOCTL_SEND_COMMAND: |
| 2814 | return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); | 2823 | return __blkdev_driver_ioctl(pd->bdev, mode, cmd, arg); |
| 2815 | |||
| 2816 | case CDROMEJECT: | ||
| 2817 | /* | ||
| 2818 | * The door gets locked when the device is opened, so we | ||
| 2819 | * have to unlock it or else the eject command fails. | ||
| 2820 | */ | ||
| 2821 | if (pd->refcnt == 1) | ||
| 2822 | pkt_lock_door(pd, 0); | ||
| 2823 | return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); | ||
| 2824 | 2824 | ||
| 2825 | default: | 2825 | default: |
| 2826 | VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd); | 2826 | VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd); |
| @@ -2849,7 +2849,7 @@ static struct block_device_operations pktcdvd_ops = { | |||
| 2849 | .owner = THIS_MODULE, | 2849 | .owner = THIS_MODULE, |
| 2850 | .open = pkt_open, | 2850 | .open = pkt_open, |
| 2851 | .release = pkt_close, | 2851 | .release = pkt_close, |
| 2852 | .ioctl = pkt_ioctl, | 2852 | .locked_ioctl = pkt_ioctl, |
| 2853 | .media_changed = pkt_media_changed, | 2853 | .media_changed = pkt_media_changed, |
| 2854 | }; | 2854 | }; |
| 2855 | 2855 | ||
| @@ -2975,7 +2975,7 @@ static int pkt_remove_dev(dev_t pkt_dev) | |||
| 2975 | pkt_debugfs_dev_remove(pd); | 2975 | pkt_debugfs_dev_remove(pd); |
| 2976 | pkt_sysfs_dev_remove(pd); | 2976 | pkt_sysfs_dev_remove(pd); |
| 2977 | 2977 | ||
| 2978 | blkdev_put(pd->bdev); | 2978 | blkdev_put(pd->bdev, FMODE_READ|FMODE_WRITE); |
| 2979 | 2979 | ||
| 2980 | remove_proc_entry(pd->name, pkt_proc); | 2980 | remove_proc_entry(pd->name, pkt_proc); |
| 2981 | DPRINTK(DRIVER_NAME": writer %s unmapped\n", pd->name); | 2981 | DPRINTK(DRIVER_NAME": writer %s unmapped\n", pd->name); |
diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c index 730ccea78e45..612965307ba0 100644 --- a/drivers/block/swim3.c +++ b/drivers/block/swim3.c | |||
| @@ -244,10 +244,10 @@ static int grab_drive(struct floppy_state *fs, enum swim_state state, | |||
| 244 | int interruptible); | 244 | int interruptible); |
| 245 | static void release_drive(struct floppy_state *fs); | 245 | static void release_drive(struct floppy_state *fs); |
| 246 | static int fd_eject(struct floppy_state *fs); | 246 | static int fd_eject(struct floppy_state *fs); |
| 247 | static int floppy_ioctl(struct inode *inode, struct file *filp, | 247 | static int floppy_ioctl(struct block_device *bdev, fmode_t mode, |
| 248 | unsigned int cmd, unsigned long param); | 248 | unsigned int cmd, unsigned long param); |
| 249 | static int floppy_open(struct inode *inode, struct file *filp); | 249 | static int floppy_open(struct block_device *bdev, fmode_t mode); |
| 250 | static int floppy_release(struct inode *inode, struct file *filp); | 250 | static int floppy_release(struct gendisk *disk, fmode_t mode); |
| 251 | static int floppy_check_change(struct gendisk *disk); | 251 | static int floppy_check_change(struct gendisk *disk); |
| 252 | static int floppy_revalidate(struct gendisk *disk); | 252 | static int floppy_revalidate(struct gendisk *disk); |
| 253 | 253 | ||
| @@ -839,10 +839,10 @@ static int fd_eject(struct floppy_state *fs) | |||
| 839 | static struct floppy_struct floppy_type = | 839 | static struct floppy_struct floppy_type = |
| 840 | { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL }; /* 7 1.44MB 3.5" */ | 840 | { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL }; /* 7 1.44MB 3.5" */ |
| 841 | 841 | ||
| 842 | static int floppy_ioctl(struct inode *inode, struct file *filp, | 842 | static int floppy_ioctl(struct block_device *bdev, fmode_t mode, |
| 843 | unsigned int cmd, unsigned long param) | 843 | unsigned int cmd, unsigned long param) |
| 844 | { | 844 | { |
| 845 | struct floppy_state *fs = inode->i_bdev->bd_disk->private_data; | 845 | struct floppy_state *fs = bdev->bd_disk->private_data; |
| 846 | int err; | 846 | int err; |
| 847 | 847 | ||
| 848 | if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)) | 848 | if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)) |
| @@ -868,9 +868,9 @@ static int floppy_ioctl(struct inode *inode, struct file *filp, | |||
| 868 | return -ENOTTY; | 868 | return -ENOTTY; |
| 869 | } | 869 | } |
| 870 | 870 | ||
| 871 | static int floppy_open(struct inode *inode, struct file *filp) | 871 | static int floppy_open(struct block_device *bdev, fmode_t mode) |
| 872 | { | 872 | { |
| 873 | struct floppy_state *fs = inode->i_bdev->bd_disk->private_data; | 873 | struct floppy_state *fs = bdev->bd_disk->private_data; |
| 874 | struct swim3 __iomem *sw = fs->swim3; | 874 | struct swim3 __iomem *sw = fs->swim3; |
| 875 | int n, err = 0; | 875 | int n, err = 0; |
| 876 | 876 | ||
| @@ -904,17 +904,17 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
| 904 | swim3_action(fs, SETMFM); | 904 | swim3_action(fs, SETMFM); |
| 905 | swim3_select(fs, RELAX); | 905 | swim3_select(fs, RELAX); |
| 906 | 906 | ||
| 907 | } else if (fs->ref_count == -1 || filp->f_flags & O_EXCL) | 907 | } else if (fs->ref_count == -1 || mode & FMODE_EXCL) |
| 908 | return -EBUSY; | 908 | return -EBUSY; |
| 909 | 909 | ||
| 910 | if (err == 0 && (filp->f_flags & O_NDELAY) == 0 | 910 | if (err == 0 && (mode & FMODE_NDELAY) == 0 |
| 911 | && (filp->f_mode & 3)) { | 911 | && (mode & (FMODE_READ|FMODE_WRITE))) { |
| 912 | check_disk_change(inode->i_bdev); | 912 | check_disk_change(bdev); |
| 913 | if (fs->ejected) | 913 | if (fs->ejected) |
| 914 | err = -ENXIO; | 914 | err = -ENXIO; |
| 915 | } | 915 | } |
| 916 | 916 | ||
| 917 | if (err == 0 && (filp->f_mode & 2)) { | 917 | if (err == 0 && (mode & FMODE_WRITE)) { |
| 918 | if (fs->write_prot < 0) | 918 | if (fs->write_prot < 0) |
| 919 | fs->write_prot = swim3_readbit(fs, WRITE_PROT); | 919 | fs->write_prot = swim3_readbit(fs, WRITE_PROT); |
| 920 | if (fs->write_prot) | 920 | if (fs->write_prot) |
| @@ -930,7 +930,7 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
| 930 | return err; | 930 | return err; |
| 931 | } | 931 | } |
| 932 | 932 | ||
| 933 | if (filp->f_flags & O_EXCL) | 933 | if (mode & FMODE_EXCL) |
| 934 | fs->ref_count = -1; | 934 | fs->ref_count = -1; |
| 935 | else | 935 | else |
| 936 | ++fs->ref_count; | 936 | ++fs->ref_count; |
| @@ -938,9 +938,9 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
| 938 | return 0; | 938 | return 0; |
| 939 | } | 939 | } |
| 940 | 940 | ||
| 941 | static int floppy_release(struct inode *inode, struct file *filp) | 941 | static int floppy_release(struct gendisk *disk, fmode_t mode) |
| 942 | { | 942 | { |
| 943 | struct floppy_state *fs = inode->i_bdev->bd_disk->private_data; | 943 | struct floppy_state *fs = disk->private_data; |
| 944 | struct swim3 __iomem *sw = fs->swim3; | 944 | struct swim3 __iomem *sw = fs->swim3; |
| 945 | if (fs->ref_count > 0 && --fs->ref_count == 0) { | 945 | if (fs->ref_count > 0 && --fs->ref_count == 0) { |
| 946 | swim3_action(fs, MOTOR_OFF); | 946 | swim3_action(fs, MOTOR_OFF); |
| @@ -1000,7 +1000,7 @@ static int floppy_revalidate(struct gendisk *disk) | |||
| 1000 | static struct block_device_operations floppy_fops = { | 1000 | static struct block_device_operations floppy_fops = { |
| 1001 | .open = floppy_open, | 1001 | .open = floppy_open, |
| 1002 | .release = floppy_release, | 1002 | .release = floppy_release, |
| 1003 | .ioctl = floppy_ioctl, | 1003 | .locked_ioctl = floppy_ioctl, |
| 1004 | .media_changed = floppy_check_change, | 1004 | .media_changed = floppy_check_change, |
| 1005 | .revalidate_disk= floppy_revalidate, | 1005 | .revalidate_disk= floppy_revalidate, |
| 1006 | }; | 1006 | }; |
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index f60e41833f69..fccac18d3111 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
| @@ -1667,10 +1667,9 @@ static void ub_revalidate(struct ub_dev *sc, struct ub_lun *lun) | |||
| 1667 | * This is mostly needed to keep refcounting, but also to support | 1667 | * This is mostly needed to keep refcounting, but also to support |
| 1668 | * media checks on removable media drives. | 1668 | * media checks on removable media drives. |
| 1669 | */ | 1669 | */ |
| 1670 | static int ub_bd_open(struct inode *inode, struct file *filp) | 1670 | static int ub_bd_open(struct block_device *bdev, fmode_t mode) |
| 1671 | { | 1671 | { |
| 1672 | struct gendisk *disk = inode->i_bdev->bd_disk; | 1672 | struct ub_lun *lun = bdev->bd_disk->private_data; |
| 1673 | struct ub_lun *lun = disk->private_data; | ||
| 1674 | struct ub_dev *sc = lun->udev; | 1673 | struct ub_dev *sc = lun->udev; |
| 1675 | unsigned long flags; | 1674 | unsigned long flags; |
| 1676 | int rc; | 1675 | int rc; |
| @@ -1684,19 +1683,19 @@ static int ub_bd_open(struct inode *inode, struct file *filp) | |||
| 1684 | spin_unlock_irqrestore(&ub_lock, flags); | 1683 | spin_unlock_irqrestore(&ub_lock, flags); |
| 1685 | 1684 | ||
| 1686 | if (lun->removable || lun->readonly) | 1685 | if (lun->removable || lun->readonly) |
| 1687 | check_disk_change(inode->i_bdev); | 1686 | check_disk_change(bdev); |
| 1688 | 1687 | ||
| 1689 | /* | 1688 | /* |
| 1690 | * The sd.c considers ->media_present and ->changed not equivalent, | 1689 | * The sd.c considers ->media_present and ->changed not equivalent, |
| 1691 | * under some pretty murky conditions (a failure of READ CAPACITY). | 1690 | * under some pretty murky conditions (a failure of READ CAPACITY). |
| 1692 | * We may need it one day. | 1691 | * We may need it one day. |
| 1693 | */ | 1692 | */ |
| 1694 | if (lun->removable && lun->changed && !(filp->f_flags & O_NDELAY)) { | 1693 | if (lun->removable && lun->changed && !(mode & FMODE_NDELAY)) { |
| 1695 | rc = -ENOMEDIUM; | 1694 | rc = -ENOMEDIUM; |
| 1696 | goto err_open; | 1695 | goto err_open; |
| 1697 | } | 1696 | } |
| 1698 | 1697 | ||
| 1699 | if (lun->readonly && (filp->f_mode & FMODE_WRITE)) { | 1698 | if (lun->readonly && (mode & FMODE_WRITE)) { |
| 1700 | rc = -EROFS; | 1699 | rc = -EROFS; |
| 1701 | goto err_open; | 1700 | goto err_open; |
| 1702 | } | 1701 | } |
| @@ -1710,9 +1709,8 @@ err_open: | |||
| 1710 | 1709 | ||
| 1711 | /* | 1710 | /* |
| 1712 | */ | 1711 | */ |
| 1713 | static int ub_bd_release(struct inode *inode, struct file *filp) | 1712 | static int ub_bd_release(struct gendisk *disk, fmode_t mode) |
| 1714 | { | 1713 | { |
| 1715 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 1716 | struct ub_lun *lun = disk->private_data; | 1714 | struct ub_lun *lun = disk->private_data; |
| 1717 | struct ub_dev *sc = lun->udev; | 1715 | struct ub_dev *sc = lun->udev; |
| 1718 | 1716 | ||
| @@ -1723,13 +1721,13 @@ static int ub_bd_release(struct inode *inode, struct file *filp) | |||
| 1723 | /* | 1721 | /* |
| 1724 | * The ioctl interface. | 1722 | * The ioctl interface. |
| 1725 | */ | 1723 | */ |
| 1726 | static int ub_bd_ioctl(struct inode *inode, struct file *filp, | 1724 | static int ub_bd_ioctl(struct block_device *bdev, fmode_t mode, |
| 1727 | unsigned int cmd, unsigned long arg) | 1725 | unsigned int cmd, unsigned long arg) |
| 1728 | { | 1726 | { |
| 1729 | struct gendisk *disk = inode->i_bdev->bd_disk; | 1727 | struct gendisk *disk = bdev->bd_disk; |
| 1730 | void __user *usermem = (void __user *) arg; | 1728 | void __user *usermem = (void __user *) arg; |
| 1731 | 1729 | ||
| 1732 | return scsi_cmd_ioctl(filp, disk->queue, disk, cmd, usermem); | 1730 | return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem); |
| 1733 | } | 1731 | } |
| 1734 | 1732 | ||
| 1735 | /* | 1733 | /* |
| @@ -1793,7 +1791,7 @@ static struct block_device_operations ub_bd_fops = { | |||
| 1793 | .owner = THIS_MODULE, | 1791 | .owner = THIS_MODULE, |
| 1794 | .open = ub_bd_open, | 1792 | .open = ub_bd_open, |
| 1795 | .release = ub_bd_release, | 1793 | .release = ub_bd_release, |
| 1796 | .ioctl = ub_bd_ioctl, | 1794 | .locked_ioctl = ub_bd_ioctl, |
| 1797 | .media_changed = ub_bd_media_changed, | 1795 | .media_changed = ub_bd_media_changed, |
| 1798 | .revalidate_disk = ub_bd_revalidate, | 1796 | .revalidate_disk = ub_bd_revalidate, |
| 1799 | }; | 1797 | }; |
diff --git a/drivers/block/viodasd.c b/drivers/block/viodasd.c index 1730d29e6044..ecccf65dce2f 100644 --- a/drivers/block/viodasd.c +++ b/drivers/block/viodasd.c | |||
| @@ -130,15 +130,15 @@ struct viodasd_device { | |||
| 130 | /* | 130 | /* |
| 131 | * External open entry point. | 131 | * External open entry point. |
| 132 | */ | 132 | */ |
| 133 | static int viodasd_open(struct inode *ino, struct file *fil) | 133 | static int viodasd_open(struct block_device *bdev, fmode_t mode) |
| 134 | { | 134 | { |
| 135 | struct viodasd_device *d = ino->i_bdev->bd_disk->private_data; | 135 | struct viodasd_device *d = bdev->bd_disk->private_data; |
| 136 | HvLpEvent_Rc hvrc; | 136 | HvLpEvent_Rc hvrc; |
| 137 | struct viodasd_waitevent we; | 137 | struct viodasd_waitevent we; |
| 138 | u16 flags = 0; | 138 | u16 flags = 0; |
| 139 | 139 | ||
| 140 | if (d->read_only) { | 140 | if (d->read_only) { |
| 141 | if ((fil != NULL) && (fil->f_mode & FMODE_WRITE)) | 141 | if (mode & FMODE_WRITE) |
| 142 | return -EROFS; | 142 | return -EROFS; |
| 143 | flags = vioblockflags_ro; | 143 | flags = vioblockflags_ro; |
| 144 | } | 144 | } |
| @@ -179,9 +179,9 @@ static int viodasd_open(struct inode *ino, struct file *fil) | |||
| 179 | /* | 179 | /* |
| 180 | * External release entry point. | 180 | * External release entry point. |
| 181 | */ | 181 | */ |
| 182 | static int viodasd_release(struct inode *ino, struct file *fil) | 182 | static int viodasd_release(struct gendisk *disk, fmode_t mode) |
| 183 | { | 183 | { |
| 184 | struct viodasd_device *d = ino->i_bdev->bd_disk->private_data; | 184 | struct viodasd_device *d = disk->private_data; |
| 185 | HvLpEvent_Rc hvrc; | 185 | HvLpEvent_Rc hvrc; |
| 186 | 186 | ||
| 187 | /* Send the event to OS/400. We DON'T expect a response */ | 187 | /* Send the event to OS/400. We DON'T expect a response */ |
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 6ec5fc052786..85d79a02d487 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
| @@ -146,11 +146,11 @@ static void do_virtblk_request(struct request_queue *q) | |||
| 146 | vblk->vq->vq_ops->kick(vblk->vq); | 146 | vblk->vq->vq_ops->kick(vblk->vq); |
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | static int virtblk_ioctl(struct inode *inode, struct file *filp, | 149 | static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, |
| 150 | unsigned cmd, unsigned long data) | 150 | unsigned cmd, unsigned long data) |
| 151 | { | 151 | { |
| 152 | return scsi_cmd_ioctl(filp, inode->i_bdev->bd_disk->queue, | 152 | return scsi_cmd_ioctl(bdev->bd_disk->queue, |
| 153 | inode->i_bdev->bd_disk, cmd, | 153 | bdev->bd_disk, mode, cmd, |
| 154 | (void __user *)data); | 154 | (void __user *)data); |
| 155 | } | 155 | } |
| 156 | 156 | ||
| @@ -180,7 +180,7 @@ static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo) | |||
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | static struct block_device_operations virtblk_fops = { | 182 | static struct block_device_operations virtblk_fops = { |
| 183 | .ioctl = virtblk_ioctl, | 183 | .locked_ioctl = virtblk_ioctl, |
| 184 | .owner = THIS_MODULE, | 184 | .owner = THIS_MODULE, |
| 185 | .getgeo = virtblk_getgeo, | 185 | .getgeo = virtblk_getgeo, |
| 186 | }; | 186 | }; |
diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 624d30f7da3f..64b496fce98b 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c | |||
| @@ -132,7 +132,7 @@ static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo); | |||
| 132 | 132 | ||
| 133 | static struct block_device_operations xd_fops = { | 133 | static struct block_device_operations xd_fops = { |
| 134 | .owner = THIS_MODULE, | 134 | .owner = THIS_MODULE, |
| 135 | .ioctl = xd_ioctl, | 135 | .locked_ioctl = xd_ioctl, |
| 136 | .getgeo = xd_getgeo, | 136 | .getgeo = xd_getgeo, |
| 137 | }; | 137 | }; |
| 138 | static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); | 138 | static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); |
| @@ -343,7 +343,7 @@ static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | /* xd_ioctl: handle device ioctl's */ | 345 | /* xd_ioctl: handle device ioctl's */ |
| 346 | static int xd_ioctl (struct inode *inode,struct file *file,u_int cmd,u_long arg) | 346 | static int xd_ioctl(struct block_device *bdev, fmode_t mode, u_int cmd, u_long arg) |
| 347 | { | 347 | { |
| 348 | switch (cmd) { | 348 | switch (cmd) { |
| 349 | case HDIO_SET_DMA: | 349 | case HDIO_SET_DMA: |
diff --git a/drivers/block/xd.h b/drivers/block/xd.h index cffd44a20383..37cacef16e93 100644 --- a/drivers/block/xd.h +++ b/drivers/block/xd.h | |||
| @@ -105,7 +105,7 @@ static u_char xd_detect (u_char *controller, unsigned int *address); | |||
| 105 | static u_char xd_initdrives (void (*init_drive)(u_char drive)); | 105 | static u_char xd_initdrives (void (*init_drive)(u_char drive)); |
| 106 | 106 | ||
| 107 | static void do_xd_request (struct request_queue * q); | 107 | static void do_xd_request (struct request_queue * q); |
| 108 | static int xd_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg); | 108 | static int xd_ioctl (struct block_device *bdev,fmode_t mode,unsigned int cmd,unsigned long arg); |
| 109 | static int xd_readwrite (u_char operation,XD_INFO *disk,char *buffer,u_int block,u_int count); | 109 | static int xd_readwrite (u_char operation,XD_INFO *disk,char *buffer,u_int block,u_int count); |
| 110 | static void xd_recalibrate (u_char drive); | 110 | static void xd_recalibrate (u_char drive); |
| 111 | 111 | ||
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 1a50ae70f716..b220c686089d 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
| @@ -156,11 +156,10 @@ static int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg) | |||
| 156 | return 0; | 156 | return 0; |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | static int blkif_ioctl(struct inode *inode, struct file *filep, | 159 | static int blkif_ioctl(struct block_device *bdev, fmode_t mode, |
| 160 | unsigned command, unsigned long argument) | 160 | unsigned command, unsigned long argument) |
| 161 | { | 161 | { |
| 162 | struct blkfront_info *info = | 162 | struct blkfront_info *info = bdev->bd_disk->private_data; |
| 163 | inode->i_bdev->bd_disk->private_data; | ||
| 164 | int i; | 163 | int i; |
| 165 | 164 | ||
| 166 | dev_dbg(&info->xbdev->dev, "command: 0x%x, argument: 0x%lx\n", | 165 | 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) | |||
| 1014 | return info->is_ready; | 1013 | return info->is_ready; |
| 1015 | } | 1014 | } |
| 1016 | 1015 | ||
| 1017 | static int blkif_open(struct inode *inode, struct file *filep) | 1016 | static int blkif_open(struct block_device *bdev, fmode_t mode) |
| 1018 | { | 1017 | { |
| 1019 | struct blkfront_info *info = inode->i_bdev->bd_disk->private_data; | 1018 | struct blkfront_info *info = bdev->bd_disk->private_data; |
| 1020 | info->users++; | 1019 | info->users++; |
| 1021 | return 0; | 1020 | return 0; |
| 1022 | } | 1021 | } |
| 1023 | 1022 | ||
| 1024 | static int blkif_release(struct inode *inode, struct file *filep) | 1023 | static int blkif_release(struct gendisk *disk, fmode_t mode) |
| 1025 | { | 1024 | { |
| 1026 | struct blkfront_info *info = inode->i_bdev->bd_disk->private_data; | 1025 | struct blkfront_info *info = disk->private_data; |
| 1027 | info->users--; | 1026 | info->users--; |
| 1028 | if (info->users == 0) { | 1027 | if (info->users == 0) { |
| 1029 | /* Check whether we have been instructed to close. We will | 1028 | /* Check whether we have been instructed to close. We will |
| @@ -1044,7 +1043,7 @@ static struct block_device_operations xlvbd_block_fops = | |||
| 1044 | .open = blkif_open, | 1043 | .open = blkif_open, |
| 1045 | .release = blkif_release, | 1044 | .release = blkif_release, |
| 1046 | .getgeo = blkif_getgeo, | 1045 | .getgeo = blkif_getgeo, |
| 1047 | .ioctl = blkif_ioctl, | 1046 | .locked_ioctl = blkif_ioctl, |
| 1048 | }; | 1047 | }; |
| 1049 | 1048 | ||
| 1050 | 1049 | ||
diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c index 4a7a059ebaf7..ecab9e67d47a 100644 --- a/drivers/block/xsysace.c +++ b/drivers/block/xsysace.c | |||
| @@ -870,25 +870,24 @@ static int ace_revalidate_disk(struct gendisk *gd) | |||
| 870 | return ace->id_result; | 870 | return ace->id_result; |
| 871 | } | 871 | } |
| 872 | 872 | ||
| 873 | static int ace_open(struct inode *inode, struct file *filp) | 873 | static int ace_open(struct block_device *bdev, fmode_t mode) |
| 874 | { | 874 | { |
| 875 | struct ace_device *ace = inode->i_bdev->bd_disk->private_data; | 875 | struct ace_device *ace = bdev->bd_disk->private_data; |
| 876 | unsigned long flags; | 876 | unsigned long flags; |
| 877 | 877 | ||
| 878 | dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1); | 878 | dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1); |
| 879 | 879 | ||
| 880 | filp->private_data = ace; | ||
| 881 | spin_lock_irqsave(&ace->lock, flags); | 880 | spin_lock_irqsave(&ace->lock, flags); |
| 882 | ace->users++; | 881 | ace->users++; |
| 883 | spin_unlock_irqrestore(&ace->lock, flags); | 882 | spin_unlock_irqrestore(&ace->lock, flags); |
| 884 | 883 | ||
| 885 | check_disk_change(inode->i_bdev); | 884 | check_disk_change(bdev); |
| 886 | return 0; | 885 | return 0; |
| 887 | } | 886 | } |
| 888 | 887 | ||
| 889 | static int ace_release(struct inode *inode, struct file *filp) | 888 | static int ace_release(struct gendisk *disk, fmode_t mode) |
| 890 | { | 889 | { |
| 891 | struct ace_device *ace = inode->i_bdev->bd_disk->private_data; | 890 | struct ace_device *ace = disk->private_data; |
| 892 | unsigned long flags; | 891 | unsigned long flags; |
| 893 | u16 val; | 892 | u16 val; |
| 894 | 893 | ||
diff --git a/drivers/block/z2ram.c b/drivers/block/z2ram.c index be20a67f1fa8..80754cdd3119 100644 --- a/drivers/block/z2ram.c +++ b/drivers/block/z2ram.c | |||
| @@ -137,8 +137,7 @@ get_chipram( void ) | |||
| 137 | return; | 137 | return; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | static int | 140 | static int z2_open(struct block_device *bdev, fmode_t mode) |
| 141 | z2_open( struct inode *inode, struct file *filp ) | ||
| 142 | { | 141 | { |
| 143 | int device; | 142 | int device; |
| 144 | int max_z2_map = ( Z2RAM_SIZE / Z2RAM_CHUNKSIZE ) * | 143 | int max_z2_map = ( Z2RAM_SIZE / Z2RAM_CHUNKSIZE ) * |
| @@ -147,7 +146,7 @@ z2_open( struct inode *inode, struct file *filp ) | |||
| 147 | sizeof( z2ram_map[0] ); | 146 | sizeof( z2ram_map[0] ); |
| 148 | int rc = -ENOMEM; | 147 | int rc = -ENOMEM; |
| 149 | 148 | ||
| 150 | device = iminor(inode); | 149 | device = MINOR(bdev->bd_dev); |
| 151 | 150 | ||
| 152 | if ( current_device != -1 && current_device != device ) | 151 | if ( current_device != -1 && current_device != device ) |
| 153 | { | 152 | { |
| @@ -299,7 +298,7 @@ err_out: | |||
| 299 | } | 298 | } |
| 300 | 299 | ||
| 301 | static int | 300 | static int |
| 302 | z2_release( struct inode *inode, struct file *filp ) | 301 | z2_release(struct gendisk *disk, fmode_t mode) |
| 303 | { | 302 | { |
| 304 | if ( current_device == -1 ) | 303 | if ( current_device == -1 ) |
| 305 | return 0; | 304 | return 0; |
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index d47f2f80accd..d16b02423d61 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
| @@ -973,7 +973,7 @@ static int cdrom_close_write(struct cdrom_device_info *cdi) | |||
| 973 | * is in their own interest: device control becomes a lot easier | 973 | * is in their own interest: device control becomes a lot easier |
| 974 | * this way. | 974 | * this way. |
| 975 | */ | 975 | */ |
| 976 | int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp) | 976 | int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev, fmode_t mode) |
| 977 | { | 977 | { |
| 978 | int ret; | 978 | int ret; |
| 979 | 979 | ||
| @@ -982,14 +982,14 @@ int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp) | |||
| 982 | /* if this was a O_NONBLOCK open and we should honor the flags, | 982 | /* if this was a O_NONBLOCK open and we should honor the flags, |
| 983 | * do a quick open without drive/disc integrity checks. */ | 983 | * do a quick open without drive/disc integrity checks. */ |
| 984 | cdi->use_count++; | 984 | cdi->use_count++; |
| 985 | if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) { | 985 | if ((mode & FMODE_NDELAY) && (cdi->options & CDO_USE_FFLAGS)) { |
| 986 | ret = cdi->ops->open(cdi, 1); | 986 | ret = cdi->ops->open(cdi, 1); |
| 987 | } else { | 987 | } else { |
| 988 | ret = open_for_data(cdi); | 988 | ret = open_for_data(cdi); |
| 989 | if (ret) | 989 | if (ret) |
| 990 | goto err; | 990 | goto err; |
| 991 | cdrom_mmc3_profile(cdi); | 991 | cdrom_mmc3_profile(cdi); |
| 992 | if (fp->f_mode & FMODE_WRITE) { | 992 | if (mode & FMODE_WRITE) { |
| 993 | ret = -EROFS; | 993 | ret = -EROFS; |
| 994 | if (cdrom_open_write(cdi)) | 994 | if (cdrom_open_write(cdi)) |
| 995 | goto err_release; | 995 | goto err_release; |
| @@ -1007,7 +1007,7 @@ int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp) | |||
| 1007 | cdi->name, cdi->use_count); | 1007 | cdi->name, cdi->use_count); |
| 1008 | /* Do this on open. Don't wait for mount, because they might | 1008 | /* Do this on open. Don't wait for mount, because they might |
| 1009 | not be mounting, but opening with O_NONBLOCK */ | 1009 | not be mounting, but opening with O_NONBLOCK */ |
| 1010 | check_disk_change(ip->i_bdev); | 1010 | check_disk_change(bdev); |
| 1011 | return 0; | 1011 | return 0; |
| 1012 | err_release: | 1012 | err_release: |
| 1013 | if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) { | 1013 | if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) { |
| @@ -1184,7 +1184,7 @@ static int check_for_audio_disc(struct cdrom_device_info * cdi, | |||
| 1184 | return 0; | 1184 | return 0; |
| 1185 | } | 1185 | } |
| 1186 | 1186 | ||
| 1187 | int cdrom_release(struct cdrom_device_info *cdi, struct file *fp) | 1187 | void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode) |
| 1188 | { | 1188 | { |
| 1189 | struct cdrom_device_ops *cdo = cdi->ops; | 1189 | struct cdrom_device_ops *cdo = cdi->ops; |
| 1190 | int opened_for_data; | 1190 | int opened_for_data; |
| @@ -1205,7 +1205,7 @@ int cdrom_release(struct cdrom_device_info *cdi, struct file *fp) | |||
| 1205 | } | 1205 | } |
| 1206 | 1206 | ||
| 1207 | opened_for_data = !(cdi->options & CDO_USE_FFLAGS) || | 1207 | opened_for_data = !(cdi->options & CDO_USE_FFLAGS) || |
| 1208 | !(fp && fp->f_flags & O_NONBLOCK); | 1208 | !(mode & FMODE_NDELAY); |
| 1209 | 1209 | ||
| 1210 | /* | 1210 | /* |
| 1211 | * flush cache on last write release | 1211 | * flush cache on last write release |
| @@ -1219,7 +1219,6 @@ int cdrom_release(struct cdrom_device_info *cdi, struct file *fp) | |||
| 1219 | cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY)) | 1219 | cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY)) |
| 1220 | cdo->tray_move(cdi, 1); | 1220 | cdo->tray_move(cdi, 1); |
| 1221 | } | 1221 | } |
| 1222 | return 0; | ||
| 1223 | } | 1222 | } |
| 1224 | 1223 | ||
| 1225 | static int cdrom_read_mech_status(struct cdrom_device_info *cdi, | 1224 | 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, | |||
| 2662 | * these days. | 2661 | * these days. |
| 2663 | * ATAPI / SCSI specific code now mainly resides in mmc_ioctl(). | 2662 | * ATAPI / SCSI specific code now mainly resides in mmc_ioctl(). |
| 2664 | */ | 2663 | */ |
| 2665 | int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi, | 2664 | int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev, |
| 2666 | struct inode *ip, unsigned int cmd, unsigned long arg) | 2665 | fmode_t mode, unsigned int cmd, unsigned long arg) |
| 2667 | { | 2666 | { |
| 2668 | void __user *argp = (void __user *)arg; | 2667 | void __user *argp = (void __user *)arg; |
| 2669 | int ret; | 2668 | int ret; |
| 2670 | struct gendisk *disk = ip->i_bdev->bd_disk; | 2669 | struct gendisk *disk = bdev->bd_disk; |
| 2671 | 2670 | ||
| 2672 | /* | 2671 | /* |
| 2673 | * Try the generic SCSI command ioctl's first. | 2672 | * Try the generic SCSI command ioctl's first. |
| 2674 | */ | 2673 | */ |
| 2675 | ret = scsi_cmd_ioctl(file, disk->queue, disk, cmd, argp); | 2674 | ret = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp); |
| 2676 | if (ret != -ENOTTY) | 2675 | if (ret != -ENOTTY) |
| 2677 | return ret; | 2676 | return ret; |
| 2678 | 2677 | ||
| @@ -2696,7 +2695,7 @@ int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi, | |||
| 2696 | case CDROM_SELECT_DISC: | 2695 | case CDROM_SELECT_DISC: |
| 2697 | return cdrom_ioctl_select_disc(cdi, arg); | 2696 | return cdrom_ioctl_select_disc(cdi, arg); |
| 2698 | case CDROMRESET: | 2697 | case CDROMRESET: |
| 2699 | return cdrom_ioctl_reset(cdi, ip->i_bdev); | 2698 | return cdrom_ioctl_reset(cdi, bdev); |
| 2700 | case CDROM_LOCKDOOR: | 2699 | case CDROM_LOCKDOOR: |
| 2701 | return cdrom_ioctl_lock_door(cdi, arg); | 2700 | return cdrom_ioctl_lock_door(cdi, arg); |
| 2702 | case CDROM_DEBUG: | 2701 | case CDROM_DEBUG: |
diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c index d6ba77a2dd7b..9aaa86b232b1 100644 --- a/drivers/cdrom/gdrom.c +++ b/drivers/cdrom/gdrom.c | |||
| @@ -490,14 +490,14 @@ static struct cdrom_device_ops gdrom_ops = { | |||
| 490 | .n_minors = 1, | 490 | .n_minors = 1, |
| 491 | }; | 491 | }; |
| 492 | 492 | ||
| 493 | static int gdrom_bdops_open(struct inode *inode, struct file *file) | 493 | static int gdrom_bdops_open(struct block_device *bdev, fmode_t mode) |
| 494 | { | 494 | { |
| 495 | return cdrom_open(gd.cd_info, inode, file); | 495 | return cdrom_open(gd.cd_info, bdev, mode); |
| 496 | } | 496 | } |
| 497 | 497 | ||
| 498 | static int gdrom_bdops_release(struct inode *inode, struct file *file) | 498 | static int gdrom_bdops_release(struct block_device *bdev, fmode_t mode) |
| 499 | { | 499 | { |
| 500 | return cdrom_release(gd.cd_info, file); | 500 | return cdrom_release(gd.cd_info, mode); |
| 501 | } | 501 | } |
| 502 | 502 | ||
| 503 | static int gdrom_bdops_mediachanged(struct gendisk *disk) | 503 | static int gdrom_bdops_mediachanged(struct gendisk *disk) |
| @@ -505,10 +505,10 @@ static int gdrom_bdops_mediachanged(struct gendisk *disk) | |||
| 505 | return cdrom_media_changed(gd.cd_info); | 505 | return cdrom_media_changed(gd.cd_info); |
| 506 | } | 506 | } |
| 507 | 507 | ||
| 508 | static int gdrom_bdops_ioctl(struct inode *inode, struct file *file, | 508 | static int gdrom_bdops_ioctl(struct block_device *bdev, fmode_t mode, |
| 509 | unsigned cmd, unsigned long arg) | 509 | unsigned cmd, unsigned long arg) |
| 510 | { | 510 | { |
| 511 | return cdrom_ioctl(file, gd.cd_info, inode, cmd, arg); | 511 | return cdrom_ioctl(gd.cd_info, bdev, mode, cmd, arg); |
| 512 | } | 512 | } |
| 513 | 513 | ||
| 514 | static struct block_device_operations gdrom_bdops = { | 514 | static struct block_device_operations gdrom_bdops = { |
| @@ -516,7 +516,7 @@ static struct block_device_operations gdrom_bdops = { | |||
| 516 | .open = gdrom_bdops_open, | 516 | .open = gdrom_bdops_open, |
| 517 | .release = gdrom_bdops_release, | 517 | .release = gdrom_bdops_release, |
| 518 | .media_changed = gdrom_bdops_mediachanged, | 518 | .media_changed = gdrom_bdops_mediachanged, |
| 519 | .ioctl = gdrom_bdops_ioctl, | 519 | .locked_ioctl = gdrom_bdops_ioctl, |
| 520 | }; | 520 | }; |
| 521 | 521 | ||
| 522 | static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id) | 522 | static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id) |
diff --git a/drivers/cdrom/viocd.c b/drivers/cdrom/viocd.c index 031e0e1a1a3b..13929356135c 100644 --- a/drivers/cdrom/viocd.c +++ b/drivers/cdrom/viocd.c | |||
| @@ -151,23 +151,24 @@ static const struct file_operations proc_viocd_operations = { | |||
| 151 | .release = single_release, | 151 | .release = single_release, |
| 152 | }; | 152 | }; |
| 153 | 153 | ||
| 154 | static int viocd_blk_open(struct inode *inode, struct file *file) | 154 | static int viocd_blk_open(struct block_device *bdev, fmode_t mode) |
| 155 | { | 155 | { |
| 156 | struct disk_info *di = inode->i_bdev->bd_disk->private_data; | 156 | struct disk_info *di = bdev->bd_disk->private_data; |
| 157 | return cdrom_open(&di->viocd_info, inode, file); | 157 | return cdrom_open(&di->viocd_info, bdev, mode); |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | static int viocd_blk_release(struct inode *inode, struct file *file) | 160 | static int viocd_blk_release(struct gendisk *disk, fmode_t mode) |
| 161 | { | 161 | { |
| 162 | struct disk_info *di = inode->i_bdev->bd_disk->private_data; | 162 | struct disk_info *di = disk->private_data; |
| 163 | return cdrom_release(&di->viocd_info, file); | 163 | cdrom_release(&di->viocd_info, mode); |
| 164 | return 0; | ||
| 164 | } | 165 | } |
| 165 | 166 | ||
| 166 | static int viocd_blk_ioctl(struct inode *inode, struct file *file, | 167 | static int viocd_blk_ioctl(struct block_device *bdev, fmode_t mode, |
| 167 | unsigned cmd, unsigned long arg) | 168 | unsigned cmd, unsigned long arg) |
| 168 | { | 169 | { |
| 169 | struct disk_info *di = inode->i_bdev->bd_disk->private_data; | 170 | struct disk_info *di = bdev->bd_disk->private_data; |
| 170 | return cdrom_ioctl(file, &di->viocd_info, inode, cmd, arg); | 171 | return cdrom_ioctl(&di->viocd_info, bdev, mode, cmd, arg); |
| 171 | } | 172 | } |
| 172 | 173 | ||
| 173 | static int viocd_blk_media_changed(struct gendisk *disk) | 174 | static int viocd_blk_media_changed(struct gendisk *disk) |
| @@ -180,7 +181,7 @@ struct block_device_operations viocd_fops = { | |||
| 180 | .owner = THIS_MODULE, | 181 | .owner = THIS_MODULE, |
| 181 | .open = viocd_blk_open, | 182 | .open = viocd_blk_open, |
| 182 | .release = viocd_blk_release, | 183 | .release = viocd_blk_release, |
| 183 | .ioctl = viocd_blk_ioctl, | 184 | .locked_ioctl = viocd_blk_ioctl, |
| 184 | .media_changed = viocd_blk_media_changed, | 185 | .media_changed = viocd_blk_media_changed, |
| 185 | }; | 186 | }; |
| 186 | 187 | ||
diff --git a/drivers/char/nvram.c b/drivers/char/nvram.c index 39f6357e3b5d..8054ee839b3c 100644 --- a/drivers/char/nvram.c +++ b/drivers/char/nvram.c | |||
| @@ -338,7 +338,7 @@ nvram_open(struct inode *inode, struct file *file) | |||
| 338 | 338 | ||
| 339 | if ((nvram_open_cnt && (file->f_flags & O_EXCL)) || | 339 | if ((nvram_open_cnt && (file->f_flags & O_EXCL)) || |
| 340 | (nvram_open_mode & NVRAM_EXCL) || | 340 | (nvram_open_mode & NVRAM_EXCL) || |
| 341 | ((file->f_mode & 2) && (nvram_open_mode & NVRAM_WRITE))) { | 341 | ((file->f_mode & FMODE_WRITE) && (nvram_open_mode & NVRAM_WRITE))) { |
| 342 | spin_unlock(&nvram_state_lock); | 342 | spin_unlock(&nvram_state_lock); |
| 343 | unlock_kernel(); | 343 | unlock_kernel(); |
| 344 | return -EBUSY; | 344 | return -EBUSY; |
| @@ -346,7 +346,7 @@ nvram_open(struct inode *inode, struct file *file) | |||
| 346 | 346 | ||
| 347 | if (file->f_flags & O_EXCL) | 347 | if (file->f_flags & O_EXCL) |
| 348 | nvram_open_mode |= NVRAM_EXCL; | 348 | nvram_open_mode |= NVRAM_EXCL; |
| 349 | if (file->f_mode & 2) | 349 | if (file->f_mode & FMODE_WRITE) |
| 350 | nvram_open_mode |= NVRAM_WRITE; | 350 | nvram_open_mode |= NVRAM_WRITE; |
| 351 | nvram_open_cnt++; | 351 | nvram_open_cnt++; |
| 352 | 352 | ||
| @@ -366,7 +366,7 @@ nvram_release(struct inode *inode, struct file *file) | |||
| 366 | /* if only one instance is open, clear the EXCL bit */ | 366 | /* if only one instance is open, clear the EXCL bit */ |
| 367 | if (nvram_open_mode & NVRAM_EXCL) | 367 | if (nvram_open_mode & NVRAM_EXCL) |
| 368 | nvram_open_mode &= ~NVRAM_EXCL; | 368 | nvram_open_mode &= ~NVRAM_EXCL; |
| 369 | if (file->f_mode & 2) | 369 | if (file->f_mode & FMODE_WRITE) |
| 370 | nvram_open_mode &= ~NVRAM_WRITE; | 370 | nvram_open_mode &= ~NVRAM_WRITE; |
| 371 | 371 | ||
| 372 | spin_unlock(&nvram_state_lock); | 372 | spin_unlock(&nvram_state_lock); |
diff --git a/drivers/char/raw.c b/drivers/char/raw.c index e139372d0e69..96adf28a17e4 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c | |||
| @@ -65,7 +65,7 @@ static int raw_open(struct inode *inode, struct file *filp) | |||
| 65 | if (!bdev) | 65 | if (!bdev) |
| 66 | goto out; | 66 | goto out; |
| 67 | igrab(bdev->bd_inode); | 67 | igrab(bdev->bd_inode); |
| 68 | err = blkdev_get(bdev, filp->f_mode, 0); | 68 | err = blkdev_get(bdev, filp->f_mode); |
| 69 | if (err) | 69 | if (err) |
| 70 | goto out; | 70 | goto out; |
| 71 | err = bd_claim(bdev, raw_open); | 71 | err = bd_claim(bdev, raw_open); |
| @@ -87,7 +87,7 @@ static int raw_open(struct inode *inode, struct file *filp) | |||
| 87 | out2: | 87 | out2: |
| 88 | bd_release(bdev); | 88 | bd_release(bdev); |
| 89 | out1: | 89 | out1: |
| 90 | blkdev_put(bdev); | 90 | blkdev_put(bdev, filp->f_mode); |
| 91 | out: | 91 | out: |
| 92 | mutex_unlock(&raw_mutex); | 92 | mutex_unlock(&raw_mutex); |
| 93 | return err; | 93 | return err; |
| @@ -112,7 +112,7 @@ static int raw_release(struct inode *inode, struct file *filp) | |||
| 112 | mutex_unlock(&raw_mutex); | 112 | mutex_unlock(&raw_mutex); |
| 113 | 113 | ||
| 114 | bd_release(bdev); | 114 | bd_release(bdev); |
| 115 | blkdev_put(bdev); | 115 | blkdev_put(bdev, filp->f_mode); |
| 116 | return 0; | 116 | return 0; |
| 117 | } | 117 | } |
| 118 | 118 | ||
| @@ -125,7 +125,7 @@ raw_ioctl(struct inode *inode, struct file *filp, | |||
| 125 | { | 125 | { |
| 126 | struct block_device *bdev = filp->private_data; | 126 | struct block_device *bdev = filp->private_data; |
| 127 | 127 | ||
| 128 | return blkdev_ioctl(bdev->bd_inode, NULL, command, arg); | 128 | return blkdev_ioctl(bdev, 0, command, arg); |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | static void bind_device(struct raw_config_request *rq) | 131 | static void bind_device(struct raw_config_request *rq) |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 13265a8827da..133afd09843c 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
| @@ -2089,17 +2089,15 @@ static ide_driver_t ide_cdrom_driver = { | |||
| 2089 | #endif | 2089 | #endif |
| 2090 | }; | 2090 | }; |
| 2091 | 2091 | ||
| 2092 | static int idecd_open(struct inode *inode, struct file *file) | 2092 | static int idecd_open(struct block_device *bdev, fmode_t mode) |
| 2093 | { | 2093 | { |
| 2094 | struct gendisk *disk = inode->i_bdev->bd_disk; | 2094 | struct cdrom_info *info = ide_cd_get(bdev->bd_disk); |
| 2095 | struct cdrom_info *info; | ||
| 2096 | int rc = -ENOMEM; | 2095 | int rc = -ENOMEM; |
| 2097 | 2096 | ||
| 2098 | info = ide_cd_get(disk); | ||
| 2099 | if (!info) | 2097 | if (!info) |
| 2100 | return -ENXIO; | 2098 | return -ENXIO; |
| 2101 | 2099 | ||
| 2102 | rc = cdrom_open(&info->devinfo, inode, file); | 2100 | rc = cdrom_open(&info->devinfo, bdev, mode); |
| 2103 | 2101 | ||
| 2104 | if (rc < 0) | 2102 | if (rc < 0) |
| 2105 | ide_cd_put(info); | 2103 | ide_cd_put(info); |
| @@ -2107,12 +2105,11 @@ static int idecd_open(struct inode *inode, struct file *file) | |||
| 2107 | return rc; | 2105 | return rc; |
| 2108 | } | 2106 | } |
| 2109 | 2107 | ||
| 2110 | static int idecd_release(struct inode *inode, struct file *file) | 2108 | static int idecd_release(struct gendisk *disk, fmode_t mode) |
| 2111 | { | 2109 | { |
| 2112 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 2113 | struct cdrom_info *info = ide_drv_g(disk, cdrom_info); | 2110 | struct cdrom_info *info = ide_drv_g(disk, cdrom_info); |
| 2114 | 2111 | ||
| 2115 | cdrom_release(&info->devinfo, file); | 2112 | cdrom_release(&info->devinfo, mode); |
| 2116 | 2113 | ||
| 2117 | ide_cd_put(info); | 2114 | ide_cd_put(info); |
| 2118 | 2115 | ||
| @@ -2158,10 +2155,9 @@ static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg) | |||
| 2158 | return 0; | 2155 | return 0; |
| 2159 | } | 2156 | } |
| 2160 | 2157 | ||
| 2161 | static int idecd_ioctl(struct inode *inode, struct file *file, | 2158 | static int idecd_ioctl(struct block_device *bdev, fmode_t mode, |
| 2162 | unsigned int cmd, unsigned long arg) | 2159 | unsigned int cmd, unsigned long arg) |
| 2163 | { | 2160 | { |
| 2164 | struct block_device *bdev = inode->i_bdev; | ||
| 2165 | struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info); | 2161 | struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info); |
| 2166 | int err; | 2162 | int err; |
| 2167 | 2163 | ||
| @@ -2174,9 +2170,9 @@ static int idecd_ioctl(struct inode *inode, struct file *file, | |||
| 2174 | break; | 2170 | break; |
| 2175 | } | 2171 | } |
| 2176 | 2172 | ||
| 2177 | err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg); | 2173 | err = generic_ide_ioctl(info->drive, bdev, cmd, arg); |
| 2178 | if (err == -EINVAL) | 2174 | if (err == -EINVAL) |
| 2179 | err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg); | 2175 | err = cdrom_ioctl(&info->devinfo, bdev, mode, cmd, arg); |
| 2180 | 2176 | ||
| 2181 | return err; | 2177 | return err; |
| 2182 | } | 2178 | } |
| @@ -2201,7 +2197,7 @@ static struct block_device_operations idecd_ops = { | |||
| 2201 | .owner = THIS_MODULE, | 2197 | .owner = THIS_MODULE, |
| 2202 | .open = idecd_open, | 2198 | .open = idecd_open, |
| 2203 | .release = idecd_release, | 2199 | .release = idecd_release, |
| 2204 | .ioctl = idecd_ioctl, | 2200 | .locked_ioctl = idecd_ioctl, |
| 2205 | .media_changed = idecd_media_changed, | 2201 | .media_changed = idecd_media_changed, |
| 2206 | .revalidate_disk = idecd_revalidate_disk | 2202 | .revalidate_disk = idecd_revalidate_disk |
| 2207 | }; | 2203 | }; |
diff --git a/drivers/ide/ide-disk.h b/drivers/ide/ide-disk.h index b234b0feaf7b..d511dab7c4aa 100644 --- a/drivers/ide/ide-disk.h +++ b/drivers/ide/ide-disk.h | |||
| @@ -13,7 +13,7 @@ ide_decl_devset(wcache); | |||
| 13 | ide_decl_devset(acoustic); | 13 | ide_decl_devset(acoustic); |
| 14 | 14 | ||
| 15 | /* ide-disk_ioctl.c */ | 15 | /* ide-disk_ioctl.c */ |
| 16 | int ide_disk_ioctl(ide_drive_t *, struct inode *, struct file *, unsigned int, | 16 | int ide_disk_ioctl(ide_drive_t *, struct block_device *, fmode_t, unsigned int, |
| 17 | unsigned long); | 17 | unsigned long); |
| 18 | 18 | ||
| 19 | #ifdef CONFIG_IDE_PROC_FS | 19 | #ifdef CONFIG_IDE_PROC_FS |
diff --git a/drivers/ide/ide-disk_ioctl.c b/drivers/ide/ide-disk_ioctl.c index a49698bcf966..7b783dd7c0be 100644 --- a/drivers/ide/ide-disk_ioctl.c +++ b/drivers/ide/ide-disk_ioctl.c | |||
| @@ -13,15 +13,14 @@ static const struct ide_ioctl_devset ide_disk_ioctl_settings[] = { | |||
| 13 | { 0 } | 13 | { 0 } |
| 14 | }; | 14 | }; |
| 15 | 15 | ||
| 16 | int ide_disk_ioctl(ide_drive_t *drive, struct inode *inode, struct file *file, | 16 | int ide_disk_ioctl(ide_drive_t *drive, struct block_device *bdev, fmode_t mode, |
| 17 | unsigned int cmd, unsigned long arg) | 17 | unsigned int cmd, unsigned long arg) |
| 18 | { | 18 | { |
| 19 | struct block_device *bdev = inode->i_bdev; | ||
| 20 | int err; | 19 | int err; |
| 21 | 20 | ||
| 22 | err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings); | 21 | err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings); |
| 23 | if (err != -EOPNOTSUPP) | 22 | if (err != -EOPNOTSUPP) |
| 24 | return err; | 23 | return err; |
| 25 | 24 | ||
| 26 | return generic_ide_ioctl(drive, file, bdev, cmd, arg); | 25 | return generic_ide_ioctl(drive, bdev, cmd, arg); |
| 27 | } | 26 | } |
diff --git a/drivers/ide/ide-floppy.h b/drivers/ide/ide-floppy.h index c17124dd6079..6dd2beb48434 100644 --- a/drivers/ide/ide-floppy.h +++ b/drivers/ide/ide-floppy.h | |||
| @@ -23,8 +23,8 @@ void ide_floppy_create_mode_sense_cmd(struct ide_atapi_pc *, u8); | |||
| 23 | void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *); | 23 | void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *); |
| 24 | 24 | ||
| 25 | /* ide-floppy_ioctl.c */ | 25 | /* ide-floppy_ioctl.c */ |
| 26 | int ide_floppy_ioctl(ide_drive_t *, struct inode *, struct file *, unsigned int, | 26 | int ide_floppy_ioctl(ide_drive_t *, struct block_device *, fmode_t, |
| 27 | unsigned long); | 27 | unsigned int, unsigned long); |
| 28 | 28 | ||
| 29 | #ifdef CONFIG_IDE_PROC_FS | 29 | #ifdef CONFIG_IDE_PROC_FS |
| 30 | /* ide-floppy_proc.c */ | 30 | /* ide-floppy_proc.c */ |
diff --git a/drivers/ide/ide-floppy_ioctl.c b/drivers/ide/ide-floppy_ioctl.c index 409e4c15f9b7..2bc51ff73fee 100644 --- a/drivers/ide/ide-floppy_ioctl.c +++ b/drivers/ide/ide-floppy_ioctl.c | |||
| @@ -241,7 +241,7 @@ static int ide_floppy_lockdoor(ide_drive_t *drive, struct ide_atapi_pc *pc, | |||
| 241 | return 0; | 241 | return 0; |
| 242 | } | 242 | } |
| 243 | 243 | ||
| 244 | static int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file, | 244 | static int ide_floppy_format_ioctl(ide_drive_t *drive, fmode_t mode, |
| 245 | unsigned int cmd, void __user *argp) | 245 | unsigned int cmd, void __user *argp) |
| 246 | { | 246 | { |
| 247 | switch (cmd) { | 247 | switch (cmd) { |
| @@ -250,7 +250,7 @@ static int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file, | |||
| 250 | case IDEFLOPPY_IOCTL_FORMAT_GET_CAPACITY: | 250 | case IDEFLOPPY_IOCTL_FORMAT_GET_CAPACITY: |
| 251 | return ide_floppy_get_format_capacities(drive, argp); | 251 | return ide_floppy_get_format_capacities(drive, argp); |
| 252 | case IDEFLOPPY_IOCTL_FORMAT_START: | 252 | case IDEFLOPPY_IOCTL_FORMAT_START: |
| 253 | if (!(file->f_mode & 2)) | 253 | if (!(mode & FMODE_WRITE)) |
| 254 | return -EPERM; | 254 | return -EPERM; |
| 255 | return ide_floppy_format_unit(drive, (int __user *)argp); | 255 | return ide_floppy_format_unit(drive, (int __user *)argp); |
| 256 | case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS: | 256 | case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS: |
| @@ -260,10 +260,9 @@ static int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file, | |||
| 260 | } | 260 | } |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | int ide_floppy_ioctl(ide_drive_t *drive, struct inode *inode, | 263 | int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev, |
| 264 | struct file *file, unsigned int cmd, unsigned long arg) | 264 | fmode_t mode, unsigned int cmd, unsigned long arg) |
| 265 | { | 265 | { |
| 266 | struct block_device *bdev = inode->i_bdev; | ||
| 267 | struct ide_atapi_pc pc; | 266 | struct ide_atapi_pc pc; |
| 268 | void __user *argp = (void __user *)arg; | 267 | void __user *argp = (void __user *)arg; |
| 269 | int err; | 268 | int err; |
| @@ -271,7 +270,7 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct inode *inode, | |||
| 271 | if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) | 270 | if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) |
| 272 | return ide_floppy_lockdoor(drive, &pc, arg, cmd); | 271 | return ide_floppy_lockdoor(drive, &pc, arg, cmd); |
| 273 | 272 | ||
| 274 | err = ide_floppy_format_ioctl(drive, file, cmd, argp); | 273 | err = ide_floppy_format_ioctl(drive, mode, cmd, argp); |
| 275 | if (err != -ENOTTY) | 274 | if (err != -ENOTTY) |
| 276 | return err; | 275 | return err; |
| 277 | 276 | ||
| @@ -280,11 +279,11 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct inode *inode, | |||
| 280 | * and CDROM_SEND_PACKET (legacy) ioctls | 279 | * and CDROM_SEND_PACKET (legacy) ioctls |
| 281 | */ | 280 | */ |
| 282 | if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND) | 281 | if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND) |
| 283 | err = scsi_cmd_ioctl(file, bdev->bd_disk->queue, | 282 | err = scsi_cmd_ioctl(bdev->bd_disk->queue, bdev->bd_disk, |
| 284 | bdev->bd_disk, cmd, argp); | 283 | mode, cmd, argp); |
| 285 | 284 | ||
| 286 | if (err == -ENOTTY) | 285 | if (err == -ENOTTY) |
| 287 | err = generic_ide_ioctl(drive, file, bdev, cmd, arg); | 286 | err = generic_ide_ioctl(drive, bdev, cmd, arg); |
| 288 | 287 | ||
| 289 | return err; | 288 | return err; |
| 290 | } | 289 | } |
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c index d44898f46c33..7b6662854374 100644 --- a/drivers/ide/ide-gd.c +++ b/drivers/ide/ide-gd.c | |||
| @@ -169,9 +169,9 @@ static ide_driver_t ide_gd_driver = { | |||
| 169 | #endif | 169 | #endif |
| 170 | }; | 170 | }; |
| 171 | 171 | ||
| 172 | static int ide_gd_open(struct inode *inode, struct file *filp) | 172 | static int ide_gd_open(struct block_device *bdev, fmode_t mode) |
| 173 | { | 173 | { |
| 174 | struct gendisk *disk = inode->i_bdev->bd_disk; | 174 | struct gendisk *disk = bdev->bd_disk; |
| 175 | struct ide_disk_obj *idkp; | 175 | struct ide_disk_obj *idkp; |
| 176 | ide_drive_t *drive; | 176 | ide_drive_t *drive; |
| 177 | int ret = 0; | 177 | int ret = 0; |
| @@ -197,12 +197,12 @@ static int ide_gd_open(struct inode *inode, struct file *filp) | |||
| 197 | * unreadable disk, so that we can get the format capacity | 197 | * unreadable disk, so that we can get the format capacity |
| 198 | * of the drive or begin the format - Sam | 198 | * of the drive or begin the format - Sam |
| 199 | */ | 199 | */ |
| 200 | if (ret && (filp->f_flags & O_NDELAY) == 0) { | 200 | if (ret && (mode & FMODE_NDELAY) == 0) { |
| 201 | ret = -EIO; | 201 | ret = -EIO; |
| 202 | goto out_put_idkp; | 202 | goto out_put_idkp; |
| 203 | } | 203 | } |
| 204 | 204 | ||
| 205 | if ((drive->dev_flags & IDE_DFLAG_WP) && (filp->f_mode & 2)) { | 205 | if ((drive->dev_flags & IDE_DFLAG_WP) && (mode & FMODE_WRITE)) { |
| 206 | ret = -EROFS; | 206 | ret = -EROFS; |
| 207 | goto out_put_idkp; | 207 | goto out_put_idkp; |
| 208 | } | 208 | } |
| @@ -214,7 +214,7 @@ static int ide_gd_open(struct inode *inode, struct file *filp) | |||
| 214 | */ | 214 | */ |
| 215 | drive->disk_ops->set_doorlock(drive, disk, 1); | 215 | drive->disk_ops->set_doorlock(drive, disk, 1); |
| 216 | drive->dev_flags |= IDE_DFLAG_MEDIA_CHANGED; | 216 | drive->dev_flags |= IDE_DFLAG_MEDIA_CHANGED; |
| 217 | check_disk_change(inode->i_bdev); | 217 | check_disk_change(bdev); |
| 218 | } else if (drive->dev_flags & IDE_DFLAG_FORMAT_IN_PROGRESS) { | 218 | } else if (drive->dev_flags & IDE_DFLAG_FORMAT_IN_PROGRESS) { |
| 219 | ret = -EBUSY; | 219 | ret = -EBUSY; |
| 220 | goto out_put_idkp; | 220 | goto out_put_idkp; |
| @@ -227,9 +227,8 @@ out_put_idkp: | |||
| 227 | return ret; | 227 | return ret; |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | static int ide_gd_release(struct inode *inode, struct file *filp) | 230 | static int ide_gd_release(struct gendisk *disk, fmode_t mode) |
| 231 | { | 231 | { |
| 232 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 233 | struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj); | 232 | struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj); |
| 234 | ide_drive_t *drive = idkp->drive; | 233 | ide_drive_t *drive = idkp->drive; |
| 235 | 234 | ||
| @@ -286,21 +285,20 @@ static int ide_gd_revalidate_disk(struct gendisk *disk) | |||
| 286 | return 0; | 285 | return 0; |
| 287 | } | 286 | } |
| 288 | 287 | ||
| 289 | static int ide_gd_ioctl(struct inode *inode, struct file *file, | 288 | static int ide_gd_ioctl(struct block_device *bdev, fmode_t mode, |
| 290 | unsigned int cmd, unsigned long arg) | 289 | unsigned int cmd, unsigned long arg) |
| 291 | { | 290 | { |
| 292 | struct block_device *bdev = inode->i_bdev; | ||
| 293 | struct ide_disk_obj *idkp = ide_drv_g(bdev->bd_disk, ide_disk_obj); | 291 | struct ide_disk_obj *idkp = ide_drv_g(bdev->bd_disk, ide_disk_obj); |
| 294 | ide_drive_t *drive = idkp->drive; | 292 | ide_drive_t *drive = idkp->drive; |
| 295 | 293 | ||
| 296 | return drive->disk_ops->ioctl(drive, inode, file, cmd, arg); | 294 | return drive->disk_ops->ioctl(drive, bdev, mode, cmd, arg); |
| 297 | } | 295 | } |
| 298 | 296 | ||
| 299 | static struct block_device_operations ide_gd_ops = { | 297 | static struct block_device_operations ide_gd_ops = { |
| 300 | .owner = THIS_MODULE, | 298 | .owner = THIS_MODULE, |
| 301 | .open = ide_gd_open, | 299 | .open = ide_gd_open, |
| 302 | .release = ide_gd_release, | 300 | .release = ide_gd_release, |
| 303 | .ioctl = ide_gd_ioctl, | 301 | .locked_ioctl = ide_gd_ioctl, |
| 304 | .getgeo = ide_gd_getgeo, | 302 | .getgeo = ide_gd_getgeo, |
| 305 | .media_changed = ide_gd_media_changed, | 303 | .media_changed = ide_gd_media_changed, |
| 306 | .revalidate_disk = ide_gd_revalidate_disk | 304 | .revalidate_disk = ide_gd_revalidate_disk |
diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c index a90945f49792..fcde16bb53a7 100644 --- a/drivers/ide/ide-ioctls.c +++ b/drivers/ide/ide-ioctls.c | |||
| @@ -240,8 +240,7 @@ static int generic_drive_reset(ide_drive_t *drive) | |||
| 240 | return ret; | 240 | return ret; |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | int generic_ide_ioctl(ide_drive_t *drive, struct file *file, | 243 | int generic_ide_ioctl(ide_drive_t *drive, struct block_device *bdev, |
| 244 | struct block_device *bdev, | ||
| 245 | unsigned int cmd, unsigned long arg) | 244 | unsigned int cmd, unsigned long arg) |
| 246 | { | 245 | { |
| 247 | int err; | 246 | int err; |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index b2b2e5e8d38e..a2d470eb2b55 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
| @@ -2340,35 +2340,30 @@ static const struct file_operations idetape_fops = { | |||
| 2340 | .release = idetape_chrdev_release, | 2340 | .release = idetape_chrdev_release, |
| 2341 | }; | 2341 | }; |
| 2342 | 2342 | ||
| 2343 | static int idetape_open(struct inode *inode, struct file *filp) | 2343 | static int idetape_open(struct block_device *bdev, fmode_t mode) |
| 2344 | { | 2344 | { |
| 2345 | struct gendisk *disk = inode->i_bdev->bd_disk; | 2345 | struct ide_tape_obj *tape = ide_tape_get(bdev->bd_disk); |
| 2346 | struct ide_tape_obj *tape; | ||
| 2347 | 2346 | ||
| 2348 | tape = ide_tape_get(disk); | ||
| 2349 | if (!tape) | 2347 | if (!tape) |
| 2350 | return -ENXIO; | 2348 | return -ENXIO; |
| 2351 | 2349 | ||
| 2352 | return 0; | 2350 | return 0; |
| 2353 | } | 2351 | } |
| 2354 | 2352 | ||
| 2355 | static int idetape_release(struct inode *inode, struct file *filp) | 2353 | static int idetape_release(struct gendisk *disk, fmode_t mode) |
| 2356 | { | 2354 | { |
| 2357 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 2358 | struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj); | 2355 | struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj); |
| 2359 | 2356 | ||
| 2360 | ide_tape_put(tape); | 2357 | ide_tape_put(tape); |
| 2361 | |||
| 2362 | return 0; | 2358 | return 0; |
| 2363 | } | 2359 | } |
| 2364 | 2360 | ||
| 2365 | static int idetape_ioctl(struct inode *inode, struct file *file, | 2361 | static int idetape_ioctl(struct block_device *bdev, fmode_t mode, |
| 2366 | unsigned int cmd, unsigned long arg) | 2362 | unsigned int cmd, unsigned long arg) |
| 2367 | { | 2363 | { |
| 2368 | struct block_device *bdev = inode->i_bdev; | ||
| 2369 | struct ide_tape_obj *tape = ide_drv_g(bdev->bd_disk, ide_tape_obj); | 2364 | struct ide_tape_obj *tape = ide_drv_g(bdev->bd_disk, ide_tape_obj); |
| 2370 | ide_drive_t *drive = tape->drive; | 2365 | ide_drive_t *drive = tape->drive; |
| 2371 | int err = generic_ide_ioctl(drive, file, bdev, cmd, arg); | 2366 | int err = generic_ide_ioctl(drive, bdev, cmd, arg); |
| 2372 | if (err == -EINVAL) | 2367 | if (err == -EINVAL) |
| 2373 | err = idetape_blkdev_ioctl(drive, cmd, arg); | 2368 | err = idetape_blkdev_ioctl(drive, cmd, arg); |
| 2374 | return err; | 2369 | return err; |
| @@ -2378,7 +2373,7 @@ static struct block_device_operations idetape_block_ops = { | |||
| 2378 | .owner = THIS_MODULE, | 2373 | .owner = THIS_MODULE, |
| 2379 | .open = idetape_open, | 2374 | .open = idetape_open, |
| 2380 | .release = idetape_release, | 2375 | .release = idetape_release, |
| 2381 | .ioctl = idetape_ioctl, | 2376 | .locked_ioctl = idetape_ioctl, |
| 2382 | }; | 2377 | }; |
| 2383 | 2378 | ||
| 2384 | static int ide_tape_probe(ide_drive_t *drive) | 2379 | static int ide_tape_probe(ide_drive_t *drive) |
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index dca401dc70a0..777c948180f9 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
| @@ -988,9 +988,9 @@ static int dev_wait(struct dm_ioctl *param, size_t param_size) | |||
| 988 | return r; | 988 | return r; |
| 989 | } | 989 | } |
| 990 | 990 | ||
| 991 | static inline int get_mode(struct dm_ioctl *param) | 991 | static inline fmode_t get_mode(struct dm_ioctl *param) |
| 992 | { | 992 | { |
| 993 | int mode = FMODE_READ | FMODE_WRITE; | 993 | fmode_t mode = FMODE_READ | FMODE_WRITE; |
| 994 | 994 | ||
| 995 | if (param->flags & DM_READONLY_FLAG) | 995 | if (param->flags & DM_READONLY_FLAG) |
| 996 | mode = FMODE_READ; | 996 | mode = FMODE_READ; |
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index 1b29e9136758..44042becad8a 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c | |||
| @@ -110,20 +110,11 @@ static int linear_status(struct dm_target *ti, status_type_t type, | |||
| 110 | return 0; | 110 | return 0; |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | static int linear_ioctl(struct dm_target *ti, struct inode *inode, | 113 | static int linear_ioctl(struct dm_target *ti, unsigned int cmd, |
| 114 | struct file *filp, unsigned int cmd, | ||
| 115 | unsigned long arg) | 114 | unsigned long arg) |
| 116 | { | 115 | { |
| 117 | struct linear_c *lc = (struct linear_c *) ti->private; | 116 | struct linear_c *lc = (struct linear_c *) ti->private; |
| 118 | struct block_device *bdev = lc->dev->bdev; | 117 | return __blkdev_driver_ioctl(lc->dev->bdev, lc->dev->mode, cmd, arg); |
| 119 | struct file fake_file = {}; | ||
| 120 | struct dentry fake_dentry = {}; | ||
| 121 | |||
| 122 | fake_file.f_mode = lc->dev->mode; | ||
| 123 | fake_file.f_path.dentry = &fake_dentry; | ||
| 124 | fake_dentry.d_inode = bdev->bd_inode; | ||
| 125 | |||
| 126 | return blkdev_driver_ioctl(bdev->bd_inode, &fake_file, bdev->bd_disk, cmd, arg); | ||
| 127 | } | 118 | } |
| 128 | 119 | ||
| 129 | static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, | 120 | static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, |
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index abf6e8cfaedb..4840733cd903 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
| @@ -1396,19 +1396,15 @@ error: | |||
| 1396 | return -EINVAL; | 1396 | return -EINVAL; |
| 1397 | } | 1397 | } |
| 1398 | 1398 | ||
| 1399 | static int multipath_ioctl(struct dm_target *ti, struct inode *inode, | 1399 | static int multipath_ioctl(struct dm_target *ti, unsigned int cmd, |
| 1400 | struct file *filp, unsigned int cmd, | ||
| 1401 | unsigned long arg) | 1400 | unsigned long arg) |
| 1402 | { | 1401 | { |
| 1403 | struct multipath *m = (struct multipath *) ti->private; | 1402 | struct multipath *m = (struct multipath *) ti->private; |
| 1404 | struct block_device *bdev = NULL; | 1403 | struct block_device *bdev = NULL; |
| 1404 | fmode_t mode = 0; | ||
| 1405 | unsigned long flags; | 1405 | unsigned long flags; |
| 1406 | struct file fake_file = {}; | ||
| 1407 | struct dentry fake_dentry = {}; | ||
| 1408 | int r = 0; | 1406 | int r = 0; |
| 1409 | 1407 | ||
| 1410 | fake_file.f_path.dentry = &fake_dentry; | ||
| 1411 | |||
| 1412 | spin_lock_irqsave(&m->lock, flags); | 1408 | spin_lock_irqsave(&m->lock, flags); |
| 1413 | 1409 | ||
| 1414 | if (!m->current_pgpath) | 1410 | if (!m->current_pgpath) |
| @@ -1416,8 +1412,7 @@ static int multipath_ioctl(struct dm_target *ti, struct inode *inode, | |||
| 1416 | 1412 | ||
| 1417 | if (m->current_pgpath) { | 1413 | if (m->current_pgpath) { |
| 1418 | bdev = m->current_pgpath->path.dev->bdev; | 1414 | bdev = m->current_pgpath->path.dev->bdev; |
| 1419 | fake_dentry.d_inode = bdev->bd_inode; | 1415 | mode = m->current_pgpath->path.dev->mode; |
| 1420 | fake_file.f_mode = m->current_pgpath->path.dev->mode; | ||
| 1421 | } | 1416 | } |
| 1422 | 1417 | ||
| 1423 | if (m->queue_io) | 1418 | if (m->queue_io) |
| @@ -1427,8 +1422,7 @@ static int multipath_ioctl(struct dm_target *ti, struct inode *inode, | |||
| 1427 | 1422 | ||
| 1428 | spin_unlock_irqrestore(&m->lock, flags); | 1423 | spin_unlock_irqrestore(&m->lock, flags); |
| 1429 | 1424 | ||
| 1430 | return r ? : blkdev_driver_ioctl(bdev->bd_inode, &fake_file, | 1425 | return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
| 1431 | bdev->bd_disk, cmd, arg); | ||
| 1432 | } | 1426 | } |
| 1433 | 1427 | ||
| 1434 | /*----------------------------------------------------------------- | 1428 | /*----------------------------------------------------------------- |
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 1407eb96f1a4..a63161aec487 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
| @@ -43,7 +43,7 @@ struct dm_table { | |||
| 43 | * device. This should be a combination of FMODE_READ | 43 | * device. This should be a combination of FMODE_READ |
| 44 | * and FMODE_WRITE. | 44 | * and FMODE_WRITE. |
| 45 | */ | 45 | */ |
| 46 | int mode; | 46 | fmode_t mode; |
| 47 | 47 | ||
| 48 | /* a list of devices used by this table */ | 48 | /* a list of devices used by this table */ |
| 49 | struct list_head devices; | 49 | struct list_head devices; |
| @@ -217,7 +217,7 @@ static int alloc_targets(struct dm_table *t, unsigned int num) | |||
| 217 | return 0; | 217 | return 0; |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | int dm_table_create(struct dm_table **result, int mode, | 220 | int dm_table_create(struct dm_table **result, fmode_t mode, |
| 221 | unsigned num_targets, struct mapped_device *md) | 221 | unsigned num_targets, struct mapped_device *md) |
| 222 | { | 222 | { |
| 223 | struct dm_table *t = kzalloc(sizeof(*t), GFP_KERNEL); | 223 | 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, | |||
| 344 | return PTR_ERR(bdev); | 344 | return PTR_ERR(bdev); |
| 345 | r = bd_claim_by_disk(bdev, _claim_ptr, dm_disk(md)); | 345 | r = bd_claim_by_disk(bdev, _claim_ptr, dm_disk(md)); |
| 346 | if (r) | 346 | if (r) |
| 347 | blkdev_put(bdev); | 347 | blkdev_put(bdev, d->dm_dev.mode); |
| 348 | else | 348 | else |
| 349 | d->dm_dev.bdev = bdev; | 349 | d->dm_dev.bdev = bdev; |
| 350 | return r; | 350 | return r; |
| @@ -359,7 +359,7 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md) | |||
| 359 | return; | 359 | return; |
| 360 | 360 | ||
| 361 | bd_release_from_disk(d->dm_dev.bdev, dm_disk(md)); | 361 | bd_release_from_disk(d->dm_dev.bdev, dm_disk(md)); |
| 362 | blkdev_put(d->dm_dev.bdev); | 362 | blkdev_put(d->dm_dev.bdev, d->dm_dev.mode); |
| 363 | d->dm_dev.bdev = NULL; | 363 | d->dm_dev.bdev = NULL; |
| 364 | } | 364 | } |
| 365 | 365 | ||
| @@ -382,7 +382,7 @@ static int check_device_area(struct dm_dev_internal *dd, sector_t start, | |||
| 382 | * careful to leave things as they were if we fail to reopen the | 382 | * careful to leave things as they were if we fail to reopen the |
| 383 | * device. | 383 | * device. |
| 384 | */ | 384 | */ |
| 385 | static int upgrade_mode(struct dm_dev_internal *dd, int new_mode, | 385 | static int upgrade_mode(struct dm_dev_internal *dd, fmode_t new_mode, |
| 386 | struct mapped_device *md) | 386 | struct mapped_device *md) |
| 387 | { | 387 | { |
| 388 | int r; | 388 | int r; |
| @@ -408,7 +408,7 @@ static int upgrade_mode(struct dm_dev_internal *dd, int new_mode, | |||
| 408 | */ | 408 | */ |
| 409 | static int __table_get_device(struct dm_table *t, struct dm_target *ti, | 409 | static int __table_get_device(struct dm_table *t, struct dm_target *ti, |
| 410 | const char *path, sector_t start, sector_t len, | 410 | const char *path, sector_t start, sector_t len, |
| 411 | int mode, struct dm_dev **result) | 411 | fmode_t mode, struct dm_dev **result) |
| 412 | { | 412 | { |
| 413 | int r; | 413 | int r; |
| 414 | dev_t uninitialized_var(dev); | 414 | dev_t uninitialized_var(dev); |
| @@ -528,7 +528,7 @@ void dm_set_device_limits(struct dm_target *ti, struct block_device *bdev) | |||
| 528 | EXPORT_SYMBOL_GPL(dm_set_device_limits); | 528 | EXPORT_SYMBOL_GPL(dm_set_device_limits); |
| 529 | 529 | ||
| 530 | int dm_get_device(struct dm_target *ti, const char *path, sector_t start, | 530 | int dm_get_device(struct dm_target *ti, const char *path, sector_t start, |
| 531 | sector_t len, int mode, struct dm_dev **result) | 531 | sector_t len, fmode_t mode, struct dm_dev **result) |
| 532 | { | 532 | { |
| 533 | int r = __table_get_device(ti->table, ti, path, | 533 | int r = __table_get_device(ti->table, ti, path, |
| 534 | start, len, mode, result); | 534 | start, len, mode, result); |
| @@ -878,7 +878,7 @@ struct list_head *dm_table_get_devices(struct dm_table *t) | |||
| 878 | return &t->devices; | 878 | return &t->devices; |
| 879 | } | 879 | } |
| 880 | 880 | ||
| 881 | int dm_table_get_mode(struct dm_table *t) | 881 | fmode_t dm_table_get_mode(struct dm_table *t) |
| 882 | { | 882 | { |
| 883 | return t->mode; | 883 | return t->mode; |
| 884 | } | 884 | } |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index d1d0cd0f5750..6963ad148408 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | #include <linux/idr.h> | 21 | #include <linux/idr.h> |
| 22 | #include <linux/hdreg.h> | 22 | #include <linux/hdreg.h> |
| 23 | #include <linux/blktrace_api.h> | 23 | #include <linux/blktrace_api.h> |
| 24 | #include <linux/smp_lock.h> | ||
| 25 | 24 | ||
| 26 | #define DM_MSG_PREFIX "core" | 25 | #define DM_MSG_PREFIX "core" |
| 27 | 26 | ||
| @@ -248,13 +247,13 @@ static void __exit dm_exit(void) | |||
| 248 | /* | 247 | /* |
| 249 | * Block device functions | 248 | * Block device functions |
| 250 | */ | 249 | */ |
| 251 | static int dm_blk_open(struct inode *inode, struct file *file) | 250 | static int dm_blk_open(struct block_device *bdev, fmode_t mode) |
| 252 | { | 251 | { |
| 253 | struct mapped_device *md; | 252 | struct mapped_device *md; |
| 254 | 253 | ||
| 255 | spin_lock(&_minor_lock); | 254 | spin_lock(&_minor_lock); |
| 256 | 255 | ||
| 257 | md = inode->i_bdev->bd_disk->private_data; | 256 | md = bdev->bd_disk->private_data; |
| 258 | if (!md) | 257 | if (!md) |
| 259 | goto out; | 258 | goto out; |
| 260 | 259 | ||
| @@ -273,11 +272,9 @@ out: | |||
| 273 | return md ? 0 : -ENXIO; | 272 | return md ? 0 : -ENXIO; |
| 274 | } | 273 | } |
| 275 | 274 | ||
| 276 | static int dm_blk_close(struct inode *inode, struct file *file) | 275 | static int dm_blk_close(struct gendisk *disk, fmode_t mode) |
| 277 | { | 276 | { |
| 278 | struct mapped_device *md; | 277 | struct mapped_device *md = disk->private_data; |
| 279 | |||
| 280 | md = inode->i_bdev->bd_disk->private_data; | ||
| 281 | atomic_dec(&md->open_count); | 278 | atomic_dec(&md->open_count); |
| 282 | dm_put(md); | 279 | dm_put(md); |
| 283 | return 0; | 280 | return 0; |
| @@ -314,21 +311,14 @@ static int dm_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 314 | return dm_get_geometry(md, geo); | 311 | return dm_get_geometry(md, geo); |
| 315 | } | 312 | } |
| 316 | 313 | ||
| 317 | static int dm_blk_ioctl(struct inode *inode, struct file *file, | 314 | static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode, |
| 318 | unsigned int cmd, unsigned long arg) | 315 | unsigned int cmd, unsigned long arg) |
| 319 | { | 316 | { |
| 320 | struct mapped_device *md; | 317 | struct mapped_device *md = bdev->bd_disk->private_data; |
| 321 | struct dm_table *map; | 318 | struct dm_table *map = dm_get_table(md); |
| 322 | struct dm_target *tgt; | 319 | struct dm_target *tgt; |
| 323 | int r = -ENOTTY; | 320 | int r = -ENOTTY; |
| 324 | 321 | ||
| 325 | /* We don't really need this lock, but we do need 'inode'. */ | ||
| 326 | unlock_kernel(); | ||
| 327 | |||
| 328 | md = inode->i_bdev->bd_disk->private_data; | ||
| 329 | |||
| 330 | map = dm_get_table(md); | ||
| 331 | |||
| 332 | if (!map || !dm_table_get_size(map)) | 322 | if (!map || !dm_table_get_size(map)) |
| 333 | goto out; | 323 | goto out; |
| 334 | 324 | ||
| @@ -344,12 +334,11 @@ static int dm_blk_ioctl(struct inode *inode, struct file *file, | |||
| 344 | } | 334 | } |
| 345 | 335 | ||
| 346 | if (tgt->type->ioctl) | 336 | if (tgt->type->ioctl) |
| 347 | r = tgt->type->ioctl(tgt, inode, file, cmd, arg); | 337 | r = tgt->type->ioctl(tgt, cmd, arg); |
| 348 | 338 | ||
| 349 | out: | 339 | out: |
| 350 | dm_table_put(map); | 340 | dm_table_put(map); |
| 351 | 341 | ||
| 352 | lock_kernel(); | ||
| 353 | return r; | 342 | return r; |
| 354 | } | 343 | } |
| 355 | 344 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index aaa3d465de4e..c1a837ca193c 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -1520,7 +1520,7 @@ static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared) | |||
| 1520 | if (err) { | 1520 | if (err) { |
| 1521 | printk(KERN_ERR "md: could not bd_claim %s.\n", | 1521 | printk(KERN_ERR "md: could not bd_claim %s.\n", |
| 1522 | bdevname(bdev, b)); | 1522 | bdevname(bdev, b)); |
| 1523 | blkdev_put(bdev); | 1523 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 1524 | return err; | 1524 | return err; |
| 1525 | } | 1525 | } |
| 1526 | if (!shared) | 1526 | if (!shared) |
| @@ -1536,7 +1536,7 @@ static void unlock_rdev(mdk_rdev_t *rdev) | |||
| 1536 | if (!bdev) | 1536 | if (!bdev) |
| 1537 | MD_BUG(); | 1537 | MD_BUG(); |
| 1538 | bd_release(bdev); | 1538 | bd_release(bdev); |
| 1539 | blkdev_put(bdev); | 1539 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 1540 | } | 1540 | } |
| 1541 | 1541 | ||
| 1542 | void md_autodetect_dev(dev_t dev); | 1542 | void md_autodetect_dev(dev_t dev); |
| @@ -4785,7 +4785,7 @@ static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 4785 | return 0; | 4785 | return 0; |
| 4786 | } | 4786 | } |
| 4787 | 4787 | ||
| 4788 | static int md_ioctl(struct inode *inode, struct file *file, | 4788 | static int md_ioctl(struct block_device *bdev, fmode_t mode, |
| 4789 | unsigned int cmd, unsigned long arg) | 4789 | unsigned int cmd, unsigned long arg) |
| 4790 | { | 4790 | { |
| 4791 | int err = 0; | 4791 | int err = 0; |
| @@ -4823,7 +4823,7 @@ static int md_ioctl(struct inode *inode, struct file *file, | |||
| 4823 | * Commands creating/starting a new array: | 4823 | * Commands creating/starting a new array: |
| 4824 | */ | 4824 | */ |
| 4825 | 4825 | ||
| 4826 | mddev = inode->i_bdev->bd_disk->private_data; | 4826 | mddev = bdev->bd_disk->private_data; |
| 4827 | 4827 | ||
| 4828 | if (!mddev) { | 4828 | if (!mddev) { |
| 4829 | BUG(); | 4829 | BUG(); |
| @@ -4996,13 +4996,13 @@ abort: | |||
| 4996 | return err; | 4996 | return err; |
| 4997 | } | 4997 | } |
| 4998 | 4998 | ||
| 4999 | static int md_open(struct inode *inode, struct file *file) | 4999 | static int md_open(struct block_device *bdev, fmode_t mode) |
| 5000 | { | 5000 | { |
| 5001 | /* | 5001 | /* |
| 5002 | * Succeed if we can lock the mddev, which confirms that | 5002 | * Succeed if we can lock the mddev, which confirms that |
| 5003 | * it isn't being stopped right now. | 5003 | * it isn't being stopped right now. |
| 5004 | */ | 5004 | */ |
| 5005 | mddev_t *mddev = inode->i_bdev->bd_disk->private_data; | 5005 | mddev_t *mddev = bdev->bd_disk->private_data; |
| 5006 | int err; | 5006 | int err; |
| 5007 | 5007 | ||
| 5008 | if ((err = mutex_lock_interruptible_nested(&mddev->reconfig_mutex, 1))) | 5008 | if ((err = mutex_lock_interruptible_nested(&mddev->reconfig_mutex, 1))) |
| @@ -5013,14 +5013,14 @@ static int md_open(struct inode *inode, struct file *file) | |||
| 5013 | atomic_inc(&mddev->openers); | 5013 | atomic_inc(&mddev->openers); |
| 5014 | mddev_unlock(mddev); | 5014 | mddev_unlock(mddev); |
| 5015 | 5015 | ||
| 5016 | check_disk_change(inode->i_bdev); | 5016 | check_disk_change(bdev); |
| 5017 | out: | 5017 | out: |
| 5018 | return err; | 5018 | return err; |
| 5019 | } | 5019 | } |
| 5020 | 5020 | ||
| 5021 | static int md_release(struct inode *inode, struct file * file) | 5021 | static int md_release(struct gendisk *disk, fmode_t mode) |
| 5022 | { | 5022 | { |
| 5023 | mddev_t *mddev = inode->i_bdev->bd_disk->private_data; | 5023 | mddev_t *mddev = disk->private_data; |
| 5024 | 5024 | ||
| 5025 | BUG_ON(!mddev); | 5025 | BUG_ON(!mddev); |
| 5026 | atomic_dec(&mddev->openers); | 5026 | atomic_dec(&mddev->openers); |
| @@ -5048,7 +5048,7 @@ static struct block_device_operations md_fops = | |||
| 5048 | .owner = THIS_MODULE, | 5048 | .owner = THIS_MODULE, |
| 5049 | .open = md_open, | 5049 | .open = md_open, |
| 5050 | .release = md_release, | 5050 | .release = md_release, |
| 5051 | .ioctl = md_ioctl, | 5051 | .locked_ioctl = md_ioctl, |
| 5052 | .getgeo = md_getgeo, | 5052 | .getgeo = md_getgeo, |
| 5053 | .media_changed = md_media_changed, | 5053 | .media_changed = md_media_changed, |
| 5054 | .revalidate_disk= md_revalidate, | 5054 | .revalidate_disk= md_revalidate, |
diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c index 5263913e0c69..7911151e56a3 100644 --- a/drivers/memstick/core/mspro_block.c +++ b/drivers/memstick/core/mspro_block.c | |||
| @@ -172,9 +172,9 @@ static int mspro_block_complete_req(struct memstick_dev *card, int error); | |||
| 172 | 172 | ||
| 173 | /*** Block device ***/ | 173 | /*** Block device ***/ |
| 174 | 174 | ||
| 175 | static int mspro_block_bd_open(struct inode *inode, struct file *filp) | 175 | static int mspro_block_bd_open(struct block_device *bdev, fmode_t mode) |
| 176 | { | 176 | { |
| 177 | struct gendisk *disk = inode->i_bdev->bd_disk; | 177 | struct gendisk *disk = bdev->bd_disk; |
| 178 | struct mspro_block_data *msb = disk->private_data; | 178 | struct mspro_block_data *msb = disk->private_data; |
| 179 | int rc = -ENXIO; | 179 | int rc = -ENXIO; |
| 180 | 180 | ||
| @@ -182,7 +182,7 @@ static int mspro_block_bd_open(struct inode *inode, struct file *filp) | |||
| 182 | 182 | ||
| 183 | if (msb && msb->card) { | 183 | if (msb && msb->card) { |
| 184 | msb->usage_count++; | 184 | msb->usage_count++; |
| 185 | if ((filp->f_mode & FMODE_WRITE) && msb->read_only) | 185 | if ((mode & FMODE_WRITE) && msb->read_only) |
| 186 | rc = -EROFS; | 186 | rc = -EROFS; |
| 187 | else | 187 | else |
| 188 | rc = 0; | 188 | rc = 0; |
| @@ -218,9 +218,8 @@ static int mspro_block_disk_release(struct gendisk *disk) | |||
| 218 | return 0; | 218 | return 0; |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | static int mspro_block_bd_release(struct inode *inode, struct file *filp) | 221 | static int mspro_block_bd_release(struct gendisk *disk, fmode_t mode) |
| 222 | { | 222 | { |
| 223 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 224 | return mspro_block_disk_release(disk); | 223 | return mspro_block_disk_release(disk); |
| 225 | } | 224 | } |
| 226 | 225 | ||
diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index 81483de8c0fd..11a617ab4243 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c | |||
| @@ -575,9 +575,9 @@ static void i2o_block_biosparam(unsigned long capacity, unsigned short *cyls, | |||
| 575 | * | 575 | * |
| 576 | * Returns 0 on success or negative error code on failure. | 576 | * Returns 0 on success or negative error code on failure. |
| 577 | */ | 577 | */ |
| 578 | static int i2o_block_open(struct inode *inode, struct file *file) | 578 | static int i2o_block_open(struct block_device *bdev, fmode_t mode) |
| 579 | { | 579 | { |
| 580 | struct i2o_block_device *dev = inode->i_bdev->bd_disk->private_data; | 580 | struct i2o_block_device *dev = bdev->bd_disk->private_data; |
| 581 | 581 | ||
| 582 | if (!dev->i2o_dev) | 582 | if (!dev->i2o_dev) |
| 583 | return -ENODEV; | 583 | return -ENODEV; |
| @@ -604,9 +604,8 @@ static int i2o_block_open(struct inode *inode, struct file *file) | |||
| 604 | * | 604 | * |
| 605 | * Returns 0 on success or negative error code on failure. | 605 | * Returns 0 on success or negative error code on failure. |
| 606 | */ | 606 | */ |
| 607 | static int i2o_block_release(struct inode *inode, struct file *file) | 607 | static int i2o_block_release(struct gendisk *disk, fmode_t mode) |
| 608 | { | 608 | { |
| 609 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 610 | struct i2o_block_device *dev = disk->private_data; | 609 | struct i2o_block_device *dev = disk->private_data; |
| 611 | u8 operation; | 610 | u8 operation; |
| 612 | 611 | ||
| @@ -653,10 +652,10 @@ static int i2o_block_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 653 | * | 652 | * |
| 654 | * Return 0 on success or negative error on failure. | 653 | * Return 0 on success or negative error on failure. |
| 655 | */ | 654 | */ |
| 656 | static int i2o_block_ioctl(struct inode *inode, struct file *file, | 655 | static int i2o_block_ioctl(struct block_device *bdev, fmode_t mode, |
| 657 | unsigned int cmd, unsigned long arg) | 656 | unsigned int cmd, unsigned long arg) |
| 658 | { | 657 | { |
| 659 | struct gendisk *disk = inode->i_bdev->bd_disk; | 658 | struct gendisk *disk = bdev->bd_disk; |
| 660 | struct i2o_block_device *dev = disk->private_data; | 659 | struct i2o_block_device *dev = disk->private_data; |
| 661 | 660 | ||
| 662 | /* Anyone capable of this syscall can do *real bad* things */ | 661 | /* Anyone capable of this syscall can do *real bad* things */ |
| @@ -933,7 +932,7 @@ static struct block_device_operations i2o_block_fops = { | |||
| 933 | .owner = THIS_MODULE, | 932 | .owner = THIS_MODULE, |
| 934 | .open = i2o_block_open, | 933 | .open = i2o_block_open, |
| 935 | .release = i2o_block_release, | 934 | .release = i2o_block_release, |
| 936 | .ioctl = i2o_block_ioctl, | 935 | .locked_ioctl = i2o_block_ioctl, |
| 937 | .getgeo = i2o_block_getgeo, | 936 | .getgeo = i2o_block_getgeo, |
| 938 | .media_changed = i2o_block_media_changed | 937 | .media_changed = i2o_block_media_changed |
| 939 | }; | 938 | }; |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 24c97d3d16bb..3d067c35185d 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
| @@ -92,18 +92,17 @@ static void mmc_blk_put(struct mmc_blk_data *md) | |||
| 92 | mutex_unlock(&open_lock); | 92 | mutex_unlock(&open_lock); |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | static int mmc_blk_open(struct inode *inode, struct file *filp) | 95 | static int mmc_blk_open(struct block_device *bdev, fmode_t mode) |
| 96 | { | 96 | { |
| 97 | struct mmc_blk_data *md; | 97 | struct mmc_blk_data *md = mmc_blk_get(bdev->bd_disk); |
| 98 | int ret = -ENXIO; | 98 | int ret = -ENXIO; |
| 99 | 99 | ||
| 100 | md = mmc_blk_get(inode->i_bdev->bd_disk); | ||
| 101 | if (md) { | 100 | if (md) { |
| 102 | if (md->usage == 2) | 101 | if (md->usage == 2) |
| 103 | check_disk_change(inode->i_bdev); | 102 | check_disk_change(bdev); |
| 104 | ret = 0; | 103 | ret = 0; |
| 105 | 104 | ||
| 106 | if ((filp->f_mode & FMODE_WRITE) && md->read_only) { | 105 | if ((mode & FMODE_WRITE) && md->read_only) { |
| 107 | mmc_blk_put(md); | 106 | mmc_blk_put(md); |
| 108 | ret = -EROFS; | 107 | ret = -EROFS; |
| 109 | } | 108 | } |
| @@ -112,9 +111,9 @@ static int mmc_blk_open(struct inode *inode, struct file *filp) | |||
| 112 | return ret; | 111 | return ret; |
| 113 | } | 112 | } |
| 114 | 113 | ||
| 115 | static int mmc_blk_release(struct inode *inode, struct file *filp) | 114 | static int mmc_blk_release(struct gendisk *disk, fmode_t mode) |
| 116 | { | 115 | { |
| 117 | struct mmc_blk_data *md = inode->i_bdev->bd_disk->private_data; | 116 | struct mmc_blk_data *md = disk->private_data; |
| 118 | 117 | ||
| 119 | mmc_blk_put(md); | 118 | mmc_blk_put(md); |
| 120 | return 0; | 119 | return 0; |
diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c index 91fbba767635..8c295f40d2ac 100644 --- a/drivers/mtd/devices/block2mtd.c +++ b/drivers/mtd/devices/block2mtd.c | |||
| @@ -224,7 +224,7 @@ static void block2mtd_free_device(struct block2mtd_dev *dev) | |||
| 224 | if (dev->blkdev) { | 224 | if (dev->blkdev) { |
| 225 | invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, | 225 | invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, |
| 226 | 0, -1); | 226 | 0, -1); |
| 227 | close_bdev_excl(dev->blkdev); | 227 | close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE); |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | kfree(dev); | 230 | kfree(dev); |
| @@ -246,7 +246,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) | |||
| 246 | return NULL; | 246 | return NULL; |
| 247 | 247 | ||
| 248 | /* Get a handle on the device */ | 248 | /* Get a handle on the device */ |
| 249 | bdev = open_bdev_excl(devname, O_RDWR, NULL); | 249 | bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL); |
| 250 | #ifndef MODULE | 250 | #ifndef MODULE |
| 251 | if (IS_ERR(bdev)) { | 251 | if (IS_ERR(bdev)) { |
| 252 | 252 | ||
diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 681d5aca2af4..1409f01406f6 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c | |||
| @@ -133,15 +133,12 @@ static void mtd_blktrans_request(struct request_queue *rq) | |||
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | 135 | ||
| 136 | static int blktrans_open(struct inode *i, struct file *f) | 136 | static int blktrans_open(struct block_device *bdev, fmode_t mode) |
| 137 | { | 137 | { |
| 138 | struct mtd_blktrans_dev *dev; | 138 | struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data; |
| 139 | struct mtd_blktrans_ops *tr; | 139 | struct mtd_blktrans_ops *tr = dev->tr; |
| 140 | int ret = -ENODEV; | 140 | int ret = -ENODEV; |
| 141 | 141 | ||
| 142 | dev = i->i_bdev->bd_disk->private_data; | ||
| 143 | tr = dev->tr; | ||
| 144 | |||
| 145 | if (!try_module_get(dev->mtd->owner)) | 142 | if (!try_module_get(dev->mtd->owner)) |
| 146 | goto out; | 143 | goto out; |
| 147 | 144 | ||
| @@ -164,15 +161,12 @@ static int blktrans_open(struct inode *i, struct file *f) | |||
| 164 | return ret; | 161 | return ret; |
| 165 | } | 162 | } |
| 166 | 163 | ||
| 167 | static int blktrans_release(struct inode *i, struct file *f) | 164 | static int blktrans_release(struct gendisk *disk, fmode_t mode) |
| 168 | { | 165 | { |
| 169 | struct mtd_blktrans_dev *dev; | 166 | struct mtd_blktrans_dev *dev = disk->private_data; |
| 170 | struct mtd_blktrans_ops *tr; | 167 | struct mtd_blktrans_ops *tr = dev->tr; |
| 171 | int ret = 0; | 168 | int ret = 0; |
| 172 | 169 | ||
| 173 | dev = i->i_bdev->bd_disk->private_data; | ||
| 174 | tr = dev->tr; | ||
| 175 | |||
| 176 | if (tr->release) | 170 | if (tr->release) |
| 177 | ret = tr->release(dev); | 171 | ret = tr->release(dev); |
| 178 | 172 | ||
| @@ -194,10 +188,10 @@ static int blktrans_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 194 | return -ENOTTY; | 188 | return -ENOTTY; |
| 195 | } | 189 | } |
| 196 | 190 | ||
| 197 | static int blktrans_ioctl(struct inode *inode, struct file *file, | 191 | static int blktrans_ioctl(struct block_device *bdev, fmode_t mode, |
| 198 | unsigned int cmd, unsigned long arg) | 192 | unsigned int cmd, unsigned long arg) |
| 199 | { | 193 | { |
| 200 | struct mtd_blktrans_dev *dev = inode->i_bdev->bd_disk->private_data; | 194 | struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data; |
| 201 | struct mtd_blktrans_ops *tr = dev->tr; | 195 | struct mtd_blktrans_ops *tr = dev->tr; |
| 202 | 196 | ||
| 203 | switch (cmd) { | 197 | switch (cmd) { |
| @@ -215,7 +209,7 @@ static struct block_device_operations mtd_blktrans_ops = { | |||
| 215 | .owner = THIS_MODULE, | 209 | .owner = THIS_MODULE, |
| 216 | .open = blktrans_open, | 210 | .open = blktrans_open, |
| 217 | .release = blktrans_release, | 211 | .release = blktrans_release, |
| 218 | .ioctl = blktrans_ioctl, | 212 | .locked_ioctl = blktrans_ioctl, |
| 219 | .getgeo = blktrans_getgeo, | 213 | .getgeo = blktrans_getgeo, |
| 220 | }; | 214 | }; |
| 221 | 215 | ||
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index 963840e9b5bf..bcffeda2df3d 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
| @@ -96,7 +96,7 @@ static int mtd_open(struct inode *inode, struct file *file) | |||
| 96 | return -ENODEV; | 96 | return -ENODEV; |
| 97 | 97 | ||
| 98 | /* You can't open the RO devices RW */ | 98 | /* You can't open the RO devices RW */ |
| 99 | if ((file->f_mode & 2) && (minor & 1)) | 99 | if ((file->f_mode & FMODE_WRITE) && (minor & 1)) |
| 100 | return -EACCES; | 100 | return -EACCES; |
| 101 | 101 | ||
| 102 | lock_kernel(); | 102 | lock_kernel(); |
| @@ -114,7 +114,7 @@ static int mtd_open(struct inode *inode, struct file *file) | |||
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | /* You can't open it RW if it's not a writeable device */ | 116 | /* You can't open it RW if it's not a writeable device */ |
| 117 | if ((file->f_mode & 2) && !(mtd->flags & MTD_WRITEABLE)) { | 117 | if ((file->f_mode & FMODE_WRITE) && !(mtd->flags & MTD_WRITEABLE)) { |
| 118 | put_mtd_device(mtd); | 118 | put_mtd_device(mtd); |
| 119 | ret = -EACCES; | 119 | ret = -EACCES; |
| 120 | goto out; | 120 | goto out; |
| @@ -144,7 +144,7 @@ static int mtd_close(struct inode *inode, struct file *file) | |||
| 144 | DEBUG(MTD_DEBUG_LEVEL0, "MTD_close\n"); | 144 | DEBUG(MTD_DEBUG_LEVEL0, "MTD_close\n"); |
| 145 | 145 | ||
| 146 | /* Only sync if opened RW */ | 146 | /* Only sync if opened RW */ |
| 147 | if ((file->f_mode & 2) && mtd->sync) | 147 | if ((file->f_mode & FMODE_WRITE) && mtd->sync) |
| 148 | mtd->sync(mtd); | 148 | mtd->sync(mtd); |
| 149 | 149 | ||
| 150 | put_mtd_device(mtd); | 150 | put_mtd_device(mtd); |
| @@ -443,7 +443,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file, | |||
| 443 | { | 443 | { |
| 444 | struct erase_info *erase; | 444 | struct erase_info *erase; |
| 445 | 445 | ||
| 446 | if(!(file->f_mode & 2)) | 446 | if(!(file->f_mode & FMODE_WRITE)) |
| 447 | return -EPERM; | 447 | return -EPERM; |
| 448 | 448 | ||
| 449 | erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL); | 449 | erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL); |
| @@ -497,7 +497,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file, | |||
| 497 | struct mtd_oob_buf __user *user_buf = argp; | 497 | struct mtd_oob_buf __user *user_buf = argp; |
| 498 | uint32_t retlen; | 498 | uint32_t retlen; |
| 499 | 499 | ||
| 500 | if(!(file->f_mode & 2)) | 500 | if(!(file->f_mode & FMODE_WRITE)) |
| 501 | return -EPERM; | 501 | return -EPERM; |
| 502 | 502 | ||
| 503 | if (copy_from_user(&buf, argp, sizeof(struct mtd_oob_buf))) | 503 | if (copy_from_user(&buf, argp, sizeof(struct mtd_oob_buf))) |
diff --git a/drivers/parisc/eisa_eeprom.c b/drivers/parisc/eisa_eeprom.c index 5ac207932fd7..685d94e69d44 100644 --- a/drivers/parisc/eisa_eeprom.c +++ b/drivers/parisc/eisa_eeprom.c | |||
| @@ -86,7 +86,7 @@ static int eisa_eeprom_open(struct inode *inode, struct file *file) | |||
| 86 | { | 86 | { |
| 87 | cycle_kernel_lock(); | 87 | cycle_kernel_lock(); |
| 88 | 88 | ||
| 89 | if (file->f_mode & 2) | 89 | if (file->f_mode & FMODE_WRITE) |
| 90 | return -EINVAL; | 90 | return -EINVAL; |
| 91 | 91 | ||
| 92 | return 0; | 92 | return 0; |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 0a225ccda026..4b76fca64a6f 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -2011,10 +2011,9 @@ static void dasd_flush_request_queue(struct dasd_block *block) | |||
| 2011 | spin_unlock_irq(&block->request_queue_lock); | 2011 | spin_unlock_irq(&block->request_queue_lock); |
| 2012 | } | 2012 | } |
| 2013 | 2013 | ||
| 2014 | static int dasd_open(struct inode *inp, struct file *filp) | 2014 | static int dasd_open(struct block_device *bdev, fmode_t mode) |
| 2015 | { | 2015 | { |
| 2016 | struct gendisk *disk = inp->i_bdev->bd_disk; | 2016 | struct dasd_block *block = bdev->bd_disk->private_data; |
| 2017 | struct dasd_block *block = disk->private_data; | ||
| 2018 | struct dasd_device *base = block->base; | 2017 | struct dasd_device *base = block->base; |
| 2019 | int rc; | 2018 | int rc; |
| 2020 | 2019 | ||
| @@ -2052,9 +2051,8 @@ unlock: | |||
| 2052 | return rc; | 2051 | return rc; |
| 2053 | } | 2052 | } |
| 2054 | 2053 | ||
| 2055 | static int dasd_release(struct inode *inp, struct file *filp) | 2054 | static int dasd_release(struct gendisk *disk, fmode_t mode) |
| 2056 | { | 2055 | { |
| 2057 | struct gendisk *disk = inp->i_bdev->bd_disk; | ||
| 2058 | struct dasd_block *block = disk->private_data; | 2056 | struct dasd_block *block = disk->private_data; |
| 2059 | 2057 | ||
| 2060 | atomic_dec(&block->open_count); | 2058 | atomic_dec(&block->open_count); |
| @@ -2089,8 +2087,7 @@ dasd_device_operations = { | |||
| 2089 | .owner = THIS_MODULE, | 2087 | .owner = THIS_MODULE, |
| 2090 | .open = dasd_open, | 2088 | .open = dasd_open, |
| 2091 | .release = dasd_release, | 2089 | .release = dasd_release, |
| 2092 | .ioctl = dasd_ioctl, | 2090 | .locked_ioctl = dasd_ioctl, |
| 2093 | .compat_ioctl = dasd_compat_ioctl, | ||
| 2094 | .getgeo = dasd_getgeo, | 2091 | .getgeo = dasd_getgeo, |
| 2095 | }; | 2092 | }; |
| 2096 | 2093 | ||
diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index aee6565aaf98..e99d566b69cc 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c | |||
| @@ -99,7 +99,7 @@ int dasd_scan_partitions(struct dasd_block *block) | |||
| 99 | struct block_device *bdev; | 99 | struct block_device *bdev; |
| 100 | 100 | ||
| 101 | bdev = bdget_disk(block->gdp, 0); | 101 | bdev = bdget_disk(block->gdp, 0); |
| 102 | if (!bdev || blkdev_get(bdev, FMODE_READ, 1) < 0) | 102 | if (!bdev || blkdev_get(bdev, FMODE_READ) < 0) |
| 103 | return -ENODEV; | 103 | return -ENODEV; |
| 104 | /* | 104 | /* |
| 105 | * See fs/partition/check.c:register_disk,rescan_partitions | 105 | * See fs/partition/check.c:register_disk,rescan_partitions |
| @@ -152,7 +152,7 @@ void dasd_destroy_partitions(struct dasd_block *block) | |||
| 152 | 152 | ||
| 153 | invalidate_partition(block->gdp, 0); | 153 | invalidate_partition(block->gdp, 0); |
| 154 | /* Matching blkdev_put to the blkdev_get in dasd_scan_partitions. */ | 154 | /* Matching blkdev_put to the blkdev_get in dasd_scan_partitions. */ |
| 155 | blkdev_put(bdev); | 155 | blkdev_put(bdev, FMODE_READ); |
| 156 | set_capacity(block->gdp, 0); | 156 | set_capacity(block->gdp, 0); |
| 157 | } | 157 | } |
| 158 | 158 | ||
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index 489d5fe488fb..05a14536c369 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h | |||
| @@ -610,8 +610,7 @@ int dasd_scan_partitions(struct dasd_block *); | |||
| 610 | void dasd_destroy_partitions(struct dasd_block *); | 610 | void dasd_destroy_partitions(struct dasd_block *); |
| 611 | 611 | ||
| 612 | /* externals in dasd_ioctl.c */ | 612 | /* externals in dasd_ioctl.c */ |
| 613 | int dasd_ioctl(struct inode *, struct file *, unsigned int, unsigned long); | 613 | int dasd_ioctl(struct block_device *, fmode_t, unsigned int, unsigned long); |
| 614 | long dasd_compat_ioctl(struct file *, unsigned int, unsigned long); | ||
| 615 | 614 | ||
| 616 | /* externals in dasd_proc.c */ | 615 | /* externals in dasd_proc.c */ |
| 617 | int dasd_proc_init(void); | 616 | int dasd_proc_init(void); |
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index 91a64630cb0f..b82d816d9ef7 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
| @@ -366,10 +366,9 @@ static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd, | |||
| 366 | } | 366 | } |
| 367 | 367 | ||
| 368 | int | 368 | int |
| 369 | dasd_ioctl(struct inode *inode, struct file *file, | 369 | dasd_ioctl(struct block_device *bdev, fmode_t mode, |
| 370 | unsigned int cmd, unsigned long arg) | 370 | unsigned int cmd, unsigned long arg) |
| 371 | { | 371 | { |
| 372 | struct block_device *bdev = inode->i_bdev; | ||
| 373 | struct dasd_block *block = bdev->bd_disk->private_data; | 372 | struct dasd_block *block = bdev->bd_disk->private_data; |
| 374 | void __user *argp = (void __user *)arg; | 373 | void __user *argp = (void __user *)arg; |
| 375 | 374 | ||
| @@ -421,15 +420,3 @@ dasd_ioctl(struct inode *inode, struct file *file, | |||
| 421 | return -EINVAL; | 420 | return -EINVAL; |
| 422 | } | 421 | } |
| 423 | } | 422 | } |
| 424 | |||
| 425 | long | ||
| 426 | dasd_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
| 427 | { | ||
| 428 | int rval; | ||
| 429 | |||
| 430 | lock_kernel(); | ||
| 431 | rval = dasd_ioctl(filp->f_path.dentry->d_inode, filp, cmd, arg); | ||
| 432 | unlock_kernel(); | ||
| 433 | |||
| 434 | return (rval == -EINVAL) ? -ENOIOCTLCMD : rval; | ||
| 435 | } | ||
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index a7ff167d5b81..63f26a135fe5 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c | |||
| @@ -31,8 +31,8 @@ | |||
| 31 | #define PRINT_WARN(x...) printk(KERN_WARNING DCSSBLK_NAME " warning: " x) | 31 | #define PRINT_WARN(x...) printk(KERN_WARNING DCSSBLK_NAME " warning: " x) |
| 32 | #define PRINT_ERR(x...) printk(KERN_ERR DCSSBLK_NAME " error: " x) | 32 | #define PRINT_ERR(x...) printk(KERN_ERR DCSSBLK_NAME " error: " x) |
| 33 | 33 | ||
| 34 | static int dcssblk_open(struct inode *inode, struct file *filp); | 34 | static int dcssblk_open(struct block_device *bdev, fmode_t mode); |
| 35 | static int dcssblk_release(struct inode *inode, struct file *filp); | 35 | static int dcssblk_release(struct gendisk *disk, fmode_t mode); |
| 36 | static int dcssblk_make_request(struct request_queue *q, struct bio *bio); | 36 | static int dcssblk_make_request(struct request_queue *q, struct bio *bio); |
| 37 | static int dcssblk_direct_access(struct block_device *bdev, sector_t secnum, | 37 | static int dcssblk_direct_access(struct block_device *bdev, sector_t secnum, |
| 38 | void **kaddr, unsigned long *pfn); | 38 | void **kaddr, unsigned long *pfn); |
| @@ -776,32 +776,31 @@ out_buf: | |||
| 776 | } | 776 | } |
| 777 | 777 | ||
| 778 | static int | 778 | static int |
| 779 | dcssblk_open(struct inode *inode, struct file *filp) | 779 | dcssblk_open(struct block_device *bdev, fmode_t mode) |
| 780 | { | 780 | { |
| 781 | struct dcssblk_dev_info *dev_info; | 781 | struct dcssblk_dev_info *dev_info; |
| 782 | int rc; | 782 | int rc; |
| 783 | 783 | ||
| 784 | dev_info = inode->i_bdev->bd_disk->private_data; | 784 | dev_info = bdev->bd_disk->private_data; |
| 785 | if (NULL == dev_info) { | 785 | if (NULL == dev_info) { |
| 786 | rc = -ENODEV; | 786 | rc = -ENODEV; |
| 787 | goto out; | 787 | goto out; |
| 788 | } | 788 | } |
| 789 | atomic_inc(&dev_info->use_count); | 789 | atomic_inc(&dev_info->use_count); |
| 790 | inode->i_bdev->bd_block_size = 4096; | 790 | bdev->bd_block_size = 4096; |
| 791 | rc = 0; | 791 | rc = 0; |
| 792 | out: | 792 | out: |
| 793 | return rc; | 793 | return rc; |
| 794 | } | 794 | } |
| 795 | 795 | ||
| 796 | static int | 796 | static int |
| 797 | dcssblk_release(struct inode *inode, struct file *filp) | 797 | dcssblk_release(struct gendisk *disk, fmode_t mode) |
| 798 | { | 798 | { |
| 799 | struct dcssblk_dev_info *dev_info; | 799 | struct dcssblk_dev_info *dev_info = disk->private_data; |
| 800 | struct segment_info *entry; | 800 | struct segment_info *entry; |
| 801 | int rc; | 801 | int rc; |
| 802 | 802 | ||
| 803 | dev_info = inode->i_bdev->bd_disk->private_data; | 803 | if (!dev_info) { |
| 804 | if (NULL == dev_info) { | ||
| 805 | rc = -ENODEV; | 804 | rc = -ENODEV; |
| 806 | goto out; | 805 | goto out; |
| 807 | } | 806 | } |
diff --git a/drivers/s390/char/tape_block.c b/drivers/s390/char/tape_block.c index a25b8bf54f41..023803dbb0c7 100644 --- a/drivers/s390/char/tape_block.c +++ b/drivers/s390/char/tape_block.c | |||
| @@ -43,9 +43,9 @@ | |||
| 43 | /* | 43 | /* |
| 44 | * file operation structure for tape block frontend | 44 | * file operation structure for tape block frontend |
| 45 | */ | 45 | */ |
| 46 | static int tapeblock_open(struct inode *, struct file *); | 46 | static int tapeblock_open(struct block_device *, fmode_t); |
| 47 | static int tapeblock_release(struct inode *, struct file *); | 47 | static int tapeblock_release(struct gendisk *, fmode_t); |
| 48 | static int tapeblock_ioctl(struct inode *, struct file *, unsigned int, | 48 | static int tapeblock_ioctl(struct block_device *, fmode_t, unsigned int, |
| 49 | unsigned long); | 49 | unsigned long); |
| 50 | static int tapeblock_medium_changed(struct gendisk *); | 50 | static int tapeblock_medium_changed(struct gendisk *); |
| 51 | static int tapeblock_revalidate_disk(struct gendisk *); | 51 | static int tapeblock_revalidate_disk(struct gendisk *); |
| @@ -54,7 +54,7 @@ static struct block_device_operations tapeblock_fops = { | |||
| 54 | .owner = THIS_MODULE, | 54 | .owner = THIS_MODULE, |
| 55 | .open = tapeblock_open, | 55 | .open = tapeblock_open, |
| 56 | .release = tapeblock_release, | 56 | .release = tapeblock_release, |
| 57 | .ioctl = tapeblock_ioctl, | 57 | .locked_ioctl = tapeblock_ioctl, |
| 58 | .media_changed = tapeblock_medium_changed, | 58 | .media_changed = tapeblock_medium_changed, |
| 59 | .revalidate_disk = tapeblock_revalidate_disk, | 59 | .revalidate_disk = tapeblock_revalidate_disk, |
| 60 | }; | 60 | }; |
| @@ -364,13 +364,12 @@ tapeblock_medium_changed(struct gendisk *disk) | |||
| 364 | * Block frontend tape device open function. | 364 | * Block frontend tape device open function. |
| 365 | */ | 365 | */ |
| 366 | static int | 366 | static int |
| 367 | tapeblock_open(struct inode *inode, struct file *filp) | 367 | tapeblock_open(struct block_device *bdev, fmode_t mode) |
| 368 | { | 368 | { |
| 369 | struct gendisk * disk; | 369 | struct gendisk * disk = bdev->bd_disk; |
| 370 | struct tape_device * device; | 370 | struct tape_device * device; |
| 371 | int rc; | 371 | int rc; |
| 372 | 372 | ||
| 373 | disk = inode->i_bdev->bd_disk; | ||
| 374 | device = tape_get_device_reference(disk->private_data); | 373 | device = tape_get_device_reference(disk->private_data); |
| 375 | 374 | ||
| 376 | if (device->required_tapemarks) { | 375 | if (device->required_tapemarks) { |
| @@ -410,9 +409,8 @@ release: | |||
| 410 | * we just get the pointer here and release the reference. | 409 | * we just get the pointer here and release the reference. |
| 411 | */ | 410 | */ |
| 412 | static int | 411 | static int |
| 413 | tapeblock_release(struct inode *inode, struct file *filp) | 412 | tapeblock_release(struct gendisk *disk, fmode_t mode) |
| 414 | { | 413 | { |
| 415 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 416 | struct tape_device *device = disk->private_data; | 414 | struct tape_device *device = disk->private_data; |
| 417 | 415 | ||
| 418 | tape_state_set(device, TS_IN_USE); | 416 | tape_state_set(device, TS_IN_USE); |
| @@ -427,22 +425,21 @@ tapeblock_release(struct inode *inode, struct file *filp) | |||
| 427 | */ | 425 | */ |
| 428 | static int | 426 | static int |
| 429 | tapeblock_ioctl( | 427 | tapeblock_ioctl( |
| 430 | struct inode * inode, | 428 | struct block_device * bdev, |
| 431 | struct file * file, | 429 | fmode_t mode, |
| 432 | unsigned int command, | 430 | unsigned int command, |
| 433 | unsigned long arg | 431 | unsigned long arg |
| 434 | ) { | 432 | ) { |
| 435 | int rc; | 433 | int rc; |
| 436 | int minor; | 434 | int minor; |
| 437 | struct gendisk *disk; | 435 | struct gendisk *disk = bdev->bd_disk; |
| 438 | struct tape_device *device; | 436 | struct tape_device *device; |
| 439 | 437 | ||
| 440 | rc = 0; | 438 | rc = 0; |
| 441 | disk = inode->i_bdev->bd_disk; | ||
| 442 | BUG_ON(!disk); | 439 | BUG_ON(!disk); |
| 443 | device = disk->private_data; | 440 | device = disk->private_data; |
| 444 | BUG_ON(!device); | 441 | BUG_ON(!device); |
| 445 | minor = iminor(inode); | 442 | minor = MINOR(bdev->bd_dev); |
| 446 | 443 | ||
| 447 | DBF_LH(6, "tapeblock_ioctl(0x%0x)\n", command); | 444 | DBF_LH(6, "tapeblock_ioctl(0x%0x)\n", command); |
| 448 | DBF_LH(6, "device = %d:%d\n", tapeblock_major, minor); | 445 | DBF_LH(6, "device = %d:%d\n", tapeblock_major, minor); |
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index afc96e844a25..2370fd82ebfe 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
| @@ -452,40 +452,34 @@ static ide_driver_t idescsi_driver = { | |||
| 452 | #endif | 452 | #endif |
| 453 | }; | 453 | }; |
| 454 | 454 | ||
| 455 | static int idescsi_ide_open(struct inode *inode, struct file *filp) | 455 | static int idescsi_ide_open(struct block_device *bdev, fmode_t mode) |
| 456 | { | 456 | { |
| 457 | struct gendisk *disk = inode->i_bdev->bd_disk; | 457 | struct ide_scsi_obj *scsi = ide_scsi_get(bdev->bd_disk); |
| 458 | struct ide_scsi_obj *scsi; | ||
| 459 | 458 | ||
| 460 | if (!(scsi = ide_scsi_get(disk))) | 459 | if (!scsi) |
| 461 | return -ENXIO; | 460 | return -ENXIO; |
| 462 | 461 | ||
| 463 | return 0; | 462 | return 0; |
| 464 | } | 463 | } |
| 465 | 464 | ||
| 466 | static int idescsi_ide_release(struct inode *inode, struct file *filp) | 465 | static int idescsi_ide_release(struct gendisk *disk, fmode_t mode) |
| 467 | { | 466 | { |
| 468 | struct gendisk *disk = inode->i_bdev->bd_disk; | 467 | ide_scsi_put(ide_scsi_g(disk)); |
| 469 | struct ide_scsi_obj *scsi = ide_scsi_g(disk); | ||
| 470 | |||
| 471 | ide_scsi_put(scsi); | ||
| 472 | |||
| 473 | return 0; | 468 | return 0; |
| 474 | } | 469 | } |
| 475 | 470 | ||
| 476 | static int idescsi_ide_ioctl(struct inode *inode, struct file *file, | 471 | static int idescsi_ide_ioctl(struct block_device *bdev, fmode_t mode, |
| 477 | unsigned int cmd, unsigned long arg) | 472 | unsigned int cmd, unsigned long arg) |
| 478 | { | 473 | { |
| 479 | struct block_device *bdev = inode->i_bdev; | ||
| 480 | struct ide_scsi_obj *scsi = ide_scsi_g(bdev->bd_disk); | 474 | struct ide_scsi_obj *scsi = ide_scsi_g(bdev->bd_disk); |
| 481 | return generic_ide_ioctl(scsi->drive, file, bdev, cmd, arg); | 475 | return generic_ide_ioctl(scsi->drive, bdev, cmd, arg); |
| 482 | } | 476 | } |
| 483 | 477 | ||
| 484 | static struct block_device_operations idescsi_ops = { | 478 | static struct block_device_operations idescsi_ops = { |
| 485 | .owner = THIS_MODULE, | 479 | .owner = THIS_MODULE, |
| 486 | .open = idescsi_ide_open, | 480 | .open = idescsi_ide_open, |
| 487 | .release = idescsi_ide_release, | 481 | .release = idescsi_ide_release, |
| 488 | .ioctl = idescsi_ide_ioctl, | 482 | .locked_ioctl = idescsi_ide_ioctl, |
| 489 | }; | 483 | }; |
| 490 | 484 | ||
| 491 | static int idescsi_slave_configure(struct scsi_device * sdp) | 485 | static int idescsi_slave_configure(struct scsi_device * sdp) |
diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c index 28b19ef26309..dc1cfb2fd76b 100644 --- a/drivers/scsi/scsi_ioctl.c +++ b/drivers/scsi/scsi_ioctl.c | |||
| @@ -237,7 +237,7 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) | |||
| 237 | case SCSI_IOCTL_SEND_COMMAND: | 237 | case SCSI_IOCTL_SEND_COMMAND: |
| 238 | if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) | 238 | if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) |
| 239 | return -EACCES; | 239 | return -EACCES; |
| 240 | return sg_scsi_ioctl(NULL, sdev->request_queue, NULL, arg); | 240 | return sg_scsi_ioctl(sdev->request_queue, NULL, 0, arg); |
| 241 | case SCSI_IOCTL_DOORLOCK: | 241 | case SCSI_IOCTL_DOORLOCK: |
| 242 | return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); | 242 | return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); |
| 243 | case SCSI_IOCTL_DOORUNLOCK: | 243 | case SCSI_IOCTL_DOORUNLOCK: |
| @@ -277,14 +277,14 @@ EXPORT_SYMBOL(scsi_ioctl); | |||
| 277 | * @filp: either NULL or a &struct file which must have the O_NONBLOCK flag. | 277 | * @filp: either NULL or a &struct file which must have the O_NONBLOCK flag. |
| 278 | */ | 278 | */ |
| 279 | int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd, | 279 | int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd, |
| 280 | void __user *arg, struct file *filp) | 280 | void __user *arg, int ndelay) |
| 281 | { | 281 | { |
| 282 | int val, result; | 282 | int val, result; |
| 283 | 283 | ||
| 284 | /* The first set of iocts may be executed even if we're doing | 284 | /* The first set of iocts may be executed even if we're doing |
| 285 | * error processing, as long as the device was opened | 285 | * error processing, as long as the device was opened |
| 286 | * non-blocking */ | 286 | * non-blocking */ |
| 287 | if (filp && (filp->f_flags & O_NONBLOCK)) { | 287 | if (ndelay) { |
| 288 | if (scsi_host_in_recovery(sdev->host)) | 288 | if (scsi_host_in_recovery(sdev->host)) |
| 289 | return -ENODEV; | 289 | return -ENODEV; |
| 290 | } else if (!scsi_block_when_processing_errors(sdev)) | 290 | } else if (!scsi_block_when_processing_errors(sdev)) |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 7c4d2e68df1c..43f34c73df12 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -609,17 +609,15 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
| 609 | * In the latter case @inode and @filp carry an abridged amount | 609 | * In the latter case @inode and @filp carry an abridged amount |
| 610 | * of information as noted above. | 610 | * of information as noted above. |
| 611 | **/ | 611 | **/ |
| 612 | static int sd_open(struct inode *inode, struct file *filp) | 612 | static int sd_open(struct block_device *bdev, fmode_t mode) |
| 613 | { | 613 | { |
| 614 | struct gendisk *disk = inode->i_bdev->bd_disk; | 614 | struct scsi_disk *sdkp = scsi_disk_get(bdev->bd_disk); |
| 615 | struct scsi_disk *sdkp; | ||
| 616 | struct scsi_device *sdev; | 615 | struct scsi_device *sdev; |
| 617 | int retval; | 616 | int retval; |
| 618 | 617 | ||
| 619 | if (!(sdkp = scsi_disk_get(disk))) | 618 | if (!sdkp) |
| 620 | return -ENXIO; | 619 | return -ENXIO; |
| 621 | 620 | ||
| 622 | |||
| 623 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n")); | 621 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n")); |
| 624 | 622 | ||
| 625 | sdev = sdkp->device; | 623 | sdev = sdkp->device; |
| @@ -633,14 +631,13 @@ static int sd_open(struct inode *inode, struct file *filp) | |||
| 633 | goto error_out; | 631 | goto error_out; |
| 634 | 632 | ||
| 635 | if (sdev->removable || sdkp->write_prot) | 633 | if (sdev->removable || sdkp->write_prot) |
| 636 | check_disk_change(inode->i_bdev); | 634 | check_disk_change(bdev); |
| 637 | 635 | ||
| 638 | /* | 636 | /* |
| 639 | * If the drive is empty, just let the open fail. | 637 | * If the drive is empty, just let the open fail. |
| 640 | */ | 638 | */ |
| 641 | retval = -ENOMEDIUM; | 639 | retval = -ENOMEDIUM; |
| 642 | if (sdev->removable && !sdkp->media_present && | 640 | if (sdev->removable && !sdkp->media_present && !(mode & FMODE_NDELAY)) |
| 643 | !(filp->f_flags & O_NDELAY)) | ||
| 644 | goto error_out; | 641 | goto error_out; |
| 645 | 642 | ||
| 646 | /* | 643 | /* |
| @@ -648,7 +645,7 @@ static int sd_open(struct inode *inode, struct file *filp) | |||
| 648 | * if the user expects to be able to write to the thing. | 645 | * if the user expects to be able to write to the thing. |
| 649 | */ | 646 | */ |
| 650 | retval = -EROFS; | 647 | retval = -EROFS; |
| 651 | if (sdkp->write_prot && (filp->f_mode & FMODE_WRITE)) | 648 | if (sdkp->write_prot && (mode & FMODE_WRITE)) |
| 652 | goto error_out; | 649 | goto error_out; |
| 653 | 650 | ||
| 654 | /* | 651 | /* |
| @@ -684,9 +681,8 @@ error_out: | |||
| 684 | * Note: may block (uninterruptible) if error recovery is underway | 681 | * Note: may block (uninterruptible) if error recovery is underway |
| 685 | * on this disk. | 682 | * on this disk. |
| 686 | **/ | 683 | **/ |
| 687 | static int sd_release(struct inode *inode, struct file *filp) | 684 | static int sd_release(struct gendisk *disk, fmode_t mode) |
| 688 | { | 685 | { |
| 689 | struct gendisk *disk = inode->i_bdev->bd_disk; | ||
| 690 | struct scsi_disk *sdkp = scsi_disk(disk); | 686 | struct scsi_disk *sdkp = scsi_disk(disk); |
| 691 | struct scsi_device *sdev = sdkp->device; | 687 | struct scsi_device *sdev = sdkp->device; |
| 692 | 688 | ||
| @@ -743,10 +739,9 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
| 743 | * Note: most ioctls are forward onto the block subsystem or further | 739 | * Note: most ioctls are forward onto the block subsystem or further |
| 744 | * down in the scsi subsystem. | 740 | * down in the scsi subsystem. |
| 745 | **/ | 741 | **/ |
| 746 | static int sd_ioctl(struct inode * inode, struct file * filp, | 742 | static int sd_ioctl(struct block_device *bdev, fmode_t mode, |
| 747 | unsigned int cmd, unsigned long arg) | 743 | unsigned int cmd, unsigned long arg) |
| 748 | { | 744 | { |
| 749 | struct block_device *bdev = inode->i_bdev; | ||
| 750 | struct gendisk *disk = bdev->bd_disk; | 745 | struct gendisk *disk = bdev->bd_disk; |
| 751 | struct scsi_device *sdp = scsi_disk(disk)->device; | 746 | struct scsi_device *sdp = scsi_disk(disk)->device; |
| 752 | void __user *p = (void __user *)arg; | 747 | void __user *p = (void __user *)arg; |
| @@ -761,7 +756,8 @@ static int sd_ioctl(struct inode * inode, struct file * filp, | |||
| 761 | * may try and take the device offline, in which case all further | 756 | * may try and take the device offline, in which case all further |
| 762 | * access to the device is prohibited. | 757 | * access to the device is prohibited. |
| 763 | */ | 758 | */ |
| 764 | error = scsi_nonblockable_ioctl(sdp, cmd, p, filp); | 759 | error = scsi_nonblockable_ioctl(sdp, cmd, p, |
| 760 | (mode & FMODE_NDELAY_NOW) != 0); | ||
| 765 | if (!scsi_block_when_processing_errors(sdp) || !error) | 761 | if (!scsi_block_when_processing_errors(sdp) || !error) |
| 766 | return error; | 762 | return error; |
| 767 | 763 | ||
| @@ -775,7 +771,7 @@ static int sd_ioctl(struct inode * inode, struct file * filp, | |||
| 775 | case SCSI_IOCTL_GET_BUS_NUMBER: | 771 | case SCSI_IOCTL_GET_BUS_NUMBER: |
| 776 | return scsi_ioctl(sdp, cmd, p); | 772 | return scsi_ioctl(sdp, cmd, p); |
| 777 | default: | 773 | default: |
| 778 | error = scsi_cmd_ioctl(filp, disk->queue, disk, cmd, p); | 774 | error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p); |
| 779 | if (error != -ENOTTY) | 775 | if (error != -ENOTTY) |
| 780 | return error; | 776 | return error; |
| 781 | } | 777 | } |
| @@ -928,11 +924,10 @@ static void sd_rescan(struct device *dev) | |||
| 928 | * This gets directly called from VFS. When the ioctl | 924 | * This gets directly called from VFS. When the ioctl |
| 929 | * is not recognized we go back to the other translation paths. | 925 | * is not recognized we go back to the other translation paths. |
| 930 | */ | 926 | */ |
| 931 | static long sd_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 927 | static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode, |
| 928 | unsigned int cmd, unsigned long arg) | ||
| 932 | { | 929 | { |
| 933 | struct block_device *bdev = file->f_path.dentry->d_inode->i_bdev; | 930 | struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device; |
| 934 | struct gendisk *disk = bdev->bd_disk; | ||
| 935 | struct scsi_device *sdev = scsi_disk(disk)->device; | ||
| 936 | 931 | ||
| 937 | /* | 932 | /* |
| 938 | * If we are in the middle of error recovery, don't let anyone | 933 | * If we are in the middle of error recovery, don't let anyone |
| @@ -962,7 +957,7 @@ static struct block_device_operations sd_fops = { | |||
| 962 | .owner = THIS_MODULE, | 957 | .owner = THIS_MODULE, |
| 963 | .open = sd_open, | 958 | .open = sd_open, |
| 964 | .release = sd_release, | 959 | .release = sd_release, |
| 965 | .ioctl = sd_ioctl, | 960 | .locked_ioctl = sd_ioctl, |
| 966 | .getgeo = sd_getgeo, | 961 | .getgeo = sd_getgeo, |
| 967 | #ifdef CONFIG_COMPAT | 962 | #ifdef CONFIG_COMPAT |
| 968 | .compat_ioctl = sd_compat_ioctl, | 963 | .compat_ioctl = sd_compat_ioctl, |
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 93bd59a1ed79..9adf35bd8b56 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
| @@ -1059,7 +1059,7 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 1059 | if (sg_allow_access(filp, &opcode)) | 1059 | if (sg_allow_access(filp, &opcode)) |
| 1060 | return -EPERM; | 1060 | return -EPERM; |
| 1061 | } | 1061 | } |
| 1062 | return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p); | 1062 | return sg_scsi_ioctl(sdp->device->request_queue, NULL, filp->f_mode, p); |
| 1063 | case SG_SET_DEBUG: | 1063 | case SG_SET_DEBUG: |
| 1064 | result = get_user(val, ip); | 1064 | result = get_user(val, ip); |
| 1065 | if (result) | 1065 | if (result) |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 0f17009c99d2..62b6633e3a97 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
| @@ -471,38 +471,31 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq) | |||
| 471 | return scsi_prep_return(q, rq, ret); | 471 | return scsi_prep_return(q, rq, ret); |
| 472 | } | 472 | } |
| 473 | 473 | ||
| 474 | static int sr_block_open(struct inode *inode, struct file *file) | 474 | static int sr_block_open(struct block_device *bdev, fmode_t mode) |
| 475 | { | 475 | { |
| 476 | struct gendisk *disk = inode->i_bdev->bd_disk; | 476 | struct scsi_cd *cd = scsi_cd_get(bdev->bd_disk); |
| 477 | struct scsi_cd *cd; | 477 | int ret = -ENXIO; |
| 478 | int ret = 0; | ||
| 479 | |||
| 480 | if(!(cd = scsi_cd_get(disk))) | ||
| 481 | return -ENXIO; | ||
| 482 | |||
| 483 | if((ret = cdrom_open(&cd->cdi, inode, file)) != 0) | ||
| 484 | scsi_cd_put(cd); | ||
| 485 | 478 | ||
| 479 | if (cd) { | ||
| 480 | ret = cdrom_open(&cd->cdi, bdev, mode); | ||
| 481 | if (ret) | ||
| 482 | scsi_cd_put(cd); | ||
| 483 | } | ||
| 486 | return ret; | 484 | return ret; |
| 487 | } | 485 | } |
| 488 | 486 | ||
| 489 | static int sr_block_release(struct inode *inode, struct file *file) | 487 | static int sr_block_release(struct gendisk *disk, fmode_t mode) |
| 490 | { | 488 | { |
| 491 | int ret; | 489 | struct scsi_cd *cd = scsi_cd(disk); |
| 492 | struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk); | 490 | cdrom_release(&cd->cdi, mode); |
| 493 | ret = cdrom_release(&cd->cdi, file); | ||
| 494 | if(ret) | ||
| 495 | return ret; | ||
| 496 | |||
| 497 | scsi_cd_put(cd); | 491 | scsi_cd_put(cd); |
| 498 | |||
| 499 | return 0; | 492 | return 0; |
| 500 | } | 493 | } |
| 501 | 494 | ||
| 502 | static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd, | 495 | static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, |
| 503 | unsigned long arg) | 496 | unsigned long arg) |
| 504 | { | 497 | { |
| 505 | struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk); | 498 | struct scsi_cd *cd = scsi_cd(bdev->bd_disk); |
| 506 | struct scsi_device *sdev = cd->device; | 499 | struct scsi_device *sdev = cd->device; |
| 507 | void __user *argp = (void __user *)arg; | 500 | void __user *argp = (void __user *)arg; |
| 508 | int ret; | 501 | int ret; |
| @@ -517,7 +510,7 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 517 | return scsi_ioctl(sdev, cmd, argp); | 510 | return scsi_ioctl(sdev, cmd, argp); |
| 518 | } | 511 | } |
| 519 | 512 | ||
| 520 | ret = cdrom_ioctl(file, &cd->cdi, inode, cmd, arg); | 513 | ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); |
| 521 | if (ret != -ENOSYS) | 514 | if (ret != -ENOSYS) |
| 522 | return ret; | 515 | return ret; |
| 523 | 516 | ||
| @@ -527,7 +520,8 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 527 | * case fall through to scsi_ioctl, which will return ENDOEV again | 520 | * case fall through to scsi_ioctl, which will return ENDOEV again |
| 528 | * if it doesn't recognise the ioctl | 521 | * if it doesn't recognise the ioctl |
| 529 | */ | 522 | */ |
| 530 | ret = scsi_nonblockable_ioctl(sdev, cmd, argp, NULL); | 523 | ret = scsi_nonblockable_ioctl(sdev, cmd, argp, |
| 524 | (mode & FMODE_NDELAY_NOW) != 0); | ||
| 531 | if (ret != -ENODEV) | 525 | if (ret != -ENODEV) |
| 532 | return ret; | 526 | return ret; |
| 533 | return scsi_ioctl(sdev, cmd, argp); | 527 | return scsi_ioctl(sdev, cmd, argp); |
| @@ -544,7 +538,7 @@ static struct block_device_operations sr_bdops = | |||
| 544 | .owner = THIS_MODULE, | 538 | .owner = THIS_MODULE, |
| 545 | .open = sr_block_open, | 539 | .open = sr_block_open, |
| 546 | .release = sr_block_release, | 540 | .release = sr_block_release, |
| 547 | .ioctl = sr_block_ioctl, | 541 | .locked_ioctl = sr_block_ioctl, |
| 548 | .media_changed = sr_block_media_changed, | 542 | .media_changed = sr_block_media_changed, |
| 549 | /* | 543 | /* |
| 550 | * No compat_ioctl for now because sr_block_ioctl never | 544 | * No compat_ioctl for now because sr_block_ioctl never |
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 5c28d08f18f4..c959bdc55f4f 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
| @@ -3263,7 +3263,8 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) | |||
| 3263 | * may try and take the device offline, in which case all further | 3263 | * may try and take the device offline, in which case all further |
| 3264 | * access to the device is prohibited. | 3264 | * access to the device is prohibited. |
| 3265 | */ | 3265 | */ |
| 3266 | retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p, file); | 3266 | retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p, |
| 3267 | file->f_flags & O_NDELAY); | ||
| 3267 | if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV) | 3268 | if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV) |
| 3268 | goto out; | 3269 | goto out; |
| 3269 | retval = 0; | 3270 | retval = 0; |
| @@ -3567,8 +3568,8 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) | |||
| 3567 | !capable(CAP_SYS_RAWIO)) | 3568 | !capable(CAP_SYS_RAWIO)) |
| 3568 | i = -EPERM; | 3569 | i = -EPERM; |
| 3569 | else | 3570 | else |
| 3570 | i = scsi_cmd_ioctl(file, STp->disk->queue, | 3571 | i = scsi_cmd_ioctl(STp->disk->queue, STp->disk, |
| 3571 | STp->disk, cmd_in, p); | 3572 | file->f_mode, cmd_in, p); |
| 3572 | if (i != -ENOTTY) | 3573 | if (i != -ENOTTY) |
| 3573 | return i; | 3574 | return i; |
| 3574 | break; | 3575 | break; |
diff --git a/fs/block_dev.c b/fs/block_dev.c index d06fe3c3dd3f..88a776fa0ef6 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -840,13 +840,12 @@ EXPORT_SYMBOL_GPL(bd_release_from_disk); | |||
| 840 | * to be used for internal purposes. If you ever need it - reconsider | 840 | * to be used for internal purposes. If you ever need it - reconsider |
| 841 | * your API. | 841 | * your API. |
| 842 | */ | 842 | */ |
| 843 | struct block_device *open_by_devnum(dev_t dev, unsigned mode) | 843 | struct block_device *open_by_devnum(dev_t dev, fmode_t mode) |
| 844 | { | 844 | { |
| 845 | struct block_device *bdev = bdget(dev); | 845 | struct block_device *bdev = bdget(dev); |
| 846 | int err = -ENOMEM; | 846 | int err = -ENOMEM; |
| 847 | int flags = mode & FMODE_WRITE ? O_RDWR : O_RDONLY; | ||
| 848 | if (bdev) | 847 | if (bdev) |
| 849 | err = blkdev_get(bdev, mode, flags); | 848 | err = blkdev_get(bdev, mode); |
| 850 | return err ? ERR_PTR(err) : bdev; | 849 | return err ? ERR_PTR(err) : bdev; |
| 851 | } | 850 | } |
| 852 | 851 | ||
| @@ -975,9 +974,7 @@ void bd_set_size(struct block_device *bdev, loff_t size) | |||
| 975 | } | 974 | } |
| 976 | EXPORT_SYMBOL(bd_set_size); | 975 | EXPORT_SYMBOL(bd_set_size); |
| 977 | 976 | ||
| 978 | static int __blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags, | 977 | static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part); |
| 979 | int for_part); | ||
| 980 | static int __blkdev_put(struct block_device *bdev, int for_part); | ||
| 981 | 978 | ||
| 982 | /* | 979 | /* |
| 983 | * bd_mutex locking: | 980 | * bd_mutex locking: |
| @@ -986,7 +983,7 @@ static int __blkdev_put(struct block_device *bdev, int for_part); | |||
| 986 | * mutex_lock_nested(whole->bd_mutex, 1) | 983 | * mutex_lock_nested(whole->bd_mutex, 1) |
| 987 | */ | 984 | */ |
| 988 | 985 | ||
| 989 | static int do_open(struct block_device *bdev, struct file *file, int for_part) | 986 | static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) |
| 990 | { | 987 | { |
| 991 | struct gendisk *disk; | 988 | struct gendisk *disk; |
| 992 | struct hd_struct *part = NULL; | 989 | struct hd_struct *part = NULL; |
| @@ -994,9 +991,9 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
| 994 | int partno; | 991 | int partno; |
| 995 | int perm = 0; | 992 | int perm = 0; |
| 996 | 993 | ||
| 997 | if (file->f_mode & FMODE_READ) | 994 | if (mode & FMODE_READ) |
| 998 | perm |= MAY_READ; | 995 | perm |= MAY_READ; |
| 999 | if (file->f_mode & FMODE_WRITE) | 996 | if (mode & FMODE_WRITE) |
| 1000 | perm |= MAY_WRITE; | 997 | perm |= MAY_WRITE; |
| 1001 | /* | 998 | /* |
| 1002 | * hooks: /n/, see "layering violations". | 999 | * hooks: /n/, see "layering violations". |
| @@ -1008,7 +1005,6 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
| 1008 | } | 1005 | } |
| 1009 | 1006 | ||
| 1010 | ret = -ENXIO; | 1007 | ret = -ENXIO; |
| 1011 | file->f_mapping = bdev->bd_inode->i_mapping; | ||
| 1012 | 1008 | ||
| 1013 | lock_kernel(); | 1009 | lock_kernel(); |
| 1014 | 1010 | ||
| @@ -1027,7 +1023,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
| 1027 | if (!partno) { | 1023 | if (!partno) { |
| 1028 | struct backing_dev_info *bdi; | 1024 | struct backing_dev_info *bdi; |
| 1029 | if (disk->fops->open) { | 1025 | if (disk->fops->open) { |
| 1030 | ret = disk->fops->open(bdev->bd_inode, file); | 1026 | ret = disk->fops->open(bdev, mode); |
| 1031 | if (ret) | 1027 | if (ret) |
| 1032 | goto out_clear; | 1028 | goto out_clear; |
| 1033 | } | 1029 | } |
| @@ -1047,7 +1043,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
| 1047 | if (!whole) | 1043 | if (!whole) |
| 1048 | goto out_clear; | 1044 | goto out_clear; |
| 1049 | BUG_ON(for_part); | 1045 | BUG_ON(for_part); |
| 1050 | ret = __blkdev_get(whole, file->f_mode, file->f_flags, 1); | 1046 | ret = __blkdev_get(whole, mode, 1); |
| 1051 | if (ret) | 1047 | if (ret) |
| 1052 | goto out_clear; | 1048 | goto out_clear; |
| 1053 | bdev->bd_contains = whole; | 1049 | bdev->bd_contains = whole; |
| @@ -1068,7 +1064,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
| 1068 | disk = NULL; | 1064 | disk = NULL; |
| 1069 | if (bdev->bd_contains == bdev) { | 1065 | if (bdev->bd_contains == bdev) { |
| 1070 | if (bdev->bd_disk->fops->open) { | 1066 | if (bdev->bd_disk->fops->open) { |
| 1071 | ret = bdev->bd_disk->fops->open(bdev->bd_inode, file); | 1067 | ret = bdev->bd_disk->fops->open(bdev, mode); |
| 1072 | if (ret) | 1068 | if (ret) |
| 1073 | goto out_unlock_bdev; | 1069 | goto out_unlock_bdev; |
| 1074 | } | 1070 | } |
| @@ -1088,7 +1084,7 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
| 1088 | bdev->bd_part = NULL; | 1084 | bdev->bd_part = NULL; |
| 1089 | bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info; | 1085 | bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info; |
| 1090 | if (bdev != bdev->bd_contains) | 1086 | if (bdev != bdev->bd_contains) |
| 1091 | __blkdev_put(bdev->bd_contains, 1); | 1087 | __blkdev_put(bdev->bd_contains, mode, 1); |
| 1092 | bdev->bd_contains = NULL; | 1088 | bdev->bd_contains = NULL; |
| 1093 | out_unlock_bdev: | 1089 | out_unlock_bdev: |
| 1094 | mutex_unlock(&bdev->bd_mutex); | 1090 | mutex_unlock(&bdev->bd_mutex); |
| @@ -1104,28 +1100,9 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part) | |||
| 1104 | return ret; | 1100 | return ret; |
| 1105 | } | 1101 | } |
| 1106 | 1102 | ||
| 1107 | static int __blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags, | 1103 | int blkdev_get(struct block_device *bdev, fmode_t mode) |
| 1108 | int for_part) | ||
| 1109 | { | 1104 | { |
| 1110 | /* | 1105 | return __blkdev_get(bdev, mode, 0); |
| 1111 | * This crockload is due to bad choice of ->open() type. | ||
| 1112 | * It will go away. | ||
| 1113 | * For now, block device ->open() routine must _not_ | ||
| 1114 | * examine anything in 'inode' argument except ->i_rdev. | ||
| 1115 | */ | ||
| 1116 | struct file fake_file = {}; | ||
| 1117 | struct dentry fake_dentry = {}; | ||
| 1118 | fake_file.f_mode = mode; | ||
| 1119 | fake_file.f_flags = flags; | ||
| 1120 | fake_file.f_path.dentry = &fake_dentry; | ||
| 1121 | fake_dentry.d_inode = bdev->bd_inode; | ||
| 1122 | |||
| 1123 | return do_open(bdev, &fake_file, for_part); | ||
| 1124 | } | ||
| 1125 | |||
| 1126 | int blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags) | ||
| 1127 | { | ||
| 1128 | return __blkdev_get(bdev, mode, flags, 0); | ||
| 1129 | } | 1106 | } |
| 1130 | EXPORT_SYMBOL(blkdev_get); | 1107 | EXPORT_SYMBOL(blkdev_get); |
| 1131 | 1108 | ||
| @@ -1142,28 +1119,36 @@ static int blkdev_open(struct inode * inode, struct file * filp) | |||
| 1142 | */ | 1119 | */ |
| 1143 | filp->f_flags |= O_LARGEFILE; | 1120 | filp->f_flags |= O_LARGEFILE; |
| 1144 | 1121 | ||
| 1122 | if (filp->f_flags & O_NDELAY) | ||
| 1123 | filp->f_mode |= FMODE_NDELAY; | ||
| 1124 | if (filp->f_flags & O_EXCL) | ||
| 1125 | filp->f_mode |= FMODE_EXCL; | ||
| 1126 | if ((filp->f_flags & O_ACCMODE) == 3) | ||
| 1127 | filp->f_mode |= FMODE_WRITE_IOCTL; | ||
| 1128 | |||
| 1145 | bdev = bd_acquire(inode); | 1129 | bdev = bd_acquire(inode); |
| 1146 | if (bdev == NULL) | 1130 | if (bdev == NULL) |
| 1147 | return -ENOMEM; | 1131 | return -ENOMEM; |
| 1148 | 1132 | ||
| 1149 | res = do_open(bdev, filp, 0); | 1133 | filp->f_mapping = bdev->bd_inode->i_mapping; |
| 1134 | |||
| 1135 | res = blkdev_get(bdev, filp->f_mode); | ||
| 1150 | if (res) | 1136 | if (res) |
| 1151 | return res; | 1137 | return res; |
| 1152 | 1138 | ||
| 1153 | if (!(filp->f_flags & O_EXCL) ) | 1139 | if (!(filp->f_mode & FMODE_EXCL)) |
| 1154 | return 0; | 1140 | return 0; |
| 1155 | 1141 | ||
| 1156 | if (!(res = bd_claim(bdev, filp))) | 1142 | if (!(res = bd_claim(bdev, filp))) |
| 1157 | return 0; | 1143 | return 0; |
| 1158 | 1144 | ||
| 1159 | blkdev_put(bdev); | 1145 | blkdev_put(bdev, filp->f_mode); |
| 1160 | return res; | 1146 | return res; |
| 1161 | } | 1147 | } |
| 1162 | 1148 | ||
| 1163 | static int __blkdev_put(struct block_device *bdev, int for_part) | 1149 | static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part) |
| 1164 | { | 1150 | { |
| 1165 | int ret = 0; | 1151 | int ret = 0; |
| 1166 | struct inode *bd_inode = bdev->bd_inode; | ||
| 1167 | struct gendisk *disk = bdev->bd_disk; | 1152 | struct gendisk *disk = bdev->bd_disk; |
| 1168 | struct block_device *victim = NULL; | 1153 | struct block_device *victim = NULL; |
| 1169 | 1154 | ||
| @@ -1178,7 +1163,7 @@ static int __blkdev_put(struct block_device *bdev, int for_part) | |||
| 1178 | } | 1163 | } |
| 1179 | if (bdev->bd_contains == bdev) { | 1164 | if (bdev->bd_contains == bdev) { |
| 1180 | if (disk->fops->release) | 1165 | if (disk->fops->release) |
| 1181 | ret = disk->fops->release(bd_inode, NULL); | 1166 | ret = disk->fops->release(disk, mode); |
| 1182 | } | 1167 | } |
| 1183 | if (!bdev->bd_openers) { | 1168 | if (!bdev->bd_openers) { |
| 1184 | struct module *owner = disk->fops->owner; | 1169 | struct module *owner = disk->fops->owner; |
| @@ -1197,13 +1182,13 @@ static int __blkdev_put(struct block_device *bdev, int for_part) | |||
| 1197 | mutex_unlock(&bdev->bd_mutex); | 1182 | mutex_unlock(&bdev->bd_mutex); |
| 1198 | bdput(bdev); | 1183 | bdput(bdev); |
| 1199 | if (victim) | 1184 | if (victim) |
| 1200 | __blkdev_put(victim, 1); | 1185 | __blkdev_put(victim, mode, 1); |
| 1201 | return ret; | 1186 | return ret; |
| 1202 | } | 1187 | } |
| 1203 | 1188 | ||
| 1204 | int blkdev_put(struct block_device *bdev) | 1189 | int blkdev_put(struct block_device *bdev, fmode_t mode) |
| 1205 | { | 1190 | { |
| 1206 | return __blkdev_put(bdev, 0); | 1191 | return __blkdev_put(bdev, mode, 0); |
| 1207 | } | 1192 | } |
| 1208 | EXPORT_SYMBOL(blkdev_put); | 1193 | EXPORT_SYMBOL(blkdev_put); |
| 1209 | 1194 | ||
| @@ -1212,12 +1197,16 @@ static int blkdev_close(struct inode * inode, struct file * filp) | |||
| 1212 | struct block_device *bdev = I_BDEV(filp->f_mapping->host); | 1197 | struct block_device *bdev = I_BDEV(filp->f_mapping->host); |
| 1213 | if (bdev->bd_holder == filp) | 1198 | if (bdev->bd_holder == filp) |
| 1214 | bd_release(bdev); | 1199 | bd_release(bdev); |
| 1215 | return blkdev_put(bdev); | 1200 | return blkdev_put(bdev, filp->f_mode); |
| 1216 | } | 1201 | } |
| 1217 | 1202 | ||
| 1218 | static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg) | 1203 | static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg) |
| 1219 | { | 1204 | { |
| 1220 | return blkdev_ioctl(file->f_mapping->host, file, cmd, arg); | 1205 | struct block_device *bdev = I_BDEV(file->f_mapping->host); |
| 1206 | fmode_t mode = file->f_mode; | ||
| 1207 | if (file->f_flags & O_NDELAY) | ||
| 1208 | mode |= FMODE_NDELAY_NOW; | ||
| 1209 | return blkdev_ioctl(bdev, mode, cmd, arg); | ||
| 1221 | } | 1210 | } |
| 1222 | 1211 | ||
| 1223 | static const struct address_space_operations def_blk_aops = { | 1212 | 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) | |||
| 1253 | int res; | 1242 | int res; |
| 1254 | mm_segment_t old_fs = get_fs(); | 1243 | mm_segment_t old_fs = get_fs(); |
| 1255 | set_fs(KERNEL_DS); | 1244 | set_fs(KERNEL_DS); |
| 1256 | res = blkdev_ioctl(bdev->bd_inode, NULL, cmd, arg); | 1245 | res = blkdev_ioctl(bdev, 0, cmd, arg); |
| 1257 | set_fs(old_fs); | 1246 | set_fs(old_fs); |
| 1258 | return res; | 1247 | return res; |
| 1259 | } | 1248 | } |
| @@ -1303,32 +1292,29 @@ fail: | |||
| 1303 | EXPORT_SYMBOL(lookup_bdev); | 1292 | EXPORT_SYMBOL(lookup_bdev); |
| 1304 | 1293 | ||
| 1305 | /** | 1294 | /** |
| 1306 | * open_bdev_excl - open a block device by name and set it up for use | 1295 | * open_bdev_exclusive - open a block device by name and set it up for use |
| 1307 | * | 1296 | * |
| 1308 | * @path: special file representing the block device | 1297 | * @path: special file representing the block device |
| 1309 | * @flags: %MS_RDONLY for opening read-only | 1298 | * @mode: FMODE_... combination to pass be used |
| 1310 | * @holder: owner for exclusion | 1299 | * @holder: owner for exclusion |
| 1311 | * | 1300 | * |
| 1312 | * Open the blockdevice described by the special file at @path, claim it | 1301 | * Open the blockdevice described by the special file at @path, claim it |
| 1313 | * for the @holder. | 1302 | * for the @holder. |
| 1314 | */ | 1303 | */ |
| 1315 | struct block_device *open_bdev_excl(const char *path, int flags, void *holder) | 1304 | struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *holder) |
| 1316 | { | 1305 | { |
| 1317 | struct block_device *bdev; | 1306 | struct block_device *bdev; |
| 1318 | mode_t mode = FMODE_READ; | ||
| 1319 | int error = 0; | 1307 | int error = 0; |
| 1320 | 1308 | ||
| 1321 | bdev = lookup_bdev(path); | 1309 | bdev = lookup_bdev(path); |
| 1322 | if (IS_ERR(bdev)) | 1310 | if (IS_ERR(bdev)) |
| 1323 | return bdev; | 1311 | return bdev; |
| 1324 | 1312 | ||
| 1325 | if (!(flags & MS_RDONLY)) | 1313 | error = blkdev_get(bdev, mode); |
| 1326 | mode |= FMODE_WRITE; | ||
| 1327 | error = blkdev_get(bdev, mode, 0); | ||
| 1328 | if (error) | 1314 | if (error) |
| 1329 | return ERR_PTR(error); | 1315 | return ERR_PTR(error); |
| 1330 | error = -EACCES; | 1316 | error = -EACCES; |
| 1331 | if (!(flags & MS_RDONLY) && bdev_read_only(bdev)) | 1317 | if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) |
| 1332 | goto blkdev_put; | 1318 | goto blkdev_put; |
| 1333 | error = bd_claim(bdev, holder); | 1319 | error = bd_claim(bdev, holder); |
| 1334 | if (error) | 1320 | if (error) |
| @@ -1337,26 +1323,27 @@ struct block_device *open_bdev_excl(const char *path, int flags, void *holder) | |||
| 1337 | return bdev; | 1323 | return bdev; |
| 1338 | 1324 | ||
| 1339 | blkdev_put: | 1325 | blkdev_put: |
| 1340 | blkdev_put(bdev); | 1326 | blkdev_put(bdev, mode); |
| 1341 | return ERR_PTR(error); | 1327 | return ERR_PTR(error); |
| 1342 | } | 1328 | } |
| 1343 | 1329 | ||
| 1344 | EXPORT_SYMBOL(open_bdev_excl); | 1330 | EXPORT_SYMBOL(open_bdev_exclusive); |
| 1345 | 1331 | ||
| 1346 | /** | 1332 | /** |
| 1347 | * close_bdev_excl - release a blockdevice openen by open_bdev_excl() | 1333 | * close_bdev_exclusive - close a blockdevice opened by open_bdev_exclusive() |
| 1348 | * | 1334 | * |
| 1349 | * @bdev: blockdevice to close | 1335 | * @bdev: blockdevice to close |
| 1336 | * @mode: mode, must match that used to open. | ||
| 1350 | * | 1337 | * |
| 1351 | * This is the counterpart to open_bdev_excl(). | 1338 | * This is the counterpart to open_bdev_exclusive(). |
| 1352 | */ | 1339 | */ |
| 1353 | void close_bdev_excl(struct block_device *bdev) | 1340 | void close_bdev_exclusive(struct block_device *bdev, fmode_t mode) |
| 1354 | { | 1341 | { |
| 1355 | bd_release(bdev); | 1342 | bd_release(bdev); |
| 1356 | blkdev_put(bdev); | 1343 | blkdev_put(bdev, mode); |
| 1357 | } | 1344 | } |
| 1358 | 1345 | ||
| 1359 | EXPORT_SYMBOL(close_bdev_excl); | 1346 | EXPORT_SYMBOL(close_bdev_exclusive); |
| 1360 | 1347 | ||
| 1361 | int __invalidate_device(struct block_device *bdev) | 1348 | int __invalidate_device(struct block_device *bdev) |
| 1362 | { | 1349 | { |
diff --git a/fs/ext2/xip.c b/fs/ext2/xip.c index 4fb94c20041b..b72b85884223 100644 --- a/fs/ext2/xip.c +++ b/fs/ext2/xip.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/buffer_head.h> | 11 | #include <linux/buffer_head.h> |
| 12 | #include <linux/ext2_fs_sb.h> | 12 | #include <linux/ext2_fs_sb.h> |
| 13 | #include <linux/ext2_fs.h> | 13 | #include <linux/ext2_fs.h> |
| 14 | #include <linux/blkdev.h> | ||
| 14 | #include "ext2.h" | 15 | #include "ext2.h" |
| 15 | #include "xip.h" | 16 | #include "xip.h" |
| 16 | 17 | ||
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 34b6fca765d7..8147dd44cede 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -347,7 +347,7 @@ fail: | |||
| 347 | static int ext3_blkdev_put(struct block_device *bdev) | 347 | static int ext3_blkdev_put(struct block_device *bdev) |
| 348 | { | 348 | { |
| 349 | bd_release(bdev); | 349 | bd_release(bdev); |
| 350 | return blkdev_put(bdev); | 350 | return blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 351 | } | 351 | } |
| 352 | 352 | ||
| 353 | static int ext3_blkdev_remove(struct ext3_sb_info *sbi) | 353 | 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, | |||
| 2067 | if (bd_claim(bdev, sb)) { | 2067 | if (bd_claim(bdev, sb)) { |
| 2068 | printk(KERN_ERR | 2068 | printk(KERN_ERR |
| 2069 | "EXT3: failed to claim external journal device.\n"); | 2069 | "EXT3: failed to claim external journal device.\n"); |
| 2070 | blkdev_put(bdev); | 2070 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 2071 | return NULL; | 2071 | return NULL; |
| 2072 | } | 2072 | } |
| 2073 | 2073 | ||
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index ae35f176b697..bdddea14e782 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -399,7 +399,7 @@ fail: | |||
| 399 | static int ext4_blkdev_put(struct block_device *bdev) | 399 | static int ext4_blkdev_put(struct block_device *bdev) |
| 400 | { | 400 | { |
| 401 | bd_release(bdev); | 401 | bd_release(bdev); |
| 402 | return blkdev_put(bdev); | 402 | return blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 403 | } | 403 | } |
| 404 | 404 | ||
| 405 | static int ext4_blkdev_remove(struct ext4_sb_info *sbi) | 405 | 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, | |||
| 2553 | if (bd_claim(bdev, sb)) { | 2553 | if (bd_claim(bdev, sb)) { |
| 2554 | printk(KERN_ERR | 2554 | printk(KERN_ERR |
| 2555 | "EXT4: failed to claim external journal device.\n"); | 2555 | "EXT4: failed to claim external journal device.\n"); |
| 2556 | blkdev_put(bdev); | 2556 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 2557 | return NULL; | 2557 | return NULL; |
| 2558 | } | 2558 | } |
| 2559 | 2559 | ||
| @@ -51,7 +51,7 @@ static int fifo_open(struct inode *inode, struct file *filp) | |||
| 51 | filp->f_mode &= (FMODE_READ | FMODE_WRITE); | 51 | filp->f_mode &= (FMODE_READ | FMODE_WRITE); |
| 52 | 52 | ||
| 53 | switch (filp->f_mode) { | 53 | switch (filp->f_mode) { |
| 54 | case 1: | 54 | case FMODE_READ: |
| 55 | /* | 55 | /* |
| 56 | * O_RDONLY | 56 | * O_RDONLY |
| 57 | * POSIX.1 says that O_NONBLOCK means return with the FIFO | 57 | * 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) | |||
| 76 | } | 76 | } |
| 77 | break; | 77 | break; |
| 78 | 78 | ||
| 79 | case 2: | 79 | case FMODE_WRITE: |
| 80 | /* | 80 | /* |
| 81 | * O_WRONLY | 81 | * O_WRONLY |
| 82 | * POSIX.1 says that O_NONBLOCK means return -1 with | 82 | * POSIX.1 says that O_NONBLOCK means return -1 with |
| @@ -98,7 +98,7 @@ static int fifo_open(struct inode *inode, struct file *filp) | |||
| 98 | } | 98 | } |
| 99 | break; | 99 | break; |
| 100 | 100 | ||
| 101 | case 3: | 101 | case FMODE_READ | FMODE_WRITE: |
| 102 | /* | 102 | /* |
| 103 | * O_RDWR | 103 | * O_RDWR |
| 104 | * POSIX.1 leaves this case "undefined" when O_NONBLOCK is set. | 104 | * POSIX.1 leaves this case "undefined" when O_NONBLOCK is set. |
diff --git a/fs/file_table.c b/fs/file_table.c index f45a4493f9e7..efc06faede6c 100644 --- a/fs/file_table.c +++ b/fs/file_table.c | |||
| @@ -161,7 +161,7 @@ EXPORT_SYMBOL(get_empty_filp); | |||
| 161 | * code should be moved into this function. | 161 | * code should be moved into this function. |
| 162 | */ | 162 | */ |
| 163 | struct file *alloc_file(struct vfsmount *mnt, struct dentry *dentry, | 163 | struct file *alloc_file(struct vfsmount *mnt, struct dentry *dentry, |
| 164 | mode_t mode, const struct file_operations *fop) | 164 | fmode_t mode, const struct file_operations *fop) |
| 165 | { | 165 | { |
| 166 | struct file *file; | 166 | struct file *file; |
| 167 | struct path; | 167 | struct path; |
| @@ -193,7 +193,7 @@ EXPORT_SYMBOL(alloc_file); | |||
| 193 | * of this should be moving to alloc_file(). | 193 | * of this should be moving to alloc_file(). |
| 194 | */ | 194 | */ |
| 195 | int init_file(struct file *file, struct vfsmount *mnt, struct dentry *dentry, | 195 | int init_file(struct file *file, struct vfsmount *mnt, struct dentry *dentry, |
| 196 | mode_t mode, const struct file_operations *fop) | 196 | fmode_t mode, const struct file_operations *fop) |
| 197 | { | 197 | { |
| 198 | int error = 0; | 198 | int error = 0; |
| 199 | file->f_path.dentry = dentry; | 199 | file->f_path.dentry = dentry; |
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index d6ecabf4d231..7f34f4385de0 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | struct hostfs_inode_info { | 20 | struct hostfs_inode_info { |
| 21 | char *host_filename; | 21 | char *host_filename; |
| 22 | int fd; | 22 | int fd; |
| 23 | int mode; | 23 | fmode_t mode; |
| 24 | struct inode vfs_inode; | 24 | struct inode vfs_inode; |
| 25 | }; | 25 | }; |
| 26 | 26 | ||
| @@ -373,7 +373,8 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir) | |||
| 373 | int hostfs_file_open(struct inode *ino, struct file *file) | 373 | int hostfs_file_open(struct inode *ino, struct file *file) |
| 374 | { | 374 | { |
| 375 | char *name; | 375 | char *name; |
| 376 | int mode = 0, r = 0, w = 0, fd; | 376 | fmode_t mode = 0; |
| 377 | int r = 0, w = 0, fd; | ||
| 377 | 378 | ||
| 378 | mode = file->f_mode & (FMODE_READ | FMODE_WRITE); | 379 | mode = file->f_mode & (FMODE_READ | FMODE_WRITE); |
| 379 | if ((mode & HOSTFS_I(ino)->mode) == mode) | 380 | if ((mode & HOSTFS_I(ino)->mode) == mode) |
diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index cd2ec2988b59..335c4de6552d 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c | |||
| @@ -1168,7 +1168,7 @@ journal_found: | |||
| 1168 | bd_release(bdev); | 1168 | bd_release(bdev); |
| 1169 | 1169 | ||
| 1170 | close: /* close external log device */ | 1170 | close: /* close external log device */ |
| 1171 | blkdev_put(bdev); | 1171 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 1172 | 1172 | ||
| 1173 | free: /* free log descriptor */ | 1173 | free: /* free log descriptor */ |
| 1174 | mutex_unlock(&jfs_log_mutex); | 1174 | mutex_unlock(&jfs_log_mutex); |
| @@ -1514,7 +1514,7 @@ int lmLogClose(struct super_block *sb) | |||
| 1514 | rc = lmLogShutdown(log); | 1514 | rc = lmLogShutdown(log); |
| 1515 | 1515 | ||
| 1516 | bd_release(bdev); | 1516 | bd_release(bdev); |
| 1517 | blkdev_put(bdev); | 1517 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); |
| 1518 | 1518 | ||
| 1519 | kfree(log); | 1519 | kfree(log); |
| 1520 | 1520 | ||
diff --git a/fs/locks.c b/fs/locks.c index 5eb259e3cd38..20457486d6b2 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -1580,7 +1580,8 @@ asmlinkage long sys_flock(unsigned int fd, unsigned int cmd) | |||
| 1580 | cmd &= ~LOCK_NB; | 1580 | cmd &= ~LOCK_NB; |
| 1581 | unlock = (cmd == LOCK_UN); | 1581 | unlock = (cmd == LOCK_UN); |
| 1582 | 1582 | ||
| 1583 | if (!unlock && !(cmd & LOCK_MAND) && !(filp->f_mode & 3)) | 1583 | if (!unlock && !(cmd & LOCK_MAND) && |
| 1584 | !(filp->f_mode & (FMODE_READ|FMODE_WRITE))) | ||
| 1584 | goto out_putf; | 1585 | goto out_putf; |
| 1585 | 1586 | ||
| 1586 | error = flock_make_lock(filp, &lock, cmd); | 1587 | error = flock_make_lock(filp, &lock, cmd); |
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 7dce1612553e..6ebaa58e2c03 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c | |||
| @@ -976,7 +976,7 @@ static void o2hb_region_release(struct config_item *item) | |||
| 976 | } | 976 | } |
| 977 | 977 | ||
| 978 | if (reg->hr_bdev) | 978 | if (reg->hr_bdev) |
| 979 | blkdev_put(reg->hr_bdev); | 979 | blkdev_put(reg->hr_bdev, FMODE_READ|FMODE_WRITE); |
| 980 | 980 | ||
| 981 | if (reg->hr_slots) | 981 | if (reg->hr_slots) |
| 982 | kfree(reg->hr_slots); | 982 | kfree(reg->hr_slots); |
| @@ -1268,7 +1268,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, | |||
| 1268 | goto out; | 1268 | goto out; |
| 1269 | 1269 | ||
| 1270 | reg->hr_bdev = I_BDEV(filp->f_mapping->host); | 1270 | reg->hr_bdev = I_BDEV(filp->f_mapping->host); |
| 1271 | ret = blkdev_get(reg->hr_bdev, FMODE_WRITE | FMODE_READ, 0); | 1271 | ret = blkdev_get(reg->hr_bdev, FMODE_WRITE | FMODE_READ); |
| 1272 | if (ret) { | 1272 | if (ret) { |
| 1273 | reg->hr_bdev = NULL; | 1273 | reg->hr_bdev = NULL; |
| 1274 | goto out; | 1274 | goto out; |
| @@ -1358,7 +1358,7 @@ out: | |||
| 1358 | iput(inode); | 1358 | iput(inode); |
| 1359 | if (ret < 0) { | 1359 | if (ret < 0) { |
| 1360 | if (reg->hr_bdev) { | 1360 | if (reg->hr_bdev) { |
| 1361 | blkdev_put(reg->hr_bdev); | 1361 | blkdev_put(reg->hr_bdev, FMODE_READ|FMODE_WRITE); |
| 1362 | reg->hr_bdev = NULL; | 1362 | reg->hr_bdev = NULL; |
| 1363 | } | 1363 | } |
| 1364 | } | 1364 | } |
| @@ -798,7 +798,7 @@ static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt, | |||
| 798 | int error; | 798 | int error; |
| 799 | 799 | ||
| 800 | f->f_flags = flags; | 800 | f->f_flags = flags; |
| 801 | f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK | | 801 | f->f_mode = (__force fmode_t)((flags+1) & O_ACCMODE) | FMODE_LSEEK | |
| 802 | FMODE_PREAD | FMODE_PWRITE; | 802 | FMODE_PREAD | FMODE_PWRITE; |
| 803 | inode = dentry->d_inode; | 803 | inode = dentry->d_inode; |
| 804 | if (f->f_mode & FMODE_WRITE) { | 804 | if (f->f_mode & FMODE_WRITE) { |
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index cfb0c80690aa..633f7a0ebb2c 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
| @@ -485,10 +485,10 @@ void register_disk(struct gendisk *disk) | |||
| 485 | goto exit; | 485 | goto exit; |
| 486 | 486 | ||
| 487 | bdev->bd_invalidated = 1; | 487 | bdev->bd_invalidated = 1; |
| 488 | err = blkdev_get(bdev, FMODE_READ, 0); | 488 | err = blkdev_get(bdev, FMODE_READ); |
| 489 | if (err < 0) | 489 | if (err < 0) |
| 490 | goto exit; | 490 | goto exit; |
| 491 | blkdev_put(bdev); | 491 | blkdev_put(bdev, FMODE_READ); |
| 492 | 492 | ||
| 493 | exit: | 493 | exit: |
| 494 | /* announce disk after possible partitions are created */ | 494 | /* announce disk after possible partitions are created */ |
diff --git a/fs/proc/base.c b/fs/proc/base.c index b5918ae8ca79..486cf3fe7139 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -1712,9 +1712,9 @@ static struct dentry *proc_fd_instantiate(struct inode *dir, | |||
| 1712 | file = fcheck_files(files, fd); | 1712 | file = fcheck_files(files, fd); |
| 1713 | if (!file) | 1713 | if (!file) |
| 1714 | goto out_unlock; | 1714 | goto out_unlock; |
| 1715 | if (file->f_mode & 1) | 1715 | if (file->f_mode & FMODE_READ) |
| 1716 | inode->i_mode |= S_IRUSR | S_IXUSR; | 1716 | inode->i_mode |= S_IRUSR | S_IXUSR; |
| 1717 | if (file->f_mode & 2) | 1717 | if (file->f_mode & FMODE_WRITE) |
| 1718 | inode->i_mode |= S_IWUSR | S_IXUSR; | 1718 | inode->i_mode |= S_IWUSR | S_IXUSR; |
| 1719 | spin_unlock(&files->file_lock); | 1719 | spin_unlock(&files->file_lock); |
| 1720 | put_files_struct(files); | 1720 | put_files_struct(files); |
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index c21df71943a6..9643c3bbeb3b 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c | |||
| @@ -2575,7 +2575,7 @@ static int release_journal_dev(struct super_block *super, | |||
| 2575 | if (journal->j_dev_bd != NULL) { | 2575 | if (journal->j_dev_bd != NULL) { |
| 2576 | if (journal->j_dev_bd->bd_dev != super->s_dev) | 2576 | if (journal->j_dev_bd->bd_dev != super->s_dev) |
| 2577 | bd_release(journal->j_dev_bd); | 2577 | bd_release(journal->j_dev_bd); |
| 2578 | result = blkdev_put(journal->j_dev_bd); | 2578 | result = blkdev_put(journal->j_dev_bd, journal->j_dev_mode); |
| 2579 | journal->j_dev_bd = NULL; | 2579 | journal->j_dev_bd = NULL; |
| 2580 | } | 2580 | } |
| 2581 | 2581 | ||
| @@ -2593,7 +2593,7 @@ static int journal_init_dev(struct super_block *super, | |||
| 2593 | { | 2593 | { |
| 2594 | int result; | 2594 | int result; |
| 2595 | dev_t jdev; | 2595 | dev_t jdev; |
| 2596 | int blkdev_mode = FMODE_READ | FMODE_WRITE; | 2596 | fmode_t blkdev_mode = FMODE_READ | FMODE_WRITE; |
| 2597 | char b[BDEVNAME_SIZE]; | 2597 | char b[BDEVNAME_SIZE]; |
| 2598 | 2598 | ||
| 2599 | result = 0; | 2599 | result = 0; |
| @@ -2608,6 +2608,7 @@ static int journal_init_dev(struct super_block *super, | |||
| 2608 | /* there is no "jdev" option and journal is on separate device */ | 2608 | /* there is no "jdev" option and journal is on separate device */ |
| 2609 | if ((!jdev_name || !jdev_name[0])) { | 2609 | if ((!jdev_name || !jdev_name[0])) { |
| 2610 | journal->j_dev_bd = open_by_devnum(jdev, blkdev_mode); | 2610 | journal->j_dev_bd = open_by_devnum(jdev, blkdev_mode); |
| 2611 | journal->j_dev_mode = blkdev_mode; | ||
| 2611 | if (IS_ERR(journal->j_dev_bd)) { | 2612 | if (IS_ERR(journal->j_dev_bd)) { |
| 2612 | result = PTR_ERR(journal->j_dev_bd); | 2613 | result = PTR_ERR(journal->j_dev_bd); |
| 2613 | journal->j_dev_bd = NULL; | 2614 | journal->j_dev_bd = NULL; |
| @@ -2618,7 +2619,7 @@ static int journal_init_dev(struct super_block *super, | |||
| 2618 | } else if (jdev != super->s_dev) { | 2619 | } else if (jdev != super->s_dev) { |
| 2619 | result = bd_claim(journal->j_dev_bd, journal); | 2620 | result = bd_claim(journal->j_dev_bd, journal); |
| 2620 | if (result) { | 2621 | if (result) { |
| 2621 | blkdev_put(journal->j_dev_bd); | 2622 | blkdev_put(journal->j_dev_bd, blkdev_mode); |
| 2622 | return result; | 2623 | return result; |
| 2623 | } | 2624 | } |
| 2624 | 2625 | ||
| @@ -2628,7 +2629,9 @@ static int journal_init_dev(struct super_block *super, | |||
| 2628 | return 0; | 2629 | return 0; |
| 2629 | } | 2630 | } |
| 2630 | 2631 | ||
| 2631 | journal->j_dev_bd = open_bdev_excl(jdev_name, 0, journal); | 2632 | journal->j_dev_mode = blkdev_mode; |
| 2633 | journal->j_dev_bd = open_bdev_exclusive(jdev_name, | ||
| 2634 | blkdev_mode, journal); | ||
| 2632 | if (IS_ERR(journal->j_dev_bd)) { | 2635 | if (IS_ERR(journal->j_dev_bd)) { |
| 2633 | result = PTR_ERR(journal->j_dev_bd); | 2636 | result = PTR_ERR(journal->j_dev_bd); |
| 2634 | journal->j_dev_bd = NULL; | 2637 | journal->j_dev_bd = NULL; |
diff --git a/fs/super.c b/fs/super.c index f31ef824d069..400a7608f15e 100644 --- a/fs/super.c +++ b/fs/super.c | |||
| @@ -755,9 +755,13 @@ int get_sb_bdev(struct file_system_type *fs_type, | |||
| 755 | { | 755 | { |
| 756 | struct block_device *bdev; | 756 | struct block_device *bdev; |
| 757 | struct super_block *s; | 757 | struct super_block *s; |
| 758 | fmode_t mode = FMODE_READ; | ||
| 758 | int error = 0; | 759 | int error = 0; |
| 759 | 760 | ||
| 760 | bdev = open_bdev_excl(dev_name, flags, fs_type); | 761 | if (!(flags & MS_RDONLY)) |
| 762 | mode |= FMODE_WRITE; | ||
| 763 | |||
| 764 | bdev = open_bdev_exclusive(dev_name, mode, fs_type); | ||
| 761 | if (IS_ERR(bdev)) | 765 | if (IS_ERR(bdev)) |
| 762 | return PTR_ERR(bdev); | 766 | return PTR_ERR(bdev); |
| 763 | 767 | ||
| @@ -780,11 +784,12 @@ int get_sb_bdev(struct file_system_type *fs_type, | |||
| 780 | goto error_bdev; | 784 | goto error_bdev; |
| 781 | } | 785 | } |
| 782 | 786 | ||
| 783 | close_bdev_excl(bdev); | 787 | close_bdev_exclusive(bdev, mode); |
| 784 | } else { | 788 | } else { |
| 785 | char b[BDEVNAME_SIZE]; | 789 | char b[BDEVNAME_SIZE]; |
| 786 | 790 | ||
| 787 | s->s_flags = flags; | 791 | s->s_flags = flags; |
| 792 | s->s_mode = mode; | ||
| 788 | strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); | 793 | strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); |
| 789 | sb_set_blocksize(s, block_size(bdev)); | 794 | sb_set_blocksize(s, block_size(bdev)); |
| 790 | error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); | 795 | error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); |
| @@ -802,7 +807,7 @@ int get_sb_bdev(struct file_system_type *fs_type, | |||
| 802 | error_s: | 807 | error_s: |
| 803 | error = PTR_ERR(s); | 808 | error = PTR_ERR(s); |
| 804 | error_bdev: | 809 | error_bdev: |
| 805 | close_bdev_excl(bdev); | 810 | close_bdev_exclusive(bdev, mode); |
| 806 | error: | 811 | error: |
| 807 | return error; | 812 | return error; |
| 808 | } | 813 | } |
| @@ -812,10 +817,11 @@ EXPORT_SYMBOL(get_sb_bdev); | |||
| 812 | void kill_block_super(struct super_block *sb) | 817 | void kill_block_super(struct super_block *sb) |
| 813 | { | 818 | { |
| 814 | struct block_device *bdev = sb->s_bdev; | 819 | struct block_device *bdev = sb->s_bdev; |
| 820 | fmode_t mode = sb->s_mode; | ||
| 815 | 821 | ||
| 816 | generic_shutdown_super(sb); | 822 | generic_shutdown_super(sb); |
| 817 | sync_blockdev(bdev); | 823 | sync_blockdev(bdev); |
| 818 | close_bdev_excl(bdev); | 824 | close_bdev_exclusive(bdev, mode); |
| 819 | } | 825 | } |
| 820 | 826 | ||
| 821 | EXPORT_SYMBOL(kill_block_super); | 827 | EXPORT_SYMBOL(kill_block_super); |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index e39013619b26..37ebe36056eb 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
| @@ -589,7 +589,7 @@ xfs_blkdev_get( | |||
| 589 | { | 589 | { |
| 590 | int error = 0; | 590 | int error = 0; |
| 591 | 591 | ||
| 592 | *bdevp = open_bdev_excl(name, 0, mp); | 592 | *bdevp = open_bdev_exclusive(name, FMODE_READ|FMODE_WRITE, mp); |
| 593 | if (IS_ERR(*bdevp)) { | 593 | if (IS_ERR(*bdevp)) { |
| 594 | error = PTR_ERR(*bdevp); | 594 | error = PTR_ERR(*bdevp); |
| 595 | printk("XFS: Invalid device [%s], error=%d\n", name, error); | 595 | printk("XFS: Invalid device [%s], error=%d\n", name, error); |
| @@ -603,7 +603,7 @@ xfs_blkdev_put( | |||
| 603 | struct block_device *bdev) | 603 | struct block_device *bdev) |
| 604 | { | 604 | { |
| 605 | if (bdev) | 605 | if (bdev) |
| 606 | close_bdev_excl(bdev); | 606 | close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE); |
| 607 | } | 607 | } |
| 608 | 608 | ||
| 609 | /* | 609 | /* |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index b4fe68fe3a57..a135256b272c 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -717,10 +717,10 @@ extern void blk_plug_device(struct request_queue *); | |||
| 717 | extern void blk_plug_device_unlocked(struct request_queue *); | 717 | extern void blk_plug_device_unlocked(struct request_queue *); |
| 718 | extern int blk_remove_plug(struct request_queue *); | 718 | extern int blk_remove_plug(struct request_queue *); |
| 719 | extern void blk_recount_segments(struct request_queue *, struct bio *); | 719 | extern void blk_recount_segments(struct request_queue *, struct bio *); |
| 720 | extern int scsi_cmd_ioctl(struct file *, struct request_queue *, | 720 | extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t, |
| 721 | struct gendisk *, unsigned int, void __user *); | 721 | unsigned int, void __user *); |
| 722 | extern int sg_scsi_ioctl(struct file *, struct request_queue *, | 722 | extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t, |
| 723 | struct gendisk *, struct scsi_ioctl_command __user *); | 723 | struct scsi_ioctl_command __user *); |
| 724 | 724 | ||
| 725 | /* | 725 | /* |
| 726 | * Temporary export, until SCSI gets fixed up. | 726 | * Temporary export, until SCSI gets fixed up. |
| @@ -910,7 +910,8 @@ static inline int sb_issue_discard(struct super_block *sb, | |||
| 910 | * command filter functions | 910 | * command filter functions |
| 911 | */ | 911 | */ |
| 912 | extern int blk_verify_command(struct blk_cmd_filter *filter, | 912 | extern int blk_verify_command(struct blk_cmd_filter *filter, |
| 913 | unsigned char *cmd, int has_write_perm); | 913 | unsigned char *cmd, fmode_t has_write_perm); |
| 914 | extern void blk_unregister_filter(struct gendisk *disk); | ||
| 914 | extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter); | 915 | extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter); |
| 915 | 916 | ||
| 916 | #define MAX_PHYS_SEGMENTS 128 | 917 | #define MAX_PHYS_SEGMENTS 128 |
| @@ -1056,6 +1057,22 @@ static inline int blk_integrity_rq(struct request *rq) | |||
| 1056 | 1057 | ||
| 1057 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ | 1058 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
| 1058 | 1059 | ||
| 1060 | struct block_device_operations { | ||
| 1061 | int (*open) (struct block_device *, fmode_t); | ||
| 1062 | int (*release) (struct gendisk *, fmode_t); | ||
| 1063 | int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | ||
| 1064 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | ||
| 1065 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | ||
| 1066 | int (*direct_access) (struct block_device *, sector_t, | ||
| 1067 | void **, unsigned long *); | ||
| 1068 | int (*media_changed) (struct gendisk *); | ||
| 1069 | int (*revalidate_disk) (struct gendisk *); | ||
| 1070 | int (*getgeo)(struct block_device *, struct hd_geometry *); | ||
| 1071 | struct module *owner; | ||
| 1072 | }; | ||
| 1073 | |||
| 1074 | extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, | ||
| 1075 | unsigned long); | ||
| 1059 | #else /* CONFIG_BLOCK */ | 1076 | #else /* CONFIG_BLOCK */ |
| 1060 | /* | 1077 | /* |
| 1061 | * stubs for when the block layer is configured out | 1078 | * stubs for when the block layer is configured out |
diff --git a/include/linux/cdrom.h b/include/linux/cdrom.h index 5db265ea60f6..0b49e08d3cb0 100644 --- a/include/linux/cdrom.h +++ b/include/linux/cdrom.h | |||
| @@ -987,11 +987,11 @@ struct cdrom_device_ops { | |||
| 987 | }; | 987 | }; |
| 988 | 988 | ||
| 989 | /* the general block_device operations structure: */ | 989 | /* the general block_device operations structure: */ |
| 990 | extern int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, | 990 | extern int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev, |
| 991 | struct file *fp); | 991 | fmode_t mode); |
| 992 | extern int cdrom_release(struct cdrom_device_info *cdi, struct file *fp); | 992 | extern void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode); |
| 993 | extern int cdrom_ioctl(struct file *file, struct cdrom_device_info *cdi, | 993 | extern int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev, |
| 994 | struct inode *ip, unsigned int cmd, unsigned long arg); | 994 | fmode_t mode, unsigned int cmd, unsigned long arg); |
| 995 | extern int cdrom_media_changed(struct cdrom_device_info *); | 995 | extern int cdrom_media_changed(struct cdrom_device_info *); |
| 996 | 996 | ||
| 997 | extern int register_cdrom(struct cdrom_device_info *cdi); | 997 | extern int register_cdrom(struct cdrom_device_info *cdi); |
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index dfb30db475ed..c17fd334e574 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
| @@ -69,8 +69,7 @@ typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, | |||
| 69 | 69 | ||
| 70 | typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv); | 70 | typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv); |
| 71 | 71 | ||
| 72 | typedef int (*dm_ioctl_fn) (struct dm_target *ti, struct inode *inode, | 72 | typedef int (*dm_ioctl_fn) (struct dm_target *ti, unsigned int cmd, |
| 73 | struct file *filp, unsigned int cmd, | ||
| 74 | unsigned long arg); | 73 | unsigned long arg); |
| 75 | 74 | ||
| 76 | typedef int (*dm_merge_fn) (struct dm_target *ti, struct bvec_merge_data *bvm, | 75 | 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); | |||
| 85 | 84 | ||
| 86 | struct dm_dev { | 85 | struct dm_dev { |
| 87 | struct block_device *bdev; | 86 | struct block_device *bdev; |
| 88 | int mode; | 87 | fmode_t mode; |
| 89 | char name[16]; | 88 | char name[16]; |
| 90 | }; | 89 | }; |
| 91 | 90 | ||
| @@ -95,7 +94,7 @@ struct dm_dev { | |||
| 95 | * FIXME: too many arguments. | 94 | * FIXME: too many arguments. |
| 96 | */ | 95 | */ |
| 97 | int dm_get_device(struct dm_target *ti, const char *path, sector_t start, | 96 | int dm_get_device(struct dm_target *ti, const char *path, sector_t start, |
| 98 | sector_t len, int mode, struct dm_dev **result); | 97 | sector_t len, fmode_t mode, struct dm_dev **result); |
| 99 | void dm_put_device(struct dm_target *ti, struct dm_dev *d); | 98 | void dm_put_device(struct dm_target *ti, struct dm_dev *d); |
| 100 | 99 | ||
| 101 | /* | 100 | /* |
| @@ -223,7 +222,7 @@ int dm_set_geometry(struct mapped_device *md, struct hd_geometry *geo); | |||
| 223 | /* | 222 | /* |
| 224 | * First create an empty table. | 223 | * First create an empty table. |
| 225 | */ | 224 | */ |
| 226 | int dm_table_create(struct dm_table **result, int mode, | 225 | int dm_table_create(struct dm_table **result, fmode_t mode, |
| 227 | unsigned num_targets, struct mapped_device *md); | 226 | unsigned num_targets, struct mapped_device *md); |
| 228 | 227 | ||
| 229 | /* | 228 | /* |
| @@ -254,7 +253,7 @@ void dm_table_put(struct dm_table *t); | |||
| 254 | */ | 253 | */ |
| 255 | sector_t dm_table_get_size(struct dm_table *t); | 254 | sector_t dm_table_get_size(struct dm_table *t); |
| 256 | unsigned int dm_table_get_num_targets(struct dm_table *t); | 255 | unsigned int dm_table_get_num_targets(struct dm_table *t); |
| 257 | int dm_table_get_mode(struct dm_table *t); | 256 | fmode_t dm_table_get_mode(struct dm_table *t); |
| 258 | struct mapped_device *dm_table_get_md(struct dm_table *t); | 257 | struct mapped_device *dm_table_get_md(struct dm_table *t); |
| 259 | 258 | ||
| 260 | /* | 259 | /* |
diff --git a/include/linux/file.h b/include/linux/file.h index a20259e248a5..335a0a5c316e 100644 --- a/include/linux/file.h +++ b/include/linux/file.h | |||
| @@ -19,10 +19,10 @@ struct file_operations; | |||
| 19 | struct vfsmount; | 19 | struct vfsmount; |
| 20 | struct dentry; | 20 | struct dentry; |
| 21 | extern int init_file(struct file *, struct vfsmount *mnt, | 21 | extern int init_file(struct file *, struct vfsmount *mnt, |
| 22 | struct dentry *dentry, mode_t mode, | 22 | struct dentry *dentry, fmode_t mode, |
| 23 | const struct file_operations *fop); | 23 | const struct file_operations *fop); |
| 24 | extern struct file *alloc_file(struct vfsmount *, struct dentry *dentry, | 24 | extern struct file *alloc_file(struct vfsmount *, struct dentry *dentry, |
| 25 | mode_t mode, const struct file_operations *fop); | 25 | fmode_t mode, const struct file_operations *fop); |
| 26 | 26 | ||
| 27 | static inline void fput_light(struct file *file, int fput_needed) | 27 | static inline void fput_light(struct file *file, int fput_needed) |
| 28 | { | 28 | { |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 7d719c1a18e3..43659ae52e4d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -63,18 +63,23 @@ extern int dir_notify_enable; | |||
| 63 | #define MAY_ACCESS 16 | 63 | #define MAY_ACCESS 16 |
| 64 | #define MAY_OPEN 32 | 64 | #define MAY_OPEN 32 |
| 65 | 65 | ||
| 66 | #define FMODE_READ 1 | 66 | #define FMODE_READ ((__force fmode_t)1) |
| 67 | #define FMODE_WRITE 2 | 67 | #define FMODE_WRITE ((__force fmode_t)2) |
| 68 | 68 | ||
| 69 | /* Internal kernel extensions */ | 69 | /* Internal kernel extensions */ |
| 70 | #define FMODE_LSEEK 4 | 70 | #define FMODE_LSEEK ((__force fmode_t)4) |
| 71 | #define FMODE_PREAD 8 | 71 | #define FMODE_PREAD ((__force fmode_t)8) |
| 72 | #define FMODE_PWRITE FMODE_PREAD /* These go hand in hand */ | 72 | #define FMODE_PWRITE FMODE_PREAD /* These go hand in hand */ |
| 73 | 73 | ||
| 74 | /* File is being opened for execution. Primary users of this flag are | 74 | /* File is being opened for execution. Primary users of this flag are |
| 75 | distributed filesystems that can use it to achieve correct ETXTBUSY | 75 | distributed filesystems that can use it to achieve correct ETXTBUSY |
| 76 | behavior for cross-node execution/opening_for_writing of files */ | 76 | behavior for cross-node execution/opening_for_writing of files */ |
| 77 | #define FMODE_EXEC 16 | 77 | #define FMODE_EXEC ((__force fmode_t)16) |
| 78 | |||
| 79 | #define FMODE_NDELAY ((__force fmode_t)32) | ||
| 80 | #define FMODE_EXCL ((__force fmode_t)64) | ||
| 81 | #define FMODE_WRITE_IOCTL ((__force fmode_t)128) | ||
| 82 | #define FMODE_NDELAY_NOW ((__force fmode_t)256) | ||
| 78 | 83 | ||
| 79 | #define RW_MASK 1 | 84 | #define RW_MASK 1 |
| 80 | #define RWA_MASK 2 | 85 | #define RWA_MASK 2 |
| @@ -825,7 +830,7 @@ struct file { | |||
| 825 | const struct file_operations *f_op; | 830 | const struct file_operations *f_op; |
| 826 | atomic_long_t f_count; | 831 | atomic_long_t f_count; |
| 827 | unsigned int f_flags; | 832 | unsigned int f_flags; |
| 828 | mode_t f_mode; | 833 | fmode_t f_mode; |
| 829 | loff_t f_pos; | 834 | loff_t f_pos; |
| 830 | struct fown_struct f_owner; | 835 | struct fown_struct f_owner; |
| 831 | unsigned int f_uid, f_gid; | 836 | unsigned int f_uid, f_gid; |
| @@ -1152,6 +1157,7 @@ struct super_block { | |||
| 1152 | char s_id[32]; /* Informational name */ | 1157 | char s_id[32]; /* Informational name */ |
| 1153 | 1158 | ||
| 1154 | void *s_fs_info; /* Filesystem private info */ | 1159 | void *s_fs_info; /* Filesystem private info */ |
| 1160 | fmode_t s_mode; | ||
| 1155 | 1161 | ||
| 1156 | /* | 1162 | /* |
| 1157 | * The next field is for VFS *only*. No filesystems have any business | 1163 | * 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); | |||
| 1266 | * to have different dirent layouts depending on the binary type. | 1272 | * to have different dirent layouts depending on the binary type. |
| 1267 | */ | 1273 | */ |
| 1268 | typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned); | 1274 | typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned); |
| 1269 | 1275 | struct block_device_operations; | |
| 1270 | struct block_device_operations { | ||
| 1271 | int (*open) (struct inode *, struct file *); | ||
| 1272 | int (*release) (struct inode *, struct file *); | ||
| 1273 | int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long); | ||
| 1274 | long (*unlocked_ioctl) (struct file *, unsigned, unsigned long); | ||
| 1275 | long (*compat_ioctl) (struct file *, unsigned, unsigned long); | ||
| 1276 | int (*direct_access) (struct block_device *, sector_t, | ||
| 1277 | void **, unsigned long *); | ||
| 1278 | int (*media_changed) (struct gendisk *); | ||
| 1279 | int (*revalidate_disk) (struct gendisk *); | ||
| 1280 | int (*getgeo)(struct block_device *, struct hd_geometry *); | ||
| 1281 | struct module *owner; | ||
| 1282 | }; | ||
| 1283 | 1276 | ||
| 1284 | /* These macros are for out of kernel modules to test that | 1277 | /* These macros are for out of kernel modules to test that |
| 1285 | * the kernel supports the unlocked_ioctl and compat_ioctl | 1278 | * the kernel supports the unlocked_ioctl and compat_ioctl |
| @@ -1713,7 +1706,7 @@ extern struct block_device *bdget(dev_t); | |||
| 1713 | extern void bd_set_size(struct block_device *, loff_t size); | 1706 | extern void bd_set_size(struct block_device *, loff_t size); |
| 1714 | extern void bd_forget(struct inode *inode); | 1707 | extern void bd_forget(struct inode *inode); |
| 1715 | extern void bdput(struct block_device *); | 1708 | extern void bdput(struct block_device *); |
| 1716 | extern struct block_device *open_by_devnum(dev_t, unsigned); | 1709 | extern struct block_device *open_by_devnum(dev_t, fmode_t); |
| 1717 | #else | 1710 | #else |
| 1718 | static inline void bd_forget(struct inode *inode) {} | 1711 | static inline void bd_forget(struct inode *inode) {} |
| 1719 | #endif | 1712 | #endif |
| @@ -1723,13 +1716,10 @@ extern const struct file_operations bad_sock_fops; | |||
| 1723 | extern const struct file_operations def_fifo_fops; | 1716 | extern const struct file_operations def_fifo_fops; |
| 1724 | #ifdef CONFIG_BLOCK | 1717 | #ifdef CONFIG_BLOCK |
| 1725 | extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); | 1718 | extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); |
| 1726 | extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long); | 1719 | extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long); |
| 1727 | extern int blkdev_driver_ioctl(struct inode *inode, struct file *file, | ||
| 1728 | struct gendisk *disk, unsigned cmd, | ||
| 1729 | unsigned long arg); | ||
| 1730 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); | 1720 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); |
| 1731 | extern int blkdev_get(struct block_device *, mode_t, unsigned); | 1721 | extern int blkdev_get(struct block_device *, fmode_t); |
| 1732 | extern int blkdev_put(struct block_device *); | 1722 | extern int blkdev_put(struct block_device *, fmode_t); |
| 1733 | extern int bd_claim(struct block_device *, void *); | 1723 | extern int bd_claim(struct block_device *, void *); |
| 1734 | extern void bd_release(struct block_device *); | 1724 | extern void bd_release(struct block_device *); |
| 1735 | #ifdef CONFIG_SYSFS | 1725 | #ifdef CONFIG_SYSFS |
| @@ -1760,9 +1750,10 @@ extern void chrdev_show(struct seq_file *,off_t); | |||
| 1760 | extern const char *__bdevname(dev_t, char *buffer); | 1750 | extern const char *__bdevname(dev_t, char *buffer); |
| 1761 | extern const char *bdevname(struct block_device *bdev, char *buffer); | 1751 | extern const char *bdevname(struct block_device *bdev, char *buffer); |
| 1762 | extern struct block_device *lookup_bdev(const char *); | 1752 | extern struct block_device *lookup_bdev(const char *); |
| 1763 | extern struct block_device *open_bdev_excl(const char *, int, void *); | 1753 | extern struct block_device *open_bdev_exclusive(const char *, fmode_t, void *); |
| 1764 | extern void close_bdev_excl(struct block_device *); | 1754 | extern void close_bdev_exclusive(struct block_device *, fmode_t); |
| 1765 | extern void blkdev_show(struct seq_file *,off_t); | 1755 | extern void blkdev_show(struct seq_file *,off_t); |
| 1756 | |||
| 1766 | #else | 1757 | #else |
| 1767 | #define BLKDEV_MAJOR_HASH_SIZE 0 | 1758 | #define BLKDEV_MAJOR_HASH_SIZE 0 |
| 1768 | #endif | 1759 | #endif |
diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index a89513188ce7..00fbd5b245c9 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h | |||
| @@ -188,7 +188,7 @@ static inline void fsnotify_close(struct file *file) | |||
| 188 | struct dentry *dentry = file->f_path.dentry; | 188 | struct dentry *dentry = file->f_path.dentry; |
| 189 | struct inode *inode = dentry->d_inode; | 189 | struct inode *inode = dentry->d_inode; |
| 190 | const char *name = dentry->d_name.name; | 190 | const char *name = dentry->d_name.name; |
| 191 | mode_t mode = file->f_mode; | 191 | fmode_t mode = file->f_mode; |
| 192 | u32 mask = (mode & FMODE_WRITE) ? IN_CLOSE_WRITE : IN_CLOSE_NOWRITE; | 192 | u32 mask = (mode & FMODE_WRITE) ? IN_CLOSE_WRITE : IN_CLOSE_NOWRITE; |
| 193 | 193 | ||
| 194 | if (S_ISDIR(inode->i_mode)) | 194 | if (S_ISDIR(inode->i_mode)) |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 89e53cfbc787..54525be4b5f8 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -474,8 +474,8 @@ struct ide_disk_ops { | |||
| 474 | ide_startstop_t (*do_request)(struct ide_drive_s *, struct request *, | 474 | ide_startstop_t (*do_request)(struct ide_drive_s *, struct request *, |
| 475 | sector_t); | 475 | sector_t); |
| 476 | int (*end_request)(struct ide_drive_s *, int, int); | 476 | int (*end_request)(struct ide_drive_s *, int, int); |
| 477 | int (*ioctl)(struct ide_drive_s *, struct inode *, | 477 | int (*ioctl)(struct ide_drive_s *, struct block_device *, |
| 478 | struct file *, unsigned int, unsigned long); | 478 | fmode_t, unsigned int, unsigned long); |
| 479 | }; | 479 | }; |
| 480 | 480 | ||
| 481 | /* ATAPI device flags */ | 481 | /* ATAPI device flags */ |
| @@ -1158,8 +1158,7 @@ struct ide_ioctl_devset { | |||
| 1158 | int ide_setting_ioctl(ide_drive_t *, struct block_device *, unsigned int, | 1158 | int ide_setting_ioctl(ide_drive_t *, struct block_device *, unsigned int, |
| 1159 | unsigned long, const struct ide_ioctl_devset *); | 1159 | unsigned long, const struct ide_ioctl_devset *); |
| 1160 | 1160 | ||
| 1161 | int generic_ide_ioctl(ide_drive_t *, struct file *, struct block_device *, | 1161 | int generic_ide_ioctl(ide_drive_t *, struct block_device *, unsigned, unsigned long); |
| 1162 | unsigned, unsigned long); | ||
| 1163 | 1162 | ||
| 1164 | extern int ide_vlb_clk; | 1163 | extern int ide_vlb_clk; |
| 1165 | extern int ide_pci_clk; | 1164 | extern int ide_pci_clk; |
diff --git a/include/linux/reiserfs_fs_sb.h b/include/linux/reiserfs_fs_sb.h index 315517e8bfa1..bda6b562a1e0 100644 --- a/include/linux/reiserfs_fs_sb.h +++ b/include/linux/reiserfs_fs_sb.h | |||
| @@ -178,6 +178,7 @@ struct reiserfs_journal { | |||
| 178 | struct reiserfs_journal_cnode *j_first; /* oldest journal block. start here for traverse */ | 178 | struct reiserfs_journal_cnode *j_first; /* oldest journal block. start here for traverse */ |
| 179 | 179 | ||
| 180 | struct block_device *j_dev_bd; | 180 | struct block_device *j_dev_bd; |
| 181 | fmode_t j_dev_mode; | ||
| 181 | int j_1st_reserved_block; /* first block on s_dev of reserved area journal */ | 182 | int j_1st_reserved_block; /* first block on s_dev of reserved area journal */ |
| 182 | 183 | ||
| 183 | unsigned long j_state; | 184 | unsigned long j_state; |
diff --git a/include/linux/types.h b/include/linux/types.h index f24f7beb47df..1d98330b1f2c 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
| @@ -190,6 +190,7 @@ typedef __u32 __bitwise __wsum; | |||
| 190 | 190 | ||
| 191 | #ifdef __KERNEL__ | 191 | #ifdef __KERNEL__ |
| 192 | typedef unsigned __bitwise__ gfp_t; | 192 | typedef unsigned __bitwise__ gfp_t; |
| 193 | typedef unsigned __bitwise__ fmode_t; | ||
| 193 | 194 | ||
| 194 | #ifdef CONFIG_PHYS_ADDR_T_64BIT | 195 | #ifdef CONFIG_PHYS_ADDR_T_64BIT |
| 195 | typedef u64 phys_addr_t; | 196 | typedef u64 phys_addr_t; |
diff --git a/include/scsi/scsi_ioctl.h b/include/scsi/scsi_ioctl.h index edb9525386da..b9006848b813 100644 --- a/include/scsi/scsi_ioctl.h +++ b/include/scsi/scsi_ioctl.h | |||
| @@ -42,7 +42,7 @@ typedef struct scsi_fctargaddress { | |||
| 42 | 42 | ||
| 43 | extern int scsi_ioctl(struct scsi_device *, int, void __user *); | 43 | extern int scsi_ioctl(struct scsi_device *, int, void __user *); |
| 44 | extern int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd, | 44 | extern int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd, |
| 45 | void __user *arg, struct file *filp); | 45 | void __user *arg, int ndelay); |
| 46 | 46 | ||
| 47 | #endif /* __KERNEL__ */ | 47 | #endif /* __KERNEL__ */ |
| 48 | #endif /* _SCSI_IOCTL_H */ | 48 | #endif /* _SCSI_IOCTL_H */ |
| @@ -817,7 +817,7 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr) | |||
| 817 | struct ipc_namespace *ns; | 817 | struct ipc_namespace *ns; |
| 818 | struct shm_file_data *sfd; | 818 | struct shm_file_data *sfd; |
| 819 | struct path path; | 819 | struct path path; |
| 820 | mode_t f_mode; | 820 | fmode_t f_mode; |
| 821 | 821 | ||
| 822 | err = -EINVAL; | 822 | err = -EINVAL; |
| 823 | if (shmid < 0) | 823 | if (shmid < 0) |
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 331f9836383f..c9d74083746f 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
| @@ -651,7 +651,7 @@ static int software_resume(void) | |||
| 651 | pr_debug("PM: Preparing processes for restore.\n"); | 651 | pr_debug("PM: Preparing processes for restore.\n"); |
| 652 | error = prepare_processes(); | 652 | error = prepare_processes(); |
| 653 | if (error) { | 653 | if (error) { |
| 654 | swsusp_close(); | 654 | swsusp_close(FMODE_READ); |
| 655 | goto Done; | 655 | goto Done; |
| 656 | } | 656 | } |
| 657 | 657 | ||
diff --git a/kernel/power/power.h b/kernel/power/power.h index acc0c101dbd5..46b5ec7a3afb 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
| @@ -153,7 +153,7 @@ extern int swsusp_shrink_memory(void); | |||
| 153 | extern void swsusp_free(void); | 153 | extern void swsusp_free(void); |
| 154 | extern int swsusp_read(unsigned int *flags_p); | 154 | extern int swsusp_read(unsigned int *flags_p); |
| 155 | extern int swsusp_write(unsigned int flags); | 155 | extern int swsusp_write(unsigned int flags); |
| 156 | extern void swsusp_close(void); | 156 | extern void swsusp_close(fmode_t); |
| 157 | 157 | ||
| 158 | struct timeval; | 158 | struct timeval; |
| 159 | /* kernel/power/swsusp.c */ | 159 | /* kernel/power/swsusp.c */ |
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 80ccac849e46..b7713b53d07a 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
| @@ -172,13 +172,13 @@ static int swsusp_swap_check(void) /* This is called before saving image */ | |||
| 172 | return res; | 172 | return res; |
| 173 | 173 | ||
| 174 | root_swap = res; | 174 | root_swap = res; |
| 175 | res = blkdev_get(resume_bdev, FMODE_WRITE, O_RDWR); | 175 | res = blkdev_get(resume_bdev, FMODE_WRITE); |
| 176 | if (res) | 176 | if (res) |
| 177 | return res; | 177 | return res; |
| 178 | 178 | ||
| 179 | res = set_blocksize(resume_bdev, PAGE_SIZE); | 179 | res = set_blocksize(resume_bdev, PAGE_SIZE); |
| 180 | if (res < 0) | 180 | if (res < 0) |
| 181 | blkdev_put(resume_bdev); | 181 | blkdev_put(resume_bdev, FMODE_WRITE); |
| 182 | 182 | ||
| 183 | return res; | 183 | return res; |
| 184 | } | 184 | } |
| @@ -426,7 +426,7 @@ int swsusp_write(unsigned int flags) | |||
| 426 | 426 | ||
| 427 | release_swap_writer(&handle); | 427 | release_swap_writer(&handle); |
| 428 | out: | 428 | out: |
| 429 | swsusp_close(); | 429 | swsusp_close(FMODE_WRITE); |
| 430 | return error; | 430 | return error; |
| 431 | } | 431 | } |
| 432 | 432 | ||
| @@ -574,7 +574,7 @@ int swsusp_read(unsigned int *flags_p) | |||
| 574 | error = load_image(&handle, &snapshot, header->pages - 1); | 574 | error = load_image(&handle, &snapshot, header->pages - 1); |
| 575 | release_swap_reader(&handle); | 575 | release_swap_reader(&handle); |
| 576 | 576 | ||
| 577 | blkdev_put(resume_bdev); | 577 | blkdev_put(resume_bdev, FMODE_READ); |
| 578 | 578 | ||
| 579 | if (!error) | 579 | if (!error) |
| 580 | pr_debug("PM: Image successfully loaded\n"); | 580 | pr_debug("PM: Image successfully loaded\n"); |
| @@ -609,7 +609,7 @@ int swsusp_check(void) | |||
| 609 | return -EINVAL; | 609 | return -EINVAL; |
| 610 | } | 610 | } |
| 611 | if (error) | 611 | if (error) |
| 612 | blkdev_put(resume_bdev); | 612 | blkdev_put(resume_bdev, FMODE_READ); |
| 613 | else | 613 | else |
| 614 | pr_debug("PM: Signature found, resuming\n"); | 614 | pr_debug("PM: Signature found, resuming\n"); |
| 615 | } else { | 615 | } else { |
| @@ -626,14 +626,14 @@ int swsusp_check(void) | |||
| 626 | * swsusp_close - close swap device. | 626 | * swsusp_close - close swap device. |
| 627 | */ | 627 | */ |
| 628 | 628 | ||
| 629 | void swsusp_close(void) | 629 | void swsusp_close(fmode_t mode) |
| 630 | { | 630 | { |
| 631 | if (IS_ERR(resume_bdev)) { | 631 | if (IS_ERR(resume_bdev)) { |
| 632 | pr_debug("PM: Image device not initialised\n"); | 632 | pr_debug("PM: Image device not initialised\n"); |
| 633 | return; | 633 | return; |
| 634 | } | 634 | } |
| 635 | 635 | ||
| 636 | blkdev_put(resume_bdev); | 636 | blkdev_put(resume_bdev, mode); /* move up */ |
| 637 | } | 637 | } |
| 638 | 638 | ||
| 639 | static int swsusp_header_init(void) | 639 | static int swsusp_header_init(void) |
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 1af62b8b86c6..e17836680f49 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c | |||
| @@ -2283,7 +2283,7 @@ static int snd_pcm_oss_open_file(struct file *file, | |||
| 2283 | int idx, err; | 2283 | int idx, err; |
| 2284 | struct snd_pcm_oss_file *pcm_oss_file; | 2284 | struct snd_pcm_oss_file *pcm_oss_file; |
| 2285 | struct snd_pcm_substream *substream; | 2285 | struct snd_pcm_substream *substream; |
| 2286 | unsigned int f_mode = file->f_mode; | 2286 | fmode_t f_mode = file->f_mode; |
| 2287 | 2287 | ||
| 2288 | if (rpcm_oss_file) | 2288 | if (rpcm_oss_file) |
| 2289 | *rpcm_oss_file = NULL; | 2289 | *rpcm_oss_file = NULL; |
diff --git a/sound/oss/au1550_ac97.c b/sound/oss/au1550_ac97.c index 23018a7c063a..81e1f443d094 100644 --- a/sound/oss/au1550_ac97.c +++ b/sound/oss/au1550_ac97.c | |||
| @@ -93,7 +93,7 @@ static struct au1550_state { | |||
| 93 | spinlock_t lock; | 93 | spinlock_t lock; |
| 94 | struct mutex open_mutex; | 94 | struct mutex open_mutex; |
| 95 | struct mutex sem; | 95 | struct mutex sem; |
| 96 | mode_t open_mode; | 96 | fmode_t open_mode; |
| 97 | wait_queue_head_t open_wait; | 97 | wait_queue_head_t open_wait; |
| 98 | 98 | ||
| 99 | struct dmabuf { | 99 | struct dmabuf { |
diff --git a/sound/oss/dmasound/dmasound.h b/sound/oss/dmasound/dmasound.h index d978b0096564..1cb13fe56ec4 100644 --- a/sound/oss/dmasound/dmasound.h +++ b/sound/oss/dmasound/dmasound.h | |||
| @@ -129,7 +129,7 @@ typedef struct { | |||
| 129 | int (*mixer_ioctl)(u_int, u_long); /* optional */ | 129 | int (*mixer_ioctl)(u_int, u_long); /* optional */ |
| 130 | int (*write_sq_setup)(void); /* optional */ | 130 | int (*write_sq_setup)(void); /* optional */ |
| 131 | int (*read_sq_setup)(void); /* optional */ | 131 | int (*read_sq_setup)(void); /* optional */ |
| 132 | int (*sq_open)(mode_t); /* optional */ | 132 | int (*sq_open)(fmode_t); /* optional */ |
| 133 | int (*state_info)(char *, size_t); /* optional */ | 133 | int (*state_info)(char *, size_t); /* optional */ |
| 134 | void (*abort_read)(void); /* optional */ | 134 | void (*abort_read)(void); /* optional */ |
| 135 | int min_dsp_speed; | 135 | int min_dsp_speed; |
| @@ -235,7 +235,7 @@ struct sound_queue { | |||
| 235 | */ | 235 | */ |
| 236 | int active; | 236 | int active; |
| 237 | wait_queue_head_t action_queue, open_queue, sync_queue; | 237 | wait_queue_head_t action_queue, open_queue, sync_queue; |
| 238 | int open_mode; | 238 | fmode_t open_mode; |
| 239 | int busy, syncing, xruns, died; | 239 | int busy, syncing, xruns, died; |
| 240 | }; | 240 | }; |
| 241 | 241 | ||
diff --git a/sound/oss/dmasound/dmasound_atari.c b/sound/oss/dmasound/dmasound_atari.c index 285239d64b82..4d45bd63718b 100644 --- a/sound/oss/dmasound/dmasound_atari.c +++ b/sound/oss/dmasound/dmasound_atari.c | |||
| @@ -143,7 +143,7 @@ static int AtaMixerIoctl(u_int cmd, u_long arg); | |||
| 143 | static int TTMixerIoctl(u_int cmd, u_long arg); | 143 | static int TTMixerIoctl(u_int cmd, u_long arg); |
| 144 | static int FalconMixerIoctl(u_int cmd, u_long arg); | 144 | static int FalconMixerIoctl(u_int cmd, u_long arg); |
| 145 | static int AtaWriteSqSetup(void); | 145 | static int AtaWriteSqSetup(void); |
| 146 | static int AtaSqOpen(mode_t mode); | 146 | static int AtaSqOpen(fmode_t mode); |
| 147 | static int TTStateInfo(char *buffer, size_t space); | 147 | static int TTStateInfo(char *buffer, size_t space); |
| 148 | static int FalconStateInfo(char *buffer, size_t space); | 148 | static int FalconStateInfo(char *buffer, size_t space); |
| 149 | 149 | ||
| @@ -1461,7 +1461,7 @@ static int AtaWriteSqSetup(void) | |||
| 1461 | return 0 ; | 1461 | return 0 ; |
| 1462 | } | 1462 | } |
| 1463 | 1463 | ||
| 1464 | static int AtaSqOpen(mode_t mode) | 1464 | static int AtaSqOpen(fmode_t mode) |
| 1465 | { | 1465 | { |
| 1466 | write_sq_ignore_int = 1; | 1466 | write_sq_ignore_int = 1; |
| 1467 | return 0 ; | 1467 | return 0 ; |
diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c index 95fc5c681755..b8239f3168fb 100644 --- a/sound/oss/dmasound/dmasound_core.c +++ b/sound/oss/dmasound/dmasound_core.c | |||
| @@ -212,7 +212,7 @@ static int irq_installed; | |||
| 212 | #endif /* MODULE */ | 212 | #endif /* MODULE */ |
| 213 | 213 | ||
| 214 | /* control over who can modify resources shared between play/record */ | 214 | /* control over who can modify resources shared between play/record */ |
| 215 | static mode_t shared_resource_owner; | 215 | static fmode_t shared_resource_owner; |
| 216 | static int shared_resources_initialised; | 216 | static int shared_resources_initialised; |
| 217 | 217 | ||
| 218 | /* | 218 | /* |
| @@ -668,7 +668,7 @@ static inline void sq_init_waitqueue(struct sound_queue *sq) | |||
| 668 | 668 | ||
| 669 | #if 0 /* blocking open() */ | 669 | #if 0 /* blocking open() */ |
| 670 | static inline void sq_wake_up(struct sound_queue *sq, struct file *file, | 670 | static inline void sq_wake_up(struct sound_queue *sq, struct file *file, |
| 671 | mode_t mode) | 671 | fmode_t mode) |
| 672 | { | 672 | { |
| 673 | if (file->f_mode & mode) { | 673 | if (file->f_mode & mode) { |
| 674 | sq->busy = 0; /* CHECK: IS THIS OK??? */ | 674 | sq->busy = 0; /* CHECK: IS THIS OK??? */ |
| @@ -677,7 +677,7 @@ static inline void sq_wake_up(struct sound_queue *sq, struct file *file, | |||
| 677 | } | 677 | } |
| 678 | #endif | 678 | #endif |
| 679 | 679 | ||
| 680 | static int sq_open2(struct sound_queue *sq, struct file *file, mode_t mode, | 680 | static int sq_open2(struct sound_queue *sq, struct file *file, fmode_t mode, |
| 681 | int numbufs, int bufsize) | 681 | int numbufs, int bufsize) |
| 682 | { | 682 | { |
| 683 | int rc = 0; | 683 | int rc = 0; |
| @@ -891,10 +891,10 @@ static int sq_release(struct inode *inode, struct file *file) | |||
| 891 | is the owner - if we have problems. | 891 | is the owner - if we have problems. |
| 892 | */ | 892 | */ |
| 893 | 893 | ||
| 894 | static int shared_resources_are_mine(mode_t md) | 894 | static int shared_resources_are_mine(fmode_t md) |
| 895 | { | 895 | { |
| 896 | if (shared_resource_owner) | 896 | if (shared_resource_owner) |
| 897 | return (shared_resource_owner & md ) ; | 897 | return (shared_resource_owner & md) != 0; |
| 898 | else { | 898 | else { |
| 899 | shared_resource_owner = md ; | 899 | shared_resource_owner = md ; |
| 900 | return 1 ; | 900 | return 1 ; |
diff --git a/sound/oss/msnd.h b/sound/oss/msnd.h index 61b3955481c5..c8be47ec2b7e 100644 --- a/sound/oss/msnd.h +++ b/sound/oss/msnd.h | |||
| @@ -211,7 +211,7 @@ typedef struct multisound_dev { | |||
| 211 | 211 | ||
| 212 | /* State variables */ | 212 | /* State variables */ |
| 213 | enum { msndClassic, msndPinnacle } type; | 213 | enum { msndClassic, msndPinnacle } type; |
| 214 | mode_t mode; | 214 | fmode_t mode; |
| 215 | unsigned long flags; | 215 | unsigned long flags; |
| 216 | #define F_RESETTING 0 | 216 | #define F_RESETTING 0 |
| 217 | #define F_HAVEDIGITAL 1 | 217 | #define F_HAVEDIGITAL 1 |
diff --git a/sound/oss/sound_config.h b/sound/oss/sound_config.h index 1a00a3210616..55271fbe7f49 100644 --- a/sound/oss/sound_config.h +++ b/sound/oss/sound_config.h | |||
| @@ -110,24 +110,16 @@ struct channel_info { | |||
| 110 | #define OPEN_WRITE PCM_ENABLE_OUTPUT | 110 | #define OPEN_WRITE PCM_ENABLE_OUTPUT |
| 111 | #define OPEN_READWRITE (OPEN_READ|OPEN_WRITE) | 111 | #define OPEN_READWRITE (OPEN_READ|OPEN_WRITE) |
| 112 | 112 | ||
| 113 | #if OPEN_READ == FMODE_READ && OPEN_WRITE == FMODE_WRITE | ||
| 114 | |||
| 115 | static inline int translate_mode(struct file *file) | ||
| 116 | { | ||
| 117 | return file->f_mode; | ||
| 118 | } | ||
| 119 | |||
| 120 | #else | ||
| 121 | |||
| 122 | static inline int translate_mode(struct file *file) | 113 | static inline int translate_mode(struct file *file) |
| 123 | { | 114 | { |
| 124 | return ((file->f_mode & FMODE_READ) ? OPEN_READ : 0) | | 115 | if (OPEN_READ == (__force int)FMODE_READ && |
| 125 | ((file->f_mode & FMODE_WRITE) ? OPEN_WRITE : 0); | 116 | OPEN_WRITE == (__force int)FMODE_WRITE) |
| 117 | return (__force int)(file->f_mode & (FMODE_READ | FMODE_WRITE)); | ||
| 118 | else | ||
| 119 | return ((file->f_mode & FMODE_READ) ? OPEN_READ : 0) | | ||
| 120 | ((file->f_mode & FMODE_WRITE) ? OPEN_WRITE : 0); | ||
| 126 | } | 121 | } |
| 127 | 122 | ||
| 128 | #endif | ||
| 129 | |||
| 130 | |||
| 131 | #include "sound_calls.h" | 123 | #include "sound_calls.h" |
| 132 | #include "dev_table.h" | 124 | #include "dev_table.h" |
| 133 | 125 | ||
diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c index 044453a4ee5b..41562ecde5bb 100644 --- a/sound/oss/swarm_cs4297a.c +++ b/sound/oss/swarm_cs4297a.c | |||
| @@ -295,7 +295,7 @@ struct cs4297a_state { | |||
| 295 | struct mutex open_mutex; | 295 | struct mutex open_mutex; |
| 296 | struct mutex open_sem_adc; | 296 | struct mutex open_sem_adc; |
| 297 | struct mutex open_sem_dac; | 297 | struct mutex open_sem_dac; |
| 298 | mode_t open_mode; | 298 | fmode_t open_mode; |
| 299 | wait_queue_head_t open_wait; | 299 | wait_queue_head_t open_wait; |
| 300 | wait_queue_head_t open_wait_adc; | 300 | wait_queue_head_t open_wait_adc; |
| 301 | wait_queue_head_t open_wait_dac; | 301 | wait_queue_head_t open_wait_dac; |
diff --git a/sound/oss/vwsnd.c b/sound/oss/vwsnd.c index dcbb3f739e61..78b8acc7c3b9 100644 --- a/sound/oss/vwsnd.c +++ b/sound/oss/vwsnd.c | |||
| @@ -1509,7 +1509,7 @@ typedef struct vwsnd_dev { | |||
| 1509 | struct mutex open_mutex; | 1509 | struct mutex open_mutex; |
| 1510 | struct mutex io_mutex; | 1510 | struct mutex io_mutex; |
| 1511 | struct mutex mix_mutex; | 1511 | struct mutex mix_mutex; |
| 1512 | mode_t open_mode; | 1512 | fmode_t open_mode; |
| 1513 | wait_queue_head_t open_wait; | 1513 | wait_queue_head_t open_wait; |
| 1514 | 1514 | ||
| 1515 | lithium_t lith; | 1515 | lithium_t lith; |
