Author: rmacklem
Date: Tue Apr 12 20:23:09 2016
New Revision: 297869
URL: https://svnweb.freebsd.org/changeset/base/297869

Log:
  If the VOP_SETATTR() call that saves the exclusive create verifier failed,
  the NFS server would leave the newly created vnode locked. This could
  result in a file system that would not unmount and processes wedged,
  waiting for the file to be unlocked.
  Since this VOP_SETATTR() never fails for most file systems, this bug
  doesn't normally manifest itself. I found it during testing of an
  exported GlusterFS file system, which can fail.
  This patch adds the vput() and changes the error to the correct NFS one.
  
  MFC after:    2 weeks

Modified:
  head/sys/fs/nfsserver/nfs_nfsdport.c

Modified: head/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdport.c        Tue Apr 12 19:11:14 2016        
(r297868)
+++ head/sys/fs/nfsserver/nfs_nfsdport.c        Tue Apr 12 20:23:09 2016        
(r297869)
@@ -794,6 +794,11 @@ nfsvno_createsub(struct nfsrv_descript *
                                        nvap->na_atime.tv_nsec = cverf[1];
                                        error = VOP_SETATTR(ndp->ni_vp,
                                            &nvap->na_vattr, nd->nd_cred);
+                                       if (error != 0) {
+                                               vput(ndp->ni_vp);
+                                               ndp->ni_vp = NULL;
+                                               error = NFSERR_NOTSUPP;
+                                       }
                                }
                        }
                /*
@@ -1422,6 +1427,11 @@ nfsvno_open(struct nfsrv_descript *nd, s
                                        nvap->na_atime.tv_nsec = cverf[1];
                                        nd->nd_repstat = VOP_SETATTR(ndp->ni_vp,
                                            &nvap->na_vattr, cred);
+                                       if (nd->nd_repstat != 0) {
+                                               vput(ndp->ni_vp);
+                                               ndp->ni_vp = NULL;
+                                               nd->nd_repstat = NFSERR_NOTSUPP;
+                                       }
                                } else {
                                        nfsrv_fixattr(nd, ndp->ni_vp, nvap,
                                            aclp, p, attrbitp, exp);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to