DEVFS - add make_autoclone_dev to take of clone initializing for devs
authorAlex Hornung <ahornung@gmail.com>
Wed, 5 Aug 2009 19:25:42 +0000 (20:25 +0100)
committerAlex Hornung <ahornung@gmail.com>
Wed, 5 Aug 2009 20:27:00 +0000 (21:27 +0100)
by creating the device with the right miinor, initing the clone bitmap
and registering the clone handler. Also fix up all users of cloning
to use this new API.

sys/bus/cam/scsi/scsi_target.c
sys/dev/misc/snp/snp.c
sys/kern/kern_conf.c
sys/net/bpf.c
sys/net/tun/if_tun.c
sys/netproto/smb/smb_dev.c
sys/sys/device.h

index 4da28d9..d483ba0 100644 (file)
@@ -1054,9 +1054,8 @@ targclone(struct dev_clone_args *ap)
 static void
 targinit(void)
 {
-       make_dev(&targ_ops, 0, UID_ROOT, GID_WHEEL, 0600, "targ");
-       devfs_clone_bitmap_init(&DEVFS_CLONE_BITMAP(targ));
-       devfs_clone_handler_add("targ", targclone);
+       make_autoclone_dev(&targ_ops, &DEVFS_CLONE_BITMAP(targ),
+               targclone, UID_ROOT, GID_WHEEL, 0600, "targ");
        /* XXX: need uninit or so? */
 }
 
index 2b4994e..3d742be 100644 (file)
@@ -595,15 +595,13 @@ snp_modevent(module_t mod, int type, void *data)
        switch (type) {
        case MOD_LOAD:
                snooplinedisc = ldisc_register(LDISC_LOAD, &snpdisc);
-               devfs_clone_bitmap_init(&DEVFS_CLONE_BITMAP(snp));
+               make_autoclone_dev(&snp_ops, &DEVFS_CLONE_BITMAP(snp),
+                       snpclone, UID_ROOT, GID_WHEEL, 0600, "snp");
 
                for (i = 0; i < SNP_PREALLOCATED_UNITS; i++) {
                        make_dev(&snp_ops, i, UID_ROOT, GID_WHEEL, 0600, "snp%d", i);
                        devfs_clone_bitmap_set(&DEVFS_CLONE_BITMAP(snp), i);
                }
-
-               make_dev(&snp_ops, 0, UID_ROOT, GID_WHEEL, 0600, "snp");
-               devfs_clone_handler_add("snp", snpclone);
                break;
        case MOD_UNLOAD:
                if (!LIST_EMPTY(&snp_sclist))
index e776db7..3a7b4cf 100644 (file)
@@ -447,6 +447,27 @@ make_dev_alias(cdev_t target, const char *fmt, ...)
        return 0;
 }
 
+cdev_t
+make_autoclone_dev(struct dev_ops *ops, struct devfs_bitmap *bitmap,
+               d_clone_t *nhandler, uid_t uid, gid_t gid, int perms, const char *fmt, ...)
+{
+       cdev_t dev;
+       char name[PATH_MAX + 1];
+       __va_list ap;
+       int i;
+
+       __va_start(ap, fmt);
+       i = kvcprintf(fmt, NULL, name, 32, ap);
+       name[i] = '\0';
+       __va_end(ap);
+
+       devfs_clone_bitmap_init(bitmap);
+       devfs_clone_handler_add(name, nhandler);
+       dev = make_dev(ops, 0xffff00ff, uid, gid, perms, name);
+
+       return dev;
+}
+
 
 /*
  * Add a reference to a device.  Callers generally add their own references
index b2d05ab..f192024 100644 (file)
@@ -1510,15 +1510,12 @@ bpf_drvinit(void *unused)
 {
        int i;
 
-       devfs_clone_bitmap_init(&DEVFS_CLONE_BITMAP(bpf));
-
+       make_autoclone_dev(&bpf_ops, &DEVFS_CLONE_BITMAP(bpf),
+               bpfclone, 0, 0, 0600, "bpf");
        for (i = 0; i < BPF_PREALLOCATED_UNITS; i++) {
                make_dev(&bpf_ops, i, 0, 0, 0600, "bpf%d", i);
                devfs_clone_bitmap_set(&DEVFS_CLONE_BITMAP(bpf), i);
        }
-
-       make_dev(&bpf_ops, 0, 0, 0, 0600, "bpf");
-       devfs_clone_handler_add("bpf", bpfclone);
 }
 
 static void
index a991a68..b19ef40 100644 (file)
@@ -102,15 +102,12 @@ static void
 tunattach(void *dummy)
 {
        int i;
-       devfs_clone_bitmap_init(&DEVFS_CLONE_BITMAP(tun));
-
+       make_autoclone_dev(&tun_ops, &DEVFS_CLONE_BITMAP(tun),
+               tunclone, UID_UUCP, GID_DIALER, 0600, "tun");
        for (i = 0; i < TUN_PREALLOCATED_UNITS; i++) {
                make_dev(&tun_ops, i, UID_UUCP, GID_DIALER, 0600, "tun%d", i);
                devfs_clone_bitmap_set(&DEVFS_CLONE_BITMAP(tun), i);
        }
-
-       make_dev(&tun_ops, 0, UID_UUCP, GID_DIALER, 0600, "tun");
-       devfs_clone_handler_add("tun", tunclone);
        /* Doesn't need uninit because unloading is not possible, see PSEUDO_SET */
 }
 
index 83b8a42..d95a6bb 100644 (file)
@@ -363,10 +363,8 @@ nsmb_dev_load(module_t mod, int cmd, void *arg)
                        smb_sm_done();
                        break;
                }
-
-               make_dev(&nsmb_ops, 0, 0, 0, 0700, NSMB_NAME);
-               devfs_clone_bitmap_init(&DEVFS_CLONE_BITMAP(nsmb));
-               devfs_clone_handler_add(NSMB_NAME, nsmbclone);
+               make_autoclone_dev(&nsmb_ops, &DEVFS_CLONE_BITMAP(nsmb),
+                       nsmbclone, 0, 0, 0700, NSMB_NAME);
 
                kprintf("netsmb_dev: loaded\n");
                break;
index c12a886..a46dccc 100644 (file)
@@ -49,6 +49,7 @@
 
 struct cdev;
 struct ucred;
+struct devfs_bitmap;
 
 /*
  * This structure is at the base of every device args structure
@@ -369,6 +370,8 @@ cdev_t make_only_devfs_dev(struct dev_ops *ops, int minor, uid_t uid, gid_t gid,
                int perms, const char *fmt, ...) __printflike(6, 7);
 void destroy_only_dev(cdev_t dev);
 int make_dev_alias(cdev_t target, const char *fmt, ...);
+cdev_t make_autoclone_dev(struct dev_ops *ops, struct devfs_bitmap *bitmap,
+               d_clone_t *nhandler, uid_t uid, gid_t gid, int perms, const char *fmt, ...);
 #endif
 
 #endif