From nobody Wed Feb 23 17:42:05 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 6EF8919E70E6; Wed, 23 Feb 2022 17:42:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4K3jz12Ythz3DK2; Wed, 23 Feb 2022 17:42:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1645638125; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=5bbvmaQzEU2Q8tCxrT0xcGt59kfKcpIr3UghMQKpczI=; b=ewDPII3Nj5I/ixkqCih6riVDMt1Xfr1SfIBKsAGTmwMtFVvqC0Y2rJ9OaszLb2n+RMVqtl lYORKR48pS4SlHfVMbKkRia9mc7bTvk4UUg0BLuPOnwCxEkuf5k28mRVogioU9vluE2rj6 iy01xU6JUTqeIxPgeVdjtRvNS0NKAOENkH3YnwEEam0YI7SISNWq3t7iXqoiAtG2BsVX0f a2XG/9FRPaAPMeZecYwbSKH/JLbmuTZqndQhpmk+w4KwcgxURXQfFoWCKn5HsXuGcTOypA Fopt5TbGKBCAQ/I8/UjA7oeQS1Wwpf1CJaLmf8eG6eeya3H/y01V8L0/pyIjyA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3878B1C73A; Wed, 23 Feb 2022 17:42:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 21NHg5IP085709; Wed, 23 Feb 2022 17:42:05 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 21NHg5PD085708; Wed, 23 Feb 2022 17:42:05 GMT (envelope-from git) Date: Wed, 23 Feb 2022 17:42:05 GMT Message-Id: <202202231742.21NHg5PD085708@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Robert Wing Subject: git: a01bf3940271 - stable/13 - geom: add kqfilter support for geom dev List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rew X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: a01bf3940271fa118d6fa306d80f44fc534f58b5 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1645638125; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=5bbvmaQzEU2Q8tCxrT0xcGt59kfKcpIr3UghMQKpczI=; b=pNGzMvO+5uuJLbZuft4nbNmvjzMdsaHlvnR19IF6vQC1jKnYQRN4U/42fUHFG79VozC7lR m/sQgZie343BDJGBGgxPVqjbtg3ShEBka+xIdAXkQ9B6ZY6GKagYqcPPypzoGX2gNkup8v BFGpdJ6tMW7J9FNH2/YDJISsamyFXnpKOP7I+fFeefZOq8Nc3MTMBVC1vd9Xzni+KG0GKa OCdebinZ127ywbhX9ypRlLBUcsBMitswlfHKMEWfRWuzYiFIX8nIarcKCt+KI/v7hQVrgK I0dLyeNbzTJZuPLc6m7gq2Y6vtPhKII80rynIf4cYvx5vbmoypqCO5tIK8X6KQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1645638125; a=rsa-sha256; cv=none; b=RTjUeurdDKaO3GiKxEdp4uCWdfwnUcotYYF3vnKuPkwVUdp8WEMM4h2ONJfVCw9t1vcK/7 i5QG5jDkjTwGiE9xQa3Fk35nrQk/WkiJtbORC2t5mvrEC6t4eoyBHTzlQuZQDrErAK2DXT R+bc2l57bydFo91kf94r6m3zdwH+qP5qt6c+TMfgcy1QCZ402EUvG26j0TF9JColWwMZy8 Kf/PK+Wq0UFw0UkUvkVy307l6NfWTlAmA8G1F1zpKGkrLqeEUzmG7gLMlpK7RW0FXsQVPK T2mrm9ily2UN0W7UXCEXr+5HwNqxf8umE69tQF0zEWI7HvmBnpWvH3obW8PH/g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by rew: URL: https://cgit.FreeBSD.org/src/commit/?id=a01bf3940271fa118d6fa306d80f44fc534f58b5 commit a01bf3940271fa118d6fa306d80f44fc534f58b5 Author: Robert Wing AuthorDate: 2022-01-18 19:54:59 +0000 Commit: Robert Wing 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 #include #include +#include #include #include #include @@ -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);