From 1109c8321563e16ebc0b1632cb2e954971f036c3 Mon Sep 17 00:00:00 2001 From: phk Date: Sun, 27 Aug 2000 14:46:36 +0000 Subject: Reorder vop's alphabetically. Smarter use of devfs_allocv() (from bp@) Introduce devfs_find() ".." fixes to devfs_lookup (from bp@) --- sys/fs/devfs/devfs_devs.c | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) (limited to 'sys/fs/devfs/devfs_devs.c') 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 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); -- cgit v1.1