svn commit: r252074 - head/sys/fs/nfsclient
Rick Macklem
rmacklem at FreeBSD.org
Fri Jun 21 22:46:17 UTC 2013
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;
+ }
+ }
}
}
More information about the svn-src-head
mailing list