From 5c7a8cfebd0e37e544e6ca46d2c369917e922fc4 Mon Sep 17 00:00:00 2001 From: "Samuel J. Greear" Date: Mon, 5 Jul 2010 04:06:50 +0000 Subject: [PATCH] vinum - Add kq support --- sys/dev/raid/vinum/vinum.c | 36 ++++++++++++++++++++++++++++++++++- sys/dev/raid/vinum/vinumext.h | 4 ++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/sys/dev/raid/vinum/vinum.c b/sys/dev/raid/vinum/vinum.c index a9ca135dd0..979dc2d86c 100644 --- a/sys/dev/raid/vinum/vinum.c +++ b/sys/dev/raid/vinum/vinum.c @@ -45,6 +45,8 @@ #include "vinumhdr.h" #include /* for sync(2) */ #include +#include +#include #ifdef VINUMDEBUG #include int debug = 0; @@ -56,13 +58,14 @@ extern struct mc malloced[]; struct dev_ops vinum_ops = { - { "vinum", VINUM_CDEV_MAJOR, D_DISK }, + { "vinum", VINUM_CDEV_MAJOR, D_DISK | D_KQFILTER }, .d_open = vinumopen, .d_close = vinumclose, .d_read = physread, .d_write = physwrite, .d_ioctl = vinumioctl, .d_poll = vinumpoll, + .d_kqfilter = vinumkqfilter, .d_strategy = vinumstrategy, .d_dump = vinumdump, .d_psize = vinumsize, @@ -579,6 +582,37 @@ vinumpoll(struct dev_poll_args *ap) return(0); } +void +vinumfilt_detach(struct knote *kn) {} + +int +vinumfilt(struct knote *kn, long hint) +{ + cdev_t dev = (cdev_t)kn->kn_hook; + + if (seltrue(dev, POLLIN | POLLRDNORM)) + return (1); + + return (0); +} + +struct filterops vinumfiltops = + { 1, NULL, vinumfilt_detach, vinumfilt }; + +int +vinumkqfilter(struct dev_kqfilter_args *ap) +{ + if (ap->a_kn->kn_filter == EVFILT_READ) { + ap->a_kn->kn_fop = &vinumfiltops; + ap->a_kn->kn_hook = (caddr_t)ap->a_head.a_dev; + ap->a_result = 0; + } else { + ap->a_result = 1; + } + + return (0); +} + /* Local Variables: */ /* fill-column: 50 */ /* End: */ diff --git a/sys/dev/raid/vinum/vinumext.h b/sys/dev/raid/vinum/vinumext.h index 94ed10fdf5..687f7fc227 100644 --- a/sys/dev/raid/vinum/vinumext.h +++ b/sys/dev/raid/vinum/vinumext.h @@ -139,6 +139,10 @@ d_ioctl_t vinumioctl; d_dump_t vinumdump; d_psize_t vinumsize; d_poll_t vinumpoll; +d_kqfilter_t vinumkqfilter; + +int vinumfilt(struct knote *, long); +void vinumfilt_detach(struct knote *); int vinumstart(cdev_t dev, struct bio *bio, int reviveok); int launch_requests(struct request *rq, int reviveok); -- 2.41.0