Deleted Added
full compact
nfs_serv.c (16226) nfs_serv.c (17761)
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.29 1996/04/30 23:23:07 bde Exp $
37 * $Id: nfs_serv.c,v 1.30 1996/06/08 12:16:26 bde 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)

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

160 if (vp->v_type == VDIR)
161 testmode = NFSV3ACCESS_LOOKUP;
162 else
163 testmode = NFSV3ACCESS_EXECUTE;
164 if ((nfsmode & testmode) &&
165 nfsrv_access(vp, VEXEC, cred, rdonly, procp))
166 nfsmode &= ~testmode;
167 getret = VOP_GETATTR(vp, vap, cred, procp);
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)

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

160 if (vp->v_type == VDIR)
161 testmode = NFSV3ACCESS_LOOKUP;
162 else
163 testmode = NFSV3ACCESS_EXECUTE;
164 if ((nfsmode & testmode) &&
165 nfsrv_access(vp, VEXEC, cred, rdonly, procp))
166 nfsmode &= ~testmode;
167 getret = VOP_GETATTR(vp, vap, cred, procp);
168 nfsrv_vput(vp);
168 vput(vp);
169 nfsm_reply(NFSX_POSTOPATTR(1) + NFSX_UNSIGNED);
170 nfsm_srvpostop_attr(getret, vap);
171 nfsm_build(tl, u_long *, NFSX_UNSIGNED);
172 *tl = txdr_unsigned(nfsmode);
173 nfsm_srvdone;
174}
175
176/*

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

205 nfsm_srvmtofh(fhp);
206 if (error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam,
207 &rdonly, (nfsd->nd_flag & ND_KERBAUTH))) {
208 nfsm_reply(0);
209 return (0);
210 }
211 nqsrv_getl(vp, ND_READ);
212 error = VOP_GETATTR(vp, vap, cred, procp);
169 nfsm_reply(NFSX_POSTOPATTR(1) + NFSX_UNSIGNED);
170 nfsm_srvpostop_attr(getret, vap);
171 nfsm_build(tl, u_long *, NFSX_UNSIGNED);
172 *tl = txdr_unsigned(nfsmode);
173 nfsm_srvdone;
174}
175
176/*

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

205 nfsm_srvmtofh(fhp);
206 if (error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam,
207 &rdonly, (nfsd->nd_flag & ND_KERBAUTH))) {
208 nfsm_reply(0);
209 return (0);
210 }
211 nqsrv_getl(vp, ND_READ);
212 error = VOP_GETATTR(vp, vap, cred, procp);
213 nfsrv_vput(vp);
213 vput(vp);
214 nfsm_reply(NFSX_FATTR(nfsd->nd_flag & ND_NFSV3));
215 if (error)
216 return (0);
217 nfsm_build(fp, struct nfs_fattr *, NFSX_FATTR(nfsd->nd_flag & ND_NFSV3));
218 nfsm_srvfillattr(vap, fp);
219 nfsm_srvdone;
220}
221

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

304 nqsrv_getl(vp, ND_WRITE);
305 if (v3) {
306 error = preat_ret = VOP_GETATTR(vp, &preat, cred, procp);
307 if (!error && gcheck &&
308 (preat.va_ctime.ts_sec != guard.ts_sec ||
309 preat.va_ctime.ts_nsec != guard.ts_nsec))
310 error = NFSERR_NOT_SYNC;
311 if (error) {
214 nfsm_reply(NFSX_FATTR(nfsd->nd_flag & ND_NFSV3));
215 if (error)
216 return (0);
217 nfsm_build(fp, struct nfs_fattr *, NFSX_FATTR(nfsd->nd_flag & ND_NFSV3));
218 nfsm_srvfillattr(vap, fp);
219 nfsm_srvdone;
220}
221

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

304 nqsrv_getl(vp, ND_WRITE);
305 if (v3) {
306 error = preat_ret = VOP_GETATTR(vp, &preat, cred, procp);
307 if (!error && gcheck &&
308 (preat.va_ctime.ts_sec != guard.ts_sec ||
309 preat.va_ctime.ts_nsec != guard.ts_nsec))
310 error = NFSERR_NOT_SYNC;
311 if (error) {
312 nfsrv_vput(vp);
312 vput(vp);
313 nfsm_reply(NFSX_WCCDATA(v3));
314 nfsm_srvwcc_data(preat_ret, &preat, postat_ret, vap);
315 return (0);
316 }
317 }
318
319 /*
320 * If the size is being changed write acces is required, otherwise

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

333 procp))
334 goto out;
335 }
336 error = VOP_SETATTR(vp, vap, cred, procp);
337 postat_ret = VOP_GETATTR(vp, vap, cred, procp);
338 if (!error)
339 error = postat_ret;
340out:
313 nfsm_reply(NFSX_WCCDATA(v3));
314 nfsm_srvwcc_data(preat_ret, &preat, postat_ret, vap);
315 return (0);
316 }
317 }
318
319 /*
320 * If the size is being changed write acces is required, otherwise

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

333 procp))
334 goto out;
335 }
336 error = VOP_SETATTR(vp, vap, cred, procp);
337 postat_ret = VOP_GETATTR(vp, vap, cred, procp);
338 if (!error)
339 error = postat_ret;
340out:
341 nfsrv_vput(vp);
341 vput(vp);
342 nfsm_reply(NFSX_WCCORFATTR(v3));
343 if (v3) {
344 nfsm_srvwcc_data(preat_ret, &preat, postat_ret, vap);
345 return (0);
346 } else {
347 nfsm_build(fp, struct nfs_fattr *, NFSX_V2FATTR);
348 nfsm_srvfillattr(vap, fp);
349 }

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

387 nd.ni_cnd.cn_nameiop = LOOKUP;
388 nd.ni_cnd.cn_flags = LOCKLEAF | SAVESTART;
389 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
390 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
391 if (dirp) {
392 if (v3)
393 dirattr_ret = VOP_GETATTR(dirp, &dirattr, cred,
394 procp);
342 nfsm_reply(NFSX_WCCORFATTR(v3));
343 if (v3) {
344 nfsm_srvwcc_data(preat_ret, &preat, postat_ret, vap);
345 return (0);
346 } else {
347 nfsm_build(fp, struct nfs_fattr *, NFSX_V2FATTR);
348 nfsm_srvfillattr(vap, fp);
349 }

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

387 nd.ni_cnd.cn_nameiop = LOOKUP;
388 nd.ni_cnd.cn_flags = LOCKLEAF | SAVESTART;
389 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
390 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
391 if (dirp) {
392 if (v3)
393 dirattr_ret = VOP_GETATTR(dirp, &dirattr, cred,
394 procp);
395 nfsrv_vrele(dirp);
395 vrele(dirp);
396 }
397 if (error) {
398 nfsm_reply(NFSX_POSTOPATTR(v3));
399 nfsm_srvpostop_attr(dirattr_ret, &dirattr);
400 return (0);
401 }
402 nqsrv_getl(nd.ni_startdir, ND_READ);
396 }
397 if (error) {
398 nfsm_reply(NFSX_POSTOPATTR(v3));
399 nfsm_srvpostop_attr(dirattr_ret, &dirattr);
400 return (0);
401 }
402 nqsrv_getl(nd.ni_startdir, ND_READ);
403 nfsrv_vrele(nd.ni_startdir);
403 vrele(nd.ni_startdir);
404 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
405 vp = nd.ni_vp;
406 bzero((caddr_t)fhp, sizeof(nfh));
407 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
408 error = VFS_VPTOFH(vp, &fhp->fh_fid);
409 if (!error)
410 error = VOP_GETATTR(vp, vap, cred, procp);
404 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
405 vp = nd.ni_vp;
406 bzero((caddr_t)fhp, sizeof(nfh));
407 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
408 error = VFS_VPTOFH(vp, &fhp->fh_fid);
409 if (!error)
410 error = VOP_GETATTR(vp, vap, cred, procp);
411 nfsrv_vput(vp);
411 vput(vp);
412 nfsm_reply(NFSX_SRVFH(v3) + NFSX_POSTOPORFATTR(v3) + NFSX_POSTOPATTR(v3));
413 if (error) {
414 nfsm_srvpostop_attr(dirattr_ret, &dirattr);
415 return (0);
416 }
417 nfsm_srvfhtom(fhp, v3);
418 if (v3) {
419 nfsm_srvpostop_attr(0, vap);

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

503 else
504 error = ENXIO;
505 goto out;
506 }
507 nqsrv_getl(vp, ND_READ);
508 error = VOP_READLINK(vp, uiop, cred);
509out:
510 getret = VOP_GETATTR(vp, &attr, cred, procp);
412 nfsm_reply(NFSX_SRVFH(v3) + NFSX_POSTOPORFATTR(v3) + NFSX_POSTOPATTR(v3));
413 if (error) {
414 nfsm_srvpostop_attr(dirattr_ret, &dirattr);
415 return (0);
416 }
417 nfsm_srvfhtom(fhp, v3);
418 if (v3) {
419 nfsm_srvpostop_attr(0, vap);

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

503 else
504 error = ENXIO;
505 goto out;
506 }
507 nqsrv_getl(vp, ND_READ);
508 error = VOP_READLINK(vp, uiop, cred);
509out:
510 getret = VOP_GETATTR(vp, &attr, cred, procp);
511 nfsrv_vput(vp);
511 vput(vp);
512 if (error)
513 m_freem(mp3);
514 nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_UNSIGNED);
515 if (v3) {
516 nfsm_srvpostop_attr(getret, &attr);
517 if (error)
518 return (0);
519 }

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

589 nqsrv_getl(vp, ND_READ);
590 if (error = nfsrv_access(vp, VREAD, cred, rdonly, procp))
591 error = nfsrv_access(vp, VEXEC, cred, rdonly, procp);
592 }
593 getret = VOP_GETATTR(vp, vap, cred, procp);
594 if (!error)
595 error = getret;
596 if (error) {
512 if (error)
513 m_freem(mp3);
514 nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_UNSIGNED);
515 if (v3) {
516 nfsm_srvpostop_attr(getret, &attr);
517 if (error)
518 return (0);
519 }

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

589 nqsrv_getl(vp, ND_READ);
590 if (error = nfsrv_access(vp, VREAD, cred, rdonly, procp))
591 error = nfsrv_access(vp, VEXEC, cred, rdonly, procp);
592 }
593 getret = VOP_GETATTR(vp, vap, cred, procp);
594 if (!error)
595 error = getret;
596 if (error) {
597 nfsrv_vput(vp);
597 vput(vp);
598 nfsm_reply(NFSX_POSTOPATTR(v3));
599 nfsm_srvpostop_attr(getret, vap);
600 return (0);
601 }
602 if (off >= vap->va_size)
603 cnt = 0;
604 else if ((off + reqlen) > vap->va_size)
605 cnt = nfsm_rndup(vap->va_size - off);

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

664 uiop->uio_segflg = UIO_SYSSPACE;
665 error = VOP_READ(vp, uiop, IO_NODELOCKED, cred);
666 off = uiop->uio_offset;
667 FREE((caddr_t)iv2, M_TEMP);
668 if (error || (getret = VOP_GETATTR(vp, vap, cred, procp))) {
669 if (!error)
670 error = getret;
671 m_freem(mreq);
598 nfsm_reply(NFSX_POSTOPATTR(v3));
599 nfsm_srvpostop_attr(getret, vap);
600 return (0);
601 }
602 if (off >= vap->va_size)
603 cnt = 0;
604 else if ((off + reqlen) > vap->va_size)
605 cnt = nfsm_rndup(vap->va_size - off);

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

664 uiop->uio_segflg = UIO_SYSSPACE;
665 error = VOP_READ(vp, uiop, IO_NODELOCKED, cred);
666 off = uiop->uio_offset;
667 FREE((caddr_t)iv2, M_TEMP);
668 if (error || (getret = VOP_GETATTR(vp, vap, cred, procp))) {
669 if (!error)
670 error = getret;
671 m_freem(mreq);
672 nfsrv_vput(vp);
672 vput(vp);
673 nfsm_reply(NFSX_POSTOPATTR(v3));
674 nfsm_srvpostop_attr(getret, vap);
675 return (0);
676 }
677 } else
678 uiop->uio_resid = 0;
673 nfsm_reply(NFSX_POSTOPATTR(v3));
674 nfsm_srvpostop_attr(getret, vap);
675 return (0);
676 }
677 } else
678 uiop->uio_resid = 0;
679 nfsrv_vput(vp);
679 vput(vp);
680 nfsm_srvfillattr(vap, fp);
681 len -= uiop->uio_resid;
682 tlen = nfsm_rndup(len);
683 if (cnt != tlen || tlen != len)
684 nfsm_adj(mb, cnt - tlen, tlen - len);
685 if (v3) {
686 *tl++ = txdr_unsigned(len);
687 if (len < reqlen)

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

801 else
802 error = (vp->v_type == VDIR) ? EISDIR : EACCES;
803 }
804 if (!error) {
805 nqsrv_getl(vp, ND_WRITE);
806 error = nfsrv_access(vp, VWRITE, cred, rdonly, procp);
807 }
808 if (error) {
680 nfsm_srvfillattr(vap, fp);
681 len -= uiop->uio_resid;
682 tlen = nfsm_rndup(len);
683 if (cnt != tlen || tlen != len)
684 nfsm_adj(mb, cnt - tlen, tlen - len);
685 if (v3) {
686 *tl++ = txdr_unsigned(len);
687 if (len < reqlen)

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

801 else
802 error = (vp->v_type == VDIR) ? EISDIR : EACCES;
803 }
804 if (!error) {
805 nqsrv_getl(vp, ND_WRITE);
806 error = nfsrv_access(vp, VWRITE, cred, rdonly, procp);
807 }
808 if (error) {
809 nfsrv_vput(vp);
809 vput(vp);
810 nfsm_reply(NFSX_WCCDATA(v3));
811 nfsm_srvwcc_data(forat_ret, &forat, aftat_ret, vap);
812 return (0);
813 }
814
815 if (len > 0) {
816 MALLOC(ivp, struct iovec *, cnt * sizeof (struct iovec), M_TEMP,
817 M_WAITOK);

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

845 uiop->uio_segflg = UIO_SYSSPACE;
846 uiop->uio_procp = (struct proc *)0;
847 uiop->uio_offset = off;
848 error = VOP_WRITE(vp, uiop, ioflags, cred);
849 nfsstats.srvvop_writes++;
850 FREE((caddr_t)iv, M_TEMP);
851 }
852 aftat_ret = VOP_GETATTR(vp, vap, cred, procp);
810 nfsm_reply(NFSX_WCCDATA(v3));
811 nfsm_srvwcc_data(forat_ret, &forat, aftat_ret, vap);
812 return (0);
813 }
814
815 if (len > 0) {
816 MALLOC(ivp, struct iovec *, cnt * sizeof (struct iovec), M_TEMP,
817 M_WAITOK);

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

845 uiop->uio_segflg = UIO_SYSSPACE;
846 uiop->uio_procp = (struct proc *)0;
847 uiop->uio_offset = off;
848 error = VOP_WRITE(vp, uiop, ioflags, cred);
849 nfsstats.srvvop_writes++;
850 FREE((caddr_t)iv, M_TEMP);
851 }
852 aftat_ret = VOP_GETATTR(vp, vap, cred, procp);
853 nfsrv_vput(vp);
853 vput(vp);
854 if (!error)
855 error = aftat_ret;
856 nfsm_reply(NFSX_PREOPATTR(v3) + NFSX_POSTOPORFATTR(v3) +
857 2 * NFSX_UNSIGNED + NFSX_WRITEVERF(v3));
858 if (v3) {
859 nfsm_srvwcc_data(forat_ret, &forat, aftat_ret, vap);
860 if (error)
861 return (0);

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

1113 error = VOP_WRITE(vp, uiop, ioflags, cred);
1114 nfsstats.srvvop_writes++;
1115 }
1116 FREE((caddr_t)iov, M_TEMP);
1117 }
1118 m_freem(mrep);
1119 if (vp) {
1120 aftat_ret = VOP_GETATTR(vp, &va, cred, procp);
854 if (!error)
855 error = aftat_ret;
856 nfsm_reply(NFSX_PREOPATTR(v3) + NFSX_POSTOPORFATTR(v3) +
857 2 * NFSX_UNSIGNED + NFSX_WRITEVERF(v3));
858 if (v3) {
859 nfsm_srvwcc_data(forat_ret, &forat, aftat_ret, vap);
860 if (error)
861 return (0);

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

1113 error = VOP_WRITE(vp, uiop, ioflags, cred);
1114 nfsstats.srvvop_writes++;
1115 }
1116 FREE((caddr_t)iov, M_TEMP);
1117 }
1118 m_freem(mrep);
1119 if (vp) {
1120 aftat_ret = VOP_GETATTR(vp, &va, cred, procp);
1121 nfsrv_vput(vp);
1121 vput(vp);
1122 }
1123
1124 /*
1125 * Loop around generating replies for all write rpcs that have
1126 * now been completed.
1127 */
1128 swp = nfsd;
1129 do {

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

1322 nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART;
1323 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
1324 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1325 if (dirp) {
1326 if (v3)
1327 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
1328 procp);
1329 else {
1122 }
1123
1124 /*
1125 * Loop around generating replies for all write rpcs that have
1126 * now been completed.
1127 */
1128 swp = nfsd;
1129 do {

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

1322 nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART;
1323 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
1324 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1325 if (dirp) {
1326 if (v3)
1327 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
1328 procp);
1329 else {
1330 nfsrv_vrele(dirp);
1330 vrele(dirp);
1331 dirp = (struct vnode *)0;
1332 }
1333 }
1334 if (error) {
1335 nfsm_reply(NFSX_WCCDATA(v3));
1336 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1337 if (dirp)
1331 dirp = (struct vnode *)0;
1332 }
1333 }
1334 if (error) {
1335 nfsm_reply(NFSX_WCCDATA(v3));
1336 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1337 if (dirp)
1338 nfsrv_vrele(dirp);
1338 vrele(dirp);
1339 return (0);
1340 }
1341 VATTR_NULL(vap);
1342 if (v3) {
1343 nfsm_dissect(tl, u_long *, NFSX_UNSIGNED);
1344 how = fxdr_unsigned(int, *tl);
1345 switch (how) {
1346 case NFSV3CREATE_GUARDED:

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

1382
1383 /*
1384 * Iff doesn't exist, create it
1385 * otherwise just truncate to 0 length
1386 * should I set the mode too ??
1387 */
1388 if (nd.ni_vp == NULL) {
1389 if (vap->va_type == VREG || vap->va_type == VSOCK) {
1339 return (0);
1340 }
1341 VATTR_NULL(vap);
1342 if (v3) {
1343 nfsm_dissect(tl, u_long *, NFSX_UNSIGNED);
1344 how = fxdr_unsigned(int, *tl);
1345 switch (how) {
1346 case NFSV3CREATE_GUARDED:

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

1382
1383 /*
1384 * Iff doesn't exist, create it
1385 * otherwise just truncate to 0 length
1386 * should I set the mode too ??
1387 */
1388 if (nd.ni_vp == NULL) {
1389 if (vap->va_type == VREG || vap->va_type == VSOCK) {
1390 nfsrv_vrele(nd.ni_startdir);
1390 vrele(nd.ni_startdir);
1391 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1392 error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
1393 if (!error) {
1391 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1392 error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
1393 if (!error) {
1394 nfsrv_vmio(nd.ni_vp);
1394 nfsrv_object_create(nd.ni_vp);
1395 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1396 if (exclusive_flag) {
1397 exclusive_flag = 0;
1398 VATTR_NULL(vap);
1399 bcopy(cverf, (caddr_t)&vap->va_atime,
1400 NFSX_V3CREATEVERF);
1401 error = VOP_SETATTR(nd.ni_vp, vap, cred,
1402 procp);
1403 }
1404 }
1405 } else if (vap->va_type == VCHR || vap->va_type == VBLK ||
1406 vap->va_type == VFIFO) {
1407 if (vap->va_type == VCHR && rdev == 0xffffffff)
1408 vap->va_type = VFIFO;
1409 if (error = suser(cred, (u_short *)0)) {
1395 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1396 if (exclusive_flag) {
1397 exclusive_flag = 0;
1398 VATTR_NULL(vap);
1399 bcopy(cverf, (caddr_t)&vap->va_atime,
1400 NFSX_V3CREATEVERF);
1401 error = VOP_SETATTR(nd.ni_vp, vap, cred,
1402 procp);
1403 }
1404 }
1405 } else if (vap->va_type == VCHR || vap->va_type == VBLK ||
1406 vap->va_type == VFIFO) {
1407 if (vap->va_type == VCHR && rdev == 0xffffffff)
1408 vap->va_type = VFIFO;
1409 if (error = suser(cred, (u_short *)0)) {
1410 nfsrv_vrele(nd.ni_startdir);
1410 vrele(nd.ni_startdir);
1411 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1412 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1411 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1412 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1413 nfsrv_vput(nd.ni_dvp);
1413 vput(nd.ni_dvp);
1414 nfsm_reply(0);
1415 return (error);
1416 } else
1417 vap->va_rdev = (dev_t)rdev;
1418 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1419 if (error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap)) {
1414 nfsm_reply(0);
1415 return (error);
1416 } else
1417 vap->va_rdev = (dev_t)rdev;
1418 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1419 if (error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap)) {
1420 nfsrv_vrele(nd.ni_startdir);
1420 vrele(nd.ni_startdir);
1421 nfsm_reply(0);
1422 }
1423 nd.ni_cnd.cn_nameiop = LOOKUP;
1424 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART);
1425 nd.ni_cnd.cn_proc = procp;
1426 nd.ni_cnd.cn_cred = cred;
1427 if (error = lookup(&nd)) {
1428 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1429 nfsm_reply(0);
1430 }
1421 nfsm_reply(0);
1422 }
1423 nd.ni_cnd.cn_nameiop = LOOKUP;
1424 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART);
1425 nd.ni_cnd.cn_proc = procp;
1426 nd.ni_cnd.cn_cred = cred;
1427 if (error = lookup(&nd)) {
1428 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1429 nfsm_reply(0);
1430 }
1431 nfsrv_vmio(nd.ni_vp);
1431 nfsrv_object_create(nd.ni_vp);
1432 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1433 if (nd.ni_cnd.cn_flags & ISSYMLINK) {
1432 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1433 if (nd.ni_cnd.cn_flags & ISSYMLINK) {
1434 nfsrv_vrele(nd.ni_dvp);
1435 nfsrv_vput(nd.ni_vp);
1434 vrele(nd.ni_dvp);
1435 vput(nd.ni_vp);
1436 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1437 error = EINVAL;
1438 nfsm_reply(0);
1439 }
1440 } else {
1436 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1437 error = EINVAL;
1438 nfsm_reply(0);
1439 }
1440 } else {
1441 nfsrv_vrele(nd.ni_startdir);
1441 vrele(nd.ni_startdir);
1442 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1443 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1442 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1443 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1444 nfsrv_vput(nd.ni_dvp);
1444 vput(nd.ni_dvp);
1445 error = ENXIO;
1446 }
1447 vp = nd.ni_vp;
1448 } else {
1445 error = ENXIO;
1446 }
1447 vp = nd.ni_vp;
1448 } else {
1449 nfsrv_vrele(nd.ni_startdir);
1449 vrele(nd.ni_startdir);
1450 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1451 vp = nd.ni_vp;
1452 if (nd.ni_dvp == vp)
1450 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1451 vp = nd.ni_vp;
1452 if (nd.ni_dvp == vp)
1453 nfsrv_vrele(nd.ni_dvp);
1453 vrele(nd.ni_dvp);
1454 else
1454 else
1455 nfsrv_vput(nd.ni_dvp);
1455 vput(nd.ni_dvp);
1456 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1457 if (vap->va_size != -1) {
1458 error = nfsrv_access(vp, VWRITE, cred,
1459 (nd.ni_cnd.cn_flags & RDONLY), procp);
1460 if (!error) {
1461 nqsrv_getl(vp, ND_WRITE);
1462 tempsize = vap->va_size;
1463 VATTR_NULL(vap);
1464 vap->va_size = tempsize;
1465 error = VOP_SETATTR(vp, vap, cred,
1466 procp);
1467 }
1468 if (error)
1456 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1457 if (vap->va_size != -1) {
1458 error = nfsrv_access(vp, VWRITE, cred,
1459 (nd.ni_cnd.cn_flags & RDONLY), procp);
1460 if (!error) {
1461 nqsrv_getl(vp, ND_WRITE);
1462 tempsize = vap->va_size;
1463 VATTR_NULL(vap);
1464 vap->va_size = tempsize;
1465 error = VOP_SETATTR(vp, vap, cred,
1466 procp);
1467 }
1468 if (error)
1469 nfsrv_vput(vp);
1469 vput(vp);
1470 }
1471 }
1472 if (!error) {
1473 bzero((caddr_t)fhp, sizeof(nfh));
1474 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
1475 error = VFS_VPTOFH(vp, &fhp->fh_fid);
1476 if (!error)
1477 error = VOP_GETATTR(vp, vap, cred, procp);
1470 }
1471 }
1472 if (!error) {
1473 bzero((caddr_t)fhp, sizeof(nfh));
1474 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
1475 error = VFS_VPTOFH(vp, &fhp->fh_fid);
1476 if (!error)
1477 error = VOP_GETATTR(vp, vap, cred, procp);
1478 nfsrv_vput(vp);
1478 vput(vp);
1479 }
1480 if (v3) {
1481 if (exclusive_flag && !error &&
1482 bcmp(cverf, (caddr_t)&vap->va_atime, NFSX_V3CREATEVERF))
1483 error = EEXIST;
1484 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
1479 }
1480 if (v3) {
1481 if (exclusive_flag && !error &&
1482 bcmp(cverf, (caddr_t)&vap->va_atime, NFSX_V3CREATEVERF))
1483 error = EEXIST;
1484 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
1485 nfsrv_vrele(dirp);
1485 vrele(dirp);
1486 }
1487 nfsm_reply(NFSX_SRVFH(v3) + NFSX_FATTR(v3) + NFSX_WCCDATA(v3));
1488 if (v3) {
1489 if (!error) {
1490 nfsm_srvpostop_fh(fhp);
1491 nfsm_srvpostop_attr(0, vap);
1492 }
1493 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1494 } else {
1495 nfsm_srvfhtom(fhp, v3);
1496 nfsm_build(fp, struct nfs_fattr *, NFSX_V2FATTR);
1497 nfsm_srvfillattr(vap, fp);
1498 }
1499 return (0);
1500nfsmout:
1501 if (dirp)
1486 }
1487 nfsm_reply(NFSX_SRVFH(v3) + NFSX_FATTR(v3) + NFSX_WCCDATA(v3));
1488 if (v3) {
1489 if (!error) {
1490 nfsm_srvpostop_fh(fhp);
1491 nfsm_srvpostop_attr(0, vap);
1492 }
1493 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1494 } else {
1495 nfsm_srvfhtom(fhp, v3);
1496 nfsm_build(fp, struct nfs_fattr *, NFSX_V2FATTR);
1497 nfsm_srvfillattr(vap, fp);
1498 }
1499 return (0);
1500nfsmout:
1501 if (dirp)
1502 nfsrv_vrele(dirp);
1502 vrele(dirp);
1503 if (nd.ni_cnd.cn_nameiop) {
1503 if (nd.ni_cnd.cn_nameiop) {
1504 nfsrv_vrele(nd.ni_startdir);
1504 vrele(nd.ni_startdir);
1505 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1506 }
1507 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1508 if (nd.ni_dvp == nd.ni_vp)
1505 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1506 }
1507 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1508 if (nd.ni_dvp == nd.ni_vp)
1509 nfsrv_vrele(nd.ni_dvp);
1509 vrele(nd.ni_dvp);
1510 else
1510 else
1511 nfsrv_vput(nd.ni_dvp);
1511 vput(nd.ni_dvp);
1512 if (nd.ni_vp)
1512 if (nd.ni_vp)
1513 nfsrv_vput(nd.ni_vp);
1513 vput(nd.ni_vp);
1514 return (error);
1515}
1516
1517/*
1518 * nfs v3 mknod service
1519 */
1520int
1521nfsrv_mknod(nfsd, slp, procp, mrq)

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

