Skip site navigation (1)Skip section navigation (2)
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 &lt;<a href=3D"mailto:rew@freebsd.org">rew@freebsd.org</a>&gt; 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 &lt;rew@FreeBSD.org&gt;<br>
AuthorDate: 2022-01-18 19:54:59 +0000<br>
Commit:=C2=A0 =C2=A0 =C2=A0Robert Wing &lt;rew@FreeBSD.org&gt;<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(&quot;$FreeBSD$&quot;);<br>
=C2=A0#include &lt;sys/disk.h&gt;<br>
=C2=A0#include &lt;sys/fcntl.h&gt;<br>
=C2=A0#include &lt;sys/limits.h&gt;<br>
+#include &lt;sys/selinfo.h&gt;<br>
=C2=A0#include &lt;sys/sysctl.h&gt;<br>
=C2=A0#include &lt;geom/geom.h&gt;<br>
=C2=A0#include &lt;geom/geom_int.h&gt;<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;&=
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 &lt;&lt; 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&quot;g_d=
ev&quot;,<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, &quot;g_dev_destroy(%p(%s=
))&quot;, cp, gp-&gt;name);<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 snprintf(buf, sizeof(buf), &quot;cdev=3D%s&quot=
;, gp-&gt;name);<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 devctl_notify(&quot;GEOM&quot;, &quot;DEV&quot;=
, &quot;DESTROY&quot;, buf);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_clear(&amp;sc-&gt;sc_selinfo.si_note, 0)=
;<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_destroy(&amp;sc-&gt;sc_selinfo.si_note);=
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (cp-&gt;acr &gt; 0 || cp-&gt;acw &gt; 0 || c=
p-&gt;ace &gt; 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-&gt;acw, -cp-&gt;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-&gt;private;<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0KNOTE_UNLOCKED(&amp;sc-&gt;sc_selinfo.si_note, =
NOTE_ATTRIB);<br>
+<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 snprintf(buf, sizeof(buf), &quot;cdev=3D%s&quot=
;, cp-&gt;provider-&gt;name);<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 devctl_notify(&quot;GEOM&quot;, &quot;DEV&quot;=
, &quot;SIZECHANGE&quot;, 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-&gt;sc_dev;<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 dev-&gt;si_flags |=3D SI_UNMAPPED;<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 dev-&gt;si_iosize_max =3D maxphys;<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_init_mtx(&amp;sc-&gt;sc_selinfo.si_note,=
 &amp;sc-&gt;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(&quot;%s: in=
it_dumpdev() failed (gp-&gt;name=3D%s, error=3D%d)\n&quot;,<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-&gt;kn_hook;<br>
+<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_remove(&amp;sc-&gt;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-&gt;kn_fflags |=3D kn-&gt;kn_sfflags &amp; h=
int;<br>
+<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0return (kn-&gt;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-&gt;si_drv1;<br>
+<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (kn-&gt;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-&gt;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-&gt;kn_fop =3D &amp;gdev_filterops_vnode;<br=
>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0kn-&gt;kn_hook =3D sc;<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0knlist_add(&amp;sc-&gt;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>