Kernel - pass sysmsg through to ioctl.
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 26 Aug 2009 01:02:22 +0000 (18:02 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 26 Aug 2009 01:02:22 +0000 (18:02 -0700)
* 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.

30 files changed:
sys/dev/disk/ccd/ccd.c
sys/dev/raid/vinum/vinumio.c
sys/dev/sound/pcm/channel.c
sys/emulation/linux/linux_file.c
sys/emulation/linux/linux_ioctl.c
sys/kern/kern_descrip.c
sys/kern/kern_device.c
sys/kern/kern_event.c
sys/kern/kern_shutdown.c
sys/kern/kern_syslink.c
sys/kern/subr_disk.c
sys/kern/sys_generic.c
sys/kern/sys_pipe.c
sys/kern/sys_socket.c
sys/kern/tty_tty.c
sys/kern/uipc_syscalls.c
sys/kern/vfs_vnops.c
sys/kern/vfs_vopops.c
sys/opencrypto/cryptodev.c
sys/sys/device.h
sys/sys/file.h
sys/sys/file2.h
sys/sys/mapped_ioctl.h
sys/sys/socketvar.h
sys/sys/vfsops.h
sys/vfs/devfs/devfs_vnops.c
sys/vfs/fifofs/fifo_vnops.c
sys/vfs/gnu/ext2fs/ext2_vfsops.c
sys/vfs/isofs/cd9660/cd9660_vfsops.c
sys/vfs/ufs/ffs_vfsops.c

index fa53ff3..20b16ac 100644 (file)
@@ -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))
index b48e4ce..14b5c19 100644 (file)
@@ -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);
index 2958816..883481a 100644 (file)
@@ -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;
index 4960798..c665e0b 100644 (file)
@@ -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);
                }
        }
index 39aea77..ed92064 100644 (file)
@@ -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,
index caf66c3..bcf9cdf 100644 (file)
@@ -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);
 }
index 21bfe38..4332d1c 100644 (file)
@@ -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));
 }
 
index 0161ad1..f390833 100644 (file)
@@ -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;
index 261d4fa..9710980 100644 (file)
@@ -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)
index cb4ed44..81b1d6c 100644 (file)
@@ -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);
 }
index 716d39c..fa039ac 100644 (file)
@@ -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);
 }
index 34e9e2d..d88fd33 100644 (file)
@@ -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.
index 1ed9f18..81fc2e1 100644 (file)
@@ -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;
index 1ed9ac8..835f007 100644 (file)
@@ -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;
index 26be9f9..031b679 100644 (file)
@@ -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*/
index 1c9f4e5..295b00c 100644 (file)
@@ -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);
index bf067e2..b13f9cd 100644 (file)
@@ -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;
index afe4cf8..a3cf635 100644 (file)
@@ -58,6 +58,7 @@
 #include <sys/vmmeter.h>
 #include <sys/vnode.h>
 #include <sys/vfsops.h>
+#include <sys/sysmsg.h>
 
 #include <machine/limits.h>
 
@@ -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);
index d6d76c4..2384f9d 100644 (file)
@@ -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;
index 6fcca1f..4f345ef 100644 (file)
@@ -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);
index cd5e7dd..047bb3d 100644 (file)
@@ -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);
index 98f2187..02625b3 100644 (file)
@@ -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);
 }
index b4a3fe2..18982c3 100644 (file)
@@ -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);
 
index 49354f7..aeb97af 100644 (file)
@@ -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);
index f6afc83..3717d0d 100644 (file)
@@ -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)                           \
index 0adba2d..26ba070 100644 (file)
@@ -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));
 }
 
 /*
index 9eeca07..79b79b1 100644 (file)
@@ -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);
        }
index 437dd4d..f2ece19 100644 (file)
@@ -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;
index 79de7ad..bfa2967 100644 (file)
@@ -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)
index 723daed..13f5f6d 100644 (file)
@@ -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;