Re: git: 2612f1b8649b - main - deadfs: Return ENXIO instead of EIO when the device is gone.
- Reply: Poul-Henning Kamp: "Re: git: 2612f1b8649b - main - deadfs: Return ENXIO instead of EIO when the device is gone."
- In reply to: Poul-Henning Kamp : "git: 2612f1b8649b - main - deadfs: Return ENXIO instead of EIO when the device is gone."
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 24 Oct 2025 08:21:00 UTC
On Fri, Oct 24, 2025 at 07:41:11AM +0000, Poul-Henning Kamp wrote:
> The branch main has been updated by phk:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=2612f1b8649bb4f069a6a064ed714daa5f10d037
>
> commit 2612f1b8649bb4f069a6a064ed714daa5f10d037
> Author: Poul-Henning Kamp <phk@FreeBSD.org>
> AuthorDate: 2025-10-24 07:19:31 +0000
> Commit: Poul-Henning Kamp <phk@FreeBSD.org>
> CommitDate: 2025-10-24 07:19:31 +0000
>
> deadfs: Return ENXIO instead of EIO when the device is gone.
>
> One some systems, under some conditions, pulling a USB stick would
> read(2) returning EIO and not ENXIO, like it should and used to.
>
> Recoverdisk(1), which does not give up on EIO, like most programs
> would, spins furiously.
>
> Arguably, deadfs was always wrong in returning EIO, because once you
> get to deadfs no operation will ever work again, but we used to
> take a different path through devfs_vnops.c which got us the ENXIO.
>
> Something changed recently, and while testing this fix, I noticed
Nothing changed WRT code, it is just a race that causes the behavior.
> that drm-kmod-66/i915kms may be the condition which trigger
> the different code-path.
>
> MFC to: stable/15
> Fixes: 289785
> Thanks to: imp, kib
> ---
> sys/fs/deadfs/dead_vnops.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/sys/fs/deadfs/dead_vnops.c b/sys/fs/deadfs/dead_vnops.c
> index 296cf058f8c9..137c86b65058 100644
> --- a/sys/fs/deadfs/dead_vnops.c
> +++ b/sys/fs/deadfs/dead_vnops.c
> @@ -122,18 +122,18 @@ dead_read(struct vop_read_args *ap)
> {
>
> /*
> - * Return EOF for tty devices, EIO for others
> + * Return EOF for tty devices, ENXIO for others
> */
> - if ((ap->a_vp->v_vflag & VV_ISTTY) == 0)
> - return (EIO);
> - return (0);
> + if (ap->a_vp->v_vflag & VV_ISTTY)
Old style with explicit '== 0' was more style-correct.
> + return (0);
> + return (ENXIO);
> }
>
> int
> dead_write(struct vop_write_args *ap)
> {
>
> - return (EIO);
> + return (ENXIO);
> }
>
> int