Lines Matching defs:node
105 mode_t mode, char *target, dev_t rdev, tmpfs_node_t **node)
208 *node = nnode;
217 tmpfs_free_node(tmpfs_mount_t *tmp, tmpfs_node_t *node)
222 LIST_REMOVE(node, tn_entries);
225 switch (node->tn_type) {
227 if (node->tn_size > 0) {
228 KASSERT(node->tn_size <= SIZE_MAX);
229 tmpfs_strname_free(tmp, node->tn_spec.tn_lnk.tn_link,
230 node->tn_size);
238 objsz = PAGE_SIZE * node->tn_spec.tn_reg.tn_aobj_pages;
242 if (node->tn_spec.tn_reg.tn_aobj != NULL) {
243 uao_detach(node->tn_spec.tn_reg.tn_aobj);
244 node->tn_spec.tn_reg.tn_aobj = NULL;
248 KASSERT(TAILQ_EMPTY(&node->tn_spec.tn_dir.tn_dir));
249 KASSERT(node->tn_spec.tn_dir.tn_parent == NULL ||
250 node == tmp->tm_root);
257 if (node->tn_id == tmp->tm_highest_inode)
261 /* mutex_destroy(&node->tn_nlock); */
262 tmpfs_node_put(tmp, node);
272 tmpfs_vnode_get(struct mount *mp, tmpfs_node_t *node, struct vnode **vpp)
279 if ((vp = node->tn_vnode) != NULL) {
280 /* atomic_or_ulong(&node->tn_gen, TMPFS_RECLAIMING_BIT); */
281 node->tn_gen |= TMPFS_RECLAIMING_BIT;
282 rw_exit_write(&node->tn_nlock);
285 rw_enter_write(&node->tn_nlock);
288 /* atomic_and_ulong(&node->tn_gen, ~TMPFS_RECLAIMING_BIT); */
289 node->tn_gen &= ~TMPFS_RECLAIMING_BIT;
293 if (TMPFS_NODE_RECLAIMING(node)) {
294 /* atomic_and_ulong(&node->tn_gen, ~TMPFS_RECLAIMING_BIT); */
295 node->tn_gen &= ~TMPFS_RECLAIMING_BIT;
303 if (node->tn_type == VREG) {
304 struct uvm_object *uobj = node->tn_spec.tn_reg.tn_aobj;
312 rw_exit_write(&node->tn_nlock);
316 rrw_init_flags(&node->tn_vlock, "tnode", RWL_DUPOK | RWL_IS_VNODE);
317 vp->v_type = node->tn_type;
320 switch (node->tn_type) {
324 if ((nvp = checkalias(vp, node->tn_spec.tn_dev.tn_rdev, mp))) {
331 node->tn_vnode = vp;
335 vp->v_flag |= node->tn_spec.tn_dir.tn_parent == node ?
351 uvm_vnp_setsize(vp, node->tn_size);
352 vp->v_data = node;
353 node->tn_vnode = vp;
355 rw_exit_write(&node->tn_nlock);
373 tmpfs_node_t *dnode = VP_TO_TMPFS_DIR(dvp), *node;
400 /* Allocate a node that represents the new file. */
402 dnode->tn_gid, vap->va_mode, target, vap->va_rdev, &node);
409 tmpfs_free_node(tmp, node);
414 rw_enter_write(&node->tn_nlock);
415 error = tmpfs_vnode_get(dvp->v_mount, node, vpp);
418 tmpfs_free_node(tmp, node);
423 tmpfs_dir_attach(dnode, de, node);
474 * => Increases link count on the associated node.
475 * => Increases link count on directory node, if our node is VDIR.
480 tmpfs_dir_attach(tmpfs_node_t *dnode, tmpfs_dirent_t *de, tmpfs_node_t *node)
493 de->td_node = node;
494 KASSERT(node->tn_links < LINK_MAX);
495 node->tn_links++;
498 node->tn_dirent_hint = de;
506 if (node->tn_type == VDIR) {
508 KASSERT(node->tn_spec.tn_dir.tn_parent == NULL);
509 node->tn_spec.tn_dir.tn_parent = dnode;
516 TMPFS_VALIDATE_DIR(node);
525 * => Decreases link count on the associated node.
526 * => Decreases the link count on directory node, if our node is VDIR.
532 tmpfs_node_t *node = de->td_node;
540 node->tn_dirent_hint = NULL;
542 KASSERT(node->tn_links > 0);
543 node->tn_links--;
544 if ((vp = node->tn_vnode) != NULL) {
546 VN_KNOTE(vp, node->tn_links ? NOTE_LINK : NOTE_DELETE);
550 if (node->tn_type == VDIR) {
551 KASSERT(node->tn_spec.tn_dir.tn_parent == dnode);
552 node->tn_spec.tn_dir.tn_parent = NULL;
582 tmpfs_dir_lookup(tmpfs_node_t *node, struct componentname *cnp)
588 KASSERT(VOP_ISLOCKED(node->tn_vnode));
591 TMPFS_VALIDATE_DIR(node);
593 TAILQ_FOREACH(de, &node->tn_spec.tn_dir.tn_dir, td_entries) {
600 tmpfs_update(node, TMPFS_NODE_ACCESSED);
611 tmpfs_dir_cached(tmpfs_node_t *node)
613 tmpfs_dirent_t *de = node->tn_dirent_hint;
615 KASSERT(VOP_ISLOCKED(node->tn_vnode));
620 KASSERT(de->td_node == node);
626 return (node->tn_type != VDIR && node->tn_links > 1) ? NULL : de;
681 tmpfs_dir_lookupbyseq(tmpfs_node_t *node, off_t seq)
683 tmpfs_dirent_t *de = node->tn_spec.tn_dir.tn_readdir_lastp;
685 TMPFS_VALIDATE_DIR(node);
695 TAILQ_FOREACH(de, &node->tn_spec.tn_dir.tn_dir, td_entries) {
709 tmpfs_dir_getdotents(tmpfs_node_t *node, struct dirent *dp, struct uio *uio)
717 dp->d_fileno = node->tn_id;
722 dp->d_fileno = node->tn_spec.tn_dir.tn_parent->tn_id;
724 de = TAILQ_FIRST(&node->tn_spec.tn_dir.tn_dir);
725 next = de ? tmpfs_dir_getseq(node, de) : TMPFS_DIRSEQ_EOF;
754 tmpfs_dir_getdents(tmpfs_node_t *node, struct uio *uio)
760 KASSERT(VOP_ISLOCKED(node->tn_vnode));
761 TMPFS_VALIDATE_DIR(node);
765 if ((error = tmpfs_dir_getdotents(node, &dent, uio)) != 0) {
770 if ((error = tmpfs_dir_getdotents(node, &dent, uio)) != 0) {
780 de = tmpfs_dir_lookupbyseq(node, uio->uio_offset);
832 dent.d_off = tmpfs_dir_getseq(node, next_de);
850 uio->uio_offset = de ? tmpfs_dir_getseq(node, de) : TMPFS_DIRSEQ_EOF;
851 node->tn_spec.tn_dir.tn_readdir_lastp = de;
853 tmpfs_update(node, TMPFS_NODE_ACCESSED);
872 tmpfs_node_t *node = VP_TO_TMPFS_NODE(vp);
873 struct uvm_object *uobj = node->tn_spec.tn_reg.tn_aobj;
882 oldsize = node->tn_size;
885 KASSERT(oldpages == node->tn_spec.tn_reg.tn_aobj_pages);
901 node->tn_spec.tn_reg.tn_aobj_pages = newpages;
902 node->tn_size = newsize;
910 if (tmpfs_uio_cached(node))
911 tmpfs_uio_uncache(node);
920 if (tmpfs_uio_cached(node))
921 tmpfs_uio_uncache(node);
928 error = tmpfs_zeropg(node, trunc_page(oldsize), pgoff);
944 tmpfs_node_t *node = VP_TO_TMPFS_NODE(vp);
953 if (cred->cr_uid != node->tn_uid && (error = suser_ucred(cred)))
957 if (node->tn_flags & (SF_IMMUTABLE | SF_APPEND) &&
960 node->tn_flags = flags;
962 if (node->tn_flags & (SF_IMMUTABLE | SF_APPEND) ||
965 node->tn_flags &= SF_SETTABLE;
966 node->tn_flags |= (flags & UF_SETTABLE);
969 tmpfs_update(node, TMPFS_NODE_CHANGED);
981 tmpfs_node_t *node = VP_TO_TMPFS_NODE(vp);
991 if (node->tn_flags & (IMMUTABLE | APPEND))
994 if (cred->cr_uid != node->tn_uid && (error = suser_ucred(cred)))
999 if (!groupmember(node->tn_gid, cred) && (mode & S_ISGID))
1003 node->tn_mode = (mode & ALLPERMS);
1004 tmpfs_update(node, TMPFS_NODE_CHANGED);
1005 if ((vp->v_flag & VTEXT) && (node->tn_mode & S_ISTXT) == 0)
1020 tmpfs_node_t *node = VP_TO_TMPFS_NODE(vp);
1028 uid = node->tn_uid;
1031 gid = node->tn_gid;
1039 if (node->tn_flags & (IMMUTABLE | APPEND))
1042 if ((cred->cr_uid != node->tn_uid || uid != node->tn_uid ||
1043 (gid != node->tn_gid && !groupmember(gid, cred))) &&
1047 node->tn_uid = uid;
1048 node->tn_gid = gid;
1049 tmpfs_update(node, TMPFS_NODE_CHANGED);
1060 tmpfs_node_t *node = VP_TO_TMPFS_NODE(vp);
1087 if (node->tn_flags & (IMMUTABLE | APPEND)) {
1103 tmpfs_node_t *node = VP_TO_TMPFS_NODE(vp);
1113 if (node->tn_flags & (IMMUTABLE | APPEND))
1116 if (cred->cr_uid != node->tn_uid && (error = suser_ucred(cred)) &&
1122 node->tn_atime = *atime;
1125 node->tn_mtime = *mtime;
1139 tmpfs_update(tmpfs_node_t *node, int flags)
1146 node->tn_atime = nowtm;
1149 node->tn_mtime = nowtm;
1152 node->tn_ctime = nowtm;
1159 tmpfs_node_t *node = VP_TO_TMPFS_NODE(vp);
1166 if (node->tn_size == length) {
1172 tmpfs_update(node, TMPFS_NODE_CHANGED | TMPFS_NODE_MODIFIED);
1179 tmpfs_uio_cached(tmpfs_node_t *node)
1181 int pgnum_valid = (node->tn_pgnum != (voff_t)-1);
1182 int pgptr_valid = (node->tn_pgptr != (vaddr_t)NULL);
1188 tmpfs_uio_lookup(tmpfs_node_t *node, voff_t pgnum)
1190 if (tmpfs_uio_cached(node) == 1 && node->tn_pgnum == pgnum)
1191 return node->tn_pgptr;
1197 tmpfs_uio_uncache(tmpfs_node_t *node)
1199 KASSERT(node->tn_pgnum != (voff_t)-1);
1200 KASSERT(node->tn_pgptr != (vaddr_t)NULL);
1201 uvm_unmap(kernel_map, node->tn_pgptr, node->tn_pgptr + PAGE_SIZE);
1202 node->tn_pgnum = (voff_t)-1;
1203 node->tn_pgptr = (vaddr_t)NULL;
1207 tmpfs_uio_cache(tmpfs_node_t *node, voff_t pgnum, vaddr_t pgptr)
1209 KASSERT(node->tn_pgnum == (voff_t)-1);
1210 KASSERT(node->tn_pgptr == (vaddr_t)NULL);
1211 node->tn_pgnum = pgnum;
1212 node->tn_pgptr = pgptr;
1221 tmpfs_uiomove(tmpfs_node_t *node, struct uio *uio, vsize_t len)
1232 va = tmpfs_uio_lookup(node, pgnum);
1245 if (tmpfs_uio_cached(node))
1246 tmpfs_uio_uncache(node);
1248 uao_reference(node->tn_uobj);
1250 error = uvm_map(kernel_map, &va, round_page(pgoff + sz), node->tn_uobj,
1254 uao_detach(node->tn_uobj); /* Drop reference. */
1260 tmpfs_uio_cache(node, pgnum, va);
1268 tmpfs_zeropg(tmpfs_node_t *node, voff_t pgnum, vaddr_t pgoff)
1273 KASSERT(tmpfs_uio_cached(node) == 0);
1275 uao_reference(node->tn_uobj);
1277 error = uvm_map(kernel_map, &va, PAGE_SIZE, node->tn_uobj, pgnum, 0,
1281 uao_detach(node->tn_uobj); /* Drop reference. */