aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_conf.c
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>2000-08-20 21:34:39 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>2000-08-20 21:34:39 +0000
commit3f54a085a603b050163611ce23972ee8de7636f1 (patch)
tree4a236ab334d49bc97f4741cc058e0ae301786c02 /sys/kern/kern_conf.c
parente0faad6850ddd7593f869132fc7647c1576e0f6d (diff)
downloadsrc-3f54a085a603b050163611ce23972ee8de7636f1.tar.gz
src-3f54a085a603b050163611ce23972ee8de7636f1.zip
Remove all traces of Julians DEVFS (incl from kern/subr_diskslice.c)
Remove old DEVFS support fields from dev_t. Make uid, gid & mode members of dev_t and set them in make_dev(). Use correct uid, gid & mode in make_dev in disk minilayer. Add support for registering alias names for a dev_t using the new function make_dev_alias(). These will show up as symlinks in DEVFS. Use makedev() rather than make_dev() for MFSs magic devices to prevent DEVFS from noticing this abuse. Add a field for DEVFS inode number in dev_t. Add new DEVFS in fs/devfs. Add devfs cloning to: disk minilayer (ie: ad(4), sd(4), cd(4) etc etc) md(4), tun(4), bpf(4), fd(4) If DEVFS add -d flag to /sbin/inits args to make it mount devfs. Add commented out DEVFS to GENERIC
Notes
Notes: svn path=/head/; revision=64880
Diffstat (limited to 'sys/kern/kern_conf.c')
-rw-r--r--sys/kern/kern_conf.c69
1 files changed, 54 insertions, 15 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index d6116f75513f..1e344e357450 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -195,13 +195,33 @@ makebdev(int x, int y)
return (makedev(bmaj2cmaj[x], y));
}
+static dev_t
+allocdev(void)
+{
+ static int stashed;
+ struct specinfo *si;
+
+ if (stashed >= DEVT_STASH) {
+ MALLOC(si, struct specinfo *, sizeof(*si), M_DEVT,
+ M_USE_RESERVE);
+ bzero(si, sizeof(*si));
+ } else if (LIST_FIRST(&dev_free)) {
+ si = LIST_FIRST(&dev_free);
+ LIST_REMOVE(si, si_hash);
+ } else {
+ si = devt_stash + stashed++;
+ si->si_flags |= SI_STASHED;
+ }
+ LIST_INIT(&si->si_names);
+ return (si);
+}
+
dev_t
makedev(int x, int y)
{
struct specinfo *si;
udev_t udev;
int hash;
- static int stashed;
if (x == umajor(NOUDEV) && y == uminor(NOUDEV))
Debugger("makedev of NOUDEV");
@@ -211,17 +231,7 @@ makedev(int x, int y)
if (si->si_udev == udev)
return (si);
}
- if (stashed >= DEVT_STASH) {
- MALLOC(si, struct specinfo *, sizeof(*si), M_DEVT,
- M_USE_RESERVE);
- bzero(si, sizeof(*si));
- } else if (LIST_FIRST(&dev_free)) {
- si = LIST_FIRST(&dev_free);
- LIST_REMOVE(si, si_hash);
- } else {
- si = devt_stash + stashed++;
- si->si_flags |= SI_STASHED;
- }
+ si = allocdev();
si->si_udev = udev;
LIST_INSERT_HEAD(&dev_hash[hash], si, si_hash);
return (si);
@@ -230,7 +240,7 @@ makedev(int x, int y)
void
freedev(dev_t dev)
{
- int hash;
+ dev_t adev;
if (!free_devt)
return;
@@ -238,7 +248,11 @@ freedev(dev_t dev)
return;
if (dev->si_devsw || dev->si_drv1 || dev->si_drv2)
return;
- hash = dev->si_udev % DEVT_HASH;
+ while (!LIST_EMPTY(&dev->si_names)) {
+ adev = LIST_FIRST(&dev->si_names);
+ adev->si_drv1 = NULL;
+ freedev(adev);
+ }
LIST_REMOVE(dev, si_hash);
if (dev->si_flags & SI_STASHED) {
bzero(dev, sizeof(*dev));
@@ -304,9 +318,34 @@ make_dev(struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, char
dev->si_name[i] = '\0';
va_end(ap);
dev->si_devsw = devsw;
+ dev->si_uid = uid;
+ dev->si_gid = gid;
+ dev->si_mode = perms;
+
+ if (devfs_create_hook)
+ devfs_create_hook(dev);
+ return (dev);
+}
+
+dev_t
+make_dev_alias(dev_t pdev, char *fmt, ...)
+{
+ dev_t dev;
+ va_list ap;
+ int i;
+
+ dev = allocdev();
+ dev->si_flags |= SI_ALIAS;
+ dev->si_drv1 = pdev;
+ LIST_INSERT_HEAD(&pdev->si_names, dev, si_hash);
+
+ va_start(ap, fmt);
+ i = kvprintf(fmt, NULL, dev->si_name, 32, ap);
+ dev->si_name[i] = '\0';
+ va_end(ap);
if (devfs_create_hook)
- devfs_create_hook(dev, uid, gid, perms);
+ devfs_create_hook(dev);
return (dev);
}