1554 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
1555 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1556 if (dirp)
1557 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred, procp);
1558 if (error) {
1559 nfsm_reply(NFSX_WCCDATA(1));
1560 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1561 if (dirp)
1514 return (error);
1515}
1516
1517/*
1518 * nfs v3 mknod service
1519 */
1520int
1521nfsrv_mknod(nfsd, slp, procp, mrq)

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

1554 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
1555 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1556 if (dirp)
1557 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred, procp);
1558 if (error) {
1559 nfsm_reply(NFSX_WCCDATA(1));
1560 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1561 if (dirp)
1562 nfsrv_vrele(dirp);
1562 vrele(dirp);
1563 return (0);
1564 }
1565 nfsm_dissect(tl, u_long *, NFSX_UNSIGNED);
1566 vtyp = nfsv3tov_type(*tl);
1567 if (vtyp != VCHR && vtyp != VBLK && vtyp != VSOCK && vtyp != VFIFO) {
1563 return (0);
1564 }
1565 nfsm_dissect(tl, u_long *, NFSX_UNSIGNED);
1566 vtyp = nfsv3tov_type(*tl);
1567 if (vtyp != VCHR && vtyp != VBLK && vtyp != VSOCK && vtyp != VFIFO) {
1568 nfsrv_vrele(nd.ni_startdir);
1568 vrele(nd.ni_startdir);
1569 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1570 error = NFSERR_BADTYPE;
1571 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1569 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1570 error = NFSERR_BADTYPE;
1571 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1572 nfsrv_vput(nd.ni_dvp);
1572 vput(nd.ni_dvp);
1573 goto out;
1574 }
1575 VATTR_NULL(vap);
1576 nfsm_srvsattr(vap);
1577 if (vtyp == VCHR || vtyp == VBLK) {
1578 nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED);
1579 major = fxdr_unsigned(u_long, *tl++);
1580 minor = fxdr_unsigned(u_long, *tl);
1581 vap->va_rdev = makedev(major, minor);
1582 }
1583
1584 /*
1585 * Iff doesn't exist, create it.
1586 */
1587 if (nd.ni_vp) {
1573 goto out;
1574 }
1575 VATTR_NULL(vap);
1576 nfsm_srvsattr(vap);
1577 if (vtyp == VCHR || vtyp == VBLK) {
1578 nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED);
1579 major = fxdr_unsigned(u_long, *tl++);
1580 minor = fxdr_unsigned(u_long, *tl);
1581 vap->va_rdev = makedev(major, minor);
1582 }
1583
1584 /*
1585 * Iff doesn't exist, create it.
1586 */
1587 if (nd.ni_vp) {
1588 nfsrv_vrele(nd.ni_startdir);
1588 vrele(nd.ni_startdir);
1589 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1590 error = EEXIST;
1591 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1589 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1590 error = EEXIST;
1591 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1592 nfsrv_vput(nd.ni_dvp);
1592 vput(nd.ni_dvp);
1593 goto out;
1594 }
1595 vap->va_type = vtyp;
1596 if (vtyp == VSOCK) {
1593 goto out;
1594 }
1595 vap->va_type = vtyp;
1596 if (vtyp == VSOCK) {
1597 nfsrv_vrele(nd.ni_startdir);
1597 vrele(nd.ni_startdir);
1598 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1599 error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
1600 if (!error)
1601 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1602 } else {
1603 if (error = suser(cred, (u_short *)0)) {
1598 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1599 error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
1600 if (!error)
1601 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1602 } else {
1603 if (error = suser(cred, (u_short *)0)) {
1604 nfsrv_vrele(nd.ni_startdir);
1604 vrele(nd.ni_startdir);
1605 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1606 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1605 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1606 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1607 nfsrv_vput(nd.ni_dvp);
1607 vput(nd.ni_dvp);
1608 goto out;
1609 }
1610 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1611 if (error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap)) {
1608 goto out;
1609 }
1610 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1611 if (error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap)) {
1612 nfsrv_vrele(nd.ni_startdir);
1612 vrele(nd.ni_startdir);
1613 goto out;
1614 }
1615 nd.ni_cnd.cn_nameiop = LOOKUP;
1616 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART);
1617 nd.ni_cnd.cn_proc = procp;
1618 nd.ni_cnd.cn_cred = procp->p_ucred;
1619 error = lookup(&nd);
1620 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1621 if (error)
1622 goto out;
1623 if (nd.ni_cnd.cn_flags & ISSYMLINK) {
1613 goto out;
1614 }
1615 nd.ni_cnd.cn_nameiop = LOOKUP;
1616 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART);
1617 nd.ni_cnd.cn_proc = procp;
1618 nd.ni_cnd.cn_cred = procp->p_ucred;
1619 error = lookup(&nd);
1620 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
1621 if (error)
1622 goto out;
1623 if (nd.ni_cnd.cn_flags & ISSYMLINK) {
1624 nfsrv_vrele(nd.ni_dvp);
1625 nfsrv_vput(nd.ni_vp);
1624 vrele(nd.ni_dvp);
1625 vput(nd.ni_vp);
1626 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1627 error = EINVAL;
1628 }
1629 }
1630out:
1631 vp = nd.ni_vp;
1632 if (!error) {
1633 bzero((caddr_t)fhp, sizeof(nfh));
1634 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
1635 error = VFS_VPTOFH(vp, &fhp->fh_fid);
1636 if (!error)
1637 error = VOP_GETATTR(vp, vap, cred, procp);
1626 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1627 error = EINVAL;
1628 }
1629 }
1630out:
1631 vp = nd.ni_vp;
1632 if (!error) {
1633 bzero((caddr_t)fhp, sizeof(nfh));
1634 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
1635 error = VFS_VPTOFH(vp, &fhp->fh_fid);
1636 if (!error)
1637 error = VOP_GETATTR(vp, vap, cred, procp);
1638 nfsrv_vput(vp);
1638 vput(vp);
1639 }
1640 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
1639 }
1640 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
1641 nfsrv_vrele(dirp);
1641 vrele(dirp);
1642 nfsm_reply(NFSX_SRVFH(1) + NFSX_POSTOPATTR(1) + NFSX_WCCDATA(1));
1643 if (!error) {
1644 nfsm_srvpostop_fh(fhp);
1645 nfsm_srvpostop_attr(0, vap);
1646 }
1647 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1648 return (0);
1649nfsmout:
1650 if (dirp)
1642 nfsm_reply(NFSX_SRVFH(1) + NFSX_POSTOPATTR(1) + NFSX_WCCDATA(1));
1643 if (!error) {
1644 nfsm_srvpostop_fh(fhp);
1645 nfsm_srvpostop_attr(0, vap);
1646 }
1647 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1648 return (0);
1649nfsmout:
1650 if (dirp)
1651 nfsrv_vrele(dirp);
1651 vrele(dirp);
1652 if (nd.ni_cnd.cn_nameiop) {
1652 if (nd.ni_cnd.cn_nameiop) {
1653 nfsrv_vrele(nd.ni_startdir);
1653 vrele(nd.ni_startdir);
1654 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1655 }
1656 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1657 if (nd.ni_dvp == nd.ni_vp)
1654 free((caddr_t)nd.ni_cnd.cn_pnbuf, M_NAMEI);
1655 }
1656 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1657 if (nd.ni_dvp == nd.ni_vp)
1658 nfsrv_vrele(nd.ni_dvp);
1658 vrele(nd.ni_dvp);
1659 else
1659 else
1660 nfsrv_vput(nd.ni_dvp);
1660 vput(nd.ni_dvp);
1661 if (nd.ni_vp)
1661 if (nd.ni_vp)
1662 nfsrv_vput(nd.ni_vp);
1662 vput(nd.ni_vp);
1663 return (error);
1664}
1665
1666/*
1667 * nfs remove service
1668 */
1669int
1670nfsrv_remove(nfsd, slp, procp, mrq)

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

