svn commit: r332863 - projects/pnfs-planb-server/sys/fs/nfsclient

Rick Macklem rmacklem at FreeBSD.org
Sat Apr 21 20:48:04 UTC 2018


Author: rmacklem
Date: Sat Apr 21 20:48:03 2018
New Revision: 332863
URL: https://svnweb.freebsd.org/changeset/base/332863

Log:
  Fix nfsrpc_layoutreturn() and nfscl_dofflayoutio() for the Flexible File
  Layout returns/recalls and I/O errors against the DS.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clrpcops.c

Modified: projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clrpcops.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clrpcops.c	Sat Apr 21 19:54:06 2018	(r332862)
+++ projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clrpcops.c	Sat Apr 21 20:48:03 2018	(r332863)
@@ -5202,10 +5202,11 @@ int
 nfsrpc_layoutreturn(struct nfsmount *nmp, uint8_t *fh, int fhlen, int reclaim,
     int layouttype, uint32_t iomode, int layoutreturn, uint64_t offset,
     uint64_t len, nfsv4stateid_t *stateidp, struct ucred *cred, NFSPROC_T *p,
-    void *stuff)
+    uint32_t stat, uint32_t op, char *devid)
 {
 	uint32_t *tl;
 	struct nfsrv_descript nfsd, *nd = &nfsd;
+	uint64_t tu64;
 	int error;
 
 	nfscl_reqstart(nd, NFSPROC_LAYOUTRETURN, nmp, fh, fhlen, NULL, NULL,
@@ -5233,11 +5234,32 @@ nfsrpc_layoutreturn(struct nfsmount *nmp, uint8_t *fh,
 		if (layouttype == NFSLAYOUT_NFSV4_1_FILES)
 			*tl = txdr_unsigned(0);
 		else if (layouttype == NFSLAYOUT_FLEXFILE) {
-			*tl = txdr_unsigned(2 * NFSX_UNSIGNED);
-			NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
-			/* No ioerrs or stats yet. */
-			*tl++ = 0;
-			*tl = 0;
+			if (stat != 0) {
+				*tl = txdr_unsigned(2 * NFSX_HYPER +
+				    NFSX_STATEID + NFSX_V4DEVICEID + 5 *
+				    NFSX_UNSIGNED);
+				NFSM_BUILD(tl, uint32_t *, 2 * NFSX_HYPER +
+				    NFSX_STATEID + NFSX_V4DEVICEID + 5 *
+				    NFSX_UNSIGNED);
+				*tl++ = txdr_unsigned(1);	/* One error. */
+				tu64 = 0;			/* Offset. */
+				txdr_hyper(tu64, tl); tl += 2;
+				tu64 = UINT64_MAX;		/* Length. */
+				txdr_hyper(tu64, tl); tl += 2;
+				NFSBCOPY(stateidp, tl, NFSX_STATEID);
+				tl += (NFSX_STATEID / NFSX_UNSIGNED);
+				*tl++ = txdr_unsigned(1);	/* One error. */
+				NFSBCOPY(devid, tl, NFSX_V4DEVICEID);
+				tl += (NFSX_V4DEVICEID / NFSX_UNSIGNED);
+				*tl++ = txdr_unsigned(stat);
+				*tl++ = txdr_unsigned(op);
+			} else {
+				*tl = txdr_unsigned(2 * NFSX_UNSIGNED);
+				NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
+				/* No ioerrs. */
+				*tl++ = 0;
+			}
+			*tl = 0;	/* No stats yet. */
 		}
 	}
 	nd->nd_flag |= ND_USEGSSNAME;
@@ -6016,6 +6038,13 @@ nfscl_dofflayoutio(vnode_t vp, struct uio *uiop, int *
 					error = nfsrpc_commitds(vp, off, xfer,
 					    *dspp, fhp, dp->nfsdi_vers,
 					    dp->nfsdi_minorvers, tcred, p);
+				NFSCL_DEBUG(4, "commitds=%d\n", error);
+				/* ENXIO indicates a problem with the DS. */
+				if (error == ENXIO) {
+					NFSCL_DEBUG(4,
+					    "DS layreterr for commit\n");
+					nfscl_dserr(NFSV4OP_COMMIT, dp, lyp);
+				}
 			}
 			NFSCL_DEBUG(4, "aft nfsio_commitds=%d\n", error);
 			if (error == 0) {
@@ -6030,11 +6059,17 @@ nfscl_dofflayoutio(vnode_t vp, struct uio *uiop, int *
 				np->n_flag &= ~NDSCOMMIT;
 				mtx_unlock(&np->n_mtx);
 			}
-		} else if (rwflag == NFSV4OPEN_ACCESSREAD)
+		} else if (rwflag == NFSV4OPEN_ACCESSREAD) {
 			error = nfsrpc_readds(vp, uiop, stateidp, eofp, *dspp,
 			    off, xfer, fhp, 1, dp->nfsdi_vers,
 			    dp->nfsdi_minorvers, tcred, p);
-		else {
+			NFSCL_DEBUG(4, "readds=%d\n", error);
+			if (error == ENXIO) {
+				/* ENXIO indicates a problem with the DS. */
+				NFSCL_DEBUG(4, "DS layreterr for read\n");
+				nfscl_dserr(NFSV4OP_READ, dp, lyp);
+			}
+		} else {
 			if (flp->nfsfl_mirrorcnt == 1) {
 				error = nfsrpc_writeds(vp, uiop, iomode,
 				    must_commit, stateidp, *dspp, off, xfer,
@@ -6065,6 +6100,12 @@ 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 == ENXIO) {
+					/* ENXIO indicates a DS problem. */
+					NFSCL_DEBUG(4,
+					    "DS layreterr for write\n");
+					nfscl_dserr(NFSV4OP_WRITE, dp, lyp);
+				}
 			}
 		}
 		NFSCL_DEBUG(4, "aft read/writeds=%d\n", error);


More information about the svn-src-projects mailing list