add file pointer to dev_d*() functions
authorJohannes Hofmann <johannes.hofmann@gmx.de>
Wed, 18 Dec 2013 22:06:22 +0000 (23:06 +0100)
committerMarkus Pfeiffer <markus.pfeiffer@morphism.de>
Tue, 21 Jan 2014 22:04:06 +0000 (22:04 +0000)
14 files changed:
sys/dev/disk/dm/dm_pdev.c
sys/dev/disk/vn/vn.c
sys/dev/video/fb/fb.c
sys/kern/kern_device.c
sys/kern/kern_shutdown.c
sys/kern/subr_disk.c
sys/kern/subr_diskiocom.c
sys/kern/subr_diskslice.c
sys/kern/tty_cons.c
sys/sys/device.h
sys/vfs/devfs/devfs_vnops.c
sys/vfs/isofs/cd9660/cd9660_vfsops.c
sys/vm/device_pager.c
sys/vm/vm_mmap.c

index 6fd0adc..4e47634 100644 (file)
@@ -157,7 +157,7 @@ dm_pdev_insert(const char *dev_name)
         */
        bzero(&dmp->pdev_pinfo, sizeof(dmp->pdev_pinfo));
        error = dev_dioctl(dmp->pdev_vnode->v_rdev, DIOCGPART,
-           (void *)&dmp->pdev_pinfo, 0, proc0.p_ucred, NULL);
+           (void *)&dmp->pdev_pinfo, 0, proc0.p_ucred, NULL, NULL);
 
        lockmgr(&dm_pdev_mutex, LK_EXCLUSIVE);
        SLIST_INSERT_HEAD(&dm_pdev_list, dmp, next_pdev);
