diff options
author | phk <phk@FreeBSD.org> | 2000-08-27 14:46:36 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2000-08-27 14:46:36 +0000 |
commit | 1109c8321563e16ebc0b1632cb2e954971f036c3 (patch) | |
tree | c9f1839b54d0723eb8e61972f56384a6e231f8dd /sys/fs/devfs/devfs_devs.c | |
parent | 7173fac52902acf879b833b7ade03cd2c55aa45a (diff) | |
download | FreeBSD-src-1109c8321563e16ebc0b1632cb2e954971f036c3.zip FreeBSD-src-1109c8321563e16ebc0b1632cb2e954971f036c3.tar.gz |
Reorder vop's alphabetically.
Smarter use of devfs_allocv() (from bp@)
Introduce devfs_find()
".." fixes to devfs_lookup (from bp@)
Diffstat (limited to 'sys/fs/devfs/devfs_devs.c')
-rw-r--r-- | sys/fs/devfs/devfs_devs.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/sys/fs/devfs/devfs_devs.c b/sys/fs/devfs/devfs_devs.c index 8b301c9..c3eb101 100644 --- a/sys/fs/devfs/devfs_devs.c +++ b/sys/fs/devfs/devfs_devs.c @@ -42,6 +42,21 @@ #include <fs/devfs/devfs.h> struct devfs_dirent * +devfs_find(struct devfs_dirent *dd, const char *name, int namelen) +{ + struct devfs_dirent *de; + + TAILQ_FOREACH(de, &dd->de_dlist, de_list) { + if (namelen != de->de_dirent->d_namlen) + continue; + if (bcmp(name, de->de_dirent->d_name, namelen) != 0) + continue; + break; + } + return (de); +} + +struct devfs_dirent * devfs_newdirent(char *name, int namelen) { int i; @@ -161,25 +176,20 @@ devfs_populate(struct devfs_mount *dm) continue; dd = dm->dm_basedir; s = dev->si_name; - nextdir: - for (q = s; *q != '/' && *q != '\0'; q++) - continue; - if (*q == '/') { - TAILQ_FOREACH(de, &dd->de_dlist, de_list) { - if (de->de_dirent->d_namlen != q - s) - continue; - if (bcmp(de->de_dirent->d_name, s, q - s)) - continue; - goto fdir; + for (;;) { + for (q = s; *q != '/' && *q != '\0'; q++) + continue; + if (*q != '/') + break; + de = devfs_find(dd, s, q - s); + if (de == NULL) { + de = devfs_vmkdir(s, q - s, dd); + de->de_inode = dm->dm_inode++; + TAILQ_INSERT_TAIL(&dd->de_dlist, de, de_list); + dd->de_links++; } - de = devfs_vmkdir(s, q - s, dd); - de->de_inode = dm->dm_inode++; - TAILQ_INSERT_TAIL(&dd->de_dlist, de, de_list); - dd->de_links++; - fdir: s = q + 1; dd = de; - goto nextdir; } de = devfs_newdirent(s, q - s); if (dev->si_flags & SI_ALIAS) { @@ -200,6 +210,7 @@ devfs_populate(struct devfs_mount *dm) de->de_dirent->d_type = DT_CHR; } dm->dm_dirent[i] = de; + de->de_dir = dd; TAILQ_INSERT_TAIL(&dd->de_dlist, de, de_list); #if 0 printf("Add ino%d %s\n", i, dev->si_name); |