Deleted Added
full compact
nfs_serv.c (29291) nfs_serv.c (29653)
1/*
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Rick Macklem at The University of Guelph.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 20 unchanged lines hidden (view full) ---

29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * @(#)nfs_serv.c 8.3 (Berkeley) 1/12/94
1/*
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Rick Macklem at The University of Guelph.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 20 unchanged lines hidden (view full) ---

29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * @(#)nfs_serv.c 8.3 (Berkeley) 1/12/94
37 * $Id: nfs_serv.c,v 1.49 1997/09/10 19:52:25 phk Exp $
37 * $Id: nfs_serv.c,v 1.50 1997/09/10 20:22:28 phk Exp $
38 */
39
40/*
41 * nfs version 2 and 3 server calls to vnode ops
42 * - these routines generally have 3 phases
43 * 1 - break down and validate rpc request in mbuf list
44 * 2 - do the vnode ops for the request
45 * (surprisingly ?? many are very similar to syscalls in vfs_syscalls.c)

--- 397 unchanged lines hidden (view full) ---

443 if (error) {
444 nfsm_reply(NFSX_POSTOPATTR(v3));
445 nfsm_srvpostop_attr(dirattr_ret, &dirattr);
446 return (0);
447 }
448
449 nqsrv_getl(ndp->ni_startdir, ND_READ);
450 vrele(ndp->ni_startdir);
38 */
39
40/*
41 * nfs version 2 and 3 server calls to vnode ops
42 * - these routines generally have 3 phases
43 * 1 - break down and validate rpc request in mbuf list
44 * 2 - do the vnode ops for the request
45 * (surprisingly ?? many are very similar to syscalls in vfs_syscalls.c)

--- 397 unchanged lines hidden (view full) ---

443 if (error) {
444 nfsm_reply(NFSX_POSTOPATTR(v3));
445 nfsm_srvpostop_attr(dirattr_ret, &dirattr);
446 return (0);
447 }
448
449 nqsrv_getl(ndp->ni_startdir, ND_READ);
450 vrele(ndp->ni_startdir);
451 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
451 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
452 vp = ndp->ni_vp;
453 bzero((caddr_t)fhp, sizeof(nfh));
454 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
455 error = VFS_VPTOFH(vp, &fhp->fh_fid);
456 if (!error)
457 error = VOP_GETATTR(vp, vap, cred, procp);
458 vput(vp);
459 nfsm_reply(NFSX_SRVFH(v3) + NFSX_POSTOPORFATTR(v3) + NFSX_POSTOPATTR(v3));

--- 995 unchanged lines hidden (view full) ---

1455 */
1456 if (nd.ni_vp == NULL) {
1457 if (vap->va_type == VREG || vap->va_type == VSOCK) {
1458 vrele(nd.ni_startdir);
1459 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1460 error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
1461 if (!error) {
1462 nfsrv_object_create(nd.ni_vp);
452 vp = ndp->ni_vp;
453 bzero((caddr_t)fhp, sizeof(nfh));
454 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
455 error = VFS_VPTOFH(vp, &fhp->fh_fid);
456 if (!error)
457 error = VOP_GETATTR(vp, vap, cred, procp);
458 vput(vp);
459 nfsm_reply(NFSX_SRVFH(v3) + NFSX_POSTOPORFATTR(v3) + NFSX_POSTOPATTR(v3));

--- 995 unchanged lines hidden (view full) ---

1455 */
1456 if (nd.ni_vp == NULL) {
1457 if (vap->va_type == VREG || vap->va_type == VSOCK) {
1458 vrele(nd.ni_startdir);
1459 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1460 error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
1461 if (!error) {
1462 nfsrv_object_create(nd.ni_vp);
1463 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1463 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1464 if (exclusive_flag) {
1465 exclusive_flag = 0;
1466 VATTR_NULL(vap);
1467 bcopy(cverf, (caddr_t)&vap->va_atime,
1468 NFSX_V3CREATEVERF);
1469 error = VOP_SETATTR(nd.ni_vp, vap, cred,
1470 procp);
1471 }
1472 }
1473 } else if (vap->va_type == VCHR || vap->va_type == VBLK ||
1474 vap->va_type == VFIFO) {
1475 if (vap->va_type == VCHR && rdev == 0xffffffff)
1476 vap->va_type = VFIFO;
1477 if (vap->va_type != VFIFO &&
1478 (error = suser(cred, (u_short *)0))) {
1479 vrele(nd.ni_startdir);
1464 if (exclusive_flag) {
1465 exclusive_flag = 0;
1466 VATTR_NULL(vap);
1467 bcopy(cverf, (caddr_t)&vap->va_atime,
1468 NFSX_V3CREATEVERF);
1469 error = VOP_SETATTR(nd.ni_vp, vap, cred,
1470 procp);
1471 }
1472 }
1473 } else if (vap->va_type == VCHR || vap->va_type == VBLK ||
1474 vap->va_type == VFIFO) {
1475 if (vap->va_type == VCHR && rdev == 0xffffffff)
1476 vap->va_type = VFIFO;
1477 if (vap->va_type != VFIFO &&
1478 (error = suser(cred, (u_short *)0))) {
1479 vrele(nd.ni_startdir);
1480 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1480 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1481 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1482 vput(nd.ni_dvp);
1483 nfsm_reply(0);
1484 return (error);
1485 } else
1486 vap->va_rdev = (dev_t)rdev;
1487 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1488 if (error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap)) {
1489 vrele(nd.ni_startdir);
1490 nfsm_reply(0);
1491 }
1492 nd.ni_cnd.cn_nameiop = LOOKUP;
1493 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART);
1494 nd.ni_cnd.cn_proc = procp;
1495 nd.ni_cnd.cn_cred = cred;
1496 if (error = lookup(&nd)) {
1481 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1482 vput(nd.ni_dvp);
1483 nfsm_reply(0);
1484 return (error);
1485 } else
1486 vap->va_rdev = (dev_t)rdev;
1487 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1488 if (error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap)) {
1489 vrele(nd.ni_startdir);
1490 nfsm_reply(0);
1491 }
1492 nd.ni_cnd.cn_nameiop = LOOKUP;
1493 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART);
1494 nd.ni_cnd.cn_proc = procp;
1495 nd.ni_cnd.cn_cred = cred;
1496 if (error = lookup(&nd)) {
1497 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1497 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1498 nfsm_reply(0);
1499 }
1500 nfsrv_object_create(nd.ni_vp);
1498 nfsm_reply(0);
1499 }
1500 nfsrv_object_create(nd.ni_vp);
1501 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1501 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1502 if (nd.ni_cnd.cn_flags & ISSYMLINK) {
1503 vrele(nd.ni_dvp);
1504 vput(nd.ni_vp);
1505 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1506 error = EINVAL;
1507 nfsm_reply(0);
1508 }
1509 } else {
1510 vrele(nd.ni_startdir);
1502 if (nd.ni_cnd.cn_flags & ISSYMLINK) {
1503 vrele(nd.ni_dvp);
1504 vput(nd.ni_vp);
1505 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1506 error = EINVAL;
1507 nfsm_reply(0);
1508 }
1509 } else {
1510 vrele(nd.ni_startdir);
1511 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1511 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1512 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1513 vput(nd.ni_dvp);
1514 error = ENXIO;
1515 }
1516 vp = nd.ni_vp;
1517 } else {
1518 vrele(nd.ni_startdir);
1512 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1513 vput(nd.ni_dvp);
1514 error = ENXIO;
1515 }
1516 vp = nd.ni_vp;
1517 } else {
1518 vrele(nd.ni_startdir);
1519 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1519 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1520 vp = nd.ni_vp;
1521 if (nd.ni_dvp == vp)
1522 vrele(nd.ni_dvp);
1523 else
1524 vput(nd.ni_dvp);
1525 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1526 if (vap->va_size != -1) {
1527 error = nfsrv_access(vp, VWRITE, cred,

--- 38 unchanged lines hidden (view full) ---

1566 nfsm_srvfillattr(vap, fp);
1567 }
1568 return (0);
1569nfsmout:
1570 if (dirp)
1571 vrele(dirp);
1572 if (nd.ni_cnd.cn_nameiop) {
1573 vrele(nd.ni_startdir);
1520 vp = nd.ni_vp;
1521 if (nd.ni_dvp == vp)
1522 vrele(nd.ni_dvp);
1523 else
1524 vput(nd.ni_dvp);
1525 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1526 if (vap->va_size != -1) {
1527 error = nfsrv_access(vp, VWRITE, cred,

--- 38 unchanged lines hidden (view full) ---

1566 nfsm_srvfillattr(vap, fp);
1567 }
1568 return (0);
1569nfsmout:
1570 if (dirp)
1571 vrele(dirp);
1572 if (nd.ni_cnd.cn_nameiop) {
1573 vrele(nd.ni_startdir);
1574 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1574 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1575 }
1576 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1577 if (nd.ni_dvp == nd.ni_vp)
1578 vrele(nd.ni_dvp);
1579 else
1580 vput(nd.ni_dvp);
1581 if (nd.ni_vp)
1582 vput(nd.ni_vp);

--- 47 unchanged lines hidden (view full) ---

1630 if (dirp)
1631 vrele(dirp);
1632 return (0);
1633 }
1634 nfsm_dissect(tl, u_long *, NFSX_UNSIGNED);
1635 vtyp = nfsv3tov_type(*tl);
1636 if (vtyp != VCHR && vtyp != VBLK && vtyp != VSOCK && vtyp != VFIFO) {
1637 vrele(nd.ni_startdir);
1575 }
1576 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1577 if (nd.ni_dvp == nd.ni_vp)
1578 vrele(nd.ni_dvp);
1579 else
1580 vput(nd.ni_dvp);
1581 if (nd.ni_vp)
1582 vput(nd.ni_vp);

--- 47 unchanged lines hidden (view full) ---

1630 if (dirp)
1631 vrele(dirp);
1632 return (0);
1633 }
1634 nfsm_dissect(tl, u_long *, NFSX_UNSIGNED);
1635 vtyp = nfsv3tov_type(*tl);
1636 if (vtyp != VCHR && vtyp != VBLK && vtyp != VSOCK && vtyp != VFIFO) {
1637 vrele(nd.ni_startdir);
1638 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1638 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1639 error = NFSERR_BADTYPE;
1640 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1641 vput(nd.ni_dvp);
1642 goto out;
1643 }
1644 VATTR_NULL(vap);
1645 nfsm_srvsattr(vap);
1646 if (vtyp == VCHR || vtyp == VBLK) {
1647 nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED);
1648 major = fxdr_unsigned(u_long, *tl++);
1649 minor = fxdr_unsigned(u_long, *tl);
1650 vap->va_rdev = makedev(major, minor);
1651 }
1652
1653 /*
1654 * Iff doesn't exist, create it.
1655 */
1656 if (nd.ni_vp) {
1657 vrele(nd.ni_startdir);
1639 error = NFSERR_BADTYPE;
1640 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1641 vput(nd.ni_dvp);
1642 goto out;
1643 }
1644 VATTR_NULL(vap);
1645 nfsm_srvsattr(vap);
1646 if (vtyp == VCHR || vtyp == VBLK) {
1647 nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED);
1648 major = fxdr_unsigned(u_long, *tl++);
1649 minor = fxdr_unsigned(u_long, *tl);
1650 vap->va_rdev = makedev(major, minor);
1651 }
1652
1653 /*
1654 * Iff doesn't exist, create it.
1655 */
1656 if (nd.ni_vp) {
1657 vrele(nd.ni_startdir);
1658 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1658 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1659 error = EEXIST;
1660 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1661 vput(nd.ni_dvp);
1662 goto out;
1663 }
1664 vap->va_type = vtyp;
1665 if (vtyp == VSOCK) {
1666 vrele(nd.ni_startdir);
1667 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1668 error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
1669 if (!error)
1659 error = EEXIST;
1660 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1661 vput(nd.ni_dvp);
1662 goto out;
1663 }
1664 vap->va_type = vtyp;
1665 if (vtyp == VSOCK) {
1666 vrele(nd.ni_startdir);
1667 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1668 error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
1669 if (!error)
1670 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1670 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1671 } else {
1672 if (vtyp != VFIFO && (error = suser(cred, (u_short *)0))) {
1673 vrele(nd.ni_startdir);
1671 } else {
1672 if (vtyp != VFIFO && (error = suser(cred, (u_short *)0))) {
1673 vrele(nd.ni_startdir);
1674 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1674 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1675 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1676 vput(nd.ni_dvp);
1677 goto out;
1678 }
1679 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1680 if (error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap)) {
1681 vrele(nd.ni_startdir);
1682 goto out;
1683 }
1684 nd.ni_cnd.cn_nameiop = LOOKUP;
1685 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART);
1686 nd.ni_cnd.cn_proc = procp;
1687 nd.ni_cnd.cn_cred = procp->p_ucred;
1688 error = lookup(&nd);
1675 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1676 vput(nd.ni_dvp);
1677 goto out;
1678 }
1679 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1680 if (error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap)) {
1681 vrele(nd.ni_startdir);
1682 goto out;
1683 }
1684 nd.ni_cnd.cn_nameiop = LOOKUP;
1685 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART);
1686 nd.ni_cnd.cn_proc = procp;
1687 nd.ni_cnd.cn_cred = procp->p_ucred;
1688 error = lookup(&nd);
1689 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1689 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1690 if (error)
1691 goto out;
1692 if (nd.ni_cnd.cn_flags & ISSYMLINK) {
1693 vrele(nd.ni_dvp);
1694 vput(nd.ni_vp);
1695 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1696 error = EINVAL;
1697 }

