From: Jeff Layton <jlayton@kernel.org>
To: NeilBrown <neilb@suse.de>,
Trond Myklebust <trond.myklebust@hammerspace.com>,
Anna Schumaker <anna@kernel.org>
Cc: linux-nfs@vger.kernel.org, Zhitao Li <zhitao.li@smartx.com>
Subject: Re: [PATCH] NFS: Restore -EIO as error to return when "umount -f" aborts request.
Date: Mon, 04 Mar 2024 08:35:38 -0500 [thread overview]
Message-ID: <da3f4c708ee61daeb3f7a579eb29b0bf007d0bc3.camel@kernel.org> (raw)
In-Reply-To: <170909199843.24797.6320949640369986924@noble.neil.brown.name>
On Wed, 2024-02-28 at 14:46 +1100, NeilBrown wrote:
> When "umount -f" is used to abort all outstanding requests on an NFS
> mount, some pending systemcalls can be expected to return an error.
> Currently this error is ERESTARTSYS which should never be exposed to
> applications (it should only be returned due to a signal).
>
> Prior to Linux v5.2 EIO would be returned in these cases, which it is
> more likely that applications will handle.
>
> This patch restores that behaviour so EIO is returned.
>
> Reported-and-tested-by: Zhitao Li <zhitao.li@smartx.com>
> Closes: https://lore.kernel.org/linux-nfs/CAPKjjnrYvzH8hEk9boaBt-fETX3VD2cjjN-Z6iNgwZpHqYUjWw@mail.gmail.com/
> Fixes: ae67bd3821bb ("SUNRPC: Fix up task signalling")
> Signed-off-by: NeilBrown <neilb@suse.de>
> ---
> include/linux/sunrpc/sched.h | 2 +-
> net/sunrpc/clnt.c | 2 +-
> net/sunrpc/sched.c | 6 +++---
> 3 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h
> index 2d61987b3545..ed3a116efd5d 100644
> --- a/include/linux/sunrpc/sched.h
> +++ b/include/linux/sunrpc/sched.h
> @@ -222,7 +222,7 @@ void rpc_put_task(struct rpc_task *);
> void rpc_put_task_async(struct rpc_task *);
> bool rpc_task_set_rpc_status(struct rpc_task *task, int rpc_status);
> void rpc_task_try_cancel(struct rpc_task *task, int error);
> -void rpc_signal_task(struct rpc_task *);
> +void rpc_signal_task(struct rpc_task *, int);
> void rpc_exit_task(struct rpc_task *);
> void rpc_exit(struct rpc_task *, int);
> void rpc_release_calldata(const struct rpc_call_ops *, void *);
> diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
> index cda0935a68c9..cdbdfae13030 100644
> --- a/net/sunrpc/clnt.c
> +++ b/net/sunrpc/clnt.c
> @@ -895,7 +895,7 @@ void rpc_killall_tasks(struct rpc_clnt *clnt)
> trace_rpc_clnt_killall(clnt);
> spin_lock(&clnt->cl_lock);
> list_for_each_entry(rovr, &clnt->cl_tasks, tk_task)
> - rpc_signal_task(rovr);
> + rpc_signal_task(rovr, -EIO);
> spin_unlock(&clnt->cl_lock);
> }
> EXPORT_SYMBOL_GPL(rpc_killall_tasks);
> diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
> index 6debf4fd42d4..e4f36fe16808 100644
> --- a/net/sunrpc/sched.c
> +++ b/net/sunrpc/sched.c
> @@ -852,14 +852,14 @@ void rpc_exit_task(struct rpc_task *task)
> }
> }
>
> -void rpc_signal_task(struct rpc_task *task)
> +void rpc_signal_task(struct rpc_task *task, int err)
> {
> struct rpc_wait_queue *queue;
>
> if (!RPC_IS_ACTIVATED(task))
> return;
>
> - if (!rpc_task_set_rpc_status(task, -ERESTARTSYS))
> + if (!rpc_task_set_rpc_status(task, err))
> return;
> trace_rpc_task_signalled(task, task->tk_action);
> set_bit(RPC_TASK_SIGNALLED, &task->tk_runstate);
> @@ -992,7 +992,7 @@ static void __rpc_execute(struct rpc_task *task)
> * clean up after sleeping on some queue, we don't
> * break the loop here, but go around once more.
> */
> - rpc_signal_task(task);
> + rpc_signal_task(task, -ERESTARTSYS);
> }
> trace_rpc_task_sync_wake(task, task->tk_action);
> }
This seems like the right thing to do.
Reviewed-by: Jeff Layton <jlayton@kernel.org>
prev parent reply other threads:[~2024-03-04 13:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-28 3:46 [PATCH] NFS: Restore -EIO as error to return when "umount -f" aborts request NeilBrown
2024-02-28 21:16 ` Trond Myklebust
2024-03-04 4:50 ` NeilBrown
2024-03-04 13:35 ` Jeff Layton [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=da3f4c708ee61daeb3f7a579eb29b0bf007d0bc3.camel@kernel.org \
--to=jlayton@kernel.org \
--cc=anna@kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
--cc=trond.myklebust@hammerspace.com \
--cc=zhitao.li@smartx.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox