From: Alex Mastro amastro@fb.com
[ Upstream commit 16df67f2189a71a8310bcebddb87ed569e8352be ]
The two implementers of vfio_device_ops.device_feature, vfio_cdx_ioctl_feature and vfio_pci_core_ioctl_feature, return -ENOTTY in the fallthrough case when the feature is unsupported. For consistency, the base case, vfio_ioctl_device_feature, should do the same when device_feature == NULL, indicating an implementation has no feature extensions.
Signed-off-by: Alex Mastro amastro@fb.com Link: https://lore.kernel.org/r/20250908-vfio-enotty-v1-1-4428e1539e2e@fb.com Signed-off-by: Alex Williamson alex.williamson@redhat.com Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
YES - `drivers/vfio/vfio_main.c:1255` now returns `-ENOTTY` when `device->ops->device_feature` is NULL, matching the documented optional nature of that callback (`include/linux/vfio.h:137`), so users probing for vendor/device extensions on drivers without feature support get the expected “unsupported ioctl” error instead of the misleading `-EINVAL`. - Existing feature implementations already signal “unsupported” with `-ENOTTY` (for example `drivers/vfio/pci/vfio_pci_core.c:1518` and `drivers/vfio/cdx/main.c:79`), so the change restores API consistency and lets user space rely on a single return code when checking for absent features. - The bug has been present since the core feature decoder was introduced (commit 445ad495f0ff), leading to real user-visible confusion where `VFIO_DEVICE_FEATURE_PROBE` can’t distinguish between bad arguments and an unsupported feature on simpler devices. - The fix is trivially small, has no dependencies, and only adjusts an errno in one fallback path, so regression risk for stable kernels is negligible while improving correctness for existing VFIO users.
drivers/vfio/vfio_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index 5046cae052224..715368076a1fe 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -1251,7 +1251,7 @@ static int vfio_ioctl_device_feature(struct vfio_device *device, feature.argsz - minsz); default: if (unlikely(!device->ops->device_feature)) - return -EINVAL; + return -ENOTTY; return device->ops->device_feature(device, feature.flags, arg->data, feature.argsz - minsz);