| From: Nick Bowler <nbowler@draconx.ca> |
| Date: Wed, 20 Jul 2022 23:57:35 -0400 |
| Subject: nvme: define compat_ioctl again to unbreak 32-bit userspace. |
| Patch-mainline: v6.0-rc1 |
| Git-commit: a25d4261582cf00dad884c194d21084836663d3d |
| References: git-fixes |
| |
| Commit 89b3d6e60550 ("nvme: simplify the compat ioctl handling") removed |
| the initialization of compat_ioctl from the nvme block_device_operations |
| structures. |
| |
| Presumably the expectation was that 32-bit ioctls would be directed |
| through the regular handler but this is not the case: failing to assign |
| .compat_ioctl actually means that the compat case is disabled entirely, |
| and any attempt to submit nvme ioctls from 32-bit userspace fails |
| outright with -ENOTTY. |
| |
| For example: |
| |
| % smartctl -x /dev/nvme0n1 |
| [...] |
| Read NVMe Identify Controller failed: NVME_IOCTL_ADMIN_CMD: Inappropriate ioctl for device |
| |
| The blkdev_compat_ptr_ioctl helper can be used to direct compat calls |
| through the main ioctl handler and makes things work again. |
| |
| Fixes: 89b3d6e60550 ("nvme: simplify the compat ioctl handling") |
| Signed-off-by: Nick Bowler <nbowler@draconx.ca> |
| Reviewed-by: Guixin Liu <kanie@linux.alibaba.com> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Acked-by: Daniel Wagner <dwagner@suse.de> |
| |
| drivers/nvme/host/core.c | 1 + |
| drivers/nvme/host/multipath.c | 1 + |
| 2 files changed, 2 insertions(+) |
| |
| |
| |
| @@ -2094,6 +2094,7 @@ static int nvme_report_zones(struct gend |
| static const struct block_device_operations nvme_bdev_ops = { |
| .owner = THIS_MODULE, |
| .ioctl = nvme_ioctl, |
| + .compat_ioctl = blkdev_compat_ptr_ioctl, |
| .open = nvme_open, |
| .release = nvme_release, |
| .getgeo = nvme_getgeo, |
| |
| |
| @@ -425,6 +425,7 @@ const struct block_device_operations nvm |
| .open = nvme_ns_head_open, |
| .release = nvme_ns_head_release, |
| .ioctl = nvme_ns_head_ioctl, |
| + .compat_ioctl = blkdev_compat_ptr_ioctl, |
| .getgeo = nvme_getgeo, |
| .report_zones = nvme_ns_head_report_zones, |
| .pr_ops = &nvme_pr_ops, |