summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_disk.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2001-10-27 17:44:21 +0000
committerphk <phk@FreeBSD.org>2001-10-27 17:44:21 +0000
commita298958ff19ad5e4d8416a9623b9d3e0601eefa3 (patch)
tree9c14f1616c72955669bdf28ab19ab8d89829a984 /sys/kern/subr_disk.c
parent4c52c72d92026ab3c4f2e80242e639274b443e09 (diff)
downloadFreeBSD-src-a298958ff19ad5e4d8416a9623b9d3e0601eefa3.zip
FreeBSD-src-a298958ff19ad5e4d8416a9623b9d3e0601eefa3.tar.gz
Nudge the axe a bit closer to cdevsw[]:
Make it a panic to repeat make_dev() or destroy_dev(), this check should maybe be neutered when -current goes -stable. Whine if devsw() is called on anon dev_t's in a devfs system. Make a hack to avoid our lazy-eval disk code triggering the above whine. Fix the multiple make_dev() in disk code by making ${disk}${unit}s${slice} an alias/symlink to ${disk}${unit}s${slice}c
Diffstat (limited to 'sys/kern/subr_disk.c')
-rw-r--r--sys/kern/subr_disk.c57
1 files changed, 55 insertions, 2 deletions
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index bb52bf0..8e637ff 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -32,6 +32,50 @@ static d_psize_t diskpsize;
static LIST_HEAD(, disk) disklist = LIST_HEAD_INITIALIZER(&disklist);
+void disk_dev_synth(dev_t dev);
+
+void
+disk_dev_synth(dev_t dev)
+{
+ struct disk *dp;
+ int u, s, p;
+ dev_t pdev;
+
+ LIST_FOREACH(dp, &disklist, d_list) {
+ if (major(dev) != dp->d_devsw->d_maj)
+ continue;
+ u = dkunit(dev);
+ p = RAW_PART;
+ s = WHOLE_DISK_SLICE;
+ pdev = makedev(dp->d_devsw->d_maj, dkmakeminor(u, s, p));
+ s = dkslice(dev);
+ p = dkpart(dev);
+ if (s == WHOLE_DISK_SLICE && p == RAW_PART) {
+ /* XXX: actually should not happen */
+ dev = make_dev(pdev->si_devsw, dkmakeminor(u, s, p),
+ UID_ROOT, GID_OPERATOR, 0640, "%s%d",
+ dp->d_devsw->d_name, u);
+ dev_depends(pdev, dev);
+ return;
+ }
+ if (s == COMPATIBILITY_SLICE) {
+ dev = make_dev(pdev->si_devsw, dkmakeminor(u, s, p),
+ UID_ROOT, GID_OPERATOR, 0640, "%s%d%c",
+ dp->d_devsw->d_name, u, 'a' + p);
+ dev_depends(pdev, dev);
+ return;
+ }
+ dev = make_dev(pdev->si_devsw, dkmakeminor(u, s, p),
+ UID_ROOT, GID_OPERATOR, 0640, "%s%ds%d%c",
+ dp->d_devsw->d_name, u, s - BASE_SLICE + 1, 'a' + p);
+ dev_depends(pdev, dev);
+ if (p == RAW_PART)
+ make_dev_alias(dev, "%s%ds%d",
+ dp->d_devsw->d_name, u, s - BASE_SLICE + 1);
+ return;
+ }
+}
+
static void
disk_clone(void *arg, char *name, int namelen, dev_t *dev)
{
@@ -86,9 +130,18 @@ disk_clone(void *arg, char *name, int namelen, dev_t *dev)
p = name[i] - 'a';
}
- *dev = make_dev(pdev->si_devsw, dkmakeminor(u, s, p),
- UID_ROOT, GID_OPERATOR, 0640, name);
+ if (s >= BASE_SLICE)
+ *dev = make_dev(pdev->si_devsw, dkmakeminor(u, s, p),
+ UID_ROOT, GID_OPERATOR, 0640, "%s%ds%d%c",
+ pdev->si_devsw->d_name, u, s - BASE_SLICE + 1, p + 'a');
+ else
+ *dev = make_dev(pdev->si_devsw, dkmakeminor(u, s, p),
+ UID_ROOT, GID_OPERATOR, 0640, name);
dev_depends(pdev, *dev);
+ if (s >= BASE_SLICE && p == RAW_PART) {
+ make_dev_alias(*dev, "%s%ds%d",
+ pdev->si_devsw->d_name, u, s - BASE_SLICE + 1);
+ }
return;
}
}
OpenPOWER on IntegriCloud