diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2008-05-16 11:41:50 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2008-05-16 11:41:50 +0000 |
| commit | 4470dfeb8393f57bba8969fdc9f6da17c6b9f098 (patch) | |
| tree | 0fcdd867771e2eddea428a8e9a63d6ae7df3e76b | |
| parent | baa3ddfb1abcd546d03dfddf7b884920cdf657e4 (diff) | |
Notes
| -rw-r--r-- | sys/kern/kern_conf.c | 84 |
1 files changed, 64 insertions, 20 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index a48ed6fe1fdd..2d60b8fdc9d6 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -254,118 +254,162 @@ no_poll(struct cdev *dev __unused, int events, struct thread *td __unused) static int giant_open(struct cdev *dev, int oflags, int devtype, struct thread *td) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_open(dev, oflags, devtype, td); + retval = dsw->d_gianttrick->d_open(dev, oflags, devtype, td); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } static int giant_fdopen(struct cdev *dev, int oflags, struct thread *td, int fdidx) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_fdopen(dev, oflags, td, fdidx); + retval = dsw->d_gianttrick->d_fdopen(dev, oflags, td, fdidx); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } static int giant_close(struct cdev *dev, int fflag, int devtype, struct thread *td) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_close(dev, fflag, devtype, td); + retval = dsw->d_gianttrick->d_close(dev, fflag, devtype, td); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } static void giant_strategy(struct bio *bp) { + struct cdevsw *dsw; + struct cdev *dev; + dev = bp->bio_dev; + dsw = dev_refthread(dev); + if (dsw == NULL) { + biofinish(bp, NULL, ENXIO); + return; + } mtx_lock(&Giant); - bp->bio_dev->si_devsw->d_gianttrick-> - d_strategy(bp); + dsw->d_gianttrick->d_strategy(bp); mtx_unlock(&Giant); + dev_relthread(dev); } static int giant_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_ioctl(dev, cmd, data, fflag, td); + retval = dsw->d_gianttrick->d_ioctl(dev, cmd, data, fflag, td); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } static int giant_read(struct cdev *dev, struct uio *uio, int ioflag) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_read(dev, uio, ioflag); + retval = dsw->d_gianttrick->d_read(dev, uio, ioflag); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } static int giant_write(struct cdev *dev, struct uio *uio, int ioflag) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_write(dev, uio, ioflag); + retval = dsw->d_gianttrick->d_write(dev, uio, ioflag); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } static int giant_poll(struct cdev *dev, int events, struct thread *td) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_poll(dev, events, td); + retval = dsw->d_gianttrick->d_poll(dev, events, td); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } static int giant_kqfilter(struct cdev *dev, struct knote *kn) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_kqfilter(dev, kn); + retval = dsw->d_gianttrick->d_kqfilter(dev, kn); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } static int giant_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) { + struct cdevsw *dsw; int retval; + dsw = dev_refthread(dev); + if (dsw == NULL) + return (ENXIO); mtx_lock(&Giant); - retval = dev->si_devsw->d_gianttrick-> - d_mmap(dev, offset, paddr, nprot); + retval = dsw->d_gianttrick->d_mmap(dev, offset, paddr, nprot); mtx_unlock(&Giant); + dev_relthread(dev); return (retval); } |
