On Fri, Jun 21, 2013 at 10:46:17PM +0000, Rick Macklem wrote: > Author: rmacklem > Date: Fri Jun 21 22:46:16 2013 > New Revision: 252074 > URL: http://svnweb.freebsd.org/changeset/base/252074 > > Log: > The NFSv4.1 LayoutCommit operation requires a valid offset and length. > (0, 0 is not sufficient) This patch a loop for each file layout, using > the offset, length of each file layout in a separate LayoutCommit. > > Modified: > head/sys/fs/nfsclient/nfs_clstate.c > > Modified: head/sys/fs/nfsclient/nfs_clstate.c > ============================================================================== > --- head/sys/fs/nfsclient/nfs_clstate.c Fri Jun 21 22:45:03 2013 > (r252073) > +++ head/sys/fs/nfsclient/nfs_clstate.c Fri Jun 21 22:46:16 2013 > (r252074) > @@ -5145,16 +5145,28 @@ static void > nfscl_dolayoutcommit(struct nfsmount *nmp, struct nfscllayout *lyp, > struct ucred *cred, NFSPROC_T *p) > { > + struct nfsclflayout *flp; > + uint64_t len; > int error; > > - error = nfsrpc_layoutcommit(nmp, lyp->nfsly_fh, lyp->nfsly_fhlen, > - 0, 0, 0, lyp->nfsly_lastbyte, &lyp->nfsly_stateid, > - NFSLAYOUT_NFSV4_1_FILES, 0, NULL, cred, p, NULL); > - if (error == NFSERR_NOTSUPP) { > - /* If the server doesn't want it, don't bother doing it. */ > - NFSLOCKMNT(nmp); > - nmp->nm_state |= NFSSTA_NOLAYOUTCOMMIT; > - NFSUNLOCKMNT(nmp); > + LIST_FOREACH(flp, &lyp->nfsly_flayrw, nfsfl_list) { > + if (flp->nfsfl_off <= lyp->nfsly_lastbyte) { > + len = flp->nfsfl_end - flp->nfsfl_off; > + error = nfsrpc_layoutcommit(nmp, lyp->nfsly_fh, > + lyp->nfsly_fhlen, 0, flp->nfsfl_off, len, > + lyp->nfsly_lastbyte, &lyp->nfsly_stateid, > + NFSLAYOUT_NFSV4_1_FILES, 0, NULL, cred, p, NULL); > + NFSCL_DEBUG(4, "layoutcommit err=%d off=%qd len=%qd " > + "lastbyte=%qd\n", error, flp->nfsfl_off, len, > + lyp->nfsly_lastbyte); > + if (error == NFSERR_NOTSUPP) { > + /* If not supported, don't bother doing it. */ > + NFSLOCKMNT(nmp); > + nmp->nm_state |= NFSSTA_NOLAYOUTCOMMIT; > + NFSUNLOCKMNT(nmp); > + break; > + } > + } > } > } >
This breaks head/. /src/sys/fs/nfsclient/nfs_clstate.c:5161:8: error: format specifies type 'long long' but the argument has type 'uint64_t' (aka 'unsigned long') [-Werror,-Wformat] lyp->nfsly_lastbyte); ^~~~~~~~~~~~~~~~~~~ /src/sys/fs/nfs/nfscl.h:74:11: note: expanded from macro 'NFSCL_DEBUG' printf(__VA_ARGS__); \ ^ 3 errors generated. *** Error code 1 Stop. make: stopped in /obj/amd64.amd64/src/sys/LINT *** Error code 1 Stop. make: stopped in /src Glen
pgpH89kOxVxOn.pgp
Description: PGP signature