summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2000-09-19 10:28:44 +0000
committerphk <phk@FreeBSD.org>2000-09-19 10:28:44 +0000
commit6023f979709dc325fe614123710e7faa12ba79f9 (patch)
treec347201698c5958ef6e577c73bf7f710c905f8db
parentbc8d9c4814a55bf29cd2c010b5a0a58a79337d46 (diff)
downloadFreeBSD-src-6023f979709dc325fe614123710e7faa12ba79f9.zip
FreeBSD-src-6023f979709dc325fe614123710e7faa12ba79f9.tar.gz
Rename lminor() to dev2unit(). This function gives a linear unit number
which hides the 'hole' in the minor bits. Introduce unit2minor() to do the reverse operation. Fix some some make_dev() calls which didn't use UID_* or GID_* macros. Kill the v_hashchain alias macro, it hides the real relationship. Introduce experimental SI_CHEAPCLONE flag set it on cloned bpfs.
-rw-r--r--sys/kern/kern_conf.c9
-rw-r--r--sys/kern/tty_pty.c4
-rw-r--r--sys/kern/vfs_export.c4
-rw-r--r--sys/kern/vfs_subr.c4
-rw-r--r--sys/net/bpf.c8
-rw-r--r--sys/net/if_tap.c4
-rw-r--r--sys/net/if_tun.c4
-rw-r--r--sys/sys/conf.h5
-rw-r--r--sys/sys/linedisc.h5
9 files changed, 29 insertions, 18 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index 6121ed7..90f667f 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -178,7 +178,7 @@ minor(dev_t x)
}
int
-lminor(dev_t x)
+dev2unit(dev_t x)
{
int i;
@@ -188,6 +188,13 @@ lminor(dev_t x)
return ((i & 0xff) | (i >> 8));
}
+int
+unit2minor(int unit)
+{
+
+ return ((unit & 0xff) | ((unit << 8) & ~0xffff));
+}
+
dev_t
makebdev(int x, int y)
{
diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c
index e8e7bbe..507a5aa 100644
--- a/sys/kern/tty_pty.c
+++ b/sys/kern/tty_pty.c
@@ -150,9 +150,9 @@ ptyinit(n)
pt = malloc(sizeof(*pt), M_PTY, M_WAITOK);
bzero(pt, sizeof(*pt));
pt->devs = devs = make_dev(&pts_cdevsw, n,
- 0, 0, 0666, "tty%c%r", names[n / 32], n % 32);
+ UID_ROOT, GID_WHEEL, 0666, "tty%c%r", names[n / 32], n % 32);
pt->devc = devc = make_dev(&ptc_cdevsw, n,
- 0, 0, 0666, "pty%c%r", names[n / 32], n % 32);
+ UID_ROOT, GID_WHEEL, 0666, "pty%c%r", names[n / 32], n % 32);
devs->si_drv1 = devc->si_drv1 = pt;
devs->si_tty = devc->si_tty = &pt->pt_tty;
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index bebc3c9..9814fd6 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -1861,7 +1861,7 @@ vgonel(vp, p)
*/
if ((vp->v_type == VBLK || vp->v_type == VCHR) && vp->v_rdev != NULL) {
simple_lock(&spechash_slock);
- SLIST_REMOVE(&vp->v_hashchain, vp, vnode, v_specnext);
+ SLIST_REMOVE(&vp->v_rdev->si_hlist, vp, vnode, v_specnext);
freedev(vp->v_rdev);
simple_unlock(&spechash_slock);
vp->v_rdev = NULL;
@@ -1929,7 +1929,7 @@ vcount(vp)
count = 0;
simple_lock(&spechash_slock);
- SLIST_FOREACH(vq, &vp->v_hashchain, v_specnext)
+ SLIST_FOREACH(vq, &vp->v_rdev->si_hlist, v_specnext)
count += vq->v_usecount;
simple_unlock(&spechash_slock);
return (count);
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index bebc3c9..9814fd6 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -1861,7 +1861,7 @@ vgonel(vp, p)
*/
if ((vp->v_type == VBLK || vp->v_type == VCHR) && vp->v_rdev != NULL) {
simple_lock(&spechash_slock);
- SLIST_REMOVE(&vp->v_hashchain, vp, vnode, v_specnext);
+ SLIST_REMOVE(&vp->v_rdev->si_hlist, vp, vnode, v_specnext);
freedev(vp->v_rdev);
simple_unlock(&spechash_slock);
vp->v_rdev = NULL;
@@ -1929,7 +1929,7 @@ vcount(vp)
count = 0;
simple_lock(&spechash_slock);
- SLIST_FOREACH(vq, &vp->v_hashchain, v_specnext)
+ SLIST_FOREACH(vq, &vp->v_rdev->si_hlist, v_specnext)
count += vq->v_usecount;
simple_unlock(&spechash_slock);
return (count);
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index 18433a3..f4da899 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -363,7 +363,8 @@ bpfopen(dev, flags, fmt, p)
*/
if (d)
return (EBUSY);
- make_dev(&bpf_cdevsw, minor(dev), 0, 0, 0600, "bpf%d", lminor(dev));
+ make_dev(&bpf_cdevsw, minor(dev), UID_ROOT, GID_WHEEL, 0600,
+ "bpf%d", dev2unit(dev));
MALLOC(d, struct bpf_d *, sizeof(*d), M_BPF, M_WAITOK);
bzero(d, sizeof(*d));
dev->si_drv1 = d;
@@ -1377,8 +1378,9 @@ bpf_clone(arg, name, namelen, dev)
return;
if (dev_stdclone(name, NULL, "bpf", &u) != 1)
return;
- /* XXX: minor encoding if u > 255 */
- *dev = make_dev(&bpf_cdevsw, u, 0, 0, 0600, "bpf%d", u);
+ *dev = make_dev(&bpf_cdevsw, unit2minor(u), UID_ROOT, GID_WHEEL, 0600,
+ "bpf%d", u);
+ (*dev)->si_flags |= SI_CHEAPCLONE;
return;
}
diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c
index aad9101..6c88075 100644
--- a/sys/net/if_tap.c
+++ b/sys/net/if_tap.c
@@ -211,12 +211,12 @@ tapcreate(dev)
/* select device: tap or vmnet */
if (minor(dev) & VMNET_DEV_MASK) {
name = VMNET;
- unit = lminor(dev) & 0xff;
+ unit = dev2unit(dev) & 0xff;
tp->tap_flags |= TAP_VMNET;
}
else {
name = TAP;
- unit = lminor(dev);
+ unit = dev2unit(dev);
}
tp->tap_dev = make_dev(&tap_cdevsw, minor(dev), UID_ROOT, GID_WHEEL,
diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c
index 8079566..4b47ec6 100644
--- a/sys/net/if_tun.c
+++ b/sys/net/if_tun.c
@@ -129,14 +129,14 @@ tuncreate(dev)
struct ifnet *ifp;
dev = make_dev(&tun_cdevsw, minor(dev),
- UID_UUCP, GID_DIALER, 0600, "tun%d", lminor(dev));
+ UID_UUCP, GID_DIALER, 0600, "tun%d", dev2unit(dev));
MALLOC(sc, struct tun_softc *, sizeof(*sc), M_TUN, M_WAITOK);
bzero(sc, sizeof *sc);
sc->tun_flags = TUN_INITED;
ifp = &sc->tun_if;
- ifp->if_unit = lminor(dev);
+ ifp->if_unit = dev2unit(dev);
ifp->if_name = "tun";
ifp->if_mtu = TUNMTU;
ifp->if_ioctl = tunifioctl;
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 48403b5..8c0a7d1 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -56,6 +56,7 @@ struct specinfo {
#define SI_STASHED 0x0001 /* created in stashed storage */
#define SI_ALIAS 0x0002 /* carrier of alias name */
#define SI_NAMED 0x0004 /* make_dev{_alias} has been called */
+#define SI_CHEAPCLONE 0x0008 /* can be removed_dev'ed when vnode reclaims */
struct timespec si_atime;
struct timespec si_ctime;
struct timespec si_mtime;
@@ -93,7 +94,6 @@ struct specinfo {
/*
* Exported shorthand
*/
-#define v_hashchain v_rdev->si_hlist
#define v_specmountpoint v_rdev->si_mountpoint
/*
@@ -291,7 +291,8 @@ int iszerodev __P((dev_t dev));
dev_t makebdev __P((int maj, int min));
dev_t make_dev __P((struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, char *fmt, ...)) __printflike(6, 7);
dev_t make_dev_alias __P((dev_t pdev, char *fmt, ...)) __printflike(2, 3);
-int lminor __P((dev_t dev));
+int dev2unit __P((dev_t dev));
+int unit2minor __P((int unit));
void setconf __P((void));
dev_t getdiskbyname(char *name);
diff --git a/sys/sys/linedisc.h b/sys/sys/linedisc.h
index 48403b5..8c0a7d1 100644
--- a/sys/sys/linedisc.h
+++ b/sys/sys/linedisc.h
@@ -56,6 +56,7 @@ struct specinfo {
#define SI_STASHED 0x0001 /* created in stashed storage */
#define SI_ALIAS 0x0002 /* carrier of alias name */
#define SI_NAMED 0x0004 /* make_dev{_alias} has been called */
+#define SI_CHEAPCLONE 0x0008 /* can be removed_dev'ed when vnode reclaims */
struct timespec si_atime;
struct timespec si_ctime;
struct timespec si_mtime;
@@ -93,7 +94,6 @@ struct specinfo {
/*
* Exported shorthand
*/
-#define v_hashchain v_rdev->si_hlist
#define v_specmountpoint v_rdev->si_mountpoint
/*
@@ -291,7 +291,8 @@ int iszerodev __P((dev_t dev));
dev_t makebdev __P((int maj, int min));
dev_t make_dev __P((struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, char *fmt, ...)) __printflike(6, 7);
dev_t make_dev_alias __P((dev_t pdev, char *fmt, ...)) __printflike(2, 3);
-int lminor __P((dev_t dev));
+int dev2unit __P((dev_t dev));
+int unit2minor __P((int unit));
void setconf __P((void));
dev_t getdiskbyname(char *name);
OpenPOWER on IntegriCloud