aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/um/drivers/ubd_kern.c6
-rw-r--r--block/compat_ioctl.c17
-rw-r--r--block/ioctl.c35
-rw-r--r--drivers/block/DAC960.c2
-rw-r--r--drivers/block/amiflop.c6
-rw-r--r--drivers/block/aoe/aoeblk.c4
-rw-r--r--drivers/block/ataflop.c6
-rw-r--r--drivers/block/brd.c2
-rw-r--r--drivers/block/cciss.c8
-rw-r--r--drivers/block/cpqarray.c6
-rw-r--r--drivers/block/floppy.c6
-rw-r--r--drivers/block/loop.c8
-rw-r--r--drivers/block/nbd.c2
-rw-r--r--drivers/block/paride/pcd.c6
-rw-r--r--drivers/block/paride/pd.c6
-rw-r--r--drivers/block/paride/pf.c6
-rw-r--r--drivers/block/pktcdvd.c6
-rw-r--r--drivers/block/swim3.c6
-rw-r--r--drivers/block/ub.c6
-rw-r--r--drivers/block/viodasd.c4
-rw-r--r--drivers/block/virtio_blk.c2
-rw-r--r--drivers/block/xd.c2
-rw-r--r--drivers/block/xen-blkfront.c4
-rw-r--r--drivers/block/xsysace.c4
-rw-r--r--drivers/block/z2ram.c4
-rw-r--r--drivers/cdrom/gdrom.c6
-rw-r--r--drivers/cdrom/viocd.c6
-rw-r--r--drivers/ide/ide-cd.c6
-rw-r--r--drivers/ide/ide-gd.c6
-rw-r--r--drivers/ide/ide-tape.c6
-rw-r--r--drivers/md/dm.c6
-rw-r--r--drivers/md/md.c6
-rw-r--r--drivers/memstick/core/mspro_block.c4
-rw-r--r--drivers/message/i2o/i2o_block.c6
-rw-r--r--drivers/mmc/card/block.c4
-rw-r--r--drivers/mtd/mtd_blkdevs.c6
-rw-r--r--drivers/s390/block/dasd.c8
-rw-r--r--drivers/s390/block/dcssblk.c4
-rw-r--r--drivers/s390/char/tape_block.c6
-rw-r--r--drivers/scsi/ide-scsi.c6
-rw-r--r--drivers/scsi/sd.c8
-rw-r--r--drivers/scsi/sr.c6
-rw-r--r--fs/block_dev.c18
-rw-r--r--include/linux/blkdev.h15
-rw-r--r--include/linux/fs.h1
45 files changed, 167 insertions, 131 deletions
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index b58fb8941d8d..72569cc3cbb7 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -108,9 +108,9 @@ static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo);
108 108
109static struct block_device_operations ubd_blops = { 109static struct block_device_operations ubd_blops = {
110 .owner = THIS_MODULE, 110 .owner = THIS_MODULE,
111 .open = ubd_open, 111 .__open = ubd_open,
112 .release = ubd_release, 112 .__release = ubd_release,
113 .ioctl = ubd_ioctl, 113 .__ioctl = ubd_ioctl,
114 .getgeo = ubd_getgeo, 114 .getgeo = ubd_getgeo,
115}; 115};
116 116
diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c
index 1e559fba7bdf..576c4fd15463 100644
--- a/block/compat_ioctl.c
+++ b/block/compat_ioctl.c
@@ -708,17 +708,17 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file,
708 return -ENOIOCTLCMD; 708 return -ENOIOCTLCMD;
709 } 709 }
710 710
711 if (disk->fops->unlocked_ioctl) 711 if (disk->fops->__unlocked_ioctl)
712 return disk->fops->unlocked_ioctl(file, cmd, arg); 712 return disk->fops->__unlocked_ioctl(file, cmd, arg);
713 713
714 if (disk->fops->ioctl) { 714 if (disk->fops->__ioctl) {
715 lock_kernel(); 715 lock_kernel();
716 ret = disk->fops->ioctl(inode, file, cmd, arg); 716 ret = disk->fops->__ioctl(inode, file, cmd, arg);
717 unlock_kernel(); 717 unlock_kernel();
718 return ret; 718 return ret;
719 } 719 }
720 720
721 return -ENOTTY; 721 return __blkdev_driver_ioctl(inode->i_bdev, file->f_mode, cmd, arg);
722} 722}
723 723
724static int compat_blkdev_locked_ioctl(struct inode *inode, struct file *file, 724static int compat_blkdev_locked_ioctl(struct inode *inode, struct file *file,
@@ -805,10 +805,11 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
805 805
806 lock_kernel(); 806 lock_kernel();
807 ret = compat_blkdev_locked_ioctl(inode, file, bdev, cmd, arg); 807 ret = compat_blkdev_locked_ioctl(inode, file, bdev, cmd, arg);
808 /* FIXME: why do we assume -> compat_ioctl needs the BKL? */ 808 if (ret == -ENOIOCTLCMD && disk->fops->__compat_ioctl)
809 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) 809 ret = disk->fops->__compat_ioctl(file, cmd, arg);
810 ret = disk->fops->compat_ioctl(file, cmd, arg);
811 unlock_kernel(); 810 unlock_kernel();
811 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl)
812 ret = disk->fops->compat_ioctl(bdev, file->f_mode, cmd, arg);
812 813
813 if (ret != -ENOIOCTLCMD) 814 if (ret != -ENOIOCTLCMD)
814 return ret; 815 return ret;
diff --git a/block/ioctl.c b/block/ioctl.c
index 9a26ace6d042..01ff463bc801 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -269,17 +269,24 @@ int blkdev_driver_ioctl(struct inode *inode, struct file *file,
269 struct gendisk *disk, unsigned cmd, unsigned long arg) 269 struct gendisk *disk, unsigned cmd, unsigned long arg)
270{ 270{
271 int ret; 271 int ret;
272 if (disk->fops->unlocked_ioctl) 272 fmode_t mode = 0;
273 return disk->fops->unlocked_ioctl(file, cmd, arg); 273 if (file) {
274 mode = file->f_mode;
275 if (file->f_flags & O_NDELAY)
276 mode |= FMODE_NDELAY_NOW;
277 }
278
279 if (disk->fops->__unlocked_ioctl)
280 return disk->fops->__unlocked_ioctl(file, cmd, arg);
274 281
275 if (disk->fops->ioctl) { 282 if (disk->fops->__ioctl) {
276 lock_kernel(); 283 lock_kernel();
277 ret = disk->fops->ioctl(inode, file, cmd, arg); 284 ret = disk->fops->__ioctl(inode, file, cmd, arg);
278 unlock_kernel(); 285 unlock_kernel();
279 return ret; 286 return ret;
280 } 287 }
281 288
282 return -ENOTTY; 289 return __blkdev_driver_ioctl(inode->i_bdev, mode, cmd, arg);
283} 290}
284EXPORT_SYMBOL_GPL(blkdev_driver_ioctl); 291EXPORT_SYMBOL_GPL(blkdev_driver_ioctl);
285 292
@@ -295,12 +302,22 @@ int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
295 fake_file.f_path.dentry = &fake_dentry; 302 fake_file.f_path.dentry = &fake_dentry;
296 fake_dentry.d_inode = bdev->bd_inode; 303 fake_dentry.d_inode = bdev->bd_inode;
297 304
298 if (disk->fops->unlocked_ioctl) 305 if (disk->fops->__unlocked_ioctl)
299 return disk->fops->unlocked_ioctl(&fake_file, cmd, arg); 306 return disk->fops->__unlocked_ioctl(&fake_file, cmd, arg);
307
308 if (disk->fops->__ioctl) {
309 lock_kernel();
310 ret = disk->fops->__ioctl(bdev->bd_inode, &fake_file, cmd, arg);
311 unlock_kernel();
312 return ret;
313 }
314
315 if (disk->fops->ioctl)
316 return disk->fops->ioctl(bdev, mode, cmd, arg);
300 317
301 if (disk->fops->ioctl) { 318 if (disk->fops->locked_ioctl) {
302 lock_kernel(); 319 lock_kernel();
303 ret = disk->fops->ioctl(bdev->bd_inode, &fake_file, cmd, arg); 320 ret = disk->fops->locked_ioctl(bdev, mode, cmd, arg);
304 unlock_kernel(); 321 unlock_kernel();
305 return ret; 322 return ret;
306 } 323 }
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c
index a002a381df92..4b90ebfa6676 100644
--- a/drivers/block/DAC960.c
+++ b/drivers/block/DAC960.c
@@ -153,7 +153,7 @@ static int DAC960_revalidate_disk(struct gendisk *disk)
153 153
154static struct block_device_operations DAC960_BlockDeviceOperations = { 154static struct block_device_operations DAC960_BlockDeviceOperations = {
155 .owner = THIS_MODULE, 155 .owner = THIS_MODULE,
156 .open = DAC960_open, 156 .__open = DAC960_open,
157 .getgeo = DAC960_getgeo, 157 .getgeo = DAC960_getgeo,
158 .media_changed = DAC960_media_changed, 158 .media_changed = DAC960_media_changed,
159 .revalidate_disk = DAC960_revalidate_disk, 159 .revalidate_disk = DAC960_revalidate_disk,
diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c
index d19c5a939fe8..d5da4e3cb2ad 100644
--- a/drivers/block/amiflop.c
+++ b/drivers/block/amiflop.c
@@ -1648,9 +1648,9 @@ static int amiga_floppy_change(struct gendisk *disk)
1648 1648
1649static struct block_device_operations floppy_fops = { 1649static struct block_device_operations floppy_fops = {
1650 .owner = THIS_MODULE, 1650 .owner = THIS_MODULE,
1651 .open = floppy_open, 1651 .__open = floppy_open,
1652 .release = floppy_release, 1652 .__release = floppy_release,
1653 .ioctl = fd_ioctl, 1653 .__ioctl = fd_ioctl,
1654 .getgeo = fd_getgeo, 1654 .getgeo = fd_getgeo,
1655 .media_changed = amiga_floppy_change, 1655 .media_changed = amiga_floppy_change,
1656}; 1656};
diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c
index d876ad861237..d4d9796d5ddd 100644
--- a/drivers/block/aoe/aoeblk.c
+++ b/drivers/block/aoe/aoeblk.c
@@ -239,8 +239,8 @@ aoeblk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
239} 239}
240 240
241static struct block_device_operations aoe_bdops = { 241static struct block_device_operations aoe_bdops = {
242 .open = aoeblk_open, 242 .__open = aoeblk_open,
243 .release = aoeblk_release, 243 .__release = aoeblk_release,
244 .getgeo = aoeblk_getgeo, 244 .getgeo = aoeblk_getgeo,
245 .owner = THIS_MODULE, 245 .owner = THIS_MODULE,
246}; 246};
diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
index 85d56a26f7c6..30166774327d 100644
--- a/drivers/block/ataflop.c
+++ b/drivers/block/ataflop.c
@@ -1857,9 +1857,9 @@ static int floppy_release( struct inode * inode, struct file * filp )
1857 1857
1858static struct block_device_operations floppy_fops = { 1858static struct block_device_operations floppy_fops = {
1859 .owner = THIS_MODULE, 1859 .owner = THIS_MODULE,
1860 .open = floppy_open, 1860 .__open = floppy_open,
1861 .release = floppy_release, 1861 .__release = floppy_release,
1862 .ioctl = fd_ioctl, 1862 .__ioctl = fd_ioctl,
1863 .media_changed = check_floppy_change, 1863 .media_changed = check_floppy_change,
1864 .revalidate_disk= floppy_revalidate, 1864 .revalidate_disk= floppy_revalidate,
1865}; 1865};
diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index d070d492e385..2ea99f947667 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -376,7 +376,7 @@ static int brd_ioctl(struct inode *inode, struct file *file,
376 376
377static struct block_device_operations brd_fops = { 377static struct block_device_operations brd_fops = {
378 .owner = THIS_MODULE, 378 .owner = THIS_MODULE,
379 .ioctl = brd_ioctl, 379 .__ioctl = brd_ioctl,
380#ifdef CONFIG_BLK_DEV_XIP 380#ifdef CONFIG_BLK_DEV_XIP
381 .direct_access = brd_direct_access, 381 .direct_access = brd_direct_access,
382#endif 382#endif
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index d9b1c15b8113..781b745181d2 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -197,12 +197,12 @@ static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg);
197 197
198static struct block_device_operations cciss_fops = { 198static struct block_device_operations cciss_fops = {
199 .owner = THIS_MODULE, 199 .owner = THIS_MODULE,
200 .open = cciss_open, 200 .__open = cciss_open,
201 .release = cciss_release, 201 .__release = cciss_release,
202 .ioctl = cciss_ioctl, 202 .__ioctl = cciss_ioctl,
203 .getgeo = cciss_getgeo, 203 .getgeo = cciss_getgeo,
204#ifdef CONFIG_COMPAT 204#ifdef CONFIG_COMPAT
205 .compat_ioctl = cciss_compat_ioctl, 205 .__compat_ioctl = cciss_compat_ioctl,
206#endif 206#endif
207 .revalidate_disk = cciss_revalidate, 207 .revalidate_disk = cciss_revalidate,
208}; 208};
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
index 3d967525e9a9..b71334b968b6 100644
--- a/drivers/block/cpqarray.c
+++ b/drivers/block/cpqarray.c
@@ -195,9 +195,9 @@ static inline ctlr_info_t *get_host(struct gendisk *disk)
195 195
196static struct block_device_operations ida_fops = { 196static 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 .__ioctl = ida_ioctl,
201 .getgeo = ida_getgeo, 201 .getgeo = ida_getgeo,
202 .revalidate_disk= ida_revalidate, 202 .revalidate_disk= ida_revalidate,
203}; 203};
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 5d60c05a736a..72363df58953 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -3902,9 +3902,9 @@ static int floppy_revalidate(struct gendisk *disk)
3902 3902
3903static struct block_device_operations floppy_fops = { 3903static struct block_device_operations floppy_fops = {
3904 .owner = THIS_MODULE, 3904 .owner = THIS_MODULE,
3905 .open = floppy_open, 3905 .__open = floppy_open,
3906 .release = floppy_release, 3906 .__release = floppy_release,
3907 .ioctl = fd_ioctl, 3907 .__ioctl = fd_ioctl,
3908 .getgeo = fd_getgeo, 3908 .getgeo = fd_getgeo,
3909 .media_changed = check_floppy_change, 3909 .media_changed = check_floppy_change,
3910 .revalidate_disk = floppy_revalidate, 3910 .revalidate_disk = floppy_revalidate,
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index d3a25b027ff9..6faca2b7ae37 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1355,11 +1355,11 @@ static int lo_release(struct inode *inode, struct file *file)
1355 1355
1356static struct block_device_operations lo_fops = { 1356static struct block_device_operations lo_fops = {
1357 .owner = THIS_MODULE, 1357 .owner = THIS_MODULE,
1358 .open = lo_open, 1358 .__open = lo_open,
1359 .release = lo_release, 1359 .__release = lo_release,
1360 .ioctl = lo_ioctl, 1360 .__ioctl = lo_ioctl,
1361#ifdef CONFIG_COMPAT 1361#ifdef CONFIG_COMPAT
1362 .compat_ioctl = lo_compat_ioctl, 1362 .__compat_ioctl = lo_compat_ioctl,
1363#endif 1363#endif
1364}; 1364};
1365 1365
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 9034ca585afd..36015e0945b1 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -691,7 +691,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
691static struct block_device_operations nbd_fops = 691static struct block_device_operations nbd_fops =
692{ 692{
693 .owner = THIS_MODULE, 693 .owner = THIS_MODULE,
694 .ioctl = nbd_ioctl, 694 .__ioctl = nbd_ioctl,
695}; 695};
696 696
697/* 697/*
diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c
index 8bd557e2a659..6e6dcc1d4328 100644
--- a/drivers/block/paride/pcd.c
+++ b/drivers/block/paride/pcd.c
@@ -252,9 +252,9 @@ static int pcd_block_media_changed(struct gendisk *disk)
252 252
253static struct block_device_operations pcd_bdops = { 253static struct block_device_operations pcd_bdops = {
254 .owner = THIS_MODULE, 254 .owner = THIS_MODULE,
255 .open = pcd_block_open, 255 .__open = pcd_block_open,
256 .release = pcd_block_release, 256 .__release = pcd_block_release,
257 .ioctl = pcd_block_ioctl, 257 .__ioctl = pcd_block_ioctl,
258 .media_changed = pcd_block_media_changed, 258 .media_changed = pcd_block_media_changed,
259}; 259};
260 260
diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c
index 5fdfa7c888ce..b3023844947c 100644
--- a/drivers/block/paride/pd.c
+++ b/drivers/block/paride/pd.c
@@ -807,9 +807,9 @@ static int pd_revalidate(struct gendisk *p)
807 807
808static struct block_device_operations pd_fops = { 808static 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 .__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 a902d84fd330..e08ca5161ad8 100644
--- a/drivers/block/paride/pf.c
+++ b/drivers/block/paride/pf.c
@@ -264,9 +264,9 @@ static char *pf_buf; /* buffer for request in progress */
264 264
265static struct block_device_operations pf_fops = { 265static 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 .__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};
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index a0ba4023953b..33ac8ddf4912 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -2847,9 +2847,9 @@ static int pkt_media_changed(struct gendisk *disk)
2847 2847
2848static struct block_device_operations pktcdvd_ops = { 2848static 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 .__ioctl = pkt_ioctl,
2853 .media_changed = pkt_media_changed, 2853 .media_changed = pkt_media_changed,
2854}; 2854};
2855 2855
diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c
index 5c45d5556ae8..9398af86a7aa 100644
--- a/drivers/block/swim3.c
+++ b/drivers/block/swim3.c
@@ -998,9 +998,9 @@ static int floppy_revalidate(struct gendisk *disk)
998} 998}
999 999
1000static struct block_device_operations floppy_fops = { 1000static 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 .__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 bc04330f3683..5261773407da 100644
--- a/drivers/block/ub.c
+++ b/drivers/block/ub.c
@@ -1791,9 +1791,9 @@ static int ub_bd_media_changed(struct gendisk *disk)
1791 1791
1792static struct block_device_operations ub_bd_fops = { 1792static struct block_device_operations ub_bd_fops = {
1793 .owner = THIS_MODULE, 1793 .owner = THIS_MODULE,
1794 .open = ub_bd_open, 1794 .__open = ub_bd_open,
1795 .release = ub_bd_release, 1795 .__release = ub_bd_release,
1796 .ioctl = ub_bd_ioctl, 1796 .__ioctl = ub_bd_ioctl,
1797 .media_changed = ub_bd_media_changed, 1797 .media_changed = ub_bd_media_changed,
1798 .revalidate_disk = ub_bd_revalidate, 1798 .revalidate_disk = ub_bd_revalidate,
1799}; 1799};
diff --git a/drivers/block/viodasd.c b/drivers/block/viodasd.c
index 1730d29e6044..7f7beec29ebb 100644
--- a/drivers/block/viodasd.c
+++ b/drivers/block/viodasd.c
@@ -221,8 +221,8 @@ static int viodasd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
221 */ 221 */
222static struct block_device_operations viodasd_fops = { 222static struct block_device_operations viodasd_fops = {
223 .owner = THIS_MODULE, 223 .owner = THIS_MODULE,
224 .open = viodasd_open, 224 .__open = viodasd_open,
225 .release = viodasd_release, 225 .__release = viodasd_release,
226 .getgeo = viodasd_getgeo, 226 .getgeo = viodasd_getgeo,
227}; 227};
228 228
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 7643cd16fd67..10f157ea7b0b 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -180,7 +180,7 @@ static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo)
180} 180}
181 181
182static struct block_device_operations virtblk_fops = { 182static struct block_device_operations virtblk_fops = {
183 .ioctl = virtblk_ioctl, 183 .__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..316fa1da4b9c 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
133static struct block_device_operations xd_fops = { 133static struct block_device_operations xd_fops = {
134 .owner = THIS_MODULE, 134 .owner = THIS_MODULE,
135 .ioctl = xd_ioctl, 135 .__ioctl = xd_ioctl,
136 .getgeo = xd_getgeo, 136 .getgeo = xd_getgeo,
137}; 137};
138static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); 138static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int);
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 1a50ae70f716..7efac80c8dde 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -1041,8 +1041,8 @@ static int blkif_release(struct inode *inode, struct file *filep)
1041static struct block_device_operations xlvbd_block_fops = 1041static struct block_device_operations xlvbd_block_fops =
1042{ 1042{
1043 .owner = THIS_MODULE, 1043 .owner = THIS_MODULE,
1044 .open = blkif_open, 1044 .__open = blkif_open,
1045 .release = blkif_release, 1045 .__release = blkif_release,
1046 .getgeo = blkif_getgeo, 1046 .getgeo = blkif_getgeo,
1047 .ioctl = blkif_ioctl, 1047 .ioctl = blkif_ioctl,
1048}; 1048};
diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c
index 4a7a059ebaf7..e4efe5b7ec22 100644
--- a/drivers/block/xsysace.c
+++ b/drivers/block/xsysace.c
@@ -919,8 +919,8 @@ static int ace_getgeo(struct block_device *bdev, struct hd_geometry *geo)
919 919
920static struct block_device_operations ace_fops = { 920static struct block_device_operations ace_fops = {
921 .owner = THIS_MODULE, 921 .owner = THIS_MODULE,
922 .open = ace_open, 922 .__open = ace_open,
923 .release = ace_release, 923 .__release = ace_release,
924 .media_changed = ace_media_changed, 924 .media_changed = ace_media_changed,
925 .revalidate_disk = ace_revalidate_disk, 925 .revalidate_disk = ace_revalidate_disk,
926 .getgeo = ace_getgeo, 926 .getgeo = ace_getgeo,
diff --git a/drivers/block/z2ram.c b/drivers/block/z2ram.c
index be20a67f1fa8..4860d0f36870 100644
--- a/drivers/block/z2ram.c
+++ b/drivers/block/z2ram.c
@@ -314,8 +314,8 @@ z2_release( struct inode *inode, struct file *filp )
314static struct block_device_operations z2_fops = 314static struct block_device_operations z2_fops =
315{ 315{
316 .owner = THIS_MODULE, 316 .owner = THIS_MODULE,
317 .open = z2_open, 317 .__open = z2_open,
318 .release = z2_release, 318 .__release = z2_release,
319}; 319};
320 320
321static struct kobject *z2_find(dev_t dev, int *part, void *data) 321static struct kobject *z2_find(dev_t dev, int *part, void *data)
diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
index 0959edf2afdb..ab0c637f58be 100644
--- a/drivers/cdrom/gdrom.c
+++ b/drivers/cdrom/gdrom.c
@@ -514,10 +514,10 @@ static int gdrom_bdops_ioctl(struct inode *inode, struct file *file,
514 514
515static struct block_device_operations gdrom_bdops = { 515static struct block_device_operations gdrom_bdops = {
516 .owner = THIS_MODULE, 516 .owner = THIS_MODULE,
517 .open = gdrom_bdops_open, 517 .__open = gdrom_bdops_open,
518 .release = gdrom_bdops_release, 518 .__release = gdrom_bdops_release,
519 .media_changed = gdrom_bdops_mediachanged, 519 .media_changed = gdrom_bdops_mediachanged,
520 .ioctl = gdrom_bdops_ioctl, 520 .__ioctl = gdrom_bdops_ioctl,
521}; 521};
522 522
523static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id) 523static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id)
diff --git a/drivers/cdrom/viocd.c b/drivers/cdrom/viocd.c
index abc4079c3f41..57c2dced3e9d 100644
--- a/drivers/cdrom/viocd.c
+++ b/drivers/cdrom/viocd.c
@@ -180,9 +180,9 @@ static int viocd_blk_media_changed(struct gendisk *disk)
180 180
181struct block_device_operations viocd_fops = { 181struct block_device_operations viocd_fops = {
182 .owner = THIS_MODULE, 182 .owner = THIS_MODULE,
183 .open = viocd_blk_open, 183 .__open = viocd_blk_open,
184 .release = viocd_blk_release, 184 .__release = viocd_blk_release,
185 .ioctl = viocd_blk_ioctl, 185 .__ioctl = viocd_blk_ioctl,
186 .media_changed = viocd_blk_media_changed, 186 .media_changed = viocd_blk_media_changed,
187}; 187};
188 188
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 87d90200b169..3533984355a6 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -2200,9 +2200,9 @@ static int idecd_revalidate_disk(struct gendisk *disk)
2200 2200
2201static struct block_device_operations idecd_ops = { 2201static struct block_device_operations idecd_ops = {
2202 .owner = THIS_MODULE, 2202 .owner = THIS_MODULE,
2203 .open = idecd_open, 2203 .__open = idecd_open,
2204 .release = idecd_release, 2204 .__release = idecd_release,
2205 .ioctl = idecd_ioctl, 2205 .__ioctl = idecd_ioctl,
2206 .media_changed = idecd_media_changed, 2206 .media_changed = idecd_media_changed,
2207 .revalidate_disk = idecd_revalidate_disk 2207 .revalidate_disk = idecd_revalidate_disk
2208}; 2208};
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c
index 948af08abe23..d118bbed7cd3 100644
--- a/drivers/ide/ide-gd.c
+++ b/drivers/ide/ide-gd.c
@@ -298,9 +298,9 @@ static int ide_gd_ioctl(struct inode *inode, struct file *file,
298 298
299static struct block_device_operations ide_gd_ops = { 299static struct block_device_operations ide_gd_ops = {
300 .owner = THIS_MODULE, 300 .owner = THIS_MODULE,
301 .open = ide_gd_open, 301 .__open = ide_gd_open,
302 .release = ide_gd_release, 302 .__release = ide_gd_release,
303 .ioctl = ide_gd_ioctl, 303 .__ioctl = ide_gd_ioctl,
304 .getgeo = ide_gd_getgeo, 304 .getgeo = ide_gd_getgeo,
305 .media_changed = ide_gd_media_changed, 305 .media_changed = ide_gd_media_changed,
306 .revalidate_disk = ide_gd_revalidate_disk 306 .revalidate_disk = ide_gd_revalidate_disk
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index 2b263281ffea..c5df53c4838c 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -2376,9 +2376,9 @@ static int idetape_ioctl(struct inode *inode, struct file *file,
2376 2376
2377static struct block_device_operations idetape_block_ops = { 2377static struct block_device_operations idetape_block_ops = {
2378 .owner = THIS_MODULE, 2378 .owner = THIS_MODULE,
2379 .open = idetape_open, 2379 .__open = idetape_open,
2380 .release = idetape_release, 2380 .__release = idetape_release,
2381 .ioctl = idetape_ioctl, 2381 .__ioctl = idetape_ioctl,
2382}; 2382};
2383 2383
2384static int ide_tape_probe(ide_drive_t *drive) 2384static int ide_tape_probe(ide_drive_t *drive)
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 5f0f4c8bcd3e..8b4c92b1b6db 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1698,9 +1698,9 @@ int dm_noflush_suspending(struct dm_target *ti)
1698EXPORT_SYMBOL_GPL(dm_noflush_suspending); 1698EXPORT_SYMBOL_GPL(dm_noflush_suspending);
1699 1699
1700static struct block_device_operations dm_blk_dops = { 1700static struct block_device_operations dm_blk_dops = {
1701 .open = dm_blk_open, 1701 .__open = dm_blk_open,
1702 .release = dm_blk_close, 1702 .__release = dm_blk_close,
1703 .ioctl = dm_blk_ioctl, 1703 .__ioctl = dm_blk_ioctl,
1704 .getgeo = dm_blk_getgeo, 1704 .getgeo = dm_blk_getgeo,
1705 .owner = THIS_MODULE 1705 .owner = THIS_MODULE
1706}; 1706};
diff --git a/drivers/md/md.c b/drivers/md/md.c
index aaa3d465de4e..21b04d39ba3b 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5046,9 +5046,9 @@ static int md_revalidate(struct gendisk *disk)
5046static struct block_device_operations md_fops = 5046static struct block_device_operations md_fops =
5047{ 5047{
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 .__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..fbe5919789d0 100644
--- a/drivers/memstick/core/mspro_block.c
+++ b/drivers/memstick/core/mspro_block.c
@@ -237,8 +237,8 @@ static int mspro_block_bd_getgeo(struct block_device *bdev,
237} 237}
238 238
239static struct block_device_operations ms_block_bdops = { 239static struct block_device_operations ms_block_bdops = {
240 .open = mspro_block_bd_open, 240 .__open = mspro_block_bd_open,
241 .release = mspro_block_bd_release, 241 .__release = mspro_block_bd_release,
242 .getgeo = mspro_block_bd_getgeo, 242 .getgeo = mspro_block_bd_getgeo,
243 .owner = THIS_MODULE 243 .owner = THIS_MODULE
244}; 244};
diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c
index 81483de8c0fd..71500dda8eb3 100644
--- a/drivers/message/i2o/i2o_block.c
+++ b/drivers/message/i2o/i2o_block.c
@@ -931,9 +931,9 @@ static void i2o_block_request_fn(struct request_queue *q)
931/* I2O Block device operations definition */ 931/* I2O Block device operations definition */
932static struct block_device_operations i2o_block_fops = { 932static struct block_device_operations i2o_block_fops = {
933 .owner = THIS_MODULE, 933 .owner = THIS_MODULE,
934 .open = i2o_block_open, 934 .__open = i2o_block_open,
935 .release = i2o_block_release, 935 .__release = i2o_block_release,
936 .ioctl = i2o_block_ioctl, 936 .__ioctl = i2o_block_ioctl,
937 .getgeo = i2o_block_getgeo, 937 .getgeo = i2o_block_getgeo,
938 .media_changed = i2o_block_media_changed 938 .media_changed = i2o_block_media_changed
939}; 939};
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 24c97d3d16bb..8cba06f5e11d 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -130,8 +130,8 @@ mmc_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
130} 130}
131 131
132static struct block_device_operations mmc_bdops = { 132static struct block_device_operations mmc_bdops = {
133 .open = mmc_blk_open, 133 .__open = mmc_blk_open,
134 .release = mmc_blk_release, 134 .__release = mmc_blk_release,
135 .getgeo = mmc_blk_getgeo, 135 .getgeo = mmc_blk_getgeo,
136 .owner = THIS_MODULE, 136 .owner = THIS_MODULE,
137}; 137};
diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
index 681d5aca2af4..b00d07c53753 100644
--- a/drivers/mtd/mtd_blkdevs.c
+++ b/drivers/mtd/mtd_blkdevs.c
@@ -213,9 +213,9 @@ static int blktrans_ioctl(struct inode *inode, struct file *file,
213 213
214static struct block_device_operations mtd_blktrans_ops = { 214static struct block_device_operations mtd_blktrans_ops = {
215 .owner = THIS_MODULE, 215 .owner = THIS_MODULE,
216 .open = blktrans_open, 216 .__open = blktrans_open,
217 .release = blktrans_release, 217 .__release = blktrans_release,
218 .ioctl = blktrans_ioctl, 218 .__ioctl = blktrans_ioctl,
219 .getgeo = blktrans_getgeo, 219 .getgeo = blktrans_getgeo,
220}; 220};
221 221
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index 0a225ccda026..6bf68e5fe89f 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -2087,10 +2087,10 @@ static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
2087struct block_device_operations 2087struct block_device_operations
2088dasd_device_operations = { 2088dasd_device_operations = {
2089 .owner = THIS_MODULE, 2089 .owner = THIS_MODULE,
2090 .open = dasd_open, 2090 .__open = dasd_open,
2091 .release = dasd_release, 2091 .__release = dasd_release,
2092 .ioctl = dasd_ioctl, 2092 .__ioctl = dasd_ioctl,
2093 .compat_ioctl = dasd_compat_ioctl, 2093 .__compat_ioctl = dasd_compat_ioctl,
2094 .getgeo = dasd_getgeo, 2094 .getgeo = dasd_getgeo,
2095}; 2095};
2096 2096
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
index a7ff167d5b81..413460cc3dd8 100644
--- a/drivers/s390/block/dcssblk.c
+++ b/drivers/s390/block/dcssblk.c
@@ -42,8 +42,8 @@ static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
42static int dcssblk_major; 42static int dcssblk_major;
43static struct block_device_operations dcssblk_devops = { 43static struct block_device_operations dcssblk_devops = {
44 .owner = THIS_MODULE, 44 .owner = THIS_MODULE,
45 .open = dcssblk_open, 45 .__open = dcssblk_open,
46 .release = dcssblk_release, 46 .__release = dcssblk_release,
47 .direct_access = dcssblk_direct_access, 47 .direct_access = dcssblk_direct_access,
48}; 48};
49 49
diff --git a/drivers/s390/char/tape_block.c b/drivers/s390/char/tape_block.c
index a25b8bf54f41..f1a741c9a6f0 100644
--- a/drivers/s390/char/tape_block.c
+++ b/drivers/s390/char/tape_block.c
@@ -52,9 +52,9 @@ static int tapeblock_revalidate_disk(struct gendisk *);
52 52
53static struct block_device_operations tapeblock_fops = { 53static 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 .__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};
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
index 5bcc04e82c28..9069afbad9d3 100644
--- a/drivers/scsi/ide-scsi.c
+++ b/drivers/scsi/ide-scsi.c
@@ -483,9 +483,9 @@ static int idescsi_ide_ioctl(struct inode *inode, struct file *file,
483 483
484static struct block_device_operations idescsi_ops = { 484static struct block_device_operations idescsi_ops = {
485 .owner = THIS_MODULE, 485 .owner = THIS_MODULE,
486 .open = idescsi_ide_open, 486 .__open = idescsi_ide_open,
487 .release = idescsi_ide_release, 487 .__release = idescsi_ide_release,
488 .ioctl = idescsi_ide_ioctl, 488 .__ioctl = idescsi_ide_ioctl,
489}; 489};
490 490
491static int idescsi_slave_configure(struct scsi_device * sdp) 491static int idescsi_slave_configure(struct scsi_device * sdp)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 5a18528a69d0..c8b95e8d2859 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -962,12 +962,12 @@ static long sd_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a
962 962
963static struct block_device_operations sd_fops = { 963static struct block_device_operations sd_fops = {
964 .owner = THIS_MODULE, 964 .owner = THIS_MODULE,
965 .open = sd_open, 965 .__open = sd_open,
966 .release = sd_release, 966 .__release = sd_release,
967 .ioctl = sd_ioctl, 967 .__ioctl = sd_ioctl,
968 .getgeo = sd_getgeo, 968 .getgeo = sd_getgeo,
969#ifdef CONFIG_COMPAT 969#ifdef CONFIG_COMPAT
970 .compat_ioctl = sd_compat_ioctl, 970 .__compat_ioctl = sd_compat_ioctl,
971#endif 971#endif
972 .media_changed = sd_media_changed, 972 .media_changed = sd_media_changed,
973 .revalidate_disk = sd_revalidate_disk, 973 .revalidate_disk = sd_revalidate_disk,
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index 2fb8d4d2d6f6..9446cbf4de84 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -540,9 +540,9 @@ static int sr_block_media_changed(struct gendisk *disk)
540static struct block_device_operations sr_bdops = 540static struct block_device_operations sr_bdops =
541{ 541{
542 .owner = THIS_MODULE, 542 .owner = THIS_MODULE,
543 .open = sr_block_open, 543 .__open = sr_block_open,
544 .release = sr_block_release, 544 .__release = sr_block_release,
545 .ioctl = sr_block_ioctl, 545 .__ioctl = sr_block_ioctl,
546 .media_changed = sr_block_media_changed, 546 .media_changed = sr_block_media_changed,
547 /* 547 /*
548 * No compat_ioctl for now because sr_block_ioctl never 548 * No compat_ioctl for now because sr_block_ioctl never
diff --git a/fs/block_dev.c b/fs/block_dev.c
index b9022694e9f7..73b6ce47c861 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1033,8 +1033,13 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
1033 bdev->bd_contains = bdev; 1033 bdev->bd_contains = bdev;
1034 if (!partno) { 1034 if (!partno) {
1035 struct backing_dev_info *bdi; 1035 struct backing_dev_info *bdi;
1036 if (disk->fops->__open) {
1037 ret = disk->fops->__open(bdev->bd_inode, file);
1038 if (ret)
1039 goto out_first;
1040 }
1036 if (disk->fops->open) { 1041 if (disk->fops->open) {
1037 ret = disk->fops->open(bdev->bd_inode, file); 1042 ret = disk->fops->open(bdev, file->f_mode);
1038 if (ret) 1043 if (ret)
1039 goto out_clear; 1044 goto out_clear;
1040 } 1045 }
@@ -1074,8 +1079,13 @@ static int do_open(struct block_device *bdev, struct file *file, int for_part)
1074 part = NULL; 1079 part = NULL;
1075 disk = NULL; 1080 disk = NULL;
1076 if (bdev->bd_contains == bdev) { 1081 if (bdev->bd_contains == bdev) {
1082 if (bdev->bd_disk->fops->__open) {
1083 ret = bdev->bd_disk->fops->__open(bdev->bd_inode, file);
1084 if (ret)
1085 goto out;
1086 }
1077 if (bdev->bd_disk->fops->open) { 1087 if (bdev->bd_disk->fops->open) {
1078 ret = bdev->bd_disk->fops->open(bdev->bd_inode, file); 1088 ret = bdev->bd_disk->fops->open(bdev, file->f_mode);
1079 if (ret) 1089 if (ret)
1080 goto out_unlock_bdev; 1090 goto out_unlock_bdev;
1081 } 1091 }
@@ -1184,8 +1194,10 @@ static int __blkdev_put(struct block_device *bdev, int for_part)
1184 kill_bdev(bdev); 1194 kill_bdev(bdev);
1185 } 1195 }
1186 if (bdev->bd_contains == bdev) { 1196 if (bdev->bd_contains == bdev) {
1197 if (disk->fops->__release)
1198 ret = disk->fops->__release(bd_inode, NULL);
1187 if (disk->fops->release) 1199 if (disk->fops->release)
1188 ret = disk->fops->release(bd_inode, NULL); 1200 ret = disk->fops->release(disk, 0);
1189 } 1201 }
1190 if (!bdev->bd_openers) { 1202 if (!bdev->bd_openers) {
1191 struct module *owner = disk->fops->owner; 1203 struct module *owner = disk->fops->owner;
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 2bad616b9949..b573186ff1a1 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -1061,11 +1061,16 @@ struct file;
1061struct inode; 1061struct inode;
1062 1062
1063struct block_device_operations { 1063struct block_device_operations {
1064 int (*open) (struct inode *, struct file *); 1064 int (*__open) (struct inode *, struct file *);
1065 int (*release) (struct inode *, struct file *); 1065 int (*__release) (struct inode *, struct file *);
1066 int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long); 1066 int (*__ioctl) (struct inode *, struct file *, unsigned, unsigned long);
1067 long (*unlocked_ioctl) (struct file *, unsigned, unsigned long); 1067 long (*__unlocked_ioctl) (struct file *, unsigned, unsigned long);
1068 long (*compat_ioctl) (struct file *, unsigned, unsigned long); 1068 long (*__compat_ioctl) (struct file *, unsigned, unsigned long);
1069 int (*open) (struct block_device *, fmode_t);
1070 int (*release) (struct gendisk *, fmode_t);
1071 int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
1072 int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
1073 int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
1069 int (*direct_access) (struct block_device *, sector_t, 1074 int (*direct_access) (struct block_device *, sector_t,
1070 void **, unsigned long *); 1075 void **, unsigned long *);
1071 int (*media_changed) (struct gendisk *); 1076 int (*media_changed) (struct gendisk *);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 58bbf689fef7..b5894604ba5e 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -79,6 +79,7 @@ extern int dir_notify_enable;
79#define FMODE_NDELAY ((__force fmode_t)32) 79#define FMODE_NDELAY ((__force fmode_t)32)
80#define FMODE_EXCL ((__force fmode_t)64) 80#define FMODE_EXCL ((__force fmode_t)64)
81#define FMODE_WRITE_IOCTL ((__force fmode_t)128) 81#define FMODE_WRITE_IOCTL ((__force fmode_t)128)
82#define FMODE_NDELAY_NOW ((__force fmode_t)256)
82 83
83#define RW_MASK 1 84#define RW_MASK 1
84#define RWA_MASK 2 85#define RWA_MASK 2