1702 nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF;
1703 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
1704 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1705 if (dirp) {
1706 if (v3)
1707 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
1708 procp);
1709 else
1663 return (error);
1664}
1665
1666/*
1667 * nfs remove service
1668 */
1669int
1670nfsrv_remove(nfsd, slp, procp, mrq)

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

1702 nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF;
1703 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
1704 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1705 if (dirp) {
1706 if (v3)
1707 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
1708 procp);
1709 else
1710 nfsrv_vrele(dirp);
1710 vrele(dirp);
1711 }
1712 if (!error) {
1713 vp = nd.ni_vp;
1714 if (vp->v_type == VDIR &&
1715 (error = suser(cred, (u_short *)0)))
1716 goto out;
1717 /*
1718 * The root of a mounted filesystem cannot be deleted.
1719 */
1720 if (vp->v_flag & VROOT) {
1721 error = EBUSY;
1722 goto out;
1723 }
1711 }
1712 if (!error) {
1713 vp = nd.ni_vp;
1714 if (vp->v_type == VDIR &&
1715 (error = suser(cred, (u_short *)0)))
1716 goto out;
1717 /*
1718 * The root of a mounted filesystem cannot be deleted.
1719 */
1720 if (vp->v_flag & VROOT) {
1721 error = EBUSY;
1722 goto out;
1723 }
1724 vnode_pager_uncache(vp);
1725out:
1726 if (!error) {
1724out:
1725 if (!error) {
1727 int deallocobj = 0;
1726 vnode_pager_uncache(vp);
1728 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1729 nqsrv_getl(vp, ND_WRITE);
1730
1727 nqsrv_getl(nd.ni_dvp, ND_WRITE);
1728 nqsrv_getl(vp, ND_WRITE);
1729
1731 if ((vp->v_flag & VVMIO) && vp->v_object)
1732 deallocobj = 1;
1733 error = VOP_REMOVE(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd);
1730 error = VOP_REMOVE(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd);
1734 if (error == 0 && deallocobj)
1735 vm_object_deallocate(vp->v_object);
1731
1736 } else {
1737 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1738 if (nd.ni_dvp == vp)
1732 } else {
1733 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
1734 if (nd.ni_dvp == vp)
1739 nfsrv_vrele(nd.ni_dvp);
1735 vrele(nd.ni_dvp);
1740 else
1736 else
1741 nfsrv_vput(nd.ni_dvp);
1742 nfsrv_vput(vp);
1737 vput(nd.ni_dvp);
1738 vput(vp);
1743 }
1744 }
1745 if (dirp && v3) {
1746 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
1739 }
1740 }
1741 if (dirp && v3) {
1742 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
1747 nfsrv_vrele(dirp);
1743 vrele(dirp);
1748 }
1749 nfsm_reply(NFSX_WCCDATA(v3));
1750 if (v3) {
1751 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1752 return (0);
1753 }
1754 nfsm_srvdone;
1755}

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

