Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Jan 2013 19:50:52 -0500 (EST)
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        John Baldwin <jhb@freebsd.org>
Cc:        Rick Macklem <rmacklem@freebsd.org>, Doug Rabson <dfr@freebsd.org>, fs@freebsd.org
Subject:   Re: [PATCH] Properly handle signals on interruptible NFS mounts
Message-ID:  <21875538.1984621.1358211052621.JavaMail.root@erie.cs.uoguelph.ca>
In-Reply-To: <201301141437.05040.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
John Baldwin wrote:
> When the new RPC layer was brought in, the RPC_INTR return value (to
> indicate
> an RPC request was interrupted by a signal) was not handled in the NFS
> client.
> As a result, if an NFS request is interrupted by a signal (on a mount
> with the
> "intr" option), then the nfs_request() functions would fall through to
> the
> default case and return EACCES rather than EINTR. While here, I
> noticed that
> the new RPC layer also lost all of the RPC statistics the old client
> used to
> keep (but that are still reported in 'nfsstat -c'). I've added back as
> many
> of the statistics as I could, but retries are not easy to do as only
> the RPC
> layer knows about them and not the NFS client.
> 
> Index: fs/nfs/nfs_commonkrpc.c
> ===================================================================
> --- fs/nfs/nfs_commonkrpc.c (revision 245225)
> +++ fs/nfs/nfs_commonkrpc.c (working copy)
> @@ -767,12 +767,18 @@
> if (stat == RPC_SUCCESS) {
> error = 0;
> } else if (stat == RPC_TIMEDOUT) {
> + NFSINCRGLOBAL(newnfsstats.rpctimeouts);
> error = ETIMEDOUT;
> } else if (stat == RPC_VERSMISMATCH) {
> + NFSINCRGLOBAL(newnfsstats.rpcinvalid);
> error = EOPNOTSUPP;
> } else if (stat == RPC_PROGVERSMISMATCH) {
> + NFSINCRGLOBAL(newnfsstats.rpcinvalid);
> error = EPROTONOSUPPORT;
> + } else if (stat == RPC_INTR) {
> + error = EINTR;
> } else {
> + NFSINCRGLOBAL(newnfsstats.rpcinvalid);
> error = EACCES;
> }
> if (error) {
> Index: nfsclient/nfs_krpc.c
> ===================================================================
> --- nfsclient/nfs_krpc.c (revision 245225)
> +++ nfsclient/nfs_krpc.c (working copy)
> @@ -549,14 +549,21 @@
> */
> if (stat == RPC_SUCCESS)
> error = 0;
> - else if (stat == RPC_TIMEDOUT)
> + else if (stat == RPC_TIMEDOUT) {
> + nfsstats.rpctimeouts++;
> error = ETIMEDOUT;
> - else if (stat == RPC_VERSMISMATCH)
> + } else if (stat == RPC_VERSMISMATCH) {
> + nfsstats.rpcinvalid++;
> error = EOPNOTSUPP;
> - else if (stat == RPC_PROGVERSMISMATCH)
> + } else if (stat == RPC_PROGVERSMISMATCH) {
> + nfsstats.rpcinvalid++;
> error = EPROTONOSUPPORT;
> - else
> + } else if (stat == RPC_INTR) {
> + error = EINTR;
> + } else {
> + nfsstats.rpcinvalid++;
> error = EACCES;
> + }
> if (error)
> goto nfsmout;
> 
> @@ -572,6 +579,7 @@
> if (error == ENOMEM) {
> m_freem(mrep);
> AUTH_DESTROY(auth);
> + nfsstats.rpcinvalid++;
> return (error);
> }
> 
This patch looks fine to me, rick

> 
> --
> John Baldwin
> _______________________________________________
> freebsd-fs@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-fs
> To unsubscribe, send any mail to "freebsd-fs-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?21875538.1984621.1358211052621.JavaMail.root>