}
#endif
+int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
+ unsigned cmd, unsigned long arg)
+{
+ struct gendisk *disk = bdev->bd_disk;
+
+ if (disk->fops->ioctl)
+ return disk->fops->ioctl(bdev, mode, cmd, arg);
+
+ return -ENOTTY;
+}
+/*
+ * For the record: _GPL here is only because somebody decided to slap it
+ * on the previous export. Sheer idiocy, since it wasn't copyrightable
+ * at all and could be open-coded without any exports by anybody who cares.
+ */
+EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl);
+
#ifdef CONFIG_COMPAT
/*
* This is the equivalent of compat_ptr_ioctl(), to be used by block
}
ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp);
- if (ret != -ENOIOCTLCMD)
- return ret;
+ if (ret == -ENOIOCTLCMD)
+ return __blkdev_driver_ioctl(bdev, mode, cmd, arg);
- if (!bdev->bd_disk->fops->ioctl)
- return -ENOTTY;
- return bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg);
+ return ret;
}
EXPORT_SYMBOL_GPL(blkdev_ioctl); /* for /dev/raw */
case CDROM_LAST_WRITTEN:
case CDROM_SEND_PACKET:
case SCSI_IOCTL_SEND_COMMAND:
- if (!bdev->bd_disk->fops->ioctl)
- ret = -ENOTTY;
- else
- ret = bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg);
+ ret = __blkdev_driver_ioctl(pd->bdev, mode, cmd, arg);
break;
+
default:
pkt_dbg(2, pd, "Unknown ioctl (%x)\n", cmd);
ret = -ENOTTY;
if (dc->io_disable)
return -EIO;
- if (!dc->bdev->bd_disk->fops->ioctl)
- return -ENOTTY;
- return dc->bdev->bd_disk->fops->ioctl(dc->bdev, mode, cmd, arg);
+
+ return __blkdev_driver_ioctl(dc->bdev, mode, cmd, arg);
}
void bch_cached_dev_request_init(struct cached_dev *dc)
}
}
- if (!bdev->bd_disk->fops->ioctl)
- r = -ENOTTY;
- else
- r = bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg);
+ r = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
out:
dm_unprepare_ioctl(md, srcu_idx);
return r;
#define blkdev_compat_ptr_ioctl NULL
#endif
+extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int,
+ unsigned long);
extern int bdev_read_page(struct block_device *, sector_t, struct page *);
extern int bdev_write_page(struct block_device *, sector_t, struct page *,
struct writeback_control *);