1804 fromnd.ni_cnd.cn_flags = WANTPARENT | SAVESTART;
1805 error = nfs_namei(&fromnd, ffhp, len, slp, nam, &md,
1806 &dpos, &fdirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1807 if (fdirp) {
1808 if (v3)
1809 fdirfor_ret = VOP_GETATTR(fdirp, &fdirfor, cred,
1810 procp);
1811 else {
1744 }
1745 nfsm_reply(NFSX_WCCDATA(v3));
1746 if (v3) {
1747 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
1748 return (0);
1749 }
1750 nfsm_srvdone;
1751}

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

1800 fromnd.ni_cnd.cn_flags = WANTPARENT | SAVESTART;
1801 error = nfs_namei(&fromnd, ffhp, len, slp, nam, &md,
1802 &dpos, &fdirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1803 if (fdirp) {
1804 if (v3)
1805 fdirfor_ret = VOP_GETATTR(fdirp, &fdirfor, cred,
1806 procp);
1807 else {
1812 nfsrv_vrele(fdirp);
1808 vrele(fdirp);
1813 fdirp = (struct vnode *)0;
1814 }
1815 }
1816 if (error) {
1817 nfsm_reply(2 * NFSX_WCCDATA(v3));
1818 nfsm_srvwcc_data(fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
1819 nfsm_srvwcc_data(tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
1820 if (fdirp)
1809 fdirp = (struct vnode *)0;
1810 }
1811 }
1812 if (error) {
1813 nfsm_reply(2 * NFSX_WCCDATA(v3));
1814 nfsm_srvwcc_data(fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
1815 nfsm_srvwcc_data(tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
1816 if (fdirp)
1821 nfsrv_vrele(fdirp);
1817 vrele(fdirp);
1822 return (0);
1823 }
1824 fvp = fromnd.ni_vp;
1825 nfsm_srvmtofh(tfhp);
1826 nfsm_strsiz(len2, NFS_MAXNAMLEN);
1827 cred->cr_uid = saved_uid;
1828 tond.ni_cnd.cn_cred = cred;
1829 tond.ni_cnd.cn_nameiop = RENAME;
1830 tond.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART;
1831 error = nfs_namei(&tond, tfhp, len2, slp, nam, &md,
1832 &dpos, &tdirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1833 if (tdirp) {
1834 if (v3)
1835 tdirfor_ret = VOP_GETATTR(tdirp, &tdirfor, cred,
1836 procp);
1837 else {
1818 return (0);
1819 }
1820 fvp = fromnd.ni_vp;
1821 nfsm_srvmtofh(tfhp);
1822 nfsm_strsiz(len2, NFS_MAXNAMLEN);
1823 cred->cr_uid = saved_uid;
1824 tond.ni_cnd.cn_cred = cred;
1825 tond.ni_cnd.cn_nameiop = RENAME;
1826 tond.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART;
1827 error = nfs_namei(&tond, tfhp, len2, slp, nam, &md,
1828 &dpos, &tdirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
1829 if (tdirp) {
1830 if (v3)
1831 tdirfor_ret = VOP_GETATTR(tdirp, &tdirfor, cred,
1832 procp);
1833 else {
1838 nfsrv_vrele(tdirp);
1834 vrele(tdirp);
1839 tdirp = (struct vnode *)0;
1840 }
1841 }
1842 if (error) {
1843 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
1835 tdirp = (struct vnode *)0;
1836 }
1837 }
1838 if (error) {
1839 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
1844 nfsrv_vrele(fromnd.ni_dvp);
1845 nfsrv_vrele(fvp);
1840 vrele(fromnd.ni_dvp);
1841 vrele(fvp);
1846 goto out1;
1847 }
1848 tdvp = tond.ni_dvp;
1849 tvp = tond.ni_vp;
1850 if (tvp != NULL) {
1851 if (fvp->v_type == VDIR && tvp->v_type != VDIR) {
1852 if (v3)
1853 error = EEXIST;

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

1895 */
1896 if (fvp == tvp && fromnd.ni_dvp == tdvp &&
1897 fromnd.ni_cnd.cn_namelen == tond.ni_cnd.cn_namelen &&
1898 !bcmp(fromnd.ni_cnd.cn_nameptr, tond.ni_cnd.cn_nameptr,
1899 fromnd.ni_cnd.cn_namelen))
1900 error = -1;
1901out:
1902 if (!error) {
1842 goto out1;
1843 }
1844 tdvp = tond.ni_dvp;
1845 tvp = tond.ni_vp;
1846 if (tvp != NULL) {
1847 if (fvp->v_type == VDIR && tvp->v_type != VDIR) {
1848 if (v3)
1849 error = EEXIST;

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

1891 */
1892 if (fvp == tvp && fromnd.ni_dvp == tdvp &&
1893 fromnd.ni_cnd.cn_namelen == tond.ni_cnd.cn_namelen &&
1894 !bcmp(fromnd.ni_cnd.cn_nameptr, tond.ni_cnd.cn_nameptr,
1895 fromnd.ni_cnd.cn_namelen))
1896 error = -1;
1897out:
1898 if (!error) {
1903 int deallocobjfrom = 0, deallocobjto = 0;
1904 nqsrv_getl(fromnd.ni_dvp, ND_WRITE);
1905 nqsrv_getl(tdvp, ND_WRITE);
1906 if (tvp) {
1907 nqsrv_getl(tvp, ND_WRITE);
1899 nqsrv_getl(fromnd.ni_dvp, ND_WRITE);
1900 nqsrv_getl(tdvp, ND_WRITE);
1901 if (tvp) {
1902 nqsrv_getl(tvp, ND_WRITE);
1908 if ((tvp->v_flag & VVMIO) && tvp->v_object)
1909 deallocobjto = 1;
1910 (void) vnode_pager_uncache(tvp);
1911 }
1903 (void) vnode_pager_uncache(tvp);
1904 }
1912 if ((fvp->v_flag & VVMIO) && fvp->v_object)
1913 deallocobjfrom = 1;
1914 error = VOP_RENAME(fromnd.ni_dvp, fromnd.ni_vp, &fromnd.ni_cnd,
1915 tond.ni_dvp, tond.ni_vp, &tond.ni_cnd);
1905 error = VOP_RENAME(fromnd.ni_dvp, fromnd.ni_vp, &fromnd.ni_cnd,
1906 tond.ni_dvp, tond.ni_vp, &tond.ni_cnd);
1916 if (deallocobjfrom)
1917 vm_object_deallocate(fvp->v_object);
1918 if (deallocobjto)
1919 vm_object_deallocate(tvp->v_object);
1920
1921 } else {
1922 VOP_ABORTOP(tond.ni_dvp, &tond.ni_cnd);
1923 if (tdvp == tvp)
1907 } else {
1908 VOP_ABORTOP(tond.ni_dvp, &tond.ni_cnd);
1909 if (tdvp == tvp)
1924 nfsrv_vrele(tdvp);
1910 vrele(tdvp);
1925 else
1911 else
1926 nfsrv_vput(tdvp);
1912 vput(tdvp);
1927 if (tvp)
1913 if (tvp)
1928 nfsrv_vput(tvp);
1914 vput(tvp);
1929 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
1915 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
1930 nfsrv_vrele(fromnd.ni_dvp);
1931 nfsrv_vrele(fvp);
1916 vrele(fromnd.ni_dvp);
1917 vrele(fvp);
1932 if (error == -1)
1933 error = 0;
1934 }
1918 if (error == -1)
1919 error = 0;
1920 }
1935 nfsrv_vrele(tond.ni_startdir);
1921 vrele(tond.ni_startdir);
1936 FREE(tond.ni_cnd.cn_pnbuf, M_NAMEI);
1937out1:
1938 if (fdirp) {
1939 fdiraft_ret = VOP_GETATTR(fdirp, &fdiraft, cred, procp);
1922 FREE(tond.ni_cnd.cn_pnbuf, M_NAMEI);
1923out1:
1924 if (fdirp) {
1925 fdiraft_ret = VOP_GETATTR(fdirp, &fdiraft, cred, procp);
1940 nfsrv_vrele(fdirp);
1926 vrele(fdirp);
1941 }
1942 if (tdirp) {
1943 tdiraft_ret = VOP_GETATTR(tdirp, &tdiraft, cred, procp);
1927 }
1928 if (tdirp) {
1929 tdiraft_ret = VOP_GETATTR(tdirp, &tdiraft, cred, procp);
1944 nfsrv_vrele(tdirp);
1930 vrele(tdirp);
1945 }
1931 }
1946 nfsrv_vrele(fromnd.ni_startdir);
1932 vrele(fromnd.ni_startdir);
1947 FREE(fromnd.ni_cnd.cn_pnbuf, M_NAMEI);
1948 nfsm_reply(2 * NFSX_WCCDATA(v3));
1949 if (v3) {
1950 nfsm_srvwcc_data(fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
1951 nfsm_srvwcc_data(tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
1952 }
1953 return (0);
1954
1955nfsmout:
1956 if (fdirp)
1933 FREE(fromnd.ni_cnd.cn_pnbuf, M_NAMEI);
1934 nfsm_reply(2 * NFSX_WCCDATA(v3));
1935 if (v3) {
1936 nfsm_srvwcc_data(fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
1937 nfsm_srvwcc_data(tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
1938 }
1939 return (0);
1940
1941nfsmout:
1942 if (fdirp)
1957 nfsrv_vrele(fdirp);
1943 vrele(fdirp);
1958 if (tdirp)
1944 if (tdirp)
1959 nfsrv_vrele(tdirp);
1945 vrele(tdirp);
1960 if (tond.ni_cnd.cn_nameiop) {
1946 if (tond.ni_cnd.cn_nameiop) {
1961 nfsrv_vrele(tond.ni_startdir);
1947 vrele(tond.ni_startdir);
1962 FREE(tond.ni_cnd.cn_pnbuf, M_NAMEI);
1963 }
1964 if (fromnd.ni_cnd.cn_nameiop) {
1948 FREE(tond.ni_cnd.cn_pnbuf, M_NAMEI);
1949 }
1950 if (fromnd.ni_cnd.cn_nameiop) {
1965 nfsrv_vrele(fromnd.ni_startdir);
1951 vrele(fromnd.ni_startdir);
1966 FREE(fromnd.ni_cnd.cn_pnbuf, M_NAMEI);
1967 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
1952 FREE(fromnd.ni_cnd.cn_pnbuf, M_NAMEI);
1953 VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
1968 nfsrv_vrele(fromnd.ni_dvp);
1969 nfsrv_vrele(fvp);
1954 vrele(fromnd.ni_dvp);
1955 vrele(fvp);
1970 }
1971 return (error);
1972}
1973
1974/*
1975 * nfs link service
1976 */
1977int

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

2018 nd.ni_cnd.cn_flags = LOCKPARENT;
2019 error = nfs_namei(&nd, dfhp, len, slp, nam, &md, &dpos,
2020 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
2021 if (dirp) {
2022 if (v3)
2023 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
2024 procp);
2025 else {
1956 }
1957 return (error);
1958}
1959
1960/*
1961 * nfs link service
1962 */
1963int

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

2004 nd.ni_cnd.cn_flags = LOCKPARENT;
2005 error = nfs_namei(&nd, dfhp, len, slp, nam, &md, &dpos,
2006 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
2007 if (dirp) {
2008 if (v3)
2009 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
2010 procp);
2011 else {
2026 nfsrv_vrele(dirp);
2012 vrele(dirp);
2027 dirp = (struct vnode *)0;
2028 }
2029 }
2030 if (error)
2031 goto out1;
2032 xp = nd.ni_vp;
2033 if (xp != NULL) {
2034 error = EEXIST;

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

2044#if defined(__NetBSD__) || defined(__FreeBSD__)
2045 error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
2046#else
2047 error = VOP_LINK(vp, nd.ni_dvp, &nd.ni_cnd);
2048#endif
2049 } else {
2050 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2051 if (nd.ni_dvp == nd.ni_vp)
2013 dirp = (struct vnode *)0;
2014 }
2015 }
2016 if (error)
2017 goto out1;
2018 xp = nd.ni_vp;
2019 if (xp != NULL) {
2020 error = EEXIST;

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

2030#if defined(__NetBSD__) || defined(__FreeBSD__)
2031 error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
2032#else
2033 error = VOP_LINK(vp, nd.ni_dvp, &nd.ni_cnd);
2034#endif
2035 } else {
2036 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2037 if (nd.ni_dvp == nd.ni_vp)
2052 nfsrv_vrele(nd.ni_dvp);
2038 vrele(nd.ni_dvp);
2053 else
2039 else
2054 nfsrv_vput(nd.ni_dvp);
2040 vput(nd.ni_dvp);
2055 if (nd.ni_vp)
2041 if (nd.ni_vp)
2056 nfsrv_vrele(nd.ni_vp);
2042 vrele(nd.ni_vp);
2057 }
2058out1:
2059 if (v3)
2060 getret = VOP_GETATTR(vp, &at, cred, procp);
2061 if (dirp) {
2062 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2043 }
2044out1:
2045 if (v3)
2046 getret = VOP_GETATTR(vp, &at, cred, procp);
2047 if (dirp) {
2048 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2063 nfsrv_vrele(dirp);
2049 vrele(dirp);
2064 }
2050 }
2065 nfsrv_vrele(vp);
2051 vrele(vp);
2066 nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3));
2067 if (v3) {
2068 nfsm_srvpostop_attr(getret, &at);
2069 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2070 return (0);
2071 }
2072 nfsm_srvdone;
2073}

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

2082 struct proc *procp;
2083 struct mbuf **mrq;
2084{
2085 struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
2086 struct mbuf *nam = nfsd->nd_nam;
2087 caddr_t dpos = nfsd->nd_dpos;
2088 struct ucred *cred = &nfsd->nd_cr;
2089 struct vattr va, dirfor, diraft;
2052 nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3));
2053 if (v3) {
2054 nfsm_srvpostop_attr(getret, &at);
2055 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2056 return (0);
2057 }
2058 nfsm_srvdone;
2059}

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

2068 struct proc *procp;
2069 struct mbuf **mrq;
2070{
2071 struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
2072 struct mbuf *nam = nfsd->nd_nam;
2073 caddr_t dpos = nfsd->nd_dpos;
2074 struct ucred *cred = &nfsd->nd_cr;
2075 struct vattr va, dirfor, diraft;
2090 struct vnode *ovp;
2091 struct nameidata nd;
2092 register struct vattr *vap = &va;
2093 register u_long *tl;
2094 register long t1;
2095 struct nfsv2_sattr *sp;
2096 char *bpos, *pathcp = (char *)0, *cp2;
2097 struct uio io;
2098 struct iovec iv;
2099 int error = 0, cache, len, len2, dirfor_ret = 1, diraft_ret = 1;
2100 int v3 = (nfsd->nd_flag & ND_NFSV3);
2101 struct mbuf *mb, *mreq, *mb2;
2102 struct vnode *dirp = (struct vnode *)0;
2103 nfsfh_t nfh;
2104 fhandle_t *fhp;
2105 u_quad_t frev;
2076 struct nameidata nd;
2077 register struct vattr *vap = &va;
2078 register u_long *tl;
2079 register long t1;
2080 struct nfsv2_sattr *sp;
2081 char *bpos, *pathcp = (char *)0, *cp2;
2082 struct uio io;
2083 struct iovec iv;
2084 int error = 0, cache, len, len2, dirfor_ret = 1, diraft_ret = 1;
2085 int v3 = (nfsd->nd_flag & ND_NFSV3);
2086 struct mbuf *mb, *mreq, *mb2;
2087 struct vnode *dirp = (struct vnode *)0;
2088 nfsfh_t nfh;
2089 fhandle_t *fhp;
2090 u_quad_t frev;
2106 int deallocobj = 0;
2107
2108 nd.ni_cnd.cn_nameiop = 0;
2109 fhp = &nfh.fh_generic;
2110 nfsm_srvmtofh(fhp);
2111 nfsm_srvnamesiz(len);
2112 nd.ni_cnd.cn_cred = cred;
2113 nd.ni_cnd.cn_nameiop = CREATE;
2114 nd.ni_cnd.cn_flags = LOCKPARENT | SAVESTART;
2115 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
2116 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
2117 if (dirp) {
2118 if (v3)
2119 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
2120 procp);
2121 else {
2091
2092 nd.ni_cnd.cn_nameiop = 0;
2093 fhp = &nfh.fh_generic;
2094 nfsm_srvmtofh(fhp);
2095 nfsm_srvnamesiz(len);
2096 nd.ni_cnd.cn_cred = cred;
2097 nd.ni_cnd.cn_nameiop = CREATE;
2098 nd.ni_cnd.cn_flags = LOCKPARENT | SAVESTART;
2099 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
2100 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
2101 if (dirp) {
2102 if (v3)
2103 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
2104 procp);
2105 else {
2122 nfsrv_vrele(dirp);
2106 vrele(dirp);
2123 dirp = (struct vnode *)0;
2124 }
2125 }
2126 if (error)
2127 goto out;
2128 VATTR_NULL(vap);
2129 if (v3)
2130 nfsm_srvsattr(vap);

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

2141 io.uio_procp = (struct proc *)0;
2142 nfsm_mtouio(&io, len2);
2143 if (!v3) {
2144 nfsm_dissect(sp, struct nfsv2_sattr *, NFSX_V2SATTR);
2145 vap->va_mode = fxdr_unsigned(u_short, sp->sa_mode);
2146 }
2147 *(pathcp + len2) = '\0';
2148 if (nd.ni_vp) {
2107 dirp = (struct vnode *)0;
2108 }
2109 }
2110 if (error)
2111 goto out;
2112 VATTR_NULL(vap);
2113 if (v3)
2114 nfsm_srvsattr(vap);

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

2125 io.uio_procp = (struct proc *)0;
2126 nfsm_mtouio(&io, len2);
2127 if (!v3) {
2128 nfsm_dissect(sp, struct nfsv2_sattr *, NFSX_V2SATTR);
2129 vap->va_mode = fxdr_unsigned(u_short, sp->sa_mode);
2130 }
2131 *(pathcp + len2) = '\0';
2132 if (nd.ni_vp) {
2149 nfsrv_vrele(nd.ni_startdir);
2133 vrele(nd.ni_startdir);
2150 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2151 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2152 if (nd.ni_dvp == nd.ni_vp)
2134 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2135 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2136 if (nd.ni_dvp == nd.ni_vp)
2153 nfsrv_vrele(nd.ni_dvp);
2137 vrele(nd.ni_dvp);
2154 else
2138 else
2155 nfsrv_vput(nd.ni_dvp);
2156 nfsrv_vrele(nd.ni_vp);
2139 vput(nd.ni_dvp);
2140 vrele(nd.ni_vp);
2157 error = EEXIST;
2158 goto out;
2159 }
2160 nqsrv_getl(nd.ni_dvp, ND_WRITE);
2141 error = EEXIST;
2142 goto out;
2143 }
2144 nqsrv_getl(nd.ni_dvp, ND_WRITE);
2161 if ((ovp = nd.ni_vp) && (ovp->v_flag & VVMIO) && ovp->v_object)
2162 deallocobj = 1;
2163 error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap, pathcp);
2145 error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap, pathcp);
2164 if (error == 0 && deallocobj)
2165 vm_object_deallocate(ovp->v_object);
2166 if (error)
2146 if (error)
2167 nfsrv_vrele(nd.ni_startdir);
2147 vrele(nd.ni_startdir);
2168 else {
2169 if (v3) {
2170 nd.ni_cnd.cn_nameiop = LOOKUP;
2171 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART | FOLLOW);
2172 nd.ni_cnd.cn_flags |= (NOFOLLOW | LOCKLEAF);
2173 nd.ni_cnd.cn_proc = procp;
2174 nd.ni_cnd.cn_cred = cred;
2175 error = lookup(&nd);
2176 if (!error) {
2177 bzero((caddr_t)fhp, sizeof(nfh));
2178 fhp->fh_fsid = nd.ni_vp->v_mount->mnt_stat.f_fsid;
2179 error = VFS_VPTOFH(nd.ni_vp, &fhp->fh_fid);
2180 if (!error)
2181 error = VOP_GETATTR(nd.ni_vp, vap, cred,
2182 procp);
2148 else {
2149 if (v3) {
2150 nd.ni_cnd.cn_nameiop = LOOKUP;
2151 nd.ni_cnd.cn_flags &= ~(LOCKPARENT | SAVESTART | FOLLOW);
2152 nd.ni_cnd.cn_flags |= (NOFOLLOW | LOCKLEAF);
2153 nd.ni_cnd.cn_proc = procp;
2154 nd.ni_cnd.cn_cred = cred;
2155 error = lookup(&nd);
2156 if (!error) {
2157 bzero((caddr_t)fhp, sizeof(nfh));
2158 fhp->fh_fsid = nd.ni_vp->v_mount->mnt_stat.f_fsid;
2159 error = VFS_VPTOFH(nd.ni_vp, &fhp->fh_fid);
2160 if (!error)
2161 error = VOP_GETATTR(nd.ni_vp, vap, cred,
2162 procp);
2183 nfsrv_vput(nd.ni_vp);
2163 vput(nd.ni_vp);
2184 }
2185 } else
2164 }
2165 } else
2186 nfsrv_vrele(nd.ni_startdir);
2166 vrele(nd.ni_startdir);
2187 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2188 }
2189out:
2190 if (pathcp)
2191 FREE(pathcp, M_TEMP);
2192 if (dirp) {
2193 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2167 FREE(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2168 }
2169out:
2170 if (pathcp)
2171 FREE(pathcp, M_TEMP);
2172 if (dirp) {
2173 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2194 nfsrv_vrele(dirp);
2174 vrele(dirp);
2195 }
2196 nfsm_reply(NFSX_SRVFH(v3) + NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3));
2197 if (v3) {
2198 if (!error) {
2199 nfsm_srvpostop_fh(fhp);
2200 nfsm_srvpostop_attr(0, vap);
2201 }
2202 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2203 }
2204 return (0);
2205nfsmout:
2206 if (nd.ni_cnd.cn_nameiop) {
2175 }
2176 nfsm_reply(NFSX_SRVFH(v3) + NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3));
2177 if (v3) {
2178 if (!error) {
2179 nfsm_srvpostop_fh(fhp);
2180 nfsm_srvpostop_attr(0, vap);
2181 }
2182 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2183 }
2184 return (0);
2185nfsmout:
2186 if (nd.ni_cnd.cn_nameiop) {
2207 nfsrv_vrele(nd.ni_startdir);
2187 vrele(nd.ni_startdir);
2208 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2209 }
2210 if (dirp)
2188 free(nd.ni_cnd.cn_pnbuf, M_NAMEI);
2189 }
2190 if (dirp)
2211 nfsrv_vrele(dirp);
2191 vrele(dirp);
2212 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2213 if (nd.ni_dvp == nd.ni_vp)
2192 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2193 if (nd.ni_dvp == nd.ni_vp)
2214 nfsrv_vrele(nd.ni_dvp);
2194 vrele(nd.ni_dvp);
2215 else
2195 else
2216 nfsrv_vput(nd.ni_dvp);
2196 vput(nd.ni_dvp);
2217 if (nd.ni_vp)
2197 if (nd.ni_vp)
2218 nfsrv_vrele(nd.ni_vp);
2198 vrele(nd.ni_vp);
2219 if (pathcp)
2220 FREE(pathcp, M_TEMP);
2221 return (error);
2222}
2223
2224/*
2225 * nfs mkdir service
2226 */

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

2260 nd.ni_cnd.cn_flags = LOCKPARENT;
2261 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
2262 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
2263 if (dirp) {
2264 if (v3)
2265 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
2266 procp);
2267 else {
2199 if (pathcp)
2200 FREE(pathcp, M_TEMP);
2201 return (error);
2202}
2203
2204/*
2205 * nfs mkdir service
2206 */

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

2240 nd.ni_cnd.cn_flags = LOCKPARENT;
2241 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
2242 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
2243 if (dirp) {
2244 if (v3)
2245 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
2246 procp);
2247 else {
2268 nfsrv_vrele(dirp);
2248 vrele(dirp);
2269 dirp = (struct vnode *)0;
2270 }
2271 }
2272 if (error) {
2273 nfsm_reply(NFSX_WCCDATA(v3));
2274 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2275 if (dirp)
2249 dirp = (struct vnode *)0;
2250 }
2251 }
2252 if (error) {
2253 nfsm_reply(NFSX_WCCDATA(v3));
2254 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2255 if (dirp)
2276 nfsrv_vrele(dirp);
2256 vrele(dirp);
2277 return (0);
2278 }
2279 VATTR_NULL(vap);
2280 if (v3) {
2281 nfsm_srvsattr(vap);
2282 } else {
2283 nfsm_dissect(tl, u_long *, NFSX_UNSIGNED);
2284 vap->va_mode = nfstov_mode(*tl++);
2285 }
2286 vap->va_type = VDIR;
2287 vp = nd.ni_vp;
2288 if (vp != NULL) {
2289 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2290 if (nd.ni_dvp == vp)
2257 return (0);
2258 }
2259 VATTR_NULL(vap);
2260 if (v3) {
2261 nfsm_srvsattr(vap);
2262 } else {
2263 nfsm_dissect(tl, u_long *, NFSX_UNSIGNED);
2264 vap->va_mode = nfstov_mode(*tl++);
2265 }
2266 vap->va_type = VDIR;
2267 vp = nd.ni_vp;
2268 if (vp != NULL) {
2269 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2270 if (nd.ni_dvp == vp)
2291 nfsrv_vrele(nd.ni_dvp);
2271 vrele(nd.ni_dvp);
2292 else
2272 else
2293 nfsrv_vput(nd.ni_dvp);
2294 nfsrv_vrele(vp);
2273 vput(nd.ni_dvp);
2274 vrele(vp);
2295 error = EEXIST;
2296 goto out;
2297 }
2298 nqsrv_getl(nd.ni_dvp, ND_WRITE);
2299 error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
2300 if (!error) {
2301 vp = nd.ni_vp;
2302 bzero((caddr_t)fhp, sizeof(nfh));
2303 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
2304 error = VFS_VPTOFH(vp, &fhp->fh_fid);
2305 if (!error)
2306 error = VOP_GETATTR(vp, vap, cred, procp);
2275 error = EEXIST;
2276 goto out;
2277 }
2278 nqsrv_getl(nd.ni_dvp, ND_WRITE);
2279 error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, vap);
2280 if (!error) {
2281 vp = nd.ni_vp;
2282 bzero((caddr_t)fhp, sizeof(nfh));
2283 fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
2284 error = VFS_VPTOFH(vp, &fhp->fh_fid);
2285 if (!error)
2286 error = VOP_GETATTR(vp, vap, cred, procp);
2307 nfsrv_vput(vp);
2287 vput(vp);
2308 }
2309out:
2310 if (dirp) {
2311 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2288 }
2289out:
2290 if (dirp) {
2291 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2312 nfsrv_vrele(dirp);
2292 vrele(dirp);
2313 }
2314 nfsm_reply(NFSX_SRVFH(v3) + NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3));
2315 if (v3) {
2316 if (!error) {
2317 nfsm_srvpostop_fh(fhp);
2318 nfsm_srvpostop_attr(0, vap);
2319 }
2320 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2321 } else {
2322 nfsm_srvfhtom(fhp, v3);
2323 nfsm_build(fp, struct nfs_fattr *, NFSX_V2FATTR);
2324 nfsm_srvfillattr(vap, fp);
2325 }
2326 return (0);
2327nfsmout:
2328 if (dirp)
2293 }
2294 nfsm_reply(NFSX_SRVFH(v3) + NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3));
2295 if (v3) {
2296 if (!error) {
2297 nfsm_srvpostop_fh(fhp);
2298 nfsm_srvpostop_attr(0, vap);
2299 }
2300 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2301 } else {
2302 nfsm_srvfhtom(fhp, v3);
2303 nfsm_build(fp, struct nfs_fattr *, NFSX_V2FATTR);
2304 nfsm_srvfillattr(vap, fp);
2305 }
2306 return (0);
2307nfsmout:
2308 if (dirp)
2329 nfsrv_vrele(dirp);
2309 vrele(dirp);
2330 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2331 if (nd.ni_dvp == nd.ni_vp)
2310 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2311 if (nd.ni_dvp == nd.ni_vp)
2332 nfsrv_vrele(nd.ni_dvp);
2312 vrele(nd.ni_dvp);
2333 else
2313 else
2334 nfsrv_vput(nd.ni_dvp);
2314 vput(nd.ni_dvp);
2335 if (nd.ni_vp)
2315 if (nd.ni_vp)
2336 nfsrv_vrele(nd.ni_vp);
2316 vrele(nd.ni_vp);
2337 return (error);
2338}
2339
2340/*
2341 * nfs rmdir service
2342 */
2343int
2344nfsrv_rmdir(nfsd, slp, procp, mrq)

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

2373 nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF;
2374 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
2375 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
2376 if (dirp) {
2377 if (v3)
2378 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
2379 procp);
2380 else {
2317 return (error);
2318}
2319
2320/*
2321 * nfs rmdir service
2322 */
2323int
2324nfsrv_rmdir(nfsd, slp, procp, mrq)

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

2353 nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF;
2354 error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
2355 &dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));
2356 if (dirp) {
2357 if (v3)
2358 dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,
2359 procp);
2360 else {
2381 nfsrv_vrele(dirp);
2361 vrele(dirp);
2382 dirp = (struct vnode *)0;
2383 }
2384 }
2385 if (error) {
2386 nfsm_reply(NFSX_WCCDATA(v3));
2387 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2388 if (dirp)
2362 dirp = (struct vnode *)0;
2363 }
2364 }
2365 if (error) {
2366 nfsm_reply(NFSX_WCCDATA(v3));
2367 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2368 if (dirp)
2389 nfsrv_vrele(dirp);
2369 vrele(dirp);
2390 return (0);
2391 }
2392 vp = nd.ni_vp;
2393 if (vp->v_type != VDIR) {
2394 error = ENOTDIR;
2395 goto out;
2396 }
2397 /*

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

2409out:
2410 if (!error) {
2411 nqsrv_getl(nd.ni_dvp, ND_WRITE);
2412 nqsrv_getl(vp, ND_WRITE);
2413 error = VOP_RMDIR(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd);
2414 } else {
2415 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2416 if (nd.ni_dvp == nd.ni_vp)
2370 return (0);
2371 }
2372 vp = nd.ni_vp;
2373 if (vp->v_type != VDIR) {
2374 error = ENOTDIR;
2375 goto out;
2376 }
2377 /*

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

2389out:
2390 if (!error) {
2391 nqsrv_getl(nd.ni_dvp, ND_WRITE);
2392 nqsrv_getl(vp, ND_WRITE);
2393 error = VOP_RMDIR(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd);
2394 } else {
2395 VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
2396 if (nd.ni_dvp == nd.ni_vp)
2417 nfsrv_vrele(nd.ni_dvp);
2397 vrele(nd.ni_dvp);
2418 else
2398 else
2419 nfsrv_vput(nd.ni_dvp);
2420 nfsrv_vput(vp);
2399 vput(nd.ni_dvp);
2400 vput(vp);
2421 }
2422 if (dirp) {
2423 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2401 }
2402 if (dirp) {
2403 diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);
2424 nfsrv_vrele(dirp);
2404 vrele(dirp);
2425 }
2426 nfsm_reply(NFSX_WCCDATA(v3));
2427 if (v3) {
2428 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2429 return (0);
2430 }
2431 nfsm_srvdone;
2432}

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

2530 if (v3) {
2531 error = getret = VOP_GETATTR(vp, &at, cred, procp);
2532 if (!error && toff && verf != at.va_filerev)
2533 error = NFSERR_BAD_COOKIE;
2534 }
2535 if (!error)
2536 error = nfsrv_access(vp, VEXEC, cred, rdonly, procp);
2537 if (error) {
2405 }
2406 nfsm_reply(NFSX_WCCDATA(v3));
2407 if (v3) {
2408 nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
2409 return (0);
2410 }
2411 nfsm_srvdone;
2412}

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

2510 if (v3) {
2511 error = getret = VOP_GETATTR(vp, &at, cred, procp);
2512 if (!error && toff && verf != at.va_filerev)
2513 error = NFSERR_BAD_COOKIE;
2514 }
2515 if (!error)
2516 error = nfsrv_access(vp, VEXEC, cred, rdonly, procp);
2517 if (error) {
2538 nfsrv_vput(vp);
2518 vput(vp);
2539 nfsm_reply(NFSX_POSTOPATTR(v3));
2540 nfsm_srvpostop_attr(getret, &at);
2541 return (0);
2542 }
2543 VOP_UNLOCK(vp);
2544 MALLOC(rbuf, caddr_t, siz, M_TEMP, M_WAITOK);
2545#ifdef __NetBSD__
2546 ncookies = siz / (5 * NFSX_UNSIGNED); /*7 for V3, but it's an est. so*/

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

