Lines Matching +full:pd +full:- +full:node

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
4 * Copyright (c) 2001 Dag-Erling Smørgrav
56 KASSERT((pn)->pn_type == pfstype_root || \
57 (pn)->pn_type == pfstype_dir || \
58 (pn)->pn_type == pfstype_procdir, \
59 ("%s(): VDIR vnode refers to non-directory pfs_node", __func__))
62 KASSERT((pn)->pn_type == pfstype_file, \
63 ("%s(): VREG vnode refers to non-file pfs_node", __func__))
66 KASSERT((pn)->pn_type == pfstype_symlink, \
67 ("%s(): VLNK vnode refers to non-link pfs_node", __func__))
78 KASSERT(pn->pn_fileno > 0, in pn_fileno()
81 return (pn->pn_fileno * NO_PID + pid); in pn_fileno()
82 return (pn->pn_fileno); in pn_fileno()
86 * Returns non-zero if given file is visible to given thread.
97 if ((proc->p_flag & P_WEXIT) != 0) in pfs_visible_proc()
111 pn->pn_name, pid, td->td_proc->p_pid)); in pfs_visible()
139 if ((proc->p_flag & P_WEXIT) != 0) { in pfs_lookup_proc()
155 struct vnode *vn = va->a_vp; in pfs_access()
156 struct pfs_vdata *pvd = vn->v_data; in pfs_access()
160 PFS_TRACE(("%s", pvd->pvd_pn->pn_name)); in pfs_access()
163 error = VOP_GETATTR(vn, &vattr, va->a_cred); in pfs_access()
166 error = vaccess(vn->v_type, vattr.va_mode, vattr.va_uid, vattr.va_gid, in pfs_access()
167 va->a_accmode, va->a_cred); in pfs_access()
177 struct vnode *vn = va->a_vp; in pfs_close()
178 struct pfs_vdata *pvd = vn->v_data; in pfs_close()
179 struct pfs_node *pn = pvd->pvd_pn; in pfs_close()
183 PFS_TRACE(("%s", pn->pn_name)); in pfs_close()
187 * Do nothing unless this is the last close and the node has a in pfs_close()
188 * last-close handler. in pfs_close()
190 if (vrefcnt(vn) > 1 || pn->pn_close == NULL) in pfs_close()
193 if (pvd->pvd_pid != NO_PID) { in pfs_close()
194 proc = pfind(pvd->pvd_pid); in pfs_close()
199 error = pn_close(va->a_td, proc, pn); in pfs_close()
213 struct vnode *vn = va->a_vp; in pfs_getattr()
214 struct pfs_vdata *pvd = vn->v_data; in pfs_getattr()
215 struct pfs_node *pn = pvd->pvd_pn; in pfs_getattr()
216 struct vattr *vap = va->a_vap; in pfs_getattr()
220 PFS_TRACE(("%s", pn->pn_name)); in pfs_getattr()
223 if (!pfs_visible(curthread, pn, pvd->pvd_pid, &proc)) in pfs_getattr()
226 vap->va_type = vn->v_type; in pfs_getattr()
227 vap->va_fileid = pn_fileno(pn, pvd->pvd_pid); in pfs_getattr()
228 vap->va_flags = 0; in pfs_getattr()
229 vap->va_blocksize = PAGE_SIZE; in pfs_getattr()
230 vap->va_bytes = vap->va_size = 0; in pfs_getattr()
231 vap->va_filerev = 0; in pfs_getattr()
232 vap->va_fsid = vn->v_mount->mnt_stat.f_fsid.val[0]; in pfs_getattr()
233 vap->va_nlink = 1; in pfs_getattr()
234 nanotime(&vap->va_ctime); in pfs_getattr()
235 vap->va_atime = vap->va_mtime = vap->va_ctime; in pfs_getattr()
237 switch (pn->pn_type) { in pfs_getattr()
246 vap->va_mode = 0555; in pfs_getattr()
250 vap->va_mode = 0444; in pfs_getattr()
254 vap->va_mode = 0; in pfs_getattr()
259 vap->va_uid = proc->p_ucred->cr_ruid; in pfs_getattr()
260 vap->va_gid = proc->p_ucred->cr_rgid; in pfs_getattr()
262 vap->va_uid = 0; in pfs_getattr()
263 vap->va_gid = 0; in pfs_getattr()
266 if (pn->pn_attr != NULL) in pfs_getattr()
287 vn = va->a_vp; in pfs_ioctl()
293 pvd = vn->v_data; in pfs_ioctl()
294 pn = pvd->pvd_pn; in pfs_ioctl()
296 PFS_TRACE(("%s: %lx", pn->pn_name, va->a_command)); in pfs_ioctl()
299 if (vn->v_type != VREG) { in pfs_ioctl()
305 if (pn->pn_ioctl == NULL) { in pfs_ioctl()
314 if (!pfs_visible(curthread, pn, pvd->pvd_pid, &proc)) { in pfs_ioctl()
319 error = pn_ioctl(curthread, proc, pn, va->a_command, va->a_data); in pfs_ioctl()
334 struct vnode *vn = va->a_vp; in pfs_getextattr()
335 struct pfs_vdata *pvd = vn->v_data; in pfs_getextattr()
336 struct pfs_node *pn = pvd->pvd_pn; in pfs_getextattr()
340 PFS_TRACE(("%s", pn->pn_name)); in pfs_getextattr()
347 if (!pfs_visible(curthread, pn, pvd->pvd_pid, &proc)) in pfs_getextattr()
350 if (pn->pn_getextattr == NULL) in pfs_getextattr()
354 va->a_attrnamespace, va->a_name, va->a_uio, in pfs_getextattr()
355 va->a_size, va->a_cred); in pfs_getextattr()
369 struct vnode *vp = ap->a_vp; in pfs_vptocnp()
370 struct vnode **dvp = ap->a_vpp; in pfs_vptocnp()
371 struct pfs_vdata *pvd = vp->v_data; in pfs_vptocnp()
372 struct pfs_node *pd = pvd->pvd_pn; in pfs_vptocnp() local
375 char *buf = ap->a_buf; in pfs_vptocnp()
376 size_t *buflen = ap->a_buflen; in pfs_vptocnp()
378 pid_t pid = pvd->pvd_pid; in pfs_vptocnp()
384 pfs_lock(pd); in pfs_vptocnp()
386 if (vp->v_type == VDIR && pd->pn_type == pfstype_root) { in pfs_vptocnp()
389 pfs_unlock(pd); in pfs_vptocnp()
391 } else if (vp->v_type == VDIR && pd->pn_type == pfstype_procdir) { in pfs_vptocnp()
393 i -= len; in pfs_vptocnp()
400 len = strlen(pd->pn_name); in pfs_vptocnp()
401 i -= len; in pfs_vptocnp()
406 bcopy(pd->pn_name, buf + i, len); in pfs_vptocnp()
409 pn = pd->pn_parent; in pfs_vptocnp()
410 pfs_unlock(pd); in pfs_vptocnp()
412 mp = vp->v_mount; in pfs_vptocnp()
437 pfs_unlock(pd); in pfs_vptocnp()
447 struct vnode *vn = va->a_dvp; in pfs_lookup()
448 struct vnode **vpp = va->a_vpp; in pfs_lookup()
449 struct componentname *cnp = va->a_cnp; in pfs_lookup()
450 struct pfs_vdata *pvd = vn->v_data; in pfs_lookup()
451 struct pfs_node *pd = pvd->pvd_pn; in pfs_lookup() local
454 pid_t pid = pvd->pvd_pid; in pfs_lookup()
458 PFS_TRACE(("%.*s", (int)cnp->cn_namelen, cnp->cn_nameptr)); in pfs_lookup()
459 pfs_assert_not_owned(pd); in pfs_lookup()
461 if (vn->v_type != VDIR) in pfs_lookup()
463 KASSERT_PN_IS_DIR(pd); in pfs_lookup()
470 if ((cnp->cn_flags & ISLASTCN) && in pfs_lookup()
471 (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) in pfs_lookup()
475 if (cnp->cn_namelen >= PFS_NAMELEN) in pfs_lookup()
479 if (!pfs_visible(curthread, pd, pvd->pvd_pid, NULL)) in pfs_lookup()
483 namelen = cnp->cn_namelen; in pfs_lookup()
484 pname = cnp->cn_nameptr; in pfs_lookup()
486 pn = pd; in pfs_lookup()
492 mp = vn->v_mount; in pfs_lookup()
495 if (cnp->cn_flags & ISDOTDOT) { in pfs_lookup()
496 if (pd->pn_type == pfstype_root) in pfs_lookup()
513 KASSERT(pd->pn_parent != NULL, in pfs_lookup()
514 ("%s(): non-root directory has no parent", __func__)); in pfs_lookup()
519 * we assume that if this node is a procdir, its in pfs_lookup()
524 if (pd->pn_type == pfstype_procdir) in pfs_lookup()
526 pfs_lock(pd); in pfs_lookup()
527 pn = pd->pn_parent; in pfs_lookup()
528 pfs_unlock(pd); in pfs_lookup()
532 pfs_lock(pd); in pfs_lookup()
534 /* named node */ in pfs_lookup()
535 for (pn = pd->pn_nodes; pn != NULL; pn = pn->pn_next) in pfs_lookup()
536 if (pn->pn_type == pfstype_procdir) in pfs_lookup()
538 else if (strncmp(pname, pn->pn_name, namelen) == 0 && in pfs_lookup()
539 pn->pn_name[namelen] == '\0') { in pfs_lookup()
540 pfs_unlock(pd); in pfs_lookup()
544 /* process dependent node */ in pfs_lookup()
548 if ((pid = pid * 10 + pname[i] - '0') > PID_MAX) in pfs_lookup()
550 if (i == cnp->cn_namelen) { in pfs_lookup()
551 pfs_unlock(pd); in pfs_lookup()
556 pfs_unlock(pd); in pfs_lookup()
561 pfs_assert_not_owned(pd); in pfs_lookup()
573 if (cnp->cn_flags & ISDOTDOT) { in pfs_lookup()
582 if (cnp->cn_flags & MAKEENTRY && !VN_IS_DOOMED(vn)) in pfs_lookup()
586 if (cnp->cn_flags & ISDOTDOT) { in pfs_lookup()
600 struct vnode *vn = va->a_vp; in pfs_open()
601 struct pfs_vdata *pvd = vn->v_data; in pfs_open()
602 struct pfs_node *pn = pvd->pvd_pn; in pfs_open()
603 int mode = va->a_mode; in pfs_open()
605 PFS_TRACE(("%s (mode 0x%x)", pn->pn_name, mode)); in pfs_open()
633 uio = ssh->uio; in pfs_sbuf_uio_drain()
637 if (ssh->skip_bytes > 0) { in pfs_sbuf_uio_drain()
638 if (ssh->skip_bytes >= len) { in pfs_sbuf_uio_drain()
639 ssh->skip_bytes -= len; in pfs_sbuf_uio_drain()
643 data += ssh->skip_bytes; in pfs_sbuf_uio_drain()
644 len -= ssh->skip_bytes; in pfs_sbuf_uio_drain()
645 skipped = ssh->skip_bytes; in pfs_sbuf_uio_drain()
646 ssh->skip_bytes = 0; in pfs_sbuf_uio_drain()
651 return (-error); in pfs_sbuf_uio_drain()
655 * This is similar to the truncated read case for non-draining PFS in pfs_sbuf_uio_drain()
656 * sbufs, and should be handled appropriately in fill-routines. in pfs_sbuf_uio_drain()
658 if (uio->uio_resid == 0) in pfs_sbuf_uio_drain()
659 return (-ENOBUFS); in pfs_sbuf_uio_drain()
670 struct vnode *vn = va->a_vp; in pfs_read()
671 struct pfs_vdata *pvd = vn->v_data; in pfs_read()
672 struct pfs_node *pn = pvd->pvd_pn; in pfs_read()
673 struct uio *uio = va->a_uio; in pfs_read()
680 PFS_TRACE(("%s", pn->pn_name)); in pfs_read()
683 if (vn->v_type != VREG) in pfs_read()
687 if (!(pn->pn_flags & PFS_RD)) in pfs_read()
690 if (pn->pn_fill == NULL) in pfs_read()
697 if (!pfs_visible(curthread, pn, pvd->pvd_pid, &proc)) in pfs_read()
708 if (pn->pn_flags & PFS_RAWRD) { in pfs_read()
709 PFS_TRACE(("%zd resid", uio->uio_resid)); in pfs_read()
711 PFS_TRACE(("%zd resid", uio->uio_resid)); in pfs_read()
715 if (uio->uio_resid < 0 || uio->uio_offset < 0 || in pfs_read()
716 uio->uio_resid > OFF_MAX - uio->uio_offset) { in pfs_read()
720 buflen = uio->uio_offset + uio->uio_resid + 1; in pfs_read()
721 if (pn->pn_flags & PFS_AUTODRAIN) in pfs_read()
738 if (pn->pn_flags & PFS_AUTODRAIN) { in pfs_read()
739 ssh.skip_bytes = uio->uio_offset; in pfs_read()
757 if ((pn->pn_flags & PFS_AUTODRAIN)) { in pfs_read()
763 if (uio->uio_resid == 0 && error == ENOBUFS) in pfs_read()
770 buflen--; in pfs_read()
786 pfs_iterate(struct thread *td, struct proc *proc, struct pfs_node *pd, in pfs_iterate() argument
792 pfs_assert_owned(pd); in pfs_iterate()
795 /* first node */ in pfs_iterate()
796 *pn = pd->pn_nodes; in pfs_iterate()
797 } else if ((*pn)->pn_type != pfstype_procdir) { in pfs_iterate()
798 /* next node */ in pfs_iterate()
799 *pn = (*pn)->pn_next; in pfs_iterate()
801 if (*pn != NULL && (*pn)->pn_type == pfstype_procdir) { in pfs_iterate()
807 /* out of processes: next node */ in pfs_iterate()
809 *pn = (*pn)->pn_next; in pfs_iterate()
815 return (-1); in pfs_iterate()
844 struct vnode *vn = va->a_vp; in pfs_readdir()
845 struct pfs_vdata *pvd = vn->v_data; in pfs_readdir()
846 struct pfs_node *pd = pvd->pvd_pn; in pfs_readdir() local
847 pid_t pid = pvd->pvd_pid; in pfs_readdir()
858 KASSERT(pd->pn_info == vn->v_mount->mnt_data, in pfs_readdir()
860 PFS_TRACE(("%s pid %lu", pd->pn_name, (unsigned long)pid)); in pfs_readdir()
861 pfs_assert_not_owned(pd); in pfs_readdir()
863 if (vn->v_type != VDIR) in pfs_readdir()
865 KASSERT_PN_IS_DIR(pd); in pfs_readdir()
866 uio = va->a_uio; in pfs_readdir()
869 offset = uio->uio_offset; in pfs_readdir()
870 resid = uio->uio_resid; in pfs_readdir()
882 pfs_lock(pd); in pfs_readdir()
891 if (!pfs_visible_proc(curthread, pd, proc)) { in pfs_readdir()
894 pfs_unlock(pd); in pfs_readdir()
901 for (pn = NULL, p = NULL; offset > 0; offset -= PFS_DELEN) { in pfs_readdir()
902 if (pfs_iterate(curthread, proc, pd, &pn, &p) == -1) { in pfs_readdir()
908 pfs_unlock(pd); in pfs_readdir()
915 while (pfs_iterate(curthread, proc, pd, &pn, &p) != -1 && in pfs_readdir()
922 pfsent->entry.d_reclen = PFS_DELEN; in pfs_readdir()
923 pfsent->entry.d_fileno = pn_fileno(pn, pid); in pfs_readdir()
925 for (i = 0; i < PFS_NAMELEN - 1 && pn->pn_name[i] != '\0'; ++i) in pfs_readdir()
926 pfsent->entry.d_name[i] = pn->pn_name[i]; in pfs_readdir()
927 pfsent->entry.d_namlen = i; in pfs_readdir()
929 pfsent->entry.d_off = offset + PFS_DELEN; in pfs_readdir()
930 switch (pn->pn_type) { in pfs_readdir()
933 ("reached procdir node with p == NULL")); in pfs_readdir()
934 pfsent->entry.d_namlen = snprintf(pfsent->entry.d_name, in pfs_readdir()
935 PFS_NAMELEN, "%d", p->p_pid); in pfs_readdir()
941 pfsent->entry.d_type = DT_DIR; in pfs_readdir()
944 pfsent->entry.d_type = DT_REG; in pfs_readdir()
947 pfsent->entry.d_type = DT_LNK; in pfs_readdir()
950 panic("%s has unexpected node type: %d", pn->pn_name, pn->pn_type); in pfs_readdir()
952 PFS_TRACE(("%s", pfsent->entry.d_name)); in pfs_readdir()
953 dirent_terminate(&pfsent->entry); in pfs_readdir()
956 resid -= PFS_DELEN; in pfs_readdir()
962 pfs_unlock(pd); in pfs_readdir()
967 error = uiomove(&pfsent->entry, PFS_DELEN, uio); in pfs_readdir()
981 struct vnode *vn = va->a_vp; in pfs_readlink()
982 struct pfs_vdata *pvd = vn->v_data; in pfs_readlink()
983 struct pfs_node *pn = pvd->pvd_pn; in pfs_readlink()
984 struct uio *uio = va->a_uio; in pfs_readlink()
990 PFS_TRACE(("%s", pn->pn_name)); in pfs_readlink()
993 if (vn->v_type != VLNK) in pfs_readlink()
997 if (pn->pn_fill == NULL) in pfs_readlink()
1000 if (pvd->pvd_pid != NO_PID) { in pfs_readlink()
1001 if ((proc = pfind(pvd->pvd_pid)) == NULL) in pfs_readlink()
1003 if (proc->p_flag & P_WEXIT) { in pfs_readlink()
1045 struct vnode *vn = va->a_vp; in pfs_reclaim()
1046 struct pfs_vdata *pvd = vn->v_data; in pfs_reclaim()
1047 struct pfs_node *pn = pvd->pvd_pn; in pfs_reclaim()
1049 PFS_TRACE(("%s", pn->pn_name)); in pfs_reclaim()
1052 return (pfs_vncache_free(va->a_vp)); in pfs_reclaim()
1061 struct vnode *vn = va->a_vp; in pfs_setattr()
1062 struct pfs_vdata *pvd = vn->v_data; in pfs_setattr()
1063 struct pfs_node *pn = pvd->pvd_pn; in pfs_setattr()
1065 PFS_TRACE(("%s", pn->pn_name)); in pfs_setattr()
1078 struct vnode *vn = va->a_vp; in pfs_write()
1079 struct pfs_vdata *pvd = vn->v_data; in pfs_write()
1080 struct pfs_node *pn = pvd->pvd_pn; in pfs_write()
1081 struct uio *uio = va->a_uio; in pfs_write()
1086 PFS_TRACE(("%s", pn->pn_name)); in pfs_write()
1089 if (vn->v_type != VREG) in pfs_write()
1093 if (!(pn->pn_flags & PFS_WR)) in pfs_write()
1096 if (pn->pn_fill == NULL) in pfs_write()
1099 if (uio->uio_resid > PFS_MAXBUFSIZ) in pfs_write()
1106 if (!pfs_visible(curthread, pn, pvd->pvd_pid, &proc)) in pfs_write()
1113 if (pn->pn_flags & PFS_RAWWR) { in pfs_write()