--- 17 unchanged lines hidden (view full) ---

1715 }
1716 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1717 return (0);
1718nfsmout:
1719 if (dirp)
1720 vrele(dirp);
1721 if (nd.ni_cnd.cn_nameiop) {
1722 vrele(nd.ni_startdir);
1690 if (error)
1691 goto out;
1692 if (nd.ni_cnd.cn_flags & ISSYMLINK) {
1693 vrele(nd.ni_dvp);
1694 vput(nd.ni_vp);
1695 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1696 error = EINVAL;
1697 }

--- 17 unchanged lines hidden (view full) ---

1715 }
1716 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1717 return (0);
1718nfsmout:
1719 if (dirp)
1720 vrele(dirp);
1721 if (nd.ni_cnd.cn_nameiop) {
1722 vrele(nd.ni_startdir);
1723 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1723 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
1724 }
1725 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1726 if (nd.ni_dvp == nd.ni_vp)
1727 vrele(nd.ni_dvp);
1728 else
1729 vput(nd.ni_dvp);
1730 if (nd.ni_vp)
1731 vput(nd.ni_vp);

--- 252 unchanged lines hidden (view full) ---

1984 vput(tvp);
1985 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
1986 vrele(fromnd.ni_dvp);
1987 vrele(fvp);
1988 if (error == -1)
1989 error = 0;
1990 }
1991 vrele(tond.ni_startdir);
1724 }
1725 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1726 if (nd.ni_dvp == nd.ni_vp)
1727 vrele(nd.ni_dvp);
1728 else
1729 vput(nd.ni_dvp);
1730 if (nd.ni_vp)
1731 vput(nd.ni_vp);