2573 error = NFSERR_PERM;
2574 if (v3) {
2575 getret = VOP_GETATTR(vp, &at, cred, procp);
2576 if (!error)
2577 error = getret;
2578 }
2579 VOP_UNLOCK(vp);
2580 if (error) {
2519 nfsm_reply(NFSX_POSTOPATTR(v3));
2520 nfsm_srvpostop_attr(getret, &at);
2521 return (0);
2522 }
2523 VOP_UNLOCK(vp);
2524 MALLOC(rbuf, caddr_t, siz, M_TEMP, M_WAITOK);
2525#ifdef __NetBSD__
2526 ncookies = siz / (5 * NFSX_UNSIGNED); /*7 for V3, but it's an est. so*/

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

2553 error = NFSERR_PERM;
2554 if (v3) {
2555 getret = VOP_GETATTR(vp, &at, cred, procp);
2556 if (!error)
2557 error = getret;
2558 }
2559 VOP_UNLOCK(vp);
2560 if (error) {
2581 nfsrv_vrele(vp);
2561 vrele(vp);
2582 free((caddr_t)rbuf, M_TEMP);
2583 if (cookies)
2584 free((caddr_t)cookies, M_TEMP);
2585 nfsm_reply(NFSX_POSTOPATTR(v3));
2586 nfsm_srvpostop_attr(getret, &at);
2587 return (0);
2588 }
2589 if (io.uio_resid) {
2590 siz -= io.uio_resid;
2591
2592 /*
2593 * If nothing read, return eof
2594 * rpc reply
2595 */
2596 if (siz == 0) {
2562 free((caddr_t)rbuf, M_TEMP);
2563 if (cookies)
2564 free((caddr_t)cookies, M_TEMP);
2565 nfsm_reply(NFSX_POSTOPATTR(v3));
2566 nfsm_srvpostop_attr(getret, &at);
2567 return (0);
2568 }
2569 if (io.uio_resid) {
2570 siz -= io.uio_resid;
2571
2572 /*
2573 * If nothing read, return eof
2574 * rpc reply
2575 */
2576 if (siz == 0) {
2597 nfsrv_vrele(vp);
2577 vrele(vp);
2598 nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_COOKIEVERF(v3) +
2599 2 * NFSX_UNSIGNED);
2600 if (v3) {
2601 nfsm_srvpostop_attr(getret, &at);
2602 nfsm_build(tl, u_long *, 4 * NFSX_UNSIGNED);
2603 txdr_hyper(&at.va_filerev, tl);
2604 tl += 2;
2605 } else

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

2715 *tl = txdr_unsigned(*cookiep);
2716 bp += NFSX_UNSIGNED;
2717 }
2718 cpos += dp->d_reclen;
2719 dp = (struct dirent *)cpos;
2720 cookiep++;
2721 ncookies--;
2722 }
2578 nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_COOKIEVERF(v3) +
2579 2 * NFSX_UNSIGNED);
2580 if (v3) {
2581 nfsm_srvpostop_attr(getret, &at);
2582 nfsm_build(tl, u_long *, 4 * NFSX_UNSIGNED);
2583 txdr_hyper(&at.va_filerev, tl);
2584 tl += 2;
2585 } else

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

