diff options
author | jh <jh@FreeBSD.org> | 2010-09-27 17:47:09 +0000 |
---|---|---|
committer | jh <jh@FreeBSD.org> | 2010-09-27 17:47:09 +0000 |
commit | b6e78e30f23dbed7263727af46739f94ef85fd86 (patch) | |
tree | aac5e5193fff6dc7e4ad901a2ea6b4bab1a82a25 /sys/fs/devfs/devfs_vnops.c | |
parent | 0901947e8d8500bb8120febd32587bc1eeabca98 (diff) | |
download | FreeBSD-src-b6e78e30f23dbed7263727af46739f94ef85fd86.zip FreeBSD-src-b6e78e30f23dbed7263727af46739f94ef85fd86.tar.gz |
Add reference counting for devfs paths containing user created symbolic
links. The reference counting is needed to be able to determine if a
specific devfs path exists. For true device file paths we can traverse
the cdevp_list but a separate directory list is needed for user created
symbolic links.
Add a new directory entry flag DE_USER to mark entries which should
unreference their parent directory on deletion.
A new function to traverse cdevp_list and the directory list will be
introduced in a separate commit.
Idea from: kib
Reviewed by: kib
Diffstat (limited to 'sys/fs/devfs/devfs_vnops.c')
-rw-r--r-- | sys/fs/devfs/devfs_vnops.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index bbf0680..5f1063d 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -1564,6 +1564,7 @@ devfs_symlink(struct vop_symlink_args *ap) dd = ap->a_dvp->v_data; de = devfs_newdirent(ap->a_cnp->cn_nameptr, ap->a_cnp->cn_namelen); + de->de_flags = DE_USER; de->de_uid = 0; de->de_gid = 0; de->de_mode = 0755; @@ -1587,6 +1588,7 @@ devfs_symlink(struct vop_symlink_args *ap) de_dotdot = TAILQ_FIRST(&dd->de_dlist); /* "." */ de_dotdot = TAILQ_NEXT(de_dotdot, de_list); /* ".." */ TAILQ_INSERT_AFTER(&dd->de_dlist, de_dotdot, de, de_list); + devfs_dir_ref_de(dmp, dd); return (devfs_allocv(de, ap->a_dvp->v_mount, LK_EXCLUSIVE, ap->a_vpp)); } |