summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2005-08-08 19:55:32 +0000
committerrwatson <rwatson@FreeBSD.org>2005-08-08 19:55:32 +0000
commitdaa1c89f450d2c308009c125db1d28bbd9c044fa (patch)
treed655c312aefcf63bff80cd1977af84d2c685fd16
parent540e708ef59e78a3e053a16463d855a75422f2bc (diff)
downloadFreeBSD-src-daa1c89f450d2c308009c125db1d28bbd9c044fa.zip
FreeBSD-src-daa1c89f450d2c308009c125db1d28bbd9c044fa.tar.gz
Merge the dev_clone and dev_clone_cred event handlers into a single
event handler, dev_clone, which accepts a credential argument. Implementors of the event can ignore it if they're not interested, and most do. This avoids having multiple event handler types and fall-back/precedence logic in devfs. This changes the kernel API for /dev cloning, and may affect third party packages containg cloning kernel modules. Requested by: phk MFC after: 3 days
-rw-r--r--sys/cam/scsi/scsi_target.c7
-rw-r--r--sys/coda/coda_fbsd.c7
-rw-r--r--sys/dev/firewire/firewirereg.h2
-rw-r--r--sys/dev/firewire/fwdev.c3
-rw-r--r--sys/dev/nmdm/nmdm.c3
-rw-r--r--sys/dev/snp/snp.c5
-rw-r--r--sys/dev/sound/pcm/dsp.c3
-rw-r--r--sys/dev/sound/pcm/mixer.c3
-rw-r--r--sys/dev/vkbd/vkbd.c6
-rw-r--r--sys/fs/coda/coda_fbsd.c7
-rw-r--r--sys/fs/devfs/devfs_vnops.c11
-rw-r--r--sys/kern/tty_pty.c2
-rw-r--r--sys/kern/tty_tty.c3
-rw-r--r--sys/net/bpf.c5
-rw-r--r--sys/net/if_tap.c6
-rw-r--r--sys/net/if_tun.c6
-rw-r--r--sys/netsmb/smb_dev.c3
-rw-r--r--sys/sys/conf.h9
18 files changed, 51 insertions, 40 deletions
diff --git a/sys/cam/scsi/scsi_target.c b/sys/cam/scsi/scsi_target.c
index 0b7caac..1e3d893 100644
--- a/sys/cam/scsi/scsi_target.c
+++ b/sys/cam/scsi/scsi_target.c
@@ -141,8 +141,8 @@ static void targfreeccb(struct targ_softc *softc, union ccb *ccb);
static struct targ_cmd_descr *
targgetdescr(struct targ_softc *softc);
static periph_init_t targinit;
-static void targclone(void *arg, char *name, int namelen,
- struct cdev **dev);
+static void targclone(void *arg, struct ucred *cred, char *name,
+ int namelen, struct cdev **dev);
static void targasync(void *callback_arg, u_int32_t code,
struct cam_path *path, void *arg);
static void abort_all_pending(struct targ_softc *softc);
@@ -1025,7 +1025,8 @@ targinit(void)
}
static void
-targclone(void *arg, char *name, int namelen, struct cdev **dev)
+targclone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
{
int u;
diff --git a/sys/coda/coda_fbsd.c b/sys/coda/coda_fbsd.c
index ac6ad48..dd379d7 100644
--- a/sys/coda/coda_fbsd.c
+++ b/sys/coda/coda_fbsd.c
@@ -70,8 +70,8 @@ int vcdebug = 1;
#define VCDEBUG if (vcdebug) printf
/* for DEVFS, using bpf & tun drivers as examples*/
-static void coda_fbsd_clone(void *arg, char *name, int namelen,
- struct cdev **dev);
+static void coda_fbsd_clone(void *arg, struct ucred *cred, char *name,
+ int namelen, struct cdev **dev);
static int
codadev_modevent(module_t mod, int type, void *data)
@@ -105,8 +105,9 @@ static moduledata_t codadev_mod = {
};
DECLARE_MODULE(codadev, codadev_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
-static void coda_fbsd_clone(arg, name, namelen, dev)
+static void coda_fbsd_clone(arg, cred, name, namelen, dev)
void *arg;
+ struct ucred *cred;
char *name;
int namelen;
struct cdev **dev;
diff --git a/sys/dev/firewire/firewirereg.h b/sys/dev/firewire/firewirereg.h
index 3b991ea..4061b8b 100644
--- a/sys/dev/firewire/firewirereg.h
+++ b/sys/dev/firewire/firewirereg.h
@@ -303,7 +303,7 @@ struct fw_bind *fw_bindlookup (struct firewire_comm *, uint16_t, uint32_t);
void fw_drain_txq (struct firewire_comm *);
int fwdev_makedev (struct firewire_softc *);
int fwdev_destroydev (struct firewire_softc *);
-void fwdev_clone (void *, char *, int, struct cdev **);
+void fwdev_clone (void *, struct ucred *, char *, int, struct cdev **);
extern int firewire_debug;
extern devclass_t firewire_devclass;
diff --git a/sys/dev/firewire/fwdev.c b/sys/dev/firewire/fwdev.c
index ecd56c4..e42c30a 100644
--- a/sys/dev/firewire/fwdev.c
+++ b/sys/dev/firewire/fwdev.c
@@ -840,7 +840,8 @@ fwdev_destroydev(struct firewire_softc *sc)
#if defined(__FreeBSD__) && __FreeBSD_version >= 500000
#define NDEVTYPE 2
void
-fwdev_clone(void *arg, char *name, int namelen, struct cdev **dev)
+fwdev_clone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
{
struct firewire_softc *sc;
char *devnames[NDEVTYPE] = {"fw", "fwmem"};
diff --git a/sys/dev/nmdm/nmdm.c b/sys/dev/nmdm/nmdm.c
index e61a05f..1c118d2 100644
--- a/sys/dev/nmdm/nmdm.c
+++ b/sys/dev/nmdm/nmdm.c
@@ -104,7 +104,8 @@ static struct clonedevs *nmdmclones;
static TAILQ_HEAD(,nm_softc) nmdmhead = TAILQ_HEAD_INITIALIZER(nmdmhead);
static void
-nmdm_clone(void *arg, char *name, int nameen, struct cdev **dev)
+nmdm_clone(void *arg, struct ucred *cred, char *name, int nameen,
+ struct cdev **dev)
{
int i, unit;
char *p;
diff --git a/sys/dev/snp/snp.c b/sys/dev/snp/snp.c
index 8be2b19..3e190c7 100644
--- a/sys/dev/snp/snp.c
+++ b/sys/dev/snp/snp.c
@@ -114,7 +114,7 @@ static LIST_HEAD(, snoop) snp_sclist = LIST_HEAD_INITIALIZER(&snp_sclist);
static struct clonedevs *snpclones;
static struct tty *snpdevtotty(struct cdev *dev);
-static void snp_clone(void *arg, char *name,
+static void snp_clone(void *arg, struct ucred *cred, char *name,
int namelen, struct cdev **dev);
static int snp_detach(struct snoop *snp);
static int snp_down(struct snoop *snp);
@@ -627,8 +627,9 @@ snppoll(dev, events, td)
}
static void
-snp_clone(arg, name, namelen, dev)
+snp_clone(arg, cred, name, namelen, dev)
void *arg;
+ struct ucred *cred;
char *name;
int namelen;
struct cdev **dev;
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index c57b59f..9c34f65 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -1130,7 +1130,8 @@ dsp_mmap(struct cdev *i_dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot)
* if xN.i isn't busy, return its dev_t
*/
static void
-dsp_clone(void *arg, char *name, int namelen, struct cdev **dev)
+dsp_clone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
{
struct cdev *pdev;
struct snddev_info *pcm_dev;
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
index 96b08fc..e7e3e0c 100644
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -486,7 +486,8 @@ mixer_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, struct thread
#ifdef USING_DEVFS
static void
-mixer_clone(void *arg, char *name, int namelen, struct cdev **dev)
+mixer_clone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
{
struct snddev_info *sd;
diff --git a/sys/dev/vkbd/vkbd.c b/sys/dev/vkbd/vkbd.c
index ed39007..b399726 100644
--- a/sys/dev/vkbd/vkbd.c
+++ b/sys/dev/vkbd/vkbd.c
@@ -124,7 +124,8 @@ typedef struct vkbd_state vkbd_state_t;
*****************************************************************************
*****************************************************************************/
-static void vkbd_dev_clone(void *, char *, int, struct cdev **);
+static void vkbd_dev_clone(void *, struct ucred *, char *, int,
+ struct cdev **);
static d_open_t vkbd_dev_open;
static d_close_t vkbd_dev_close;
static d_read_t vkbd_dev_read;
@@ -152,7 +153,8 @@ static struct clonedevs *vkbd_dev_clones = NULL;
/* Clone device */
static void
-vkbd_dev_clone(void *arg, char *name, int namelen, struct cdev **dev)
+vkbd_dev_clone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
{
int unit;
diff --git a/sys/fs/coda/coda_fbsd.c b/sys/fs/coda/coda_fbsd.c
index ac6ad48..dd379d7 100644
--- a/sys/fs/coda/coda_fbsd.c
+++ b/sys/fs/coda/coda_fbsd.c
@@ -70,8 +70,8 @@ int vcdebug = 1;
#define VCDEBUG if (vcdebug) printf
/* for DEVFS, using bpf & tun drivers as examples*/
-static void coda_fbsd_clone(void *arg, char *name, int namelen,
- struct cdev **dev);
+static void coda_fbsd_clone(void *arg, struct ucred *cred, char *name,
+ int namelen, struct cdev **dev);
static int
codadev_modevent(module_t mod, int type, void *data)
@@ -105,8 +105,9 @@ static moduledata_t codadev_mod = {
};
DECLARE_MODULE(codadev, codadev_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
-static void coda_fbsd_clone(arg, name, namelen, dev)
+static void coda_fbsd_clone(arg, cred, name, namelen, dev)
void *arg;
+ struct ucred *cred;
char *name;
int namelen;
struct cdev **dev;
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index 34e78d9..8f14bcf 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -705,13 +705,10 @@ devfs_lookupx(ap)
goto notfound;
cdev = NULL;
- EVENTHANDLER_INVOKE(dev_clone_cred, td->td_ucred, pname,
- strlen(pname), &cdev);
- if (cdev == NULL) {
- EVENTHANDLER_INVOKE(dev_clone, pname, strlen(pname), &cdev);
- if (cdev == NULL)
- goto notfound;
- }
+ EVENTHANDLER_INVOKE(dev_clone, td->td_ucred, pname, strlen(pname),
+ &cdev);
+ if (cdev == NULL)
+ goto notfound;
devfs_populate(dmp);
diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c
index 92f6da1..d386601 100644
--- a/sys/kern/tty_pty.c
+++ b/sys/kern/tty_pty.c
@@ -720,7 +720,7 @@ static void
ptc_drvinit(void *unused)
{
- EVENTHANDLER_REGISTER(dev_clone_cred, pty_clone, 0, 1000);
+ EVENTHANDLER_REGISTER(dev_clone, pty_clone, 0, 1000);
}
SYSINIT(ptcdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE,ptc_drvinit,NULL)
diff --git a/sys/kern/tty_tty.c b/sys/kern/tty_tty.c
index 8951e99..5a99d25 100644
--- a/sys/kern/tty_tty.c
+++ b/sys/kern/tty_tty.c
@@ -52,7 +52,8 @@ cttyopen(struct cdev *dev, int flag, int mode, struct thread *td)
}
static void
-ctty_clone(void *arg, char *name, int namelen, struct cdev **dev)
+ctty_clone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
{
if (*dev != NULL)
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index c42ea81..9ae3a96 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -108,7 +108,7 @@ static int bpf_setdlt(struct bpf_d *, u_int);
static void filt_bpfdetach(struct knote *);
static int filt_bpfread(struct knote *, long);
static void bpf_drvinit(void *);
-static void bpf_clone(void *, char *, int, struct cdev **);
+static void bpf_clone(void *, struct ucred *, char *, int, struct cdev **);
static int bpf_stats_sysctl(SYSCTL_HANDLER_ARGS);
/*
@@ -1614,8 +1614,9 @@ bpf_setdlt(d, dlt)
}
static void
-bpf_clone(arg, name, namelen, dev)
+bpf_clone(arg, cred, name, namelen, dev)
void *arg;
+ struct ucred *cred;
char *name;
int namelen;
struct cdev **dev;
diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c
index f6ee9b0..f631c09 100644
--- a/sys/net/if_tap.c
+++ b/sys/net/if_tap.c
@@ -82,7 +82,8 @@
static int tapmodevent(module_t, int, void *);
/* device */
-static void tapclone(void *, char *, int, struct cdev **);
+static void tapclone(void *, struct ucred *, char *, int,
+ struct cdev **);
static void tapcreate(struct cdev *);
/* network interface */
@@ -231,8 +232,9 @@ tapmodevent(mod, type, data)
* We need to support two kind of devices - tap and vmnet
*/
static void
-tapclone(arg, name, namelen, dev)
+tapclone(arg, cred, name, namelen, dev)
void *arg;
+ struct ucred *cred;
char *name;
int namelen;
struct cdev **dev;
diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c
index 4c23fa8..d9c31e2 100644
--- a/sys/net/if_tun.c
+++ b/sys/net/if_tun.c
@@ -107,7 +107,8 @@ static struct clonedevs *tunclones;
static TAILQ_HEAD(,tun_softc) tunhead = TAILQ_HEAD_INITIALIZER(tunhead);
SYSCTL_INT(_debug, OID_AUTO, if_tun_debug, CTLFLAG_RW, &tundebug, 0, "");
-static void tunclone(void *arg, char *name, int namelen, struct cdev **dev);
+static void tunclone(void *arg, struct ucred *cred, char *name,
+ int namelen, struct cdev **dev);
static void tuncreate(struct cdev *dev);
static int tunifioctl(struct ifnet *, u_long, caddr_t);
static int tuninit(struct ifnet *);
@@ -136,7 +137,8 @@ static struct cdevsw tun_cdevsw = {
};
static void
-tunclone(void *arg, char *name, int namelen, struct cdev **dev)
+tunclone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
{
int u, i;
diff --git a/sys/netsmb/smb_dev.c b/sys/netsmb/smb_dev.c
index 89a1676..17994cf 100644
--- a/sys/netsmb/smb_dev.c
+++ b/sys/netsmb/smb_dev.c
@@ -99,7 +99,8 @@ static struct cdevsw nsmb_cdevsw = {
static eventhandler_tag nsmb_dev_tag;
static void
-nsmb_dev_clone(void *arg, char *name, int namelen, struct cdev **dev)
+nsmb_dev_clone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
{
int u;
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 8784ace..2dfa956 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -68,7 +68,7 @@ struct cdev {
uid_t si_uid;
gid_t si_gid;
mode_t si_mode;
- struct ucred *si_cred;
+ struct ucred *si_cred; /* cached clone-time credential */
u_int si_drv0;
int si_refcount;
LIST_ENTRY(cdev) si_list;
@@ -279,15 +279,12 @@ void devfs_destroy(struct cdev *dev);
#define GID_GAMES 13
#define GID_DIALER 68
-typedef void (*dev_clone_fn)(void *arg, char *name, int namelen, struct cdev **result);
+typedef void (*dev_clone_fn)(void *arg, struct ucred *cred, char *name,
+ int namelen, struct cdev **result);
int dev_stdclone(char *_name, char **_namep, const char *_stem, int *_unit);
EVENTHANDLER_DECLARE(dev_clone, dev_clone_fn);
-typedef void (*dev_clone_cred_fn)(void *arg, struct ucred *cred, char *name,
- int namelen, struct cdev **result);
-EVENTHANDLER_DECLARE(dev_clone_cred, dev_clone_cred_fn);
-
/* Stuff relating to kernel-dump */
struct dumperinfo {
OpenPOWER on IntegriCloud