Author: rmacklem
Date: Wed May 25 20:53:08 2011
New Revision: 222289
URL: http://svn.freebsd.org/changeset/base/222289

Log:
  Fix the new NFS client so that it correctly sets the "must_commit"
  argument for a write RPC when it succeeds for the first one and
  fails for a subsequent RPC within the same call to the function.
  This makes it compatible with the old NFS client for this case.
  
  MFC after:    2 weeks

Modified:
  head/sys/fs/nfs/nfs_var.h
  head/sys/fs/nfsclient/nfs_clrpcops.c
  head/sys/fs/nfsclient/nfs_clvnops.c

Modified: head/sys/fs/nfs/nfs_var.h
==============================================================================
--- head/sys/fs/nfs/nfs_var.h   Wed May 25 20:25:13 2011        (r222288)
+++ head/sys/fs/nfs/nfs_var.h   Wed May 25 20:53:08 2011        (r222289)
@@ -370,7 +370,7 @@ int nfsrpc_readlink(vnode_t, struct uio 
     NFSPROC_T *, struct nfsvattr *, int *, void *);
 int nfsrpc_read(vnode_t, struct uio *, struct ucred *, NFSPROC_T *,
     struct nfsvattr *, int *, void *);
-int nfsrpc_write(vnode_t, struct uio *, int *, u_char *,
+int nfsrpc_write(vnode_t, struct uio *, int *, int *,
     struct ucred *, NFSPROC_T *, struct nfsvattr *, int *, void *, int);
 int nfsrpc_mknod(vnode_t, char *, int, struct vattr *, u_int32_t,
     enum vtype, struct ucred *, NFSPROC_T *, struct nfsvattr *,

Modified: head/sys/fs/nfsclient/nfs_clrpcops.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clrpcops.c        Wed May 25 20:25:13 2011        
(r222288)
+++ head/sys/fs/nfsclient/nfs_clrpcops.c        Wed May 25 20:53:08 2011        
(r222289)
@@ -68,7 +68,7 @@ static int nfsrpc_setattrrpc(vnode_t , s
     struct ucred *, NFSPROC_T *, struct nfsvattr *, int *, void *);
 static int nfsrpc_readrpc(vnode_t , struct uio *, struct ucred *,
     nfsv4stateid_t *, NFSPROC_T *, struct nfsvattr *, int *, void *);
-static int nfsrpc_writerpc(vnode_t , struct uio *, int *, u_char *,
+static int nfsrpc_writerpc(vnode_t , struct uio *, int *, int *,
     struct ucred *, nfsv4stateid_t *, NFSPROC_T *, struct nfsvattr *, int *,
     void *);
 static int nfsrpc_createv23(vnode_t , char *, int, struct vattr *,
@@ -1369,7 +1369,7 @@ nfsmout:
  * will then deadlock.
  */
 APPLESTATIC int
-nfsrpc_write(vnode_t vp, struct uio *uiop, int *iomode, u_char *verfp,
+nfsrpc_write(vnode_t vp, struct uio *uiop, int *iomode, int *must_commit,
     struct ucred *cred, NFSPROC_T *p, struct nfsvattr *nap, int *attrflagp,
     void *stuff, int called_from_strategy)
 {
@@ -1382,6 +1382,7 @@ nfsrpc_write(vnode_t vp, struct uio *uio
        nfsv4stateid_t stateid;
        void *lckp;
 
+       *must_commit = 0;
        if (nmp->nm_clp != NULL)
                clidrev = nmp->nm_clp->nfsc_clientidrev;
        newcred = cred;
@@ -1412,7 +1413,7 @@ nfsrpc_write(vnode_t vp, struct uio *uio
                if (nostateid)
                        error = 0;
                else
-                       error = nfsrpc_writerpc(vp, uiop, iomode, verfp,
+                       error = nfsrpc_writerpc(vp, uiop, iomode, must_commit,
                            newcred, &stateid, p, nap, attrflagp, stuff);
                if (error == NFSERR_STALESTATEID)
                        nfscl_initiate_recovery(nmp->nm_clp);
@@ -1447,7 +1448,7 @@ nfsrpc_write(vnode_t vp, struct uio *uio
  */
 static int
 nfsrpc_writerpc(vnode_t vp, struct uio *uiop, int *iomode,
-    u_char *verfp, struct ucred *cred, nfsv4stateid_t *stateidp,
+    int *must_commit, struct ucred *cred, nfsv4stateid_t *stateidp,
     NFSPROC_T *p, struct nfsvattr *nap, int *attrflagp, void *stuff)
 {
        u_int32_t *tl;
@@ -1585,14 +1586,16 @@ nfsrpc_writerpc(vnode_t vp, struct uio *
                                else if (committed == NFSWRITE_DATASYNC &&
                                        commit == NFSWRITE_UNSTABLE)
                                        committed = commit;
-                               if (verfp != NULL)
-                                       NFSBCOPY((caddr_t)tl, verfp, NFSX_VERF);
                                NFSLOCKMNT(nmp);
                                if (!NFSHASWRITEVERF(nmp)) {
                                        NFSBCOPY((caddr_t)tl,
                                            (caddr_t)&nmp->nm_verf[0],
                                            NFSX_VERF);
                                        NFSSETWRITEVERF(nmp);
+                               } else if (NFSBCMP(tl, nmp->nm_verf,
+                                   NFSX_VERF)) {
+                                       *must_commit = 1;
+                                       NFSBCOPY(tl, nmp->nm_verf, NFSX_VERF);
                                }
                                NFSUNLOCKMNT(nmp);
                        }

Modified: head/sys/fs/nfsclient/nfs_clvnops.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clvnops.c Wed May 25 20:25:13 2011        
(r222288)
+++ head/sys/fs/nfsclient/nfs_clvnops.c Wed May 25 20:53:08 2011        
(r222289)
@@ -1332,19 +1332,9 @@ ncl_writerpc(struct vnode *vp, struct ui
 {
        struct nfsvattr nfsva;
        int error = 0, attrflag, ret;
-       u_char verf[NFSX_VERF];
-       struct nfsmount *nmp = VFSTONFS(vp->v_mount);
 
-       *must_commit = 0;
-       error = nfsrpc_write(vp, uiop, iomode, verf, cred,
+       error = nfsrpc_write(vp, uiop, iomode, must_commit, cred,
            uiop->uio_td, &nfsva, &attrflag, NULL, called_from_strategy);
-       NFSLOCKMNT(nmp);
-       if (!error && NFSHASWRITEVERF(nmp) &&
-           NFSBCMP(verf, nmp->nm_verf, NFSX_VERF)) {
-               *must_commit = 1;
-               NFSBCOPY(verf, nmp->nm_verf, NFSX_VERF);
-       }
-       NFSUNLOCKMNT(nmp);
        if (attrflag) {
                if (VTONFS(vp)->n_flag & ND_NFSV4)
                        ret = nfscl_loadattrcache(&vp, &nfsva, NULL, NULL, 1,
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to