diff options
author | phk <phk@FreeBSD.org> | 2000-08-20 21:34:39 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2000-08-20 21:34:39 +0000 |
commit | b648921accec69a7e5c83e915ded3037cbca7f3d (patch) | |
tree | fa2e43c05e3c1d31732408f806d72db091c03d14 /sys/kern/subr_disk.c | |
parent | 1c624ac57c791b6df4b51eb86e04dc404052c700 (diff) | |
download | FreeBSD-src-b648921accec69a7e5c83e915ded3037cbca7f3d.zip FreeBSD-src-b648921accec69a7e5c83e915ded3037cbca7f3d.tar.gz |
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
Diffstat (limited to 'sys/kern/subr_disk.c')
-rw-r--r-- | sys/kern/subr_disk.c | 77 |
1 files changed, 75 insertions, 2 deletions
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c index 8bb0c6d..77fc4ee 100644 --- a/sys/kern/subr_disk.c +++ b/sys/kern/subr_disk.c @@ -10,6 +10,8 @@ * */ +#include "opt_devfs.h" + #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -21,6 +23,12 @@ #include <sys/sysctl.h> #include <machine/md_var.h> +#ifdef DEVFS +#include <sys/eventhandler.h> +#include <fs/devfs/devfs.h> +#include <sys/ctype.h> +#endif + MALLOC_DEFINE(M_DISK, "disk", "disk data"); static d_strategy_t diskstrategy; @@ -30,7 +38,65 @@ static d_ioctl_t diskioctl; static d_psize_t diskpsize; static LIST_HEAD(, disk) disklist = LIST_HEAD_INITIALIZER(&disklist); - + +#ifdef DEVFS +static void +disk_clone(void *arg, char *name, int namelen, dev_t *dev) +{ + struct disk *dp; + char const *d; + int i, u, s, p; + dev_t pdev; + + if (*dev != NODEV) + return; + + LIST_FOREACH(dp, &disklist, d_list) { + d = dp->d_devsw->d_name; + i = strlen(d); + if (bcmp(d, name, i) != 0) + continue; + u = 0; + if (!isdigit(name[i])) + continue; + while (isdigit(name[i])) { + u *= 10; + u += name[i++] - '0'; + } + p = RAW_PART; + s = WHOLE_DISK_SLICE; + pdev = makedev(dp->d_devsw->d_maj, dkmakeminor(u, s, p)); + if (pdev->si_disk == NULL) + continue; + if (name[i] != '\0') { + if (name[i] == 's') { + s = 0; + i++; + if (!isdigit(name[i])) + continue; + while (isdigit(name[i])) { + s *= 10; + s += name[i++] - '0'; + } + s += BASE_SLICE - 1; + } else { + s = COMPATIBILITY_SLICE; + } + if (name[i] == '\0') + ; + else if (name[i] < 'a' || name[i] > 'h') + continue; + else + p = name[i] - 'a'; + } + + *dev = make_dev(pdev->si_devsw, dkmakeminor(u, s, p), + UID_ROOT, GID_OPERATOR, 0640, name); + return; + } +} +#endif + static void inherit_raw(dev_t pdev, dev_t dev) { @@ -45,6 +111,7 @@ inherit_raw(dev_t pdev, dev_t dev) dev_t disk_create(int unit, struct disk *dp, int flags, struct cdevsw *cdevsw, struct cdevsw *proto) { + static int once; dev_t dev; bzero(dp, sizeof(*dp)); @@ -63,13 +130,19 @@ disk_create(int unit, struct disk *dp, int flags, struct cdevsw *cdevsw, struct if (bootverbose) printf("Creating DISK %s%d\n", cdevsw->d_name, unit); dev = make_dev(proto, dkmakeminor(unit, WHOLE_DISK_SLICE, RAW_PART), - 0, 0, 0, "%s%d", cdevsw->d_name, unit); + UID_ROOT, GID_OPERATOR, 0640, "%s%d", cdevsw->d_name, unit); dev->si_disk = dp; dp->d_dev = dev; dp->d_dsflags = flags; dp->d_devsw = cdevsw; LIST_INSERT_HEAD(&disklist, dp, d_list); + if (!once) { +#ifdef DEVFS + EVENTHANDLER_REGISTER(devfs_clone, disk_clone, 0, 1000); +#endif + once++; + } return (dev); } |