From: Hoegeun Kwon Date: Wed, 9 Nov 2022 05:59:19 +0000 (+0900) Subject: Revert "block: remove __blkdev_driver_ioctl" X-Git-Tag: accepted/tizen/unified/20230814.120944~44 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fkernel%2Flinux-rpi.git;a=commitdiff_plain;h=b4f735d356502ddb295e9eac512180943c20a5e3 Revert "block: remove __blkdev_driver_ioctl" Revert that commit for use with the blkdev_flushbuf ioctl. This reverts commit a7cb3d2f09c8405aed59d97a7d02cebea43cd3c7. Change-Id: Idd8b165ea6c83ecbacdb697afa0532414b330360 Signed-off-by: Hoegeun Kwon --- diff --git a/block/ioctl.c b/block/ioctl.c index cd506a9..44c3ce1 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -232,6 +232,23 @@ static int compat_put_ulong(compat_ulong_t __user *argp, compat_ulong_t val) } #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 @@ -593,12 +610,10 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, } 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 */ diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index ca2ab97..49bebd3 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -2619,11 +2619,9 @@ static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, 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; diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 9f4a285..f575b2d 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -1239,9 +1239,8 @@ static int cached_dev_ioctl(struct bcache_device *d, fmode_t mode, 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) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 9dd2c2d..b68d52c 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -466,10 +466,7 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode, } } - 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; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index cf64df9..4b99811 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1881,6 +1881,8 @@ extern int blkdev_compat_ptr_ioctl(struct block_device *, fmode_t, #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 *);