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

Attachment: pgpH89kOxVxOn.pgp
Description: PGP signature

Reply via email to