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