--- 252 unchanged lines hidden (view full) ---

1984 vput(tvp);
1985 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
1986 vrele(fromnd.ni_dvp);
1987 vrele(fvp);
1988 if (error == -1)
1989 error = 0;
1990 }
1991 vrele(tond.ni_startdir);
1992 FREE(tond.ni_cnd.cn_pnbuf, M_NAMEI);
1992 zfree(namei_zone, tond.ni_cnd.cn_pnbuf);
1993out1:
1994 if (fdirp) {
1995 fdiraft_ret = VOP_GETATTR(fdirp, &fdiraft, cred, procp);
1996 vrele(fdirp);
1997 }
1998 if (tdirp) {
1999 tdiraft_ret = VOP_GETATTR(tdirp, &tdiraft, cred, procp);
2000 vrele(tdirp);
2001 }
2002 vrele(fromnd.ni_startdir);
1993out1:
1994 if (fdirp) {
1995 fdiraft_ret = VOP_GETATTR(fdirp, &fdiraft, cred, procp);
1996 vrele(fdirp);
1997 }
1998 if (tdirp) {
1999 tdiraft_ret = VOP_GETATTR(tdirp, &tdiraft, cred, procp);
2000 vrele(tdirp);
2001 }
2002 vrele(fromnd.ni_startdir);
2003 FREE(fromnd.ni_cnd.cn_pnbuf, M_NAMEI);
2003 zfree(namei_zone, fromnd.ni_cnd.cn_pnbuf);
2004 nfsm_reply(2 * NFSX_WCCDATA(v3));
2005 if (v3) {
2006 nfsm_srvwcc_data(fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
2007 nfsm_srvwcc_data(tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
2008 }
2009 return (0);
2010
2011nfsmout:
2012 if (fdirp)
2013 vrele(fdirp);
2014 if (tdirp)
2015 vrele(tdirp);
2016 if (tond.ni_cnd.cn_nameiop) {
2017 vrele(tond.ni_startdir);
2004 nfsm_reply(2 * NFSX_WCCDATA(v3));
2005 if (v3) {
2006 nfsm_srvwcc_data(fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
2007 nfsm_srvwcc_data(tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
2008 }
2009 return (0);
2010
2011nfsmout:
2012 if (fdirp)
2013 vrele(fdirp);
2014 if (tdirp)
2015 vrele(tdirp);
2016 if (tond.ni_cnd.cn_nameiop) {
2017 vrele(tond.ni_startdir);
2018 FREE(tond.ni_cnd.cn_pnbuf, M_NAMEI);
2018 zfree(namei_zone, tond.ni_cnd.cn_pnbuf);
2019 }
2020 if (fromnd.ni_cnd.cn_nameiop) {
2021 vrele(fromnd.ni_startdir);
2019 }
2020 if (fromnd.ni_cnd.cn_nameiop) {
2021 vrele(fromnd.ni_startdir);
2022 FREE(fromnd.ni_cnd.cn_pnbuf, M_NAMEI);
2022 zfree(namei_zone, fromnd.ni_cnd.cn_pnbuf);
2023 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
2024 vrele(fromnd.ni_dvp);
2025 vrele(fvp);
2026 }
2027 return (error);
2028}
2029
2030/*

--- 163 unchanged lines hidden (view full) ---

2194 nfsm_mtouio(&io, len2);
2195 if (!v3) {
2196 nfsm_dissect(sp, struct nfsv2_sattr *, NFSX_V2SATTR);
2197 vap->va_mode = fxdr_unsigned(u_short, sp->sa_mode);
2198 }
2199 *(pathcp + len2) = '\0';
2200 if (nd.ni_vp) {
2201 vrele(nd.ni_startdir);
2023 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
2024 vrele(fromnd.ni_dvp);
2025 vrele(fvp);
2026 }
2027 return (error);
2028}
2029
2030/*

--- 163 unchanged lines hidden (view full) ---

2194 nfsm_mtouio(&io, len2);
2195 if (!v3) {
2196 nfsm_dissect(sp, struct nfsv2_sattr *, NFSX_V2SATTR);
2197 vap->va_mode = fxdr_unsigned(u_short, sp->sa_mode);
2198 }
2199 *(pathcp + len2) = '\0';
2200 if (nd.ni_vp) {
2201 vrele(nd.ni_startdir);
2202 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2202 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
2203 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2204 if (nd.ni_dvp == nd.ni_vp)
2205 vrele(nd.ni_dvp);
2206 else
2207 vput(nd.ni_dvp);
2208 vrele(nd.ni_vp);
2209 error = EEXIST;
2210 goto out;

--- 16 unchanged lines hidden (view full) ---

2227 error = VFS_VPTOFH(nd.ni_vp, &fhp->fh_fid);
2228 if (!error)
2229 error = VOP_GETATTR(nd.ni_vp, vap, cred,
2230 procp);
2231 vput(nd.ni_vp);
2232 }
2233 } else
2234 vrele(nd.ni_startdir);
2203 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2204 if (nd.ni_dvp == nd.ni_vp)
2205 vrele(nd.ni_dvp);
2206 else
2207 vput(nd.ni_dvp);
2208 vrele(nd.ni_vp);
2209 error = EEXIST;
2210 goto out;

--- 16 unchanged lines hidden (view full) ---

2227 error = VFS_VPTOFH(nd.ni_vp, &fhp->fh_fid);
2228 if (!error)
2229 error = VOP_GETATTR(nd.ni_vp, vap, cred,
2230 procp);
2231 vput(nd.ni_vp);
2232 }
2233 } else
2234 vrele(nd.ni_startdir);
2235 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2235 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
2236 }
2237out:
2238 if (pathcp)
2239 FREE(pathcp, M_TEMP);
2240 if (dirp) {
2241 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2242 vrele(dirp);
2243 }

--- 4 unchanged lines hidden (view full) ---

2248 nfsm_srvpostop_attr(0, vap);
2249 }
2250 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2251 }
2252 return (0);
2253nfsmout:
2254 if (nd.ni_cnd.cn_nameiop) {
2255 vrele(nd.ni_startdir);
2236 }
2237out:
2238 if (pathcp)
2239 FREE(pathcp, M_TEMP);
2240 if (dirp) {
2241 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2242 vrele(dirp);
2243 }

--- 4 unchanged lines hidden (view full) ---

2248 nfsm_srvpostop_attr(0, vap);
2249 }
2250 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2251 }
2252 return (0);
2253nfsmout:
2254 if (nd.ni_cnd.cn_nameiop) {
2255 vrele(nd.ni_startdir);
2256 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2256 zfree(namei_zone, nd.ni_cnd.cn_pnbuf);
2257 }
2258 if (dirp)
2259 vrele(dirp);
2260 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2261 if (nd.ni_dvp == nd.ni_vp)
2262 vrele(nd.ni_dvp);
2263 else
2264 vput(nd.ni_dvp);

--- 1196 unchanged lines hidden ---
2257 }
2258 if (dirp)
2259 vrele(dirp);
2260 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2261 if (nd.ni_dvp == nd.ni_vp)
2262 vrele(nd.ni_dvp);
2263 else
2264 vput(nd.ni_dvp);

--- 1196 unchanged lines hidden ---