Date: Sun, 29 Apr 2012 00:59:39 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r234778 - in projects/nfsv4.1-client/sys/fs: nfs nfsclient Message-ID: <201204290059.q3T0xdRA088894@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Sun Apr 29 00:59:38 2012 New Revision: 234778 URL: http://svn.freebsd.org/changeset/base/234778 Log: Fix the last byte written field of the layout commit operation for NFSv4.1 PNFS. Modified: projects/nfsv4.1-client/sys/fs/nfs/nfs_var.h projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Modified: projects/nfsv4.1-client/sys/fs/nfs/nfs_var.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfs_var.h Sat Apr 28 23:13:09 2012 (r234777) +++ projects/nfsv4.1-client/sys/fs/nfs/nfs_var.h Sun Apr 29 00:59:38 2012 (r234778) @@ -451,7 +451,7 @@ int nfsrpc_layoutget(struct nfsmount *, int nfsrpc_getdeviceinfo(struct nfsmount *, uint8_t *, int, uint32_t *, struct nfscldevinfo **, struct ucred *, NFSPROC_T *); int nfsrpc_layoutcommit(struct nfsmount *, uint8_t *, int, int, - uint64_t, uint64_t, nfsv4stateid_t *, int, int, uint8_t *, + uint64_t, uint64_t, uint64_t, nfsv4stateid_t *, int, int, uint8_t *, struct ucred *, NFSPROC_T *, void *); int nfsrpc_layoutreturn(struct nfsmount *, uint8_t *, int, int, int, uint32_t, int, uint64_t, uint64_t, nfsv4stateid_t *, int, uint32_t *, struct ucred *, Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h Sat Apr 28 23:13:09 2012 (r234777) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h Sun Apr 29 00:59:38 2012 (r234778) @@ -230,6 +230,7 @@ struct nfscllayout { LIST_ENTRY(nfscllayout) nfsly_hash; nfsv4stateid_t nfsly_stateid; uint64_t nfsly_filesid[2]; + uint64_t nfsly_lastbyte; struct nfsclflayouthead nfsly_flayread; struct nfsclflayouthead nfsly_flayrw; struct nfsclrecalllayouthead nfsly_recall; Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Sat Apr 28 23:13:09 2012 (r234777) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Sun Apr 29 00:59:38 2012 (r234778) @@ -4923,9 +4923,9 @@ nfsmout: */ int nfsrpc_layoutcommit(struct nfsmount *nmp, uint8_t *fh, int fhlen, int reclaim, - uint64_t off, uint64_t len, nfsv4stateid_t *stateidp, int layouttype, - int layoutupdatecnt, uint8_t *layp, struct ucred *cred, NFSPROC_T *p, - void *stuff) + uint64_t off, uint64_t len, uint64_t lastbyte, nfsv4stateid_t *stateidp, + int layouttype, int layoutupdatecnt, uint8_t *layp, struct ucred *cred, + NFSPROC_T *p, void *stuff) { uint32_t *tl; struct nfsrv_descript nfsd, *nd = &nfsd; @@ -4933,7 +4933,7 @@ nfsrpc_layoutcommit(struct nfsmount *nmp uint8_t *cp; nfscl_reqstart(nd, NFSPROC_LAYOUTCOMMIT, nmp, fh, fhlen, NULL, NULL); - NFSM_BUILD(tl, uint32_t *, 5 * NFSX_UNSIGNED + 2 * NFSX_HYPER + + NFSM_BUILD(tl, uint32_t *, 5 * NFSX_UNSIGNED + 3 * NFSX_HYPER + NFSX_STATEID); txdr_hyper(off, tl); tl += 2; @@ -4947,7 +4947,13 @@ nfsrpc_layoutcommit(struct nfsmount *nmp *tl++ = stateidp->other[0]; *tl++ = stateidp->other[1]; *tl++ = stateidp->other[2]; - *tl++ = newnfs_false; + *tl++ = newnfs_true; + if (lastbyte < off) + lastbyte = off; + else if (lastbyte >= (off + len)) + lastbyte = off + len - 1; + txdr_hyper(lastbyte, tl); + tl += 2; *tl++ = newnfs_false; *tl++ = txdr_unsigned(layouttype); *tl = txdr_unsigned(layoutupdatecnt); @@ -5285,7 +5291,7 @@ nfscl_doiods(vnode_t vp, struct uio *uio struct nfsclflayout *rflp; nfsv4stateid_t stateid; struct ucred *newcred; - uint64_t len, off, oresid, xfer; + uint64_t lastbyte, len, off, oresid, xfer; int eof, error, iolaymode, recalled; void *lckp; @@ -5351,6 +5357,14 @@ if (error == 2) printf("rwacc=0x%x\n", r must_commit, &eof, &stateid, rwaccess, dip, rflp, off, xfer, newcred, p); nfscl_reldevinfo(dip); + lastbyte = off + xfer - 1; + if (error == 0) { + NFSLOCKCLSTATE(); + if (lastbyte > layp->nfsly_lastbyte) + layp->nfsly_lastbyte = lastbyte; + NFSUNLOCKCLSTATE(); +printf("lastb=%qd\n", layp->nfsly_lastbyte); + } } else error = EIO; if (error == 0) Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Sat Apr 28 23:13:09 2012 (r234777) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Sun Apr 29 00:59:38 2012 (r234778) @@ -4668,6 +4668,7 @@ nfscl_layout(struct nfsmount *nmp, vnode lyp->nfsly_stateid.other[0] = stateidp->other[0]; lyp->nfsly_stateid.other[1] = stateidp->other[1]; lyp->nfsly_stateid.other[2] = stateidp->other[2]; + lyp->nfsly_lastbyte = 0; LIST_INIT(&lyp->nfsly_flayread); LIST_INIT(&lyp->nfsly_flayrw); LIST_INIT(&lyp->nfsly_recall); @@ -5039,7 +5040,7 @@ nfscl_dolayoutcommit(struct nfsmount *nm else len = flp->nfsfl_end - flp->nfsfl_off; error = nfsrpc_layoutcommit(nmp, lyp->nfsly_fh, lyp->nfsly_fhlen, - 0, flp->nfsfl_off, len, &lyp->nfsly_stateid, + 0, flp->nfsfl_off, len, lyp->nfsly_lastbyte, &lyp->nfsly_stateid, NFSLAYOUT_NFSV4_1_FILES, 0, NULL, cred, p, NULL); } @@ -5071,6 +5072,7 @@ tryagain: if ((flp->nfsfl_flags & NFSFL_WRITTEN) != 0) { flp->nfsfl_flags &= ~NFSFL_WRITTEN; NFSUNLOCKCLSTATE(); +printf("do layoutcommit2\n"); nfscl_dolayoutcommit(clp->nfsc_nmp, lyp, flp, NFSPROCCRED(p), p); NFSLOCKCLSTATE();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204290059.q3T0xdRA088894>