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, ¬runc); 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, ¬runc); 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 --- |