fh_init(&resp->fh, NFS3_FHSIZE);
        resp->status = nfsd_create(rqstp, &resp->dirfh, argp->name, argp->len,
                                   &attrs, S_IFDIR, 0, &resp->fh);
-       fh_unlock(&resp->dirfh);
        return rpc_success;
 }
 
        type = nfs3_ftypes[argp->ftype];
        resp->status = nfsd_create(rqstp, &resp->dirfh, argp->name, argp->len,
                                   &attrs, type, rdev, &resp->fh);
-       fh_unlock(&resp->dirfh);
 out:
        return rpc_success;
 }
 
                create->cr_bmval[2] &= ~FATTR4_WORD2_SECURITY_LABEL;
        if (attrs.na_aclerr)
                create->cr_bmval[0] &= ~FATTR4_WORD0_ACL;
-
-       fh_unlock(&cstate->current_fh);
        set_change_info(&create->cr_cinfo, &cstate->current_fh);
        fh_dup2(&cstate->current_fh, &resfh);
 out:
 
        fh_lock_nested(fhp, I_MUTEX_PARENT);
        dchild = lookup_one_len(fname, dentry, flen);
        host_err = PTR_ERR(dchild);
-       if (IS_ERR(dchild))
-               return nfserrno(host_err);
+       if (IS_ERR(dchild)) {
+               err = nfserrno(host_err);
+               goto out_unlock;
+       }
        err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
        /*
         * We unconditionally drop our ref to dchild as fh_compose will have
         */
        dput(dchild);
        if (err)
-               return err;
-       return nfsd_create_locked(rqstp, fhp, fname, flen, attrs, type,
-                                       rdev, resfhp);
+               goto out_unlock;
+       err = nfsd_create_locked(rqstp, fhp, fname, flen, attrs, type,
+                                rdev, resfhp);
+out_unlock:
+       fh_unlock(fhp);
+       return err;
 }
 
 /*
                goto out;
 
        host_err = fh_want_write(fhp);
-       if (host_err)
-               goto out_nfserr;
+       if (host_err) {
+               err = nfserrno(host_err);
+               goto out;
+       }
 
        fh_lock(fhp);
        dentry = fhp->fh_dentry;
        dnew = lookup_one_len(fname, dentry, flen);
-       host_err = PTR_ERR(dnew);
-       if (IS_ERR(dnew))
-               goto out_nfserr;
-
+       if (IS_ERR(dnew)) {
+               err = nfserrno(PTR_ERR(dnew));
+               fh_unlock(fhp);
+               goto out_drop_write;
+       }
        host_err = vfs_symlink(&init_user_ns, d_inode(dentry), dnew, path);
        err = nfserrno(host_err);
        cerr = fh_compose(resfhp, fhp->fh_export, dnew, fhp);
        fh_unlock(fhp);
        if (!err)
                err = nfserrno(commit_metadata(fhp));
-       fh_drop_write(fhp);
-
        dput(dnew);
        if (err==0) err = cerr;
+out_drop_write:
+       fh_drop_write(fhp);
 out:
        return err;
-
-out_nfserr:
-       err = nfserrno(host_err);
-       goto out;
 }
 
 /*