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

[-- Attachment #1 --]
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);
>

[-- Attachment #2 --]
<div dir="ltr"><div>I forgot to pass the -x flag to git cherry pick on this one.</div><div><br></div><div>This commit was cherry picked from a50e92cc203c1e3dd2cca03410b568f76694895c</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Feb 23, 2022 at 8:42 AM Robert Wing &lt;<a href="mailto:rew@freebsd.org">rew@freebsd.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The branch stable/13 has been updated by rew:<br>
<br>
URL: <a href="https://cgit.FreeBSD.org/src/commit/?id=a01bf3940271fa118d6fa306d80f44fc534f58b5" rel="noreferrer" target="_blank">https://cgit.FreeBSD.org/src/commit/?id=a01bf3940271fa118d6fa306d80f44fc534f58b5</a><br>;
<br>
commit a01bf3940271fa118d6fa306d80f44fc534f58b5<br>
Author:     Robert Wing &lt;rew@FreeBSD.org&gt;<br>
AuthorDate: 2022-01-18 19:54:59 +0000<br>
Commit:     Robert Wing &lt;rew@FreeBSD.org&gt;<br>
CommitDate: 2022-02-23 17:26:49 +0000<br>
<br>
    geom: add kqfilter support for geom dev<br>
<br>
    The only event hooked up is NOTE_ATTRIB, which is triggered when the<br>
    device is resized. Support for other NOTE_* events to follow.<br>
<br>
    Reviewed by:    kib, jhb<br>
    Differential Revision:  <a href="https://reviews.freebsd.org/D33402" rel="noreferrer" target="_blank">https://reviews.freebsd.org/D33402</a><br>;
---<br>
 sys/geom/geom_dev.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
 1 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>
 #include &lt;sys/disk.h&gt;<br>
 #include &lt;sys/fcntl.h&gt;<br>
 #include &lt;sys/limits.h&gt;<br>
+#include &lt;sys/selinfo.h&gt;<br>
 #include &lt;sys/sysctl.h&gt;<br>
 #include &lt;geom/geom.h&gt;<br>
 #include &lt;geom/geom_int.h&gt;<br>
@@ -65,6 +66,7 @@ struct g_dev_softc {<br>
        struct cdev     *sc_alias;<br>
        int              sc_open;<br>
        u_int            sc_active;<br>
+       struct selinfo   sc_selinfo;<br>
 #define        SC_A_DESTROY    (1 &lt;&lt; 31)<br>
 #define        SC_A_OPEN       (1 &lt;&lt; 30)<br>
 #define        SC_A_ACTIVE     (SC_A_OPEN - 1)<br>
@@ -74,6 +76,16 @@ static d_open_t              g_dev_open;<br>
 static d_close_t       g_dev_close;<br>
 static d_strategy_t    g_dev_strategy;<br>
 static d_ioctl_t       g_dev_ioctl;<br>
+static d_kqfilter_t    g_dev_kqfilter;<br>
+<br>
+static void            gdev_filter_detach(struct knote *kn);<br>
+static int             gdev_filter_vnode(struct knote *kn, long hint);<br>
+<br>
+static struct filterops gdev_filterops_vnode = {<br>
+       .f_isfd = 1,<br>
+       .f_detach = gdev_filter_detach,<br>
+       .f_event = gdev_filter_vnode,<br>
+};<br>
<br>
 static struct cdevsw g_dev_cdevsw = {<br>
        .d_version =    D_VERSION,<br>
@@ -85,6 +97,7 @@ static struct cdevsw g_dev_cdevsw = {<br>
        .d_strategy =   g_dev_strategy,<br>
        .d_name =       &quot;g_dev&quot;,<br>
        .d_flags =      D_DISK | D_TRACKCLOSE,<br>
+       .d_kqfilter =   g_dev_kqfilter,<br>
 };<br>
<br>
 static g_init_t g_dev_init;<br>
@@ -214,6 +227,8 @@ g_dev_destroy(void *arg, int flags __unused)<br>
        g_trace(G_T_TOPOLOGY, &quot;g_dev_destroy(%p(%s))&quot;, cp, gp-&gt;name);<br>
        snprintf(buf, sizeof(buf), &quot;cdev=%s&quot;, gp-&gt;name);<br>
        devctl_notify(&quot;GEOM&quot;, &quot;DEV&quot;, &quot;DESTROY&quot;, buf);<br>
+       knlist_clear(&amp;sc-&gt;sc_selinfo.si_note, 0);<br>
+       knlist_destroy(&amp;sc-&gt;sc_selinfo.si_note);<br>
        if (cp-&gt;acr &gt; 0 || cp-&gt;acw &gt; 0 || cp-&gt;ace &gt; 0)<br>
                g_access(cp, -cp-&gt;acr, -cp-&gt;acw, -cp-&gt;ace);<br>
        g_detach(cp);<br>
@@ -305,8 +320,12 @@ g_dev_attrchanged(struct g_consumer *cp, const char *attr)<br>
 static void<br>
 g_dev_resize(struct g_consumer *cp)<br>
 {<br>
+       struct g_dev_softc *sc;<br>
        char buf[SPECNAMELEN + 6];<br>
<br>
+       sc = cp-&gt;private;<br>
+       KNOTE_UNLOCKED(&amp;sc-&gt;sc_selinfo.si_note, NOTE_ATTRIB);<br>
+<br>
        snprintf(buf, sizeof(buf), &quot;cdev=%s&quot;, cp-&gt;provider-&gt;name);<br>
        devctl_notify(&quot;GEOM&quot;, &quot;DEV&quot;, &quot;SIZECHANGE&quot;, buf);<br>
 }<br>
@@ -378,6 +397,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)<br>
        dev = sc-&gt;sc_dev;<br>
        dev-&gt;si_flags |= SI_UNMAPPED;<br>
        dev-&gt;si_iosize_max = maxphys;<br>
+       knlist_init_mtx(&amp;sc-&gt;sc_selinfo.si_note, &amp;sc-&gt;sc_mtx);<br>
        error = init_dumpdev(dev);<br>
        if (error != 0)<br>
                printf(&quot;%s: init_dumpdev() failed (gp-&gt;name=%s, error=%d)\n&quot;,<br>
@@ -883,4 +903,43 @@ g_dev_orphan(struct g_consumer *cp)<br>
        destroy_dev_sched_cb(dev, g_dev_callback, cp);<br>
 }<br>
<br>
+static void<br>
+gdev_filter_detach(struct knote *kn)<br>
+{<br>
+       struct g_dev_softc *sc;<br>
+<br>
+       sc = kn-&gt;kn_hook;<br>
+<br>
+       knlist_remove(&amp;sc-&gt;sc_selinfo.si_note, kn, 0);<br>
+}<br>
+<br>
+static int<br>
+gdev_filter_vnode(struct knote *kn, long hint)<br>
+{<br>
+       kn-&gt;kn_fflags |= kn-&gt;kn_sfflags &amp; hint;<br>
+<br>
+       return (kn-&gt;kn_fflags != 0);<br>
+}<br>
+<br>
+static int<br>
+g_dev_kqfilter(struct cdev *dev, struct knote *kn)<br>
+{<br>
+       struct g_dev_softc *sc;<br>
+<br>
+       sc = dev-&gt;si_drv1;<br>
+<br>
+       if (kn-&gt;kn_filter != EVFILT_VNODE)<br>
+               return (EINVAL);<br>
+<br>
+       /* XXX: extend support for other NOTE_* events */<br>
+       if (kn-&gt;kn_sfflags != NOTE_ATTRIB)<br>
+               return (EINVAL);<br>
+<br>
+       kn-&gt;kn_fop = &amp;gdev_filterops_vnode;<br>
+       kn-&gt;kn_hook = sc;<br>
+       knlist_add(&amp;sc-&gt;sc_selinfo.si_note, kn, 0);<br>
+<br>
+       return (0);<br>
+}<br>
+<br>
 DECLARE_GEOM_CLASS(g_dev_class, g_dev);<br>
</blockquote></div>

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAF3%2Bn_cMmtzHHQ4m2R2ranCGBfTW8nYRD=dBGysxKWAnJWSzsA>