index 18e4053..2d380dc 100644 (file)
@@ -588,7 +588,7 @@ vniocattach_file(struct vn_softc *vn, struct vn_ioctl *vio, cdev_t dev,
        info.d_ncylinders = vn->sc_size / info.d_secpercyl;
        disk_setdiskinfo_sync(&vn->sc_disk, &info);
 
-       error = dev_dopen(dev, flag, S_IFCHR, cred);
+       error = dev_dopen(dev, flag, S_IFCHR, cred, NULL);
        if (error)
                vnclear(vn);
 
@@ -665,7 +665,7 @@ vniocattach_swap(struct vn_softc *vn, struct vn_ioctl *vio, cdev_t dev,
                info.d_ncylinders = vn->sc_size / info.d_secpercyl;
                disk_setdiskinfo_sync(&vn->sc_disk, &info);
 
-               error = dev_dopen(dev, flag, S_IFCHR, cred);
+               error = dev_dopen(dev, flag, S_IFCHR, cred, NULL);
        }
        if (error == 0) {
                IFOPT(vn, VN_FOLLOW) {
index 6ebeb8d..885dbbb 100644 (file)
@@ -445,7 +445,7 @@ fbopen(struct dev_open_args *ap)
                return ENXIO;
        if ((fdev = vidcdevsw[unit]) == NULL)
                return ENXIO;
-       return dev_dopen(fdev, ap->a_oflags, ap->a_devtype, ap->a_cred);
+       return dev_dopen(fdev, ap->a_oflags, ap->a_devtype, ap->a_cred, NULL);
 }
 
 static int
index 16049cc..7be42b8 100644 (file)
@@ -133,7 +133,7 @@ dev_needmplock(cdev_t dev)
  * The MPSAFEness of these depends on dev->si_ops->head.flags
  */
 int
-dev_dopen(cdev_t dev, int oflags, int devtype, struct ucred *cred)
+dev_dopen(cdev_t dev, int oflags, int devtype, struct ucred *cred, struct file *fp)
 {
        struct dev_open_args ap;
        int needmplock = dev_needmplock(dev);
@@ -144,6 +144,7 @@ dev_dopen(cdev_t dev, int oflags, int devtype, struct ucred *cred)
        ap.a_oflags = oflags;
        ap.a_devtype = devtype;
        ap.a_cred = cred;
+       ap.a_fp = fp;
 
        if (needmplock)
                get_mplock();
@@ -174,7 +175,7 @@ dev_dclose(cdev_t dev, int fflag, int devtype)
 }
 
 int
-dev_dread(cdev_t dev, struct uio *uio, int ioflag)
+dev_dread(cdev_t dev, struct uio *uio, int ioflag, struct file *fp)
 {
        struct dev_read_args ap;
        int needmplock = dev_needmplock(dev);
@@ -184,6 +185,7 @@ dev_dread(cdev_t dev, struct uio *uio, int ioflag)
        ap.a_head.a_dev = dev;
        ap.a_uio = uio;
        ap.a_ioflag = ioflag;
+       ap.a_fp = fp;
 
        if (needmplock) {
                get_mplock();
@@ -200,7 +202,7 @@ dev_dread(cdev_t dev, struct uio *uio, int ioflag)
 }
 
 int
-dev_dwrite(cdev_t dev, struct uio *uio, int ioflag)
+dev_dwrite(cdev_t dev, struct uio *uio, int ioflag, struct file *fp)
 {
        struct dev_write_args ap;
        int needmplock = dev_needmplock(dev);
@@ -211,6 +213,7 @@ dev_dwrite(cdev_t dev, struct uio *uio, int ioflag)
        ap.a_head.a_dev = dev;
        ap.a_uio = uio;
        ap.a_ioflag = ioflag;
+       ap.a_fp = fp;
 
        if (needmplock) {
                get_mplock();
@@ -226,7 +229,7 @@ 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,
-          struct sysmsg *msg)
+          struct sysmsg *msg, struct file *fp)
 {
        struct dev_ioctl_args ap;
        int needmplock = dev_needmplock(dev);
@@ -239,6 +242,7 @@ dev_dioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, struct ucred *cred,
        ap.a_fflag = fflag;
        ap.a_cred = cred;
        ap.a_sysmsg = msg;
+       ap.a_fp = fp;
 
        if (needmplock)
                get_mplock();
@@ -249,7 +253,7 @@ dev_dioctl(cdev_t dev, u_long cmd, caddr_t data, int fflag, struct ucred *cred,
 }
 
 int
-dev_dmmap(cdev_t dev, vm_offset_t offset, int nprot)
+dev_dmmap(cdev_t dev, vm_offset_t offset, int nprot, struct file *fp)
 {
        struct dev_mmap_args ap;
        int needmplock = dev_needmplock(dev);
@@ -259,6 +263,7 @@ dev_dmmap(cdev_t dev, vm_offset_t offset, int nprot)
        ap.a_head.a_dev = dev;
        ap.a_offset = offset;
        ap.a_nprot = nprot;
+       ap.a_fp = fp;
 
        if (needmplock)
                get_mplock();
@@ -273,7 +278,7 @@ dev_dmmap(cdev_t dev, vm_offset_t offset, int nprot)
 
 int
 dev_dmmap_single(cdev_t dev, vm_ooffset_t *offset, vm_size_t size,
-                 struct vm_object **object, int nprot)
+                 struct vm_object **object, int nprot, struct file *fp)
 {
        struct dev_mmap_single_args ap;
        int needmplock = dev_needmplock(dev);
@@ -285,6 +290,7 @@ dev_dmmap_single(cdev_t dev, vm_ooffset_t *offset, vm_size_t size,
        ap.a_size = size;
        ap.a_object = object;
        ap.a_nprot = nprot;
+       ap.a_fp = fp;
 
        if (needmplock)
                get_mplock();
@@ -451,7 +457,7 @@ dev_dpsize(cdev_t dev)
  *      which return 0 do not have to bother setting a_result.
  */
 int
-dev_dkqfilter(cdev_t dev, struct knote *kn)
+dev_dkqfilter(cdev_t dev, struct knote *kn, struct file *fp)
 {
        struct dev_kqfilter_args ap;
        int needmplock = dev_needmplock(dev);
@@ -461,6 +467,7 @@ dev_dkqfilter(cdev_t dev, struct knote *kn)
        ap.a_head.a_dev = dev;
        ap.a_kn = kn;
        ap.a_result = 0;
+       ap.a_fp = fp;
 
        if (needmplock)
                get_mplock();
index 04d35e3..6e1d813 100644 (file)
@@ -627,7 +627,7 @@ setdumpdev(cdev_t dev)
         */
        doopen = (dev->si_sysref.refcnt == 1);
        if (doopen) {
-               error = dev_dopen(dev, FREAD, S_IFCHR, proc0.p_ucred);
+               error = dev_dopen(dev, FREAD, S_IFCHR, proc0.p_ucred, NULL);
                if (error)
                        return (error);
        }
index a5ab5c6..01f1cf7 100644 (file)
@@ -836,7 +836,7 @@ disk_dumpcheck(cdev_t dev, u_int64_t *size,
 
        bzero(&pinfo, sizeof(pinfo));
        error = dev_dioctl(dev, DIOCGPART, (void *)&pinfo, 0,
-                          proc0.p_ucred, NULL);
+                          proc0.p_ucred, NULL, NULL);
        if (error)
                return (error);
 
@@ -1033,7 +1033,7 @@ diskopen(struct dev_open_args *ap)
                        pdev->si_iosize_max = dev->si_iosize_max;
 #endif
                error = dev_dopen(dp->d_rawdev, ap->a_oflags,
-                                 ap->a_devtype, ap->a_cred);
+                                 ap->a_devtype, ap->a_cred, NULL);
        }
 
        if (error)
@@ -1141,7 +1141,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, NULL);
+                                  ap->a_fflag, ap->a_cred, NULL, NULL);
        }
        return (error);
 }
index 1101392..bc4532f 100644 (file)
@@ -257,7 +257,7 @@ disk_blk_open(struct disk *dp, kdmsg_msg_t *msg)
                        fflags = FREAD;
                if (msg->any.blk_open.modes & DMSG_BLKOPEN_WR)
                        fflags |= FWRITE;
-               error = dev_dopen(dp->d_rawdev, fflags, S_IFCHR, proc0.p_ucred);
+               error = dev_dopen(dp->d_rawdev, fflags, S_IFCHR, proc0.p_ucred, NULL);
                if (error) {
                        error = DMSG_ERR_IO;
                } else {
index 061b047..96e5ce9 100644 (file)
@@ -806,7 +806,7 @@ dssize(cdev_t dev, struct diskslices **sspp)
        ssp = *sspp;
        if (ssp == NULL || slice >= ssp->dss_nslices
            || !dschkmask(&ssp->dss_slices[slice], part)) {
-               if (dev_dopen(dev, FREAD, S_IFCHR, proc0.p_ucred) != 0)
+               if (dev_dopen(dev, FREAD, S_IFCHR, proc0.p_ucred, NULL) != 0)
                        return (-1);
                dev_dclose(dev, FREAD, S_IFCHR);
                ssp = *sspp;
index 6793ed7..975b3dc 100644 (file)
@@ -262,7 +262,7 @@ sysctl_kern_consmute(SYSCTL_HANDLER_ARGS)
                        if (cn_is_open) {
                                /* XXX curproc is not what we want really */
                                error = dev_dopen(cn_dev, openflag,
-                                               openmode, curproc->p_ucred);
+                                               openmode, curproc->p_ucred, NULL);
                        }
                        /* if it failed, back it out */
                        if ( error != 0) cnuninit();
index bf5341f..d61da62 100644 (file)
@@ -67,6 +67,7 @@ struct dev_open_args {
        int             a_oflags;
        int             a_devtype;
        struct ucred    *a_cred;
+       struct file     *a_fp;
 };
 
 /*
@@ -85,6 +86,7 @@ struct dev_read_args {
        struct dev_generic_args a_head;
        struct uio      *a_uio;
        int             a_ioflag;
+       struct file     *a_fp;
 };
 
 /*
@@ -94,6 +96,7 @@ struct dev_write_args {
        struct dev_generic_args a_head;
        struct uio      *a_uio;
        int             a_ioflag;
+       struct file     *a_fp;
 };
 
 /*
@@ -107,6 +110,7 @@ struct dev_ioctl_args {
        int             a_fflag;
        struct ucred    *a_cred;
        struct sysmsg   *a_sysmsg;
+       struct file     *a_fp;
 };
 
 /*
@@ -117,6 +121,7 @@ struct dev_mmap_args {
        vm_offset_t     a_offset;
        int             a_nprot;
        int             a_result;       /* page number */
+       struct file     *a_fp;
 };
 
 /*
@@ -129,6 +134,7 @@ struct dev_mmap_single_args {
        vm_size_t               a_size;
        struct vm_object **a_object;
        int             a_nprot;
+       struct file     *a_fp;
 };
 
 /*
@@ -169,6 +175,7 @@ struct dev_kqfilter_args {
        struct dev_generic_args a_head;
        struct knote    *a_kn;
        int             a_result;
+       struct file     *a_fp;
 };
 
 /*
@@ -308,21 +315,21 @@ 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_dopen(cdev_t dev, int oflags, int devtype, struct ucred *cred, struct file *fp);
 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 sysmsg *msg);
+int dev_dioctl(cdev_t dev, u_long cmd, caddr_t data,
+               int fflag, struct ucred *cred, struct sysmsg *msg, struct file *fp);
 int dev_ddump(cdev_t dev, void *virtual, vm_offset_t physical, off_t offset,
     size_t length);
 int64_t dev_dpsize(cdev_t dev);
-int dev_dread(cdev_t dev, struct uio *uio, int ioflag);
-int dev_dwrite(cdev_t dev, struct uio *uio, int ioflag);
-int dev_dkqfilter(cdev_t dev, struct knote *kn);
-int dev_dmmap(cdev_t dev, vm_offset_t offset, int nprot);
+int dev_dread(cdev_t dev, struct uio *uio, int ioflag, struct file *fp);
+int dev_dwrite(cdev_t dev, struct uio *uio, int ioflag, struct file *fp);
+int dev_dkqfilter(cdev_t dev, struct knote *kn, struct file *fp);
+int dev_dmmap(cdev_t dev, vm_offset_t offset, int nprot, struct file *fp);
 int dev_dmmap_single(cdev_t dev, vm_ooffset_t *offset, vm_size_t size,
-                       struct vm_object **object, int nprot);
+                       struct vm_object **object, int nprot, struct file *fp);
 int dev_dclone(cdev_t dev);
 int dev_drevoke(cdev_t dev);
 
index f3a9f92..a7cf921 100644 (file)
@@ -590,7 +590,7 @@ devfs_vop_getattr(struct vop_getattr_args *ap)
        if ((node->d_dev) && (dev_dflags(node->d_dev) & D_DISK)) {
                bzero(&pinfo, sizeof(pinfo));
                error = dev_dioctl(node->d_dev, DIOCGPART, (void *)&pinfo,
-                                  0, proc0.p_ucred, NULL);
+                                  0, proc0.p_ucred, NULL, NULL);
                if ((error == 0) && (pinfo.media_blksize != 0)) {
                        vap->va_size = pinfo.media_size;
                } else {
@@ -920,7 +920,7 @@ devfs_spec_open(struct vop_open_args *ap)
         * Open underlying device
         */
        vn_unlock(vp);
-       error = dev_dopen(dev, ap->a_mode, S_IFCHR, ap->a_cred);
+       error = dev_dopen(dev, ap->a_mode, S_IFCHR, ap->a_cred, ap->a_fp);
        vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
 
        /*
@@ -1125,6 +1125,7 @@ devfs_fo_close(struct file *fp)
        struct vnode *vp = (struct vnode *)fp->f_data;
        int error;
 
+       devfs_clear_cdevpriv(fp);
        fp->f_ops = &badfileops;
        error = vn_close(vp, fp->f_flag);
 
@@ -1187,7 +1188,7 @@ devfs_fo_read(struct file *fp, struct uio *uio,
        }
        ioflag |= sequential_heuristic(uio, fp);
 
-       error = dev_dread(dev, uio, ioflag);
+       error = dev_dread(dev, uio, ioflag, fp);
 
        release_dev(dev);
        if (node)
@@ -1264,7 +1265,7 @@ devfs_fo_write(struct file *fp, struct uio *uio,
                ioflag |= IO_SYNC;
        ioflag |= sequential_heuristic(uio, fp);
 
-       error = dev_dwrite(dev, uio, ioflag);
+       error = dev_dwrite(dev, uio, ioflag, fp);
 
        release_dev(dev);
        if (node) {
@@ -1402,7 +1403,7 @@ devfs_fo_kqfilter(struct file *fp, struct knote *kn)
        }
        reference_dev(dev);
 
-       error = dev_dkqfilter(dev, kn);
+       error = dev_dkqfilter(dev, kn, fp);
 
        release_dev(dev);
 
@@ -1465,7 +1466,7 @@ devfs_fo_ioctl(struct file *fp, u_long com, caddr_t data,
                goto out;
        }
 
-       error = dev_dioctl(dev, com, data, fp->f_flag, ucred, msg);
+       error = dev_dioctl(dev, com, data, fp->f_flag, ucred, msg, fp);
 
 #if 0
        if (node) {
@@ -1552,7 +1553,7 @@ devfs_spec_read(struct vop_read_args *ap)
                return (0);
 
        vn_unlock(vp);
-       error = dev_dread(dev, uio, ap->a_ioflag);
+       error = dev_dread(dev, uio, ap->a_ioflag, NULL);
        vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
 
        if (node)
@@ -1587,7 +1588,7 @@ devfs_spec_write(struct vop_write_args *ap)
                return (EBADF);
 
        vn_unlock(vp);
-       error = dev_dwrite(dev, uio, ap->a_ioflag);
+       error = dev_dwrite(dev, uio, ap->a_ioflag, NULL);
        vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
 
        if (node) {
@@ -1625,7 +1626,7 @@ 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, ap->a_sysmsg));
+                          ap->a_cred, ap->a_sysmsg, NULL));
 }
 
 /*
@@ -1650,7 +1651,7 @@ devfs_spec_kqfilter(struct vop_kqfilter_args *ap)
                nanotime(&node->atime);
 #endif
 
-       return (dev_dkqfilter(dev, ap->a_kn));
+       return (dev_dkqfilter(dev, ap->a_kn, NULL));
 }
 
 /*
index d8763ea..f67b488 100644 (file)
@@ -123,14 +123,14 @@ iso_get_ssector(cdev_t dev)
        int i;
 
        if (dev_dioctl(dev, CDIOREADTOCHEADER, (caddr_t)&h, FREAD,
-                      proc0.p_ucred, NULL) != 0)
+                      proc0.p_ucred, NULL, 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, NULL) != 0) {
+                              proc0.p_ucred, NULL, NULL) != 0) {
                        return 0;
                }
                if ((t.entry.control & 4) != 0)
index c17d3f8..6199d39 100644 (file)
@@ -314,7 +314,7 @@ old_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot,
         */
        npages = OFF_TO_IDX(size);
        for (off = foff; npages--; off += PAGE_SIZE) {
-               if (dev_dmmap(dev, off, (int)prot) == -1)
+               if (dev_dmmap(dev, off, (int)prot, NULL) == -1)
                        return (EINVAL);
        }
 
@@ -344,7 +344,7 @@ static int old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset,
        dev = object->handle;
 
        paddr = pmap_phys_address(
-                   dev_dmmap(dev, offset, prot));
+                   dev_dmmap(dev, offset, prot, NULL));
        KASSERT(paddr != -1,("dev_pager_getpage: map function returns error"));
        KKASSERT(object->type == OBJT_DEVICE);
 
index 8796d45..393e98a 100644 (file)
@@ -1312,7 +1312,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
                         * Force them to be shared.
                         */
                        error = dev_dmmap_single(vp->v_rdev, &foff, objsize,
-                                               &object, prot);
+                                               &object, prot, NULL);
 
                        if (error == ENODEV) {
                                handle = (void *)(intptr_t)vp->v_rdev;