2695 *tl = txdr_unsigned(*cookiep);
2696 bp += NFSX_UNSIGNED;
2697 }
2698 cpos += dp->d_reclen;
2699 dp = (struct dirent *)cpos;
2700 cookiep++;
2701 ncookies--;
2702 }
2723 nfsrv_vrele(vp);
2703 vrele(vp);
2724 nfsm_clget;
2725 *tl = nfs_false;
2726 bp += NFSX_UNSIGNED;
2727 nfsm_clget;
2728 if (eofflag)
2729 *tl = nfs_true;
2730 else
2731 *tl = nfs_false;

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

2797 error = getret = VOP_GETATTR(vp, &at, cred, procp);
2798 if (!error && toff && verf != at.va_filerev)
2799 error = NFSERR_BAD_COOKIE;
2800 if (!error) {
2801 nqsrv_getl(vp, ND_READ);
2802 error = nfsrv_access(vp, VEXEC, cred, rdonly, procp);
2803 }
2804 if (error) {
2704 nfsm_clget;
2705 *tl = nfs_false;
2706 bp += NFSX_UNSIGNED;
2707 nfsm_clget;
2708 if (eofflag)
2709 *tl = nfs_true;
2710 else
2711 *tl = nfs_false;

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

2777 error = getret = VOP_GETATTR(vp, &at, cred, procp);
2778 if (!error && toff && verf != at.va_filerev)
2779 error = NFSERR_BAD_COOKIE;
2780 if (!error) {
2781 nqsrv_getl(vp, ND_READ);
2782 error = nfsrv_access(vp, VEXEC, cred, rdonly, procp);
2783 }
2784 if (error) {
2805 nfsrv_vput(vp);
2785 vput(vp);
2806 nfsm_reply(NFSX_V3POSTOPATTR);
2807 nfsm_srvpostop_attr(getret, &at);
2808 return (0);
2809 }
2810 VOP_UNLOCK(vp);
2811 MALLOC(rbuf, caddr_t, siz, M_TEMP, M_WAITOK);
2812#ifdef __NetBSD__
2813 ncookies = siz / (7 * NFSX_UNSIGNED);

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

2838 off = (u_quad_t)io.uio_offset;
2839 getret = VOP_GETATTR(vp, &at, cred, procp);
2840 VOP_UNLOCK(vp);
2841 if (!cookies && !error)
2842 error = NFSERR_PERM;
2843 if (!error)
2844 error = getret;
2845 if (error) {
2786 nfsm_reply(NFSX_V3POSTOPATTR);
2787 nfsm_srvpostop_attr(getret, &at);
2788 return (0);
2789 }
2790 VOP_UNLOCK(vp);
2791 MALLOC(rbuf, caddr_t, siz, M_TEMP, M_WAITOK);
2792#ifdef __NetBSD__
2793 ncookies = siz / (7 * NFSX_UNSIGNED);

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

2818 off = (u_quad_t)io.uio_offset;
2819 getret = VOP_GETATTR(vp, &at, cred, procp);
2820 VOP_UNLOCK(vp);
2821 if (!cookies && !error)
2822 error = NFSERR_PERM;
2823 if (!error)
2824 error = getret;
2825 if (error) {
2846 nfsrv_vrele(vp);
2826 vrele(vp);
2847 if (cookies)
2848 free((caddr_t)cookies, M_TEMP);
2849 free((caddr_t)rbuf, M_TEMP);
2850 nfsm_reply(NFSX_V3POSTOPATTR);
2851 nfsm_srvpostop_attr(getret, &at);
2852 return (0);
2853 }
2854 if (io.uio_resid) {
2855 siz -= io.uio_resid;
2856
2857 /*
2858 * If nothing read, return eof
2859 * rpc reply
2860 */
2861 if (siz == 0) {
2827 if (cookies)
2828 free((caddr_t)cookies, M_TEMP);
2829 free((caddr_t)rbuf, M_TEMP);
2830 nfsm_reply(NFSX_V3POSTOPATTR);
2831 nfsm_srvpostop_attr(getret, &at);
2832 return (0);
2833 }
2834 if (io.uio_resid) {
2835 siz -= io.uio_resid;
2836
2837 /*
2838 * If nothing read, return eof
2839 * rpc reply
2840 */
2841 if (siz == 0) {
2862 nfsrv_vrele(vp);
2842 vrele(vp);
2863 nfsm_reply(NFSX_V3POSTOPATTR + NFSX_V3COOKIEVERF +
2864 2 * NFSX_UNSIGNED);
2865 nfsm_srvpostop_attr(getret, &at);
2866 nfsm_build(tl, u_long *, 4 * NFSX_UNSIGNED);
2867 txdr_hyper(&at.va_filerev, tl);
2868 tl += 2;
2869 *tl++ = nfs_false;
2870 *tl = nfs_true;

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

2907 }
2908
2909 /*
2910 * Probe one of the directory entries to see if the filesystem
2911 * supports VGET.
2912 */
2913 if (VFS_VGET(vp->v_mount, dp->d_fileno, &nvp) == EOPNOTSUPP) {
2914 error = NFSERR_NOTSUPP;
2843 nfsm_reply(NFSX_V3POSTOPATTR + NFSX_V3COOKIEVERF +
2844 2 * NFSX_UNSIGNED);
2845 nfsm_srvpostop_attr(getret, &at);
2846 nfsm_build(tl, u_long *, 4 * NFSX_UNSIGNED);
2847 txdr_hyper(&at.va_filerev, tl);
2848 tl += 2;
2849 *tl++ = nfs_false;
2850 *tl = nfs_true;

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

2887 }
2888
2889 /*
2890 * Probe one of the directory entries to see if the filesystem
2891 * supports VGET.
2892 */
2893 if (VFS_VGET(vp->v_mount, dp->d_fileno, &nvp) == EOPNOTSUPP) {
2894 error = NFSERR_NOTSUPP;
2915 nfsrv_vrele(vp);
2895 vrele(vp);
2916 free((caddr_t)cookies, M_TEMP);
2917 free((caddr_t)rbuf, M_TEMP);
2918 nfsm_reply(NFSX_V3POSTOPATTR);
2919 nfsm_srvpostop_attr(getret, &at);
2920 return (0);
2921 }
2922
2923 dirlen = len = NFSX_V3POSTOPATTR + NFSX_V3COOKIEVERF + 2 * NFSX_UNSIGNED;

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

3031 }
3032 }
3033invalid:
3034 cpos += dp->d_reclen;
3035 dp = (struct dirent *)cpos;
3036 cookiep++;
3037 ncookies--;
3038 }
2896 free((caddr_t)cookies, M_TEMP);
2897 free((caddr_t)rbuf, M_TEMP);
2898 nfsm_reply(NFSX_V3POSTOPATTR);
2899 nfsm_srvpostop_attr(getret, &at);
2900 return (0);
2901 }
2902
2903 dirlen = len = NFSX_V3POSTOPATTR + NFSX_V3COOKIEVERF + 2 * NFSX_UNSIGNED;

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

3011 }
3012 }
3013invalid:
3014 cpos += dp->d_reclen;
3015 dp = (struct dirent *)cpos;
3016 cookiep++;
3017 ncookies--;
3018 }
3039 nfsrv_vrele(vp);
3019 vrele(vp);
3040 nfsm_clget;
3041 *tl = nfs_false;
3042 bp += NFSX_UNSIGNED;
3043 nfsm_clget;
3044 if (eofflag)
3045 *tl = nfs_true;
3046 else
3047 *tl = nfs_false;

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

3100 &rdonly, (nfsd->nd_flag & ND_KERBAUTH))) {
3101 nfsm_reply(2 * NFSX_UNSIGNED);
3102 nfsm_srvwcc_data(for_ret, &bfor, aft_ret, &aft);
3103 return (0);
3104 }
3105 for_ret = VOP_GETATTR(vp, &bfor, cred, procp);
3106 error = VOP_FSYNC(vp, cred, MNT_WAIT, procp);
3107 aft_ret = VOP_GETATTR(vp, &aft, cred, procp);
3020 nfsm_clget;
3021 *tl = nfs_false;
3022 bp += NFSX_UNSIGNED;
3023 nfsm_clget;
3024 if (eofflag)
3025 *tl = nfs_true;
3026 else
3027 *tl = nfs_false;

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

3080 &rdonly, (nfsd->nd_flag & ND_KERBAUTH))) {
3081 nfsm_reply(2 * NFSX_UNSIGNED);
3082 nfsm_srvwcc_data(for_ret, &bfor, aft_ret, &aft);
3083 return (0);
3084 }
3085 for_ret = VOP_GETATTR(vp, &bfor, cred, procp);
3086 error = VOP_FSYNC(vp, cred, MNT_WAIT, procp);
3087 aft_ret = VOP_GETATTR(vp, &aft, cred, procp);
3108 nfsrv_vput(vp);
3088 vput(vp);
3109 nfsm_reply(NFSX_V3WCCDATA + NFSX_V3WRITEVERF);
3110 nfsm_srvwcc_data(for_ret, &bfor, aft_ret, &aft);
3111 if (!error) {
3112 nfsm_build(tl, u_long *, NFSX_V3WRITEVERF);
3113 *tl++ = txdr_unsigned(boottime.tv_sec);
3114 *tl = txdr_unsigned(boottime.tv_usec);
3115 } else
3116 return (0);

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

3156 &rdonly, (nfsd->nd_flag & ND_KERBAUTH))) {
3157 nfsm_reply(NFSX_UNSIGNED);
3158 nfsm_srvpostop_attr(getret, &at);
3159 return (0);
3160 }
3161 sf = &statfs;
3162 error = VFS_STATFS(vp->v_mount, sf, procp);
3163 getret = VOP_GETATTR(vp, &at, cred, procp);
3089 nfsm_reply(NFSX_V3WCCDATA + NFSX_V3WRITEVERF);
3090 nfsm_srvwcc_data(for_ret, &bfor, aft_ret, &aft);
3091 if (!error) {
3092 nfsm_build(tl, u_long *, NFSX_V3WRITEVERF);
3093 *tl++ = txdr_unsigned(boottime.tv_sec);
3094 *tl = txdr_unsigned(boottime.tv_usec);
3095 } else
3096 return (0);

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

3136 &rdonly, (nfsd->nd_flag & ND_KERBAUTH))) {
3137 nfsm_reply(NFSX_UNSIGNED);
3138 nfsm_srvpostop_attr(getret, &at);
3139 return (0);
3140 }
3141 sf = &statfs;
3142 error = VFS_STATFS(vp->v_mount, sf, procp);
3143 getret = VOP_GETATTR(vp, &at, cred, procp);
3164 nfsrv_vput(vp);
3144 vput(vp);
3165 nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_STATFS(v3));
3166 if (v3)
3167 nfsm_srvpostop_attr(getret, &at);
3168 if (error)
3169 return (0);
3170 nfsm_build(sfp, struct nfs_statfs *, NFSX_STATFS(v3));
3171 if (v3) {
3172 tval = (u_quad_t)sf->f_blocks;

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

3229 nfsm_srvmtofh(fhp);
3230 if (error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam,
3231 &rdonly, (nfsd->nd_flag & ND_KERBAUTH))) {
3232 nfsm_reply(NFSX_UNSIGNED);
3233 nfsm_srvpostop_attr(getret, &at);
3234 return (0);
3235 }
3236 getret = VOP_GETATTR(vp, &at, cred, procp);
3145 nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_STATFS(v3));
3146 if (v3)
3147 nfsm_srvpostop_attr(getret, &at);
3148 if (error)
3149 return (0);
3150 nfsm_build(sfp, struct nfs_statfs *, NFSX_STATFS(v3));
3151 if (v3) {
3152 tval = (u_quad_t)sf->f_blocks;

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

3209 nfsm_srvmtofh(fhp);
3210 if (error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam,
3211 &rdonly, (nfsd->nd_flag & ND_KERBAUTH))) {
3212 nfsm_reply(NFSX_UNSIGNED);
3213 nfsm_srvpostop_attr(getret, &at);
3214 return (0);
3215 }
3216 getret = VOP_GETATTR(vp, &at, cred, procp);
3237 nfsrv_vput(vp);
3217 vput(vp);
3238 nfsm_reply(NFSX_V3POSTOPATTR + NFSX_V3FSINFO);
3239 nfsm_srvpostop_attr(getret, &at);
3240 nfsm_build(sip, struct nfsv3_fsinfo *, NFSX_V3FSINFO);
3241
3242 /*
3243 * XXX
3244 * There should be file system VFS OP(s) to get this information.
3245 * For now, assume ufs.

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

3307 error = VOP_PATHCONF(vp, _PC_LINK_MAX, &linkmax);
3308 if (!error)
3309 error = VOP_PATHCONF(vp, _PC_NAME_MAX, &namemax);
3310 if (!error)
3311 error = VOP_PATHCONF(vp, _PC_CHOWN_RESTRICTED, &chownres);
3312 if (!error)
3313 error = VOP_PATHCONF(vp, _PC_NO_TRUNC, &notrunc);
3314 getret = VOP_GETATTR(vp, &at, cred, procp);
3218 nfsm_reply(NFSX_V3POSTOPATTR + NFSX_V3FSINFO);
3219 nfsm_srvpostop_attr(getret, &at);
3220 nfsm_build(sip, struct nfsv3_fsinfo *, NFSX_V3FSINFO);
3221
3222 /*
3223 * XXX
3224 * There should be file system VFS OP(s) to get this information.
3225 * For now, assume ufs.

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

3287 error = VOP_PATHCONF(vp, _PC_LINK_MAX, &linkmax);
3288 if (!error)
3289 error = VOP_PATHCONF(vp, _PC_NAME_MAX, &namemax);
3290 if (!error)
3291 error = VOP_PATHCONF(vp, _PC_CHOWN_RESTRICTED, &chownres);
3292 if (!error)
3293 error = VOP_PATHCONF(vp, _PC_NO_TRUNC, &notrunc);
3294 getret = VOP_GETATTR(vp, &at, cred, procp);
3315 nfsrv_vput(vp);
3295 vput(vp);
3316 nfsm_reply(NFSX_V3POSTOPATTR + NFSX_V3PATHCONF);
3317 nfsm_srvpostop_attr(getret, &at);
3318 if (error)
3319 return (0);
3320 nfsm_build(pc, struct nfsv3_pathconf *, NFSX_V3PATHCONF);
3321
3322 pc->pc_linkmax = txdr_unsigned(linkmax);
3323 pc->pc_namemax = txdr_unsigned(namemax);

--- 114 unchanged lines hidden ---
3296 nfsm_reply(NFSX_V3POSTOPATTR + NFSX_V3PATHCONF);
3297 nfsm_srvpostop_attr(getret, &at);
3298 if (error)
3299 return (0);
3300 nfsm_build(pc, struct nfsv3_pathconf *, NFSX_V3PATHCONF);
3301
3302 pc->pc_linkmax = txdr_unsigned(linkmax);
3303 pc->pc_namemax = txdr_unsigned(namemax);

--- 114 unchanged lines hidden ---