get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.2/patches/830411/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 830411,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/830411/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1508971954-3567-3-git-send-email-nikolay@cumulusnetworks.com/",
    "project": {
        "id": 7,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/7/?format=api",
        "name": "Linux network development",
        "link_name": "netdev",
        "list_id": "netdev.vger.kernel.org",
        "list_email": "netdev@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1508971954-3567-3-git-send-email-nikolay@cumulusnetworks.com>",
    "list_archive_url": null,
    "date": "2017-10-25T22:52:34",
    "name": "[net-next,v4,2/2] bridge: vlan: signal if anything changed on vlan add",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "aa5dbfc635404a7bc73878cefb4cca8a55b99fad",
    "submitter": {
        "id": 66448,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/66448/?format=api",
        "name": "Nikolay Aleksandrov",
        "email": "nikolay@cumulusnetworks.com"
    },
    "delegate": {
        "id": 34,
        "url": "http://patchwork.ozlabs.org/api/1.2/users/34/?format=api",
        "username": "davem",
        "first_name": "David",
        "last_name": "Miller",
        "email": "davem@davemloft.net"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1508971954-3567-3-git-send-email-nikolay@cumulusnetworks.com/mbox/",
    "series": [
        {
            "id": 10239,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/10239/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=10239",
            "date": "2017-10-25T22:52:32",
            "name": "bridge: make setlink/dellink notifications more accurate",
            "version": 4,
            "mbox": "http://patchwork.ozlabs.org/series/10239/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/830411/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/830411/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<netdev-owner@vger.kernel.org>",
        "X-Original-To": "patchwork-incoming@ozlabs.org",
        "Delivered-To": "patchwork-incoming@ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=cumulusnetworks.com\n\theader.i=@cumulusnetworks.com header.b=\"g/oVQT7b\"; \n\tdkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yMln33McGz9t48\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 26 Oct 2017 09:53:59 +1100 (AEDT)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751916AbdJYWx5 (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tWed, 25 Oct 2017 18:53:57 -0400",
            "from mail-wr0-f196.google.com ([209.85.128.196]:44307 \"EHLO\n\tmail-wr0-f196.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751753AbdJYWxx (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Wed, 25 Oct 2017 18:53:53 -0400",
            "by mail-wr0-f196.google.com with SMTP id z55so1475512wrz.1\n\tfor <netdev@vger.kernel.org>; Wed, 25 Oct 2017 15:53:53 -0700 (PDT)",
            "from debil.mediahub-bg.com (46-10-142-144.ip.btc-net.bg.\n\t[46.10.142.144]) by smtp.gmail.com with ESMTPSA id\n\tk9sm4393483wrk.88.2017.10.25.15.53.50\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tWed, 25 Oct 2017 15:53:50 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=cumulusnetworks.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=dW1YDp2jULz8w36WTVd1K+3D3SvR0ZQuTu0Q+p2+p64=;\n\tb=g/oVQT7bdYZE1r60tx+AxkllxPcRITqeKzXYAh27o9aq/knWnSxSFyCVkJEnQxeyUS\n\tJgpvZ0d58mLgt8BaIiXsktav564HN/5YFG0S0eSzhr/dLY3GySrlULVrU0HrHKdIeS4u\n\trWK39jdMuwvdPj407iMwMP+ofAvw5x1agIDq4=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=dW1YDp2jULz8w36WTVd1K+3D3SvR0ZQuTu0Q+p2+p64=;\n\tb=ap6BRds/G4LLARscaDmNmKlrtBea97pnV1wqJP0qDYGhl58kUYHIuLrJeZYSKSvlKg\n\ttztXmdPfnpba0zbcp9eAH8vTReN0iub8zQ6/xF4bJKiBRrIZpPC1F8O/N1ZgY4LKy9VB\n\tyi8tRo8RJ13S+hQ07KoLkvUyq5gNqxnh7HcKUSYMDr4p4nIGqbuF8788wgOpofN50NrS\n\t+UFYLna9qr5kJFoJI39yjrwUsxxFchEM2J3jC8qJsmjg8HZGP50ajzK/uNaU0GGkgjFA\n\tZ7Oh3Xw7OiRjZ9T5641+kRvOk9gzvoWMVy9xFlEiXG+lTaVnoBSjsvFDND01MqoRHNzw\n\t7AWg==",
        "X-Gm-Message-State": "AMCzsaUIwzdu+4V7dvbhj5E00r/7BRsHely0mS+PvQKk/6F2+1SRBAI8\n\t5CUGdXdoiFd4gvjfgXX5l7F09Dsi",
        "X-Google-Smtp-Source": "ABhQp+QbhRfkpKOrsEmtNg4KF3M2ECsYlNBhD8a2dTTURzq5h5GKXj0rdZ01i7/mMb4FAfPnIVWQ/w==",
        "X-Received": "by 10.223.184.69 with SMTP id u5mr3606079wrf.33.1508972032057;\n\tWed, 25 Oct 2017 15:53:52 -0700 (PDT)",
        "From": "Nikolay Aleksandrov <nikolay@cumulusnetworks.com>",
        "To": "netdev@vger.kernel.org",
        "Cc": "dsa@cumulusnetworks.com, mrv@mojatatu.com, davem@davemloft.net,\n\tbridge@lists.linux-foundation.org, roopa@cumulusnetworks.com,\n\tstephen@networkplumber.org,\n\tNikolay Aleksandrov <nikolay@cumulusnetworks.com>",
        "Subject": "[PATCH net-next v4 2/2] bridge: vlan: signal if anything changed on\n\tvlan add",
        "Date": "Thu, 26 Oct 2017 01:52:34 +0300",
        "Message-Id": "<1508971954-3567-3-git-send-email-nikolay@cumulusnetworks.com>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": "<1508971954-3567-1-git-send-email-nikolay@cumulusnetworks.com>",
        "References": "<f6c0da96-77f0-db19-7a9a-13b246d83d39@cumulusnetworks.com>\n\t<1508971954-3567-1-git-send-email-nikolay@cumulusnetworks.com>",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "Before this patch there was no way to tell if the vlan add operation\nactually changed anything, thus we would always generate a notification\non adds. Let's make the notifications more precise and generate them\nonly if anything changed, so use the new bool parameter to signal that the\nvlan was updated. We cannot return an error because there are valid use\ncases that will be broken (e.g. overlapping range add) and also we can't\nrisk masking errors due to calls into drivers for vlan add which can\npotentially return anything.\n\nSigned-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>\n---\nv4: set changed always to false in the non-vlan config case\nv3: fix non-vlan config functions reported by kbuild bot\nv2: pass changed down to vlan add functions instead of using a specific\nerror that needs to be masked\n\n net/bridge/br_netlink.c |  9 ++++--\n net/bridge/br_private.h | 14 ++++++---\n net/bridge/br_vlan.c    | 78 +++++++++++++++++++++++++++++++++++--------------\n 3 files changed, 72 insertions(+), 29 deletions(-)",
    "diff": "diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c\nindex d0290ede9342..e732403669c6 100644\n--- a/net/bridge/br_netlink.c\n+++ b/net/bridge/br_netlink.c\n@@ -508,6 +508,7 @@ int br_getlink(struct sk_buff *skb, u32 pid, u32 seq,\n static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,\n \t\t\tint cmd, struct bridge_vlan_info *vinfo, bool *changed)\n {\n+\tbool curr_change;\n \tint err = 0;\n \n \tswitch (cmd) {\n@@ -516,12 +517,14 @@ static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,\n \t\t\t/* if the MASTER flag is set this will act on the global\n \t\t\t * per-VLAN entry as well\n \t\t\t */\n-\t\t\terr = nbp_vlan_add(p, vinfo->vid, vinfo->flags);\n+\t\t\terr = nbp_vlan_add(p, vinfo->vid, vinfo->flags,\n+\t\t\t\t\t   &curr_change);\n \t\t} else {\n \t\t\tvinfo->flags |= BRIDGE_VLAN_INFO_BRENTRY;\n-\t\t\terr = br_vlan_add(br, vinfo->vid, vinfo->flags);\n+\t\t\terr = br_vlan_add(br, vinfo->vid, vinfo->flags,\n+\t\t\t\t\t  &curr_change);\n \t\t}\n-\t\tif (!err)\n+\t\tif (curr_change)\n \t\t\t*changed = true;\n \t\tbreak;\n \ndiff --git a/net/bridge/br_private.h b/net/bridge/br_private.h\nindex fa0039f44818..860e4afaf71a 100644\n--- a/net/bridge/br_private.h\n+++ b/net/bridge/br_private.h\n@@ -803,7 +803,8 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br,\n \t\t\t       const struct net_bridge_port *port,\n \t\t\t       struct net_bridge_vlan_group *vg,\n \t\t\t       struct sk_buff *skb);\n-int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags);\n+int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags,\n+\t\tbool *changed);\n int br_vlan_delete(struct net_bridge *br, u16 vid);\n void br_vlan_flush(struct net_bridge *br);\n struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, u16 vid);\n@@ -816,7 +817,8 @@ int br_vlan_set_stats(struct net_bridge *br, unsigned long val);\n int br_vlan_init(struct net_bridge *br);\n int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val);\n int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid);\n-int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags);\n+int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,\n+\t\t bool *changed);\n int nbp_vlan_delete(struct net_bridge_port *port, u16 vid);\n void nbp_vlan_flush(struct net_bridge_port *port);\n int nbp_vlan_init(struct net_bridge_port *port);\n@@ -903,8 +905,10 @@ static inline struct sk_buff *br_handle_vlan(struct net_bridge *br,\n \treturn skb;\n }\n \n-static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)\n+static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags,\n+\t\t\t      bool *changed)\n {\n+\t*changed = false;\n \treturn -EOPNOTSUPP;\n }\n \n@@ -926,8 +930,10 @@ static inline int br_vlan_init(struct net_bridge *br)\n \treturn 0;\n }\n \n-static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)\n+static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,\n+\t\t\t       bool *changed)\n {\n+\t*changed = false;\n \treturn -EOPNOTSUPP;\n }\n \ndiff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c\nindex 233a30040c91..fb0a903d19d1 100644\n--- a/net/bridge/br_vlan.c\n+++ b/net/bridge/br_vlan.c\n@@ -32,27 +32,34 @@ static struct net_bridge_vlan *br_vlan_lookup(struct rhashtable *tbl, u16 vid)\n \treturn rhashtable_lookup_fast(tbl, &vid, br_vlan_rht_params);\n }\n \n-static void __vlan_add_pvid(struct net_bridge_vlan_group *vg, u16 vid)\n+static bool __vlan_add_pvid(struct net_bridge_vlan_group *vg, u16 vid)\n {\n \tif (vg->pvid == vid)\n-\t\treturn;\n+\t\treturn false;\n \n \tsmp_wmb();\n \tvg->pvid = vid;\n+\n+\treturn true;\n }\n \n-static void __vlan_delete_pvid(struct net_bridge_vlan_group *vg, u16 vid)\n+static bool __vlan_delete_pvid(struct net_bridge_vlan_group *vg, u16 vid)\n {\n \tif (vg->pvid != vid)\n-\t\treturn;\n+\t\treturn false;\n \n \tsmp_wmb();\n \tvg->pvid = 0;\n+\n+\treturn true;\n }\n \n-static void __vlan_add_flags(struct net_bridge_vlan *v, u16 flags)\n+/* return true if anything changed, false otherwise */\n+static bool __vlan_add_flags(struct net_bridge_vlan *v, u16 flags)\n {\n \tstruct net_bridge_vlan_group *vg;\n+\tu16 old_flags = v->flags;\n+\tbool ret;\n \n \tif (br_vlan_is_master(v))\n \t\tvg = br_vlan_group(v->br);\n@@ -60,14 +67,16 @@ static void __vlan_add_flags(struct net_bridge_vlan *v, u16 flags)\n \t\tvg = nbp_vlan_group(v->port);\n \n \tif (flags & BRIDGE_VLAN_INFO_PVID)\n-\t\t__vlan_add_pvid(vg, v->vid);\n+\t\tret = __vlan_add_pvid(vg, v->vid);\n \telse\n-\t\t__vlan_delete_pvid(vg, v->vid);\n+\t\tret = __vlan_delete_pvid(vg, v->vid);\n \n \tif (flags & BRIDGE_VLAN_INFO_UNTAGGED)\n \t\tv->flags |= BRIDGE_VLAN_INFO_UNTAGGED;\n \telse\n \t\tv->flags &= ~BRIDGE_VLAN_INFO_UNTAGGED;\n+\n+\treturn ret || !!(old_flags ^ v->flags);\n }\n \n static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br,\n@@ -151,8 +160,10 @@ static struct net_bridge_vlan *br_vlan_get_master(struct net_bridge *br, u16 vid\n \tvg = br_vlan_group(br);\n \tmasterv = br_vlan_find(vg, vid);\n \tif (!masterv) {\n+\t\tbool changed;\n+\n \t\t/* missing global ctx, create it now */\n-\t\tif (br_vlan_add(br, vid, 0))\n+\t\tif (br_vlan_add(br, vid, 0, &changed))\n \t\t\treturn NULL;\n \t\tmasterv = br_vlan_find(vg, vid);\n \t\tif (WARN_ON(!masterv))\n@@ -232,8 +243,11 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags)\n \n \t\t/* need to work on the master vlan too */\n \t\tif (flags & BRIDGE_VLAN_INFO_MASTER) {\n-\t\t\terr = br_vlan_add(br, v->vid, flags |\n-\t\t\t\t\t\t      BRIDGE_VLAN_INFO_BRENTRY);\n+\t\t\tbool changed;\n+\n+\t\t\terr = br_vlan_add(br, v->vid,\n+\t\t\t\t\t  flags | BRIDGE_VLAN_INFO_BRENTRY,\n+\t\t\t\t\t  &changed);\n \t\t\tif (err)\n \t\t\t\tgoto out_filt;\n \t\t}\n@@ -550,8 +564,9 @@ bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid)\n \n /* Must be protected by RTNL.\n  * Must be called with vid in range from 1 to 4094 inclusive.\n+ * changed must be true only if the vlan was created or updated\n  */\n-int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)\n+int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, bool *changed)\n {\n \tstruct net_bridge_vlan_group *vg;\n \tstruct net_bridge_vlan *vlan;\n@@ -559,6 +574,7 @@ int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)\n \n \tASSERT_RTNL();\n \n+\t*changed = false;\n \tvg = br_vlan_group(br);\n \tvlan = br_vlan_find(vg, vid);\n \tif (vlan) {\n@@ -576,9 +592,12 @@ int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)\n \t\t\trefcount_inc(&vlan->refcnt);\n \t\t\tvlan->flags |= BRIDGE_VLAN_INFO_BRENTRY;\n \t\t\tvg->num_vlans++;\n+\t\t\t*changed = true;\n \t\t}\n-\t\t__vlan_add_flags(vlan, flags);\n-\t\treturn 0;\n+\t\tif (__vlan_add_flags(vlan, flags))\n+\t\t\t*changed = true;\n+\n+\t\treturn ret;\n \t}\n \n \tvlan = kzalloc(sizeof(*vlan), GFP_KERNEL);\n@@ -601,6 +620,7 @@ int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)\n \t\tfree_percpu(vlan->stats);\n \t\tkfree(vlan);\n \t}\n+\t*changed = true;\n \n \treturn ret;\n }\n@@ -824,9 +844,10 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid)\n \tconst struct net_bridge_vlan *pvent;\n \tstruct net_bridge_vlan_group *vg;\n \tstruct net_bridge_port *p;\n+\tunsigned long *changed;\n+\tbool vlchange;\n \tu16 old_pvid;\n \tint err = 0;\n-\tunsigned long *changed;\n \n \tif (!pvid) {\n \t\tbr_vlan_disable_default_pvid(br);\n@@ -850,7 +871,8 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid)\n \t\terr = br_vlan_add(br, pvid,\n \t\t\t\t  BRIDGE_VLAN_INFO_PVID |\n \t\t\t\t  BRIDGE_VLAN_INFO_UNTAGGED |\n-\t\t\t\t  BRIDGE_VLAN_INFO_BRENTRY);\n+\t\t\t\t  BRIDGE_VLAN_INFO_BRENTRY,\n+\t\t\t\t  &vlchange);\n \t\tif (err)\n \t\t\tgoto out;\n \t\tbr_vlan_delete(br, old_pvid);\n@@ -869,7 +891,8 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid)\n \n \t\terr = nbp_vlan_add(p, pvid,\n \t\t\t\t   BRIDGE_VLAN_INFO_PVID |\n-\t\t\t\t   BRIDGE_VLAN_INFO_UNTAGGED);\n+\t\t\t\t   BRIDGE_VLAN_INFO_UNTAGGED,\n+\t\t\t\t   &vlchange);\n \t\tif (err)\n \t\t\tgoto err_port;\n \t\tnbp_vlan_delete(p, old_pvid);\n@@ -890,7 +913,8 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid)\n \t\tif (old_pvid)\n \t\t\tnbp_vlan_add(p, old_pvid,\n \t\t\t\t     BRIDGE_VLAN_INFO_PVID |\n-\t\t\t\t     BRIDGE_VLAN_INFO_UNTAGGED);\n+\t\t\t\t     BRIDGE_VLAN_INFO_UNTAGGED,\n+\t\t\t\t     &vlchange);\n \t\tnbp_vlan_delete(p, pvid);\n \t}\n \n@@ -899,7 +923,8 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid)\n \t\t\tbr_vlan_add(br, old_pvid,\n \t\t\t\t    BRIDGE_VLAN_INFO_PVID |\n \t\t\t\t    BRIDGE_VLAN_INFO_UNTAGGED |\n-\t\t\t\t    BRIDGE_VLAN_INFO_BRENTRY);\n+\t\t\t\t    BRIDGE_VLAN_INFO_BRENTRY,\n+\t\t\t\t    &vlchange);\n \t\tbr_vlan_delete(br, pvid);\n \t}\n \tgoto out;\n@@ -931,6 +956,7 @@ int br_vlan_init(struct net_bridge *br)\n {\n \tstruct net_bridge_vlan_group *vg;\n \tint ret = -ENOMEM;\n+\tbool changed;\n \n \tvg = kzalloc(sizeof(*vg), GFP_KERNEL);\n \tif (!vg)\n@@ -947,7 +973,7 @@ int br_vlan_init(struct net_bridge *br)\n \trcu_assign_pointer(br->vlgrp, vg);\n \tret = br_vlan_add(br, 1,\n \t\t\t  BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED |\n-\t\t\t  BRIDGE_VLAN_INFO_BRENTRY);\n+\t\t\t  BRIDGE_VLAN_INFO_BRENTRY, &changed);\n \tif (ret)\n \t\tgoto err_vlan_add;\n \n@@ -992,9 +1018,12 @@ int nbp_vlan_init(struct net_bridge_port *p)\n \tINIT_LIST_HEAD(&vg->vlan_list);\n \trcu_assign_pointer(p->vlgrp, vg);\n \tif (p->br->default_pvid) {\n+\t\tbool changed;\n+\n \t\tret = nbp_vlan_add(p, p->br->default_pvid,\n \t\t\t\t   BRIDGE_VLAN_INFO_PVID |\n-\t\t\t\t   BRIDGE_VLAN_INFO_UNTAGGED);\n+\t\t\t\t   BRIDGE_VLAN_INFO_UNTAGGED,\n+\t\t\t\t   &changed);\n \t\tif (ret)\n \t\t\tgoto err_vlan_add;\n \t}\n@@ -1016,8 +1045,10 @@ int nbp_vlan_init(struct net_bridge_port *p)\n \n /* Must be protected by RTNL.\n  * Must be called with vid in range from 1 to 4094 inclusive.\n+ * changed must be true only if the vlan was created or updated\n  */\n-int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)\n+int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,\n+\t\t bool *changed)\n {\n \tstruct switchdev_obj_port_vlan v = {\n \t\t.obj.orig_dev = port->dev,\n@@ -1031,13 +1062,15 @@ int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)\n \n \tASSERT_RTNL();\n \n+\t*changed = false;\n \tvlan = br_vlan_find(nbp_vlan_group(port), vid);\n \tif (vlan) {\n \t\t/* Pass the flags to the hardware bridge */\n \t\tret = switchdev_port_obj_add(port->dev, &v.obj);\n \t\tif (ret && ret != -EOPNOTSUPP)\n \t\t\treturn ret;\n-\t\t__vlan_add_flags(vlan, flags);\n+\t\t*changed = __vlan_add_flags(vlan, flags);\n+\n \t\treturn 0;\n \t}\n \n@@ -1050,6 +1083,7 @@ int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)\n \tret = __vlan_add(vlan, flags);\n \tif (ret)\n \t\tkfree(vlan);\n+\t*changed = true;\n \n \treturn ret;\n }\n",
    "prefixes": [
        "net-next",
        "v4",
        "2/2"
    ]
}