Author: rmacklem
Date: Fri Jul 13 12:39:27 2018
New Revision: 336239
URL: https://svnweb.freebsd.org/changeset/base/336239

Log:
  Change the pNFS client so that it does not report an NFSERR_STALE from
  an I/O attempt on a DS to the server via LayoutReturn.
  
  The current FreeBSD client can generate these errors for an operational
  DS while doing a recovery of a mirror after a mirrored DS has been repaired.
  I am not sure why these errors occur, but my best current guess is a race
  between the Layout Recall issued by the kernel code run from pnfsdscopymr(8)
  and a Read operation on the DS for the file bing copied.
  The errrors are not fatal, since the client falls back on doing I/O through
  the MDS, which can do the I/O successfully as a proxy. (The fact that the
  MDS can do this indicates that the file does still exist on the functioning
  DS.)
  This patch only affects behaviour of the pNFS client and only when using
  Flexible File layouts.
  
  MFC after:    2 weeks

Modified:
  head/sys/fs/nfsclient/nfs_clrpcops.c

Modified: head/sys/fs/nfsclient/nfs_clrpcops.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clrpcops.c        Fri Jul 13 11:32:27 2018        
(r336238)
+++ head/sys/fs/nfsclient/nfs_clrpcops.c        Fri Jul 13 12:39:27 2018        
(r336239)
@@ -6046,7 +6046,8 @@ nfscl_dofflayoutio(vnode_t vp, struct uio *uiop, int *
                                            *dspp, fhp, dp->nfsdi_vers,
                                            dp->nfsdi_minorvers, tcred, p);
                                NFSCL_DEBUG(4, "commitds=%d\n", error);
-                               if (error != 0 && error != EACCES) {
+                               if (error != 0 && error != EACCES && error !=
+                                   ESTALE) {
                                        NFSCL_DEBUG(4,
                                            "DS layreterr for commit\n");
                                        nfscl_dserr(NFSV4OP_COMMIT, error, dp,
@@ -6071,7 +6072,7 @@ nfscl_dofflayoutio(vnode_t vp, struct uio *uiop, int *
                            off, xfer, fhp, 1, dp->nfsdi_vers,
                            dp->nfsdi_minorvers, tcred, p);
                        NFSCL_DEBUG(4, "readds=%d\n", error);
-                       if (error != 0 && error != EACCES) {
+                       if (error != 0 && error != EACCES && error != ESTALE) {
                                NFSCL_DEBUG(4, "DS layreterr for read\n");
                                nfscl_dserr(NFSV4OP_READ, error, dp, lyp,
                                    *dspp);
@@ -6107,7 +6108,8 @@ nfscl_dofflayoutio(vnode_t vp, struct uio *uiop, int *
                                            xfer, fhp, m, dp->nfsdi_vers,
                                            dp->nfsdi_minorvers, tcred, p);
                                NFSCL_DEBUG(4, "nfsio_writedsmir=%d\n", error);
-                               if (error != 0 && error != EACCES) {
+                               if (error != 0 && error != EACCES && error !=
+                                   ESTALE) {
                                        NFSCL_DEBUG(4,
                                            "DS layreterr for write\n");
                                        nfscl_dserr(NFSV4OP_WRITE, error, dp,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to