From 87baaf0c04784d423bf2cc72d941780a1b6a9f4b Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Tue, 25 Aug 2009 18:02:22 -0700 Subject: [PATCH] Kernel - pass sysmsg through to ioctl. * Pass the sysmsg through to the ioctl code so ioctls can set the return value. A single linux ioctl from the SCSI sg code uses this feature. --- sys/dev/disk/ccd/ccd.c | 3 +- sys/dev/raid/vinum/vinumio.c | 12 +++---- sys/dev/sound/pcm/channel.c | 1 + sys/emulation/linux/linux_file.c | 2 +- sys/emulation/linux/linux_ioctl.c | 47 ++++++++++++++-------------- sys/kern/kern_descrip.c | 16 ++++++---- sys/kern/kern_device.c | 4 ++- sys/kern/kern_event.c | 5 +-- sys/kern/kern_shutdown.c | 3 +- sys/kern/kern_syslink.c | 5 +-- sys/kern/subr_disk.c | 5 +-- sys/kern/sys_generic.c | 9 +++--- sys/kern/sys_pipe.c | 6 ++-- sys/kern/sys_socket.c | 3 +- sys/kern/tty_tty.c | 3 +- sys/kern/uipc_syscalls.c | 4 +-- sys/kern/vfs_vnops.c | 7 +++-- sys/kern/vfs_vopops.c | 4 ++- sys/opencrypto/cryptodev.c | 10 +++--- sys/sys/device.h | 6 ++-- sys/sys/file.h | 3 +- sys/sys/file2.h | 5 +-- sys/sys/mapped_ioctl.h | 3 +- sys/sys/socketvar.h | 7 +++-- sys/sys/vfsops.h | 8 +++-- sys/vfs/devfs/devfs_vnops.c | 19 +++++------ sys/vfs/fifofs/fifo_vnops.c | 8 +++-- sys/vfs/gnu/ext2fs/ext2_vfsops.c | 3 +- sys/vfs/isofs/cd9660/cd9660_vfsops.c | 6 ++-- sys/vfs/ufs/ffs_vfsops.c | 12 ++++--- 30 files changed, 133 insertions(+), 96 deletions(-) diff --git a/sys/dev/disk/ccd/ccd.c b/sys/dev/disk/ccd/ccd.c index fa53ff3ba2..20b16ac26c 100644 --- a/sys/dev/disk/ccd/ccd.c +++ b/sys/dev/disk/ccd/ccd.c @@ -476,7 +476,8 @@ ccdinit(struct ccddevice *ccd, char **cpaths, struct ucred *cred) /* * Get partition information for the component. */ - error = VOP_IOCTL(vp, DIOCGPART, (caddr_t)&dpart, FREAD, cred); + error = VOP_IOCTL(vp, DIOCGPART, (caddr_t)&dpart, FREAD, + cred, NULL); if (error) { #ifdef DEBUG if (ccddebug & (CCDB_FOLLOW|CCDB_INIT)) diff --git a/sys/dev/raid/vinum/vinumio.c b/sys/dev/raid/vinum/vinumio.c index b48e4ce090..14b5c19152 100644 --- a/sys/dev/raid/vinum/vinumio.c +++ b/sys/dev/raid/vinum/vinumio.c @@ -176,8 +176,8 @@ init_drive(struct drive *drive, int verbose) return drive->lasterror; drive->lasterror = VOP_IOCTL(drive->vp, DIOCGPART, - (caddr_t)&drive->partinfo, - FREAD|FWRITE, proc0.p_ucred); + (caddr_t)&drive->partinfo, FREAD|FWRITE, + proc0.p_ucred, NULL); if (drive->lasterror) { if (verbose) log(LOG_WARNING, @@ -627,8 +627,8 @@ daemon_save_config(void) error = 0; #if 1 error = VOP_IOCTL(drive->vp, DIOCWLABEL, - (caddr_t)&wlabel_on, - FREAD|FWRITE, proc0.p_ucred); + (caddr_t)&wlabel_on, FREAD|FWRITE, + proc0.p_ucred, NULL); #endif if (error == 0) error = write_drive(drive, (char *) vhdr, VINUMHEADERLEN, VINUM_LABEL_OFFSET); @@ -640,8 +640,8 @@ daemon_save_config(void) #if 1 if (error == 0) { error = VOP_IOCTL(drive->vp, DIOCWLABEL, - (caddr_t)&wlabel_on, - FREAD|FWRITE, proc0.p_ucred); + (caddr_t)&wlabel_on, FREAD|FWRITE, + proc0.p_ucred, NULL); } #endif unlockdrive(drive); diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c index 2958816cf3..883481a721 100644 --- a/sys/dev/sound/pcm/channel.c +++ b/sys/dev/sound/pcm/channel.c @@ -1445,6 +1445,7 @@ chn_buildfeeder(struct pcm_channel *c) map.a_data = (caddr_t)&vol; map.a_fflag = -1; map.a_cred = NULL; + map.a_sysmsg = NULL; if (mixer_ioctl(&map) != 0) device_printf(c->dev, "Soft PCM Volume: Failed to read default value\n"); left = vol & 0x7f; diff --git a/sys/emulation/linux/linux_file.c b/sys/emulation/linux/linux_file.c index 4960798763..c665e0bb22 100644 --- a/sys/emulation/linux/linux_file.c +++ b/sys/emulation/linux/linux_file.c @@ -145,7 +145,7 @@ sys_linux_open(struct linux_open_args *args) fp = holdfp(p->p_fd, args->sysmsg_iresult, -1); if (fp) { if (fp->f_type == DTYPE_VNODE) - fo_ioctl(fp, TIOCSCTTY, NULL, p->p_ucred); + fo_ioctl(fp, TIOCSCTTY, NULL, p->p_ucred, NULL); fdrop(fp); } } diff --git a/sys/emulation/linux/linux_ioctl.c b/sys/emulation/linux/linux_ioctl.c index 39aea77018..ed92064d7e 100644 --- a/sys/emulation/linux/linux_ioctl.c +++ b/sys/emulation/linux/linux_ioctl.c @@ -73,7 +73,7 @@ linux_ioctl_BLKGETSIZE32(struct file *fp, u_long cmd, u_long ocmd, u_int32_t value; int error; - error = fo_ioctl(fp, DIOCGPART, (caddr_t)&dpart, cred); + error = fo_ioctl(fp, DIOCGPART, (caddr_t)&dpart, cred, NULL); if (error) return (error); value = dpart.media_blocks; /* 64->32 */ @@ -477,7 +477,7 @@ linux_ioctl_TCGETS(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struc struct linux_termios lios; int error; - error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, cred); + error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, cred, NULL); if (error) return (error); bsd_to_linux_termios(&bios, &lios); @@ -493,7 +493,7 @@ linux_ioctl_TCSETS(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struc bcopy(data, &lios, sizeof(lios)); linux_to_bsd_termios(&lios, &bios); - return (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, cred)); + return (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, cred, NULL)); } static int @@ -504,7 +504,7 @@ linux_ioctl_TCSETSW(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, stru bcopy(data, &lios, sizeof(lios)); linux_to_bsd_termios(&lios, &bios); - return (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, cred)); + return (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, cred, NULL)); } static int @@ -515,7 +515,7 @@ linux_ioctl_TCSETSF(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, stru bcopy(data, &lios, sizeof(lios)); linux_to_bsd_termios(&lios, &bios); - return (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, cred)); + return (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, cred, NULL)); } static int @@ -525,7 +525,7 @@ linux_ioctl_TCGETA(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struc struct linux_termio lio; int error; - error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, cred); + error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, cred, NULL); if (error) return (error); bsd_to_linux_termio(&bios, &lio); @@ -541,7 +541,7 @@ linux_ioctl_TCSETA(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struc bcopy(data, &lio, sizeof(lio)); linux_to_bsd_termio(&lio, &bios); - return (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, cred)); + return (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, cred, NULL)); } static int @@ -552,7 +552,7 @@ linux_ioctl_TCSETAW(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, stru bcopy(data, &lio, sizeof(lio)); linux_to_bsd_termio(&lio, &bios); - return (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, cred)); + return (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, cred, NULL)); } static int @@ -563,7 +563,7 @@ linux_ioctl_TCSETAF(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, stru bcopy(data, &lio, sizeof(lio)); linux_to_bsd_termio(&lio, &bios); - return (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, cred)); + return (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, cred, NULL)); } static int @@ -581,7 +581,7 @@ linux_ioctl_TCXONC(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struc struct termios bios; int error, c; - error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, cred); + error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, cred, NULL); if (error) return (error); c = ((u_long)data == LINUX_TCIOFF) ? VSTOP : VSTART; @@ -608,7 +608,7 @@ linux_ioctl_TCXONC(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struc default: return (EINVAL); } - return (fo_ioctl(fp, cmd, 0, cred)); + return (fo_ioctl(fp, cmd, 0, cred, NULL)); } static int @@ -627,7 +627,7 @@ linux_ioctl_TCFLSH(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struc default: return (EINVAL); } - return (fo_ioctl(fp, TIOCFLUSH, data, cred)); + return (fo_ioctl(fp, TIOCFLUSH, data, cred, NULL)); } static int @@ -674,7 +674,7 @@ linux_ioctl_TIOCSETD(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, str default: return (EINVAL); } - return (fo_ioctl(fp, TIOCSETD, (caddr_t)&line, cred)); + return (fo_ioctl(fp, TIOCSETD, (caddr_t)&line, cred, NULL)); } static int @@ -683,7 +683,7 @@ linux_ioctl_TIOCGETD(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, str int linux_line, error; int bsd_line = TTYDISC; - error = fo_ioctl(fp, TIOCGETD, (caddr_t)&bsd_line, cred); + error = fo_ioctl(fp, TIOCGETD, (caddr_t)&bsd_line, cred, NULL); if (error) return (error); switch (bsd_line) { @@ -788,7 +788,7 @@ linux_ioctl_CDROMREADTOCHDR(struct file *fp, u_long cmd, u_long ocmd, caddr_t da struct linux_cdrom_tochdr lth; int error; - error = fo_ioctl(fp, CDIOREADTOCHEADER, (caddr_t)&th, cred); + error = fo_ioctl(fp, CDIOREADTOCHEADER, (caddr_t)&th, cred, NULL); if (error) return (error); lth.cdth_trk0 = th.starting_track; @@ -806,7 +806,7 @@ linux_ioctl_CDROMREADTOCENTRY(struct file *fp, u_long cmd, u_long ocmd, caddr_t irtse.address_format = ltep->cdte_format; irtse.track = ltep->cdte_track; - error = fo_ioctl(fp, CDIOREADTOCENTRY, (caddr_t)&irtse, cred); + error = fo_ioctl(fp, CDIOREADTOCENTRY, (caddr_t)&irtse, cred, NULL); if (error) return (error); @@ -832,7 +832,7 @@ linux_ioctl_CDROMSUBCHNL(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, bsdsc.track = 0; bsdsc.data_len = sizeof(struct cd_sub_channel_info); bsdsc.data = bsdinfo; - error = fo_ioctl(fp, CDIOCREADSUBCHANNEL, (caddr_t)&bsdsc, cred); + error = fo_ioctl(fp, CDIOCREADSUBCHANNEL, (caddr_t)&bsdsc, cred, NULL); if (error) return (error); sc->cdsc_audiostatus = bsdinfo->header.audio_status; @@ -884,7 +884,7 @@ linux_ioctl_KDSKBMODE(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, st default: return (EINVAL); } - return (fo_ioctl(fp, KDSKBMODE, (caddr_t)&kbdmode, cred)); + return (fo_ioctl(fp, KDSKBMODE, (caddr_t)&kbdmode, cred, NULL)); } static int @@ -894,7 +894,7 @@ linux_ioctl_VT_SETMODE(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, s if (!ISSIGVALID(mode->frsig) && ISSIGVALID(mode->acqsig)) mode->frsig = mode->acqsig; - return (fo_ioctl(fp, VT_SETMODE, data, cred)); + return (fo_ioctl(fp, VT_SETMODE, data, cred, NULL)); } @@ -1051,7 +1051,7 @@ linux_ioctl_SIOCGIFFLAGS(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, * we don't translate the ifname and * use l_ifreq instead of ifreq */ - return (fo_ioctl(fp, SIOCGIFFLAGS, data, cred)); + return (fo_ioctl(fp, SIOCGIFFLAGS, data, cred, NULL)); } ifp = ifname_linux_to_bsd(ifr->ifr_name, ifname); @@ -1127,7 +1127,7 @@ linux_ioctl_map_ifname(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, s /* not a socket - probably a tap / vmnet device */ if (ocmd == LINUX_SIOCGIFADDR || ocmd == LINUX_SIOCSIFADDR) { cmd = (ocmd == LINUX_SIOCGIFADDR) ? SIOCGIFADDR : SIOCSIFADDR; - return (fo_ioctl(fp, cmd, data, cred)); + return (fo_ioctl(fp, cmd, data, cred, NULL)); } else return (ENOIOCTL); } @@ -1150,7 +1150,7 @@ linux_ioctl_map_ifname(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, s lifname, oifname); #endif - error = fo_ioctl(fp, cmd, data, cred); + error = fo_ioctl(fp, cmd, data, cred, NULL); clean_ifname: bcopy(lifname, oifname, LINUX_IFNAMSIZ); @@ -1295,7 +1295,8 @@ sys_linux_ioctl(struct linux_ioctl_args *args) kprintf(ARGS(ioctl, "%d, %04x, *"), args->fd, args->cmd); #endif - return (mapped_ioctl(args->fd, args->cmd, (caddr_t)args->arg, &linux_ioctl_map)); + return (mapped_ioctl(args->fd, args->cmd, (caddr_t)args->arg, + &linux_ioctl_map, &args->sysmsg)); } SYSINIT (linux_ioctl_register, SI_BOOT2_KLD, SI_ORDER_MIDDLE, diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index caf66c33c3..bcf9cdf7b3 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -127,9 +127,9 @@ static struct dev_ops fildesc_ops = { }; static int badfo_readwrite (struct file *fp, struct uio *uio, - struct ucred *cred, int flags); + struct ucred *cred, int flags); static int badfo_ioctl (struct file *fp, u_long com, caddr_t data, - struct ucred *cred); + struct ucred *cred, struct sysmsg *msg); static int badfo_poll (struct file *fp, int events, struct ucred *cred); static int badfo_kqfilter (struct file *fp, struct knote *kn); static int badfo_stat (struct file *fp, struct stat *sb, struct ucred *cred); @@ -283,18 +283,21 @@ kern_fcntl(int fd, int cmd, union fcntl_dat *dat, struct ucred *cred) error = EINVAL; if (error == 0 && ((nflags ^ oflags) & FASYNC)) { tmp = nflags & FASYNC; - error = fo_ioctl(fp, FIOASYNC, (caddr_t)&tmp, cred); + error = fo_ioctl(fp, FIOASYNC, (caddr_t)&tmp, + cred, NULL); } if (error == 0) fp->f_flag = nflags; break; case F_GETOWN: - error = fo_ioctl(fp, FIOGETOWN, (caddr_t)&dat->fc_owner, cred); + error = fo_ioctl(fp, FIOGETOWN, (caddr_t)&dat->fc_owner, + cred, NULL); break; case F_SETOWN: - error = fo_ioctl(fp, FIOSETOWN, (caddr_t)&dat->fc_owner, cred); + error = fo_ioctl(fp, FIOSETOWN, (caddr_t)&dat->fc_owner, + cred, NULL); break; case F_SETLKW: @@ -2718,7 +2721,8 @@ badfo_readwrite( * MPSAFE */ static int -badfo_ioctl(struct file *fp, u_long com, caddr_t data, struct ucred *cred) +badfo_ioctl(struct file *fp, u_long com, caddr_t data, + struct ucred *cred, struct sysmsg *msgv) { return (EBADF); } diff --git a/sys/kern/kern_device.c b/sys/kern/kern_device.c index 21bfe3819b..4332d1cc7b 100644 --- a/sys/kern/kern_device.c +++ b/sys/kern/kern_device.c @@ -159,7 +159,8 @@ dev_dwrite(cdev_t dev, struct uio *uio, int ioflag) } int -dev_dioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, struct ucred *cred) +dev_dioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, struct ucred *cred, + struct sysmsg *msg) { struct dev_ioctl_args ap; @@ -169,6 +170,7 @@ dev_dioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, struct ucred *cred) ap.a_data = data; ap.a_fflag = fflag; ap.a_cred = cred; + ap.a_sysmsg = msg; return(dev->si_ops->d_ioctl(&ap)); } diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 0161ad177f..f390833ecb 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -65,7 +65,7 @@ static int kqueue_read(struct file *fp, struct uio *uio, static int kqueue_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags); static int kqueue_ioctl(struct file *fp, u_long com, caddr_t data, - struct ucred *cred); + struct ucred *cred, struct sysmsg *msg); static int kqueue_poll(struct file *fp, int events, struct ucred *cred); static int kqueue_kqfilter(struct file *fp, struct knote *kn); static int kqueue_stat(struct file *fp, struct stat *st, @@ -751,7 +751,8 @@ kqueue_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags) * MPSAFE */ static int -kqueue_ioctl(struct file *fp, u_long com, caddr_t data, struct ucred *cred) +kqueue_ioctl(struct file *fp, u_long com, caddr_t data, + struct ucred *cred, struct sysmsg *msg) { struct kqueue *kq; int error; diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index 261d4fae09..9710980634 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -586,7 +586,8 @@ setdumpdev(cdev_t dev) if (error) return (error); } - error = dev_dioctl(dev, DIOCGPART, (void *)&pinfo, 0, proc0.p_ucred); + error = dev_dioctl(dev, DIOCGPART, (void *)&pinfo, 0, + proc0.p_ucred, NULL); if (doopen) dev_dclose(dev, FREAD, S_IFCHR); if (error || pinfo.media_blocks == 0 || pinfo.media_blksize == 0) diff --git a/sys/kern/kern_syslink.c b/sys/kern/kern_syslink.c index cb4ed44ffe..81b1d6c8ea 100644 --- a/sys/kern/kern_syslink.c +++ b/sys/kern/kern_syslink.c @@ -229,7 +229,7 @@ static int slfileop_close(struct file *fp); static int slfileop_stat(struct file *fp, struct stat *sb, struct ucred *cred); static int slfileop_shutdown(struct file *fp, int how); static int slfileop_ioctl(struct file *fp, u_long cmd, caddr_t data, - struct ucred *cred); + struct ucred *cred, struct sysmsg *msg); static int slfileop_poll(struct file *fp, int events, struct ucred *cred); static int slfileop_kqfilter(struct file *fp, struct knote *kn); @@ -977,7 +977,8 @@ slfileop_shutdown (struct file *fp, int how) static int -slfileop_ioctl (struct file *fp, u_long cmd, caddr_t data, struct ucred *cred) +slfileop_ioctl (struct file *fp, u_long cmd, caddr_t data, + struct ucred *cred, struct sysmsg *msg) { return(EINVAL); } diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c index 716d39c381..fa039aca61 100644 --- a/sys/kern/subr_disk.c +++ b/sys/kern/subr_disk.c @@ -568,7 +568,8 @@ disk_dumpcheck(cdev_t dev, u_int64_t *count, u_int64_t *blkno, u_int *secsize) int error; bzero(&pinfo, sizeof(pinfo)); - error = dev_dioctl(dev, DIOCGPART, (void *)&pinfo, 0, proc0.p_ucred); + error = dev_dioctl(dev, DIOCGPART, (void *)&pinfo, 0, + proc0.p_ucred, NULL); if (error) return (error); if (pinfo.media_blksize == 0) @@ -765,7 +766,7 @@ diskioctl(struct dev_ioctl_args *ap) if (error == ENOIOCTL) { error = dev_dioctl(dp->d_rawdev, ap->a_cmd, ap->a_data, - ap->a_fflag, ap->a_cred); + ap->a_fflag, ap->a_cred, NULL); } return (error); } diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 34e9e2dd2f..d88fd33ae4 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -518,7 +518,7 @@ dofilewrite(int fd, struct file *fp, struct uio *auio, int flags, size_t *res) int sys_ioctl(struct ioctl_args *uap) { - return(mapped_ioctl(uap->fd, uap->com, uap->data, NULL)); + return(mapped_ioctl(uap->fd, uap->com, uap->data, NULL, &uap->sysmsg)); } struct ioctl_map_entry { @@ -533,7 +533,8 @@ struct ioctl_map_entry { * and appropriate conversions/conversion functions will be utilized. */ int -mapped_ioctl(int fd, u_long com, caddr_t uspc_data, struct ioctl_map *map) +mapped_ioctl(int fd, u_long com, caddr_t uspc_data, struct ioctl_map *map, + struct sysmsg *msg) { struct thread *td = curthread; struct proc *p = td->td_proc; @@ -682,7 +683,7 @@ mapped_ioctl(int fd, u_long com, caddr_t uspc_data, struct ioctl_map *map) fp->f_flag |= FASYNC; else fp->f_flag &= ~FASYNC; - error = fo_ioctl(fp, FIOASYNC, (caddr_t)&tmp, cred); + error = fo_ioctl(fp, FIOASYNC, (caddr_t)&tmp, cred, msg); break; default: @@ -693,7 +694,7 @@ mapped_ioctl(int fd, u_long com, caddr_t uspc_data, struct ioctl_map *map) if (map != NULL && iomc->wrapfunc != NULL) error = iomc->wrapfunc(fp, com, ocom, data, cred); else - error = fo_ioctl(fp, com, data, cred); + error = fo_ioctl(fp, com, data, cred, msg); /* * Copy any data to user, size was * already set and checked above. diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 1ed9f189ef..81fc2e12cb 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -78,7 +78,8 @@ static int pipe_shutdown (struct file *fp, int how); static int pipe_poll (struct file *fp, int events, struct ucred *cred); static int pipe_kqfilter (struct file *fp, struct knote *kn); static int pipe_stat (struct file *fp, struct stat *sb, struct ucred *cred); -static int pipe_ioctl (struct file *fp, u_long cmd, caddr_t data, struct ucred *cred); +static int pipe_ioctl (struct file *fp, u_long cmd, caddr_t data, + struct ucred *cred, struct sysmsg *msg); static struct fileops pipeops = { .fo_read = pipe_read, @@ -971,7 +972,8 @@ pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int fflags) * we implement a very minimal set of ioctls for compatibility with sockets. */ int -pipe_ioctl(struct file *fp, u_long cmd, caddr_t data, struct ucred *cred) +pipe_ioctl(struct file *fp, u_long cmd, caddr_t data, + struct ucred *cred, struct sysmsg *msg) { struct pipe *mpipe; lwkt_tokref rlock; diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c index 1ed9ac877c..835f007b9b 100644 --- a/sys/kern/sys_socket.c +++ b/sys/kern/sys_socket.c @@ -123,7 +123,8 @@ soo_write(struct file *fp, struct uio *uio, struct ucred *cred, int fflags) * MPALMOSTSAFE - acquires mplock */ int -soo_ioctl(struct file *fp, u_long cmd, caddr_t data, struct ucred *cred) +soo_ioctl(struct file *fp, u_long cmd, caddr_t data, + struct ucred *cred, struct sysmsg *msg) { struct socket *so; int error; diff --git a/sys/kern/tty_tty.c b/sys/kern/tty_tty.c index 26be9f9371..031b6797e1 100644 --- a/sys/kern/tty_tty.c +++ b/sys/kern/tty_tty.c @@ -230,7 +230,8 @@ cttyioctl(struct dev_ioctl_args *ap) return (EINVAL); } } - return (VOP_IOCTL(ttyvp, ap->a_cmd, ap->a_data, ap->a_fflag, ap->a_cred)); + return (VOP_IOCTL(ttyvp, ap->a_cmd, ap->a_data, ap->a_fflag, + ap->a_cred, ap->a_sysmsg)); } /*ARGSUSED*/ diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 1c9f4e5588..295b00c9df 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -321,9 +321,9 @@ kern_accept(int s, int fflags, struct sockaddr **name, int *namelen, int *res) nfp->f_data = so; /* Sync socket nonblocking/async state with file flags */ tmp = fflag & FNONBLOCK; - (void) fo_ioctl(nfp, FIONBIO, (caddr_t)&tmp, p->p_ucred); + fo_ioctl(nfp, FIONBIO, (caddr_t)&tmp, p->p_ucred, NULL); tmp = fflag & FASYNC; - (void) fo_ioctl(nfp, FIOASYNC, (caddr_t)&tmp, p->p_ucred); + fo_ioctl(nfp, FIOASYNC, (caddr_t)&tmp, p->p_ucred, NULL); sa = NULL; error = soaccept(so, &sa); diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index bf067e2d3b..b13f9cdc9c 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -61,7 +61,7 @@ static int vn_closefile (struct file *fp); static int vn_ioctl (struct file *fp, u_long com, caddr_t data, - struct ucred *cred); + struct ucred *cred, struct sysmsg *msg); static int vn_read (struct file *fp, struct uio *uio, struct ucred *cred, int flags); static int vn_poll (struct file *fp, int events, struct ucred *cred); @@ -887,7 +887,8 @@ vn_stat(struct vnode *vp, struct stat *sb, struct ucred *cred) * MPALMOSTSAFE - acquires mplock */ static int -vn_ioctl(struct file *fp, u_long com, caddr_t data, struct ucred *ucred) +vn_ioctl(struct file *fp, u_long com, caddr_t data, struct ucred *ucred, + struct sysmsg *msg) { struct vnode *vp = ((struct vnode *)fp->f_data); struct vnode *ovp; @@ -934,7 +935,7 @@ vn_ioctl(struct file *fp, u_long com, caddr_t data, struct ucred *ucred) error = 0; break; } - error = VOP_IOCTL(vp, com, data, fp->f_flag, ucred); + error = VOP_IOCTL(vp, com, data, fp->f_flag, ucred, msg); if (error == 0 && com == TIOCSCTTY) { struct proc *p = curthread->td_proc; struct session *sess; diff --git a/sys/kern/vfs_vopops.c b/sys/kern/vfs_vopops.c index afe4cf895d..a3cf635fe8 100644 --- a/sys/kern/vfs_vopops.c +++ b/sys/kern/vfs_vopops.c @@ -58,6 +58,7 @@ #include #include #include +#include #include @@ -358,7 +359,7 @@ vop_write(struct vop_ops *ops, struct vnode *vp, struct uio *uio, int ioflag, int vop_ioctl(struct vop_ops *ops, struct vnode *vp, u_long command, caddr_t data, - int fflag, struct ucred *cred) + int fflag, struct ucred *cred, struct sysmsg *msg) { struct vop_ioctl_args ap; int error; @@ -370,6 +371,7 @@ vop_ioctl(struct vop_ops *ops, struct vnode *vp, u_long command, caddr_t data, ap.a_data = data; ap.a_fflag = fflag; ap.a_cred = cred; + ap.a_sysmsg = msg; DO_OPS(ops, error, &ap, vop_ioctl); return(error); diff --git a/sys/opencrypto/cryptodev.c b/sys/opencrypto/cryptodev.c index d6d76c479f..2384f9d4cf 100644 --- a/sys/opencrypto/cryptodev.c +++ b/sys/opencrypto/cryptodev.c @@ -86,7 +86,8 @@ struct fcrypt { static int cryptof_rw(struct file *fp, struct uio *uio, struct ucred *cred, int flags); -static int cryptof_ioctl(struct file *, u_long, caddr_t, struct ucred *); +static int cryptof_ioctl(struct file *, u_long, caddr_t, + struct ucred *, struct sysmsg *); static int cryptof_poll(struct file *, int, struct ucred *); static int cryptof_kqfilter(struct file *, struct knote *); static int cryptof_stat(struct file *, struct stat *, struct ucred *); @@ -131,11 +132,8 @@ cryptof_rw( * MPALMOSTSAFE - acquires mplock */ static int -cryptof_ioctl( - struct file *fp, - u_long cmd, - caddr_t data, - struct ucred *cred) +cryptof_ioctl(struct file *fp, u_long cmd, caddr_t data, + struct ucred *cred, struct sysmsg *msg) { struct cryptoini cria, crie; struct fcrypt *fcr; diff --git a/sys/sys/device.h b/sys/sys/device.h index 6fcca1febc..4f345ef7e2 100644 --- a/sys/sys/device.h +++ b/sys/sys/device.h @@ -100,7 +100,7 @@ struct dev_write_args { /* * int d_ioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, - * struct ucred *cred) + * struct ucred *cred, struct sysmsg *msg) */ struct dev_ioctl_args { struct dev_generic_args a_head; @@ -108,6 +108,7 @@ struct dev_ioctl_args { caddr_t a_data; int a_fflag; struct ucred *a_cred; + struct sysmsg *a_sysmsg; }; /* @@ -298,13 +299,14 @@ RB_PROTOTYPE2(dev_ops_rb_tree, dev_ops_maj, rbnode, rb_dev_ops_compare, int); extern struct dev_ops dead_dev_ops; struct disk; +struct sysmsg; int dev_dopen(cdev_t dev, int oflags, int devtype, struct ucred *cred); int dev_dclose(cdev_t dev, int fflag, int devtype); void dev_dstrategy(cdev_t dev, struct bio *bio); void dev_dstrategy_chain(cdev_t dev, struct bio *bio); int dev_dioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, - struct ucred *cred); + struct ucred *cred, struct sysmsg *msg); int dev_ddump(cdev_t dev); int64_t dev_dpsize(cdev_t dev); int dev_dread(cdev_t dev, struct uio *uio, int ioflag); diff --git a/sys/sys/file.h b/sys/sys/file.h index cd5e7dd96d..047bb3d4ff 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -73,6 +73,7 @@ struct ucred; struct vnode; struct lwkt_port; struct namecache; +struct sysmsg; struct fileops { int (*fo_read) (struct file *fp, struct uio *uio, @@ -80,7 +81,7 @@ struct fileops { int (*fo_write) (struct file *fp, struct uio *uio, struct ucred *cred, int flags); int (*fo_ioctl) (struct file *fp, u_long com, caddr_t data, - struct ucred *cred); + struct ucred *cred, struct sysmsg *msg); int (*fo_poll) (struct file *fp, int events, struct ucred *cred); int (*fo_kqfilter)(struct file *fp, struct knote *kn); diff --git a/sys/sys/file2.h b/sys/sys/file2.h index 98f218777e..02625b37b5 100644 --- a/sys/sys/file2.h +++ b/sys/sys/file2.h @@ -79,12 +79,13 @@ fo_ioctl( struct file *fp, u_long com, caddr_t data, - struct ucred *cred + struct ucred *cred, + struct sysmsg *msg ) { int error; fhold(fp); - error = (*fp->f_ops->fo_ioctl)(fp, com, data, cred); + error = (*fp->f_ops->fo_ioctl)(fp, com, data, cred, msg); fdrop(fp); return (error); } diff --git a/sys/sys/mapped_ioctl.h b/sys/sys/mapped_ioctl.h index b4a3fe20f7..18982c33fe 100644 --- a/sys/sys/mapped_ioctl.h +++ b/sys/sys/mapped_ioctl.h @@ -84,7 +84,8 @@ struct ioctl_map_handler { struct ioctl_map_range *cmd_ranges; }; -int mapped_ioctl(int fd, u_long com, caddr_t uspc_data, struct ioctl_map *map); +int mapped_ioctl(int fd, u_long com, caddr_t uspc_data, + struct ioctl_map *map, struct sysmsg *msg); int mapped_ioctl_register_handler(struct ioctl_map_handler *he); int mapped_ioctl_unregister_handler(struct ioctl_map_handler *he); diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index 49354f745f..aeb97afcbf 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -327,18 +327,19 @@ struct stat; struct ucred; struct uio; struct knote; +struct sysmsg; /* * File operations on sockets. */ int soo_read (struct file *fp, struct uio *uio, struct ucred *cred, - int flags); + int flags); int soo_write (struct file *fp, struct uio *uio, struct ucred *cred, - int flags); + int flags); int soo_close (struct file *fp); int soo_shutdown (struct file *fp, int how); int soo_ioctl (struct file *fp, u_long cmd, caddr_t data, - struct ucred *cred); + struct ucred *cred, struct sysmsg *msg); int soo_poll (struct file *fp, int events, struct ucred *cred); int soo_stat (struct file *fp, struct stat *ub, struct ucred *cred); int sokqfilter (struct file *fp, struct knote *kn); diff --git a/sys/sys/vfsops.h b/sys/sys/vfsops.h index f6afc83a7e..3717d0db6a 100644 --- a/sys/sys/vfsops.h +++ b/sys/sys/vfsops.h @@ -179,6 +179,7 @@ struct vop_ioctl_args { caddr_t a_data; int a_fflag; struct ucred *a_cred; + struct sysmsg *a_sysmsg; }; struct vop_poll_args { @@ -744,7 +745,8 @@ int vop_read(struct vop_ops *ops, struct vnode *vp, struct uio *uio, int vop_write(struct vop_ops *ops, struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred); int vop_ioctl(struct vop_ops *ops, struct vnode *vp, u_long command, - caddr_t data, int fflag, struct ucred *cred); + caddr_t data, int fflag, struct ucred *cred, + struct sysmsg *msg); int vop_poll(struct vop_ops *ops, struct vnode *vp, int events, struct ucred *cred); int vop_kqfilter(struct vop_ops *ops, struct vnode *vp, struct knote *kn); @@ -984,8 +986,8 @@ extern struct syslink_desc vop_nrename_desc; vop_read(*(vp)->v_ops, vp, uio, ioflag, cred) #define VOP_WRITE(vp, uio, ioflag, cred) \ vop_write(*(vp)->v_ops, vp, uio, ioflag, cred) -#define VOP_IOCTL(vp, command, data, fflag, cred) \ - vop_ioctl(*(vp)->v_ops, vp, command, data, fflag, cred) +#define VOP_IOCTL(vp, command, data, fflag, cred, msg) \ + vop_ioctl(*(vp)->v_ops, vp, command, data, fflag, cred, msg) #define VOP_POLL(vp, events, cred) \ vop_poll(*(vp)->v_ops, vp, events, cred) #define VOP_KQFILTER(vp, kn) \ diff --git a/sys/vfs/devfs/devfs_vnops.c b/sys/vfs/devfs/devfs_vnops.c index 0adba2de2b..26ba070c6a 100644 --- a/sys/vfs/devfs/devfs_vnops.c +++ b/sys/vfs/devfs/devfs_vnops.c @@ -106,11 +106,11 @@ static int devfs_specf_write(struct file *, struct uio *, struct ucred *, int); static int devfs_specf_stat(struct file *, struct stat *, struct ucred *); static int devfs_specf_kqfilter(struct file *, struct knote *); static int devfs_specf_poll(struct file *, int, struct ucred *); -static int devfs_specf_ioctl(struct file *, u_long, caddr_t, struct ucred *); - - +static int devfs_specf_ioctl(struct file *, u_long, caddr_t, + struct ucred *, struct sysmsg *); static __inline int sequential_heuristic(struct uio *, struct file *); -extern struct lock devfs_lock; + +extern struct lock devfs_lock; /* * devfs vnode operations for regular files @@ -1297,7 +1297,8 @@ done: * MPALMOSTSAFE - acquires mplock */ static int -devfs_specf_ioctl(struct file *fp, u_long com, caddr_t data, struct ucred *ucred) +devfs_specf_ioctl(struct file *fp, u_long com, caddr_t data, + struct ucred *ucred, struct sysmsg *msg) { struct devfs_node *node; struct vnode *vp; @@ -1343,7 +1344,7 @@ devfs_specf_ioctl(struct file *fp, u_long com, caddr_t data, struct ucred *ucred goto out; } reference_dev(dev); - error = dev_dioctl(dev, com, data, fp->f_flag, ucred); + error = dev_dioctl(dev, com, data, fp->f_flag, ucred, msg); release_dev(dev); #if 0 if (node) { @@ -1481,7 +1482,7 @@ devfs_spec_write(struct vop_write_args *ap) * Device ioctl operation. * * spec_ioctl(struct vnode *a_vp, int a_command, caddr_t a_data, - * int a_fflag, struct ucred *a_cred) + * int a_fflag, struct ucred *a_cred, struct sysmsg *msg) */ static int devfs_spec_ioctl(struct vop_ioctl_args *ap) @@ -1501,8 +1502,8 @@ devfs_spec_ioctl(struct vop_ioctl_args *ap) } #endif - return (dev_dioctl(dev, ap->a_command, ap->a_data, - ap->a_fflag, ap->a_cred)); + return (dev_dioctl(dev, ap->a_command, ap->a_data, ap->a_fflag, + ap->a_cred, ap->a_sysmsg)); } /* diff --git a/sys/vfs/fifofs/fifo_vnops.c b/sys/vfs/fifofs/fifo_vnops.c index 9eeca075e4..79b79b197c 100644 --- a/sys/vfs/fifofs/fifo_vnops.c +++ b/sys/vfs/fifofs/fifo_vnops.c @@ -328,7 +328,7 @@ fifo_write(struct vop_write_args *ap) * Device ioctl operation. * * fifo_ioctl(struct vnode *a_vp, int a_command, caddr_t a_data, int a_fflag, - * struct ucred *a_cred) + * struct ucred *a_cred, struct sysmsg *a_sysmsg) */ /* ARGSUSED */ static int @@ -339,13 +339,15 @@ fifo_ioctl(struct vop_ioctl_args *ap) if (ap->a_fflag & FREAD) { filetmp.f_data = ap->a_vp->v_fifoinfo->fi_readsock; - error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_cred); + error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, + ap->a_cred, ap->a_sysmsg); if (error) return (error); } if (ap->a_fflag & FWRITE) { filetmp.f_data = ap->a_vp->v_fifoinfo->fi_writesock; - error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_cred); + error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, + ap->a_cred, ap->a_sysmsg); if (error) return (error); } diff --git a/sys/vfs/gnu/ext2fs/ext2_vfsops.c b/sys/vfs/gnu/ext2fs/ext2_vfsops.c index 437dd4d29a..f2ece19103 100644 --- a/sys/vfs/gnu/ext2fs/ext2_vfsops.c +++ b/sys/vfs/gnu/ext2fs/ext2_vfsops.c @@ -779,7 +779,8 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp, struct ucred *cred) mp->mnt_iosize_max = dev->si_iosize_max; if (mp->mnt_iosize_max > MAXPHYS) mp->mnt_iosize_max = MAXPHYS; - if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, cred) != 0) { + if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, + cred, NULL) != 0) { size = DEV_BSIZE; } else { size = dpart.media_blksize; diff --git a/sys/vfs/isofs/cd9660/cd9660_vfsops.c b/sys/vfs/isofs/cd9660/cd9660_vfsops.c index 79de7ad27c..bfa2967c7f 100644 --- a/sys/vfs/isofs/cd9660/cd9660_vfsops.c +++ b/sys/vfs/isofs/cd9660/cd9660_vfsops.c @@ -118,13 +118,15 @@ iso_get_ssector(cdev_t dev) struct ioc_read_toc_single_entry t; int i; - if (dev_dioctl(dev, CDIOREADTOCHEADER, (caddr_t)&h, FREAD, proc0.p_ucred) != 0) + if (dev_dioctl(dev, CDIOREADTOCHEADER, (caddr_t)&h, FREAD, + proc0.p_ucred, NULL) != 0) return 0; for (i = h.ending_track; i >= 0; i--) { t.address_format = CD_LBA_FORMAT; t.track = i; - if (dev_dioctl(dev, CDIOREADTOCENTRY, (caddr_t)&t, FREAD, proc0.p_ucred) != 0) { + if (dev_dioctl(dev, CDIOREADTOCENTRY, (caddr_t)&t, FREAD, + proc0.p_ucred, NULL) != 0) { return 0; } if ((t.entry.control & 4) != 0) diff --git a/sys/vfs/ufs/ffs_vfsops.c b/sys/vfs/ufs/ffs_vfsops.c index 723daed535..13f5f6d29e 100644 --- a/sys/vfs/ufs/ffs_vfsops.c +++ b/sys/vfs/ufs/ffs_vfsops.c @@ -482,10 +482,12 @@ ffs_reload(struct mount *mp, struct ucred *cred) /* * Step 2: re-read superblock from disk. */ - if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, cred) != 0) + if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, + cred, NULL) != 0) { size = DEV_BSIZE; - else + } else { size = dpart.media_blksize; + } if ((error = bread(devvp, SBOFF, SBSIZE, &bp)) != 0) { brelse(bp); return (error); @@ -649,10 +651,12 @@ ffs_mountfs(struct vnode *devvp, struct mount *mp, struct malloc_type *mtype) if (devvp->v_object == NULL) panic("ffs_reload: devvp has no VM object!"); - if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, proc0.p_ucred) != 0) + if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, + proc0.p_ucred, NULL) != 0) { size = DEV_BSIZE; - else + } else { size = dpart.media_blksize; + } bp = NULL; ump = NULL; -- 2.41.0