Date: Wed, 23 Feb 2022 10:06:40 -0900 From: Rob Wing <rew@freebsd.org> To: src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-branches@freebsd.org Subject: Re: git: a01bf3940271 - stable/13 - geom: add kqfilter support for geom dev Message-ID: <CAF3%2Bn_cMmtzHHQ4m2R2ranCGBfTW8nYRD=dBGysxKWAnJWSzsA@mail.gmail.com> In-Reply-To: <202202231742.21NHg5PD085708@gitrepo.freebsd.org> References: <202202231742.21NHg5PD085708@gitrepo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--0000000000000448cb05d8b42b12 Content-Type: text/plain; charset="UTF-8" I forgot to pass the -x flag to git cherry pick on this one. This commit was cherry picked from a50e92cc203c1e3dd2cca03410b568f76694895c On Wed, Feb 23, 2022 at 8:42 AM Robert Wing <rew@freebsd.org> wrote: > The branch stable/13 has been updated by rew: > > URL: > https://cgit.FreeBSD.org/src/commit/?id=a01bf3940271fa118d6fa306d80f44fc534f58b5 > > commit a01bf3940271fa118d6fa306d80f44fc534f58b5 > Author: Robert Wing <rew@FreeBSD.org> > AuthorDate: 2022-01-18 19:54:59 +0000 > Commit: Robert Wing <rew@FreeBSD.org> > CommitDate: 2022-02-23 17:26:49 +0000 > > geom: add kqfilter support for geom dev > > The only event hooked up is NOTE_ATTRIB, which is triggered when the > device is resized. Support for other NOTE_* events to follow. > > Reviewed by: kib, jhb > Differential Revision: https://reviews.freebsd.org/D33402 > --- > sys/geom/geom_dev.c | 59 > +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 59 insertions(+) > > diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c > index 24ab14e90c1b..b94df9fcda67 100644 > --- a/sys/geom/geom_dev.c > +++ b/sys/geom/geom_dev.c > @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$"); > #include <sys/disk.h> > #include <sys/fcntl.h> > #include <sys/limits.h> > +#include <sys/selinfo.h> > #include <sys/sysctl.h> > #include <geom/geom.h> > #include <geom/geom_int.h> > @@ -65,6 +66,7 @@ struct g_dev_softc { > struct cdev *sc_alias; > int sc_open; > u_int sc_active; > + struct selinfo sc_selinfo; > #define SC_A_DESTROY (1 << 31) > #define SC_A_OPEN (1 << 30) > #define SC_A_ACTIVE (SC_A_OPEN - 1) > @@ -74,6 +76,16 @@ static d_open_t g_dev_open; > static d_close_t g_dev_close; > static d_strategy_t g_dev_strategy; > static d_ioctl_t g_dev_ioctl; > +static d_kqfilter_t g_dev_kqfilter; > + > +static void gdev_filter_detach(struct knote *kn); > +static int gdev_filter_vnode(struct knote *kn, long hint); > + > +static struct filterops gdev_filterops_vnode = { > + .f_isfd = 1, > + .f_detach = gdev_filter_detach, > + .f_event = gdev_filter_vnode, > +}; > > static struct cdevsw g_dev_cdevsw = { > .d_version = D_VERSION, > @@ -85,6 +97,7 @@ static struct cdevsw g_dev_cdevsw = { > .d_strategy = g_dev_strategy, > .d_name = "g_dev", > .d_flags = D_DISK | D_TRACKCLOSE, > + .d_kqfilter = g_dev_kqfilter, > }; > > static g_init_t g_dev_init; > @@ -214,6 +227,8 @@ g_dev_destroy(void *arg, int flags __unused) > g_trace(G_T_TOPOLOGY, "g_dev_destroy(%p(%s))", cp, gp->name); > snprintf(buf, sizeof(buf), "cdev=%s", gp->name); > devctl_notify("GEOM", "DEV", "DESTROY", buf); > + knlist_clear(&sc->sc_selinfo.si_note, 0); > + knlist_destroy(&sc->sc_selinfo.si_note); > if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0) > g_access(cp, -cp->acr, -cp->acw, -cp->ace); > g_detach(cp); > @@ -305,8 +320,12 @@ g_dev_attrchanged(struct g_consumer *cp, const char > *attr) > static void > g_dev_resize(struct g_consumer *cp) > { > + struct g_dev_softc *sc; > char buf[SPECNAMELEN + 6]; > > + sc = cp->private; > + KNOTE_UNLOCKED(&sc->sc_selinfo.si_note, NOTE_ATTRIB); > + > snprintf(buf, sizeof(buf), "cdev=%s", cp->provider->name); > devctl_notify("GEOM", "DEV", "SIZECHANGE", buf); > } > @@ -378,6 +397,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, > int insist __unused) > dev = sc->sc_dev; > dev->si_flags |= SI_UNMAPPED; > dev->si_iosize_max = maxphys; > + knlist_init_mtx(&sc->sc_selinfo.si_note, &sc->sc_mtx); > error = init_dumpdev(dev); > if (error != 0) > printf("%s: init_dumpdev() failed (gp->name=%s, > error=%d)\n", > @@ -883,4 +903,43 @@ g_dev_orphan(struct g_consumer *cp) > destroy_dev_sched_cb(dev, g_dev_callback, cp); > } > > +static void > +gdev_filter_detach(struct knote *kn) > +{ > + struct g_dev_softc *sc; > + > + sc = kn->kn_hook; > + > + knlist_remove(&sc->sc_selinfo.si_note, kn, 0); > +} > + > +static int > +gdev_filter_vnode(struct knote *kn, long hint) > +{ > + kn->kn_fflags |= kn->kn_sfflags & hint; > + > + return (kn->kn_fflags != 0); > +} > + > +static int > +g_dev_kqfilter(struct cdev *dev, struct knote *kn) > +{ > + struct g_dev_softc *sc; > + > + sc = dev->si_drv1; > + > + if (kn->kn_filter != EVFILT_VNODE) > + return (EINVAL); > + > + /* XXX: extend support for other NOTE_* events */ > + if (kn->kn_sfflags != NOTE_ATTRIB) > + return (EINVAL); > + > + kn->kn_fop = &gdev_filterops_vnode; > + kn->kn_hook = sc; > + knlist_add(&sc->sc_selinfo.si_note, kn, 0); > + > + return (0); > +} > + > DECLARE_GEOM_CLASS(g_dev_class, g_dev); > --0000000000000448cb05d8b42b12 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div>I forgot to pass the -x flag to git cherry pick on th= is one.</div><div><br></div><div>This commit was cherry picked from a50e92c= c203c1e3dd2cca03410b568f76694895c</div></div><br><div class=3D"gmail_quote"= ><div dir=3D"ltr" class=3D"gmail_attr">On Wed, Feb 23, 2022 at 8:42 AM Robe= rt Wing <<a href=3D"mailto:rew@freebsd.org">rew@freebsd.org</a>> wrot= e:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0= .8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The branch st= able/13 has been updated by rew:<br> <br> URL: <a href=3D"https://cgit.FreeBSD.org/src/commit/?id=3Da01bf3940271fa118= d6fa306d80f44fc534f58b5" rel=3D"noreferrer" target=3D"_blank">https://cgit.= FreeBSD.org/src/commit/?id=3Da01bf3940271fa118d6fa306d80f44fc534f58b5</a><b= r> <br> commit a01bf3940271fa118d6fa306d80f44fc534f58b5<br> Author:=C2=A0 =C2=A0 =C2=A0Robert Wing <rew@FreeBSD.org><br> AuthorDate: 2022-01-18 19:54:59 +0000<br> Commit:=C2=A0 =C2=A0 =C2=A0Robert Wing <rew@FreeBSD.org><br> CommitDate: 2022-02-23 17:26:49 +0000<br> <br> =C2=A0 =C2=A0 geom: add kqfilter support for geom dev<br> <br> =C2=A0 =C2=A0 The only event hooked up is NOTE_ATTRIB, which is triggered w= hen the<br> =C2=A0 =C2=A0 device is resized. Support for other NOTE_* events to follow.= <br> <br> =C2=A0 =C2=A0 Reviewed by:=C2=A0 =C2=A0 kib, jhb<br> =C2=A0 =C2=A0 Differential Revision:=C2=A0 <a href=3D"https://reviews.freeb= sd.org/D33402" rel=3D"noreferrer" target=3D"_blank">https://reviews.freebsd= .org/D33402</a><br> ---<br> =C2=A0sys/geom/geom_dev.c | 59 ++++++++++++++++++++++++++++++++++++++++++++= +++++++++<br> =C2=A01 file changed, 59 insertions(+)<br> <br> diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c<br> index 24ab14e90c1b..b94df9fcda67 100644<br> --- a/sys/geom/geom_dev.c<br> +++ b/sys/geom/geom_dev.c<br> @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");<br> =C2=A0#include <sys/disk.h><br> =C2=A0#include <sys/fcntl.h><br> =C2=A0#include <sys/limits.h><br> +#include <sys/selinfo.h><br> =C2=A0#include <sys/sysctl.h><br> =C2=A0#include <geom/geom.h><br> =C2=A0#include <geom/geom_int.h><br> @@ -65,6 +66,7 @@ struct g_dev_softc {<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct cdev=C2=A0 =C2=A0 =C2=A0*sc_alias;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 sc_open;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 u_int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = sc_active;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0struct selinfo=C2=A0 =C2=A0sc_selinfo;<br> =C2=A0#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 SC_A_DESTROY=C2=A0 =C2=A0 (1 <&= lt; 31)<br> =C2=A0#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 SC_A_OPEN=C2=A0 =C2=A0 =C2=A0 =C2= =A0(1 << 30)<br> =C2=A0#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 SC_A_ACTIVE=C2=A0 =C2=A0 =C2=A0(SC= _A_OPEN - 1)<br> @@ -74,6 +76,16 @@ static d_open_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 g_dev_open;<br> =C2=A0static d_close_t=C2=A0 =C2=A0 =C2=A0 =C2=A0g_dev_close;<br> =C2=A0static d_strategy_t=C2=A0 =C2=A0 g_dev_strategy;<br> =C2=A0static d_ioctl_t=C2=A0 =C2=A0 =C2=A0 =C2=A0g_dev_ioctl;<br> +static d_kqfilter_t=C2=A0 =C2=A0 g_dev_kqfilter;<br> +<br> +static void=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 gdev_filter_detach(st= ruct knote *kn);<br> +static int=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0gdev_filter_vnod= e(struct knote *kn, long hint);<br> +<br> +static struct filterops gdev_filterops_vnode =3D {<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0.f_isfd =3D 1,<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0.f_detach =3D gdev_filter_detach,<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0.f_event =3D gdev_filter_vnode,<br> +};<br> <br> =C2=A0static struct cdevsw g_dev_cdevsw =3D {<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 .d_version =3D=C2=A0 =C2=A0 D_VERSION,<br> @@ -85,6 +97,7 @@ static struct cdevsw g_dev_cdevsw =3D {<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 .d_strategy =3D=C2=A0 =C2=A0g_dev_strategy,<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 .d_name =3D=C2=A0 =C2=A0 =C2=A0 =C2=A0"g_d= ev",<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 .d_flags =3D=C2=A0 =C2=A0 =C2=A0 D_DISK | D_TRA= CKCLOSE,<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0.d_kqfilter =3D=C2=A0 =C2=A0g_dev_kqfilter,<br> =C2=A0};<br> <br> =C2=A0static g_init_t g_dev_init;<br> @@ -214,6 +227,8 @@ g_dev_destroy(void *arg, int flags __unused)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 g_trace(G_T_TOPOLOGY, "g_dev_destroy(%p(%s= ))", cp, gp->name);<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 snprintf(buf, sizeof(buf), "cdev=3D%s"= ;, gp->name);<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 devctl_notify("GEOM", "DEV"= , "DESTROY", buf);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_clear(&sc->sc_selinfo.si_note, 0)= ;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_destroy(&sc->sc_selinfo.si_note);= <br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (cp->acr > 0 || cp->acw > 0 || c= p->ace > 0)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 g_access(cp, -cp-&g= t;acr, -cp->acw, -cp->ace);<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 g_detach(cp);<br> @@ -305,8 +320,12 @@ g_dev_attrchanged(struct g_consumer *cp, const char *a= ttr)<br> =C2=A0static void<br> =C2=A0g_dev_resize(struct g_consumer *cp)<br> =C2=A0{<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0struct g_dev_softc *sc;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 char buf[SPECNAMELEN + 6];<br> <br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0sc =3D cp->private;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0KNOTE_UNLOCKED(&sc->sc_selinfo.si_note, = NOTE_ATTRIB);<br> +<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 snprintf(buf, sizeof(buf), "cdev=3D%s"= ;, cp->provider->name);<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 devctl_notify("GEOM", "DEV"= , "SIZECHANGE", buf);<br> =C2=A0}<br> @@ -378,6 +397,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, = int insist __unused)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 dev =3D sc->sc_dev;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 dev->si_flags |=3D SI_UNMAPPED;<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 dev->si_iosize_max =3D maxphys;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_init_mtx(&sc->sc_selinfo.si_note,= &sc->sc_mtx);<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 error =3D init_dumpdev(dev);<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (error !=3D 0)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 printf("%s: in= it_dumpdev() failed (gp->name=3D%s, error=3D%d)\n",<br> @@ -883,4 +903,43 @@ g_dev_orphan(struct g_consumer *cp)<br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 destroy_dev_sched_cb(dev, g_dev_callback, cp);<= br> =C2=A0}<br> <br> +static void<br> +gdev_filter_detach(struct knote *kn)<br> +{<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0struct g_dev_softc *sc;<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0sc =3D kn->kn_hook;<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_remove(&sc->sc_selinfo.si_note, k= n, 0);<br> +}<br> +<br> +static int<br> +gdev_filter_vnode(struct knote *kn, long hint)<br> +{<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0kn->kn_fflags |=3D kn->kn_sfflags & h= int;<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0return (kn->kn_fflags !=3D 0);<br> +}<br> +<br> +static int<br> +g_dev_kqfilter(struct cdev *dev, struct knote *kn)<br> +{<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0struct g_dev_softc *sc;<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0sc =3D dev->si_drv1;<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0if (kn->kn_filter !=3D EVFILT_VNODE)<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return (EINVAL);<br= > +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0/* XXX: extend support for other NOTE_* events = */<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0if (kn->kn_sfflags !=3D NOTE_ATTRIB)<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return (EINVAL);<br= > +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0kn->kn_fop =3D &gdev_filterops_vnode;<br= > +=C2=A0 =C2=A0 =C2=A0 =C2=A0kn->kn_hook =3D sc;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_add(&sc->sc_selinfo.si_note, kn, = 0);<br> +<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0return (0);<br> +}<br> +<br> =C2=A0DECLARE_GEOM_CLASS(g_dev_class, g_dev);<br> </blockquote></div> --0000000000000448cb05d8b42b12--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAF3%2Bn_cMmtzHHQ4m2R2ranCGBfTW8nYRD=dBGysxKWAnJWSzsA>