get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 830410,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/830410/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1508971954-3567-2-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-2-git-send-email-nikolay@cumulusnetworks.com>",
    "list_archive_url": null,
    "date": "2017-10-25T22:52:33",
    "name": "[net-next,v4,1/2] bridge: netlink: make setlink/dellink notifications more accurate",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "efc9663135aa6dc1b5476b8582e5e0d4b0b472a4",
    "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-2-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/830410/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/830410/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=\"TXd74mQs\"; \n\tdkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yMln21gWcz9t3Z\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 26 Oct 2017 09:53:58 +1100 (AEDT)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751901AbdJYWxy (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tWed, 25 Oct 2017 18:53:54 -0400",
            "from mail-wr0-f193.google.com ([209.85.128.193]:43110 \"EHLO\n\tmail-wr0-f193.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751813AbdJYWxv (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Wed, 25 Oct 2017 18:53:51 -0400",
            "by mail-wr0-f193.google.com with SMTP id w105so1482454wrc.0\n\tfor <netdev@vger.kernel.org>; Wed, 25 Oct 2017 15:53:51 -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.48\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tWed, 25 Oct 2017 15:53:48 -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=XKM4wF5iEWYYSYAnc8VOfXtt3mTX16IulkudV0mOtQE=;\n\tb=TXd74mQs6WIi+9ClcC0GcTSAzp6tTklBnogTeWK/fncnmBr+0v4HY7fqqxOgH//b+h\n\tnXuKsdmyH1JrBkmMZnJX6XDUodTAza6C5f5+Ari1U0od5RccHrjO2WTLKUyg3ki5s6HH\n\tHo49QYRn2vO9pqvSo/UJPybFXHGOY12tyaKP8=",
        "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=XKM4wF5iEWYYSYAnc8VOfXtt3mTX16IulkudV0mOtQE=;\n\tb=lOxxTKtEtToA5b+5m0g4AEzHPXVxb+T4oSnNdcMSi9wguLIt8DIDZY+ICrf2R7h5c+\n\tzDieb2vVkqH5rcOuDHvc+RmnXmU5GlaCTLKGMbGGO7ZSBMIl9cpvq8Y5AdyPGxJ3eAK6\n\tuZC20x1BpimBnNZ/aZ4IyBo4Wnka9uwTiLLgoWflL7d7YndfsO3Lq0QIKdnKyoU9c7PH\n\tXRkrNdb1zKyqtHJS5z2qMNofkHBIpdoPDCK49ZyOYZ5a22OBilCZsN/S26gGZDQvzNos\n\tAEnSsfL8+r0RvCc//NDF567Gif84AcA5DyUUH//UqTEs3sWq22tR+YORJdKrdoFAHvPH\n\tCvCw==",
        "X-Gm-Message-State": "AMCzsaUlbTmW4JZLoMj/E5uuJQMUPngm5SvPvewmwKEfGtFz1rOmVjlZ\n\tft93IeyVfdUs7duSG3JVcR4zMOQd",
        "X-Google-Smtp-Source": "ABhQp+Qy44ud/+8Ze9mIyipDiOUkZagUeTI169IATG0Oa0P0qqlR1+7dyDDO07WIgv2ZeYGH32Y5Hw==",
        "X-Received": "by 10.223.157.136 with SMTP id p8mr3788200wre.28.1508972030171; \n\tWed, 25 Oct 2017 15:53:50 -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 1/2] bridge: netlink: make setlink/dellink\n\tnotifications more accurate",
        "Date": "Thu, 26 Oct 2017 01:52:33 +0300",
        "Message-Id": "<1508971954-3567-2-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 we had cases that either sent notifications when there\nwere in fact no changes (e.g. non-existent vlan delete) or didn't send\nnotifications when there were changes (e.g. vlan add range with an error in\nthe middle, port flags change + vlan update error). This patch sends down\na boolean to the functions setlink/dellink use and if there is even a\nsingle configuration change (port flag, vlan add/del, port state) then\nwe always send a notification. This is all done to keep backwards\ncompatibility with the opportunistic vlan delete, where one could\nspecify a vlan range that has missing vlans inside and still everything\nin that range will be cleared, this is mostly used to clear the whole\nvlan config with a single call, i.e. range 1-4094.\n\nSigned-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>\n---\n net/bridge/br_netlink.c        | 44 +++++++++++++++++++++++++-----------------\n net/bridge/br_netlink_tunnel.c | 14 +++++++++-----\n net/bridge/br_private_tunnel.h |  3 ++-\n 3 files changed, 37 insertions(+), 24 deletions(-)",
    "diff": "diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c\nindex fb61b6c79235..d0290ede9342 100644\n--- a/net/bridge/br_netlink.c\n+++ b/net/bridge/br_netlink.c\n@@ -506,7 +506,7 @@ int br_getlink(struct sk_buff *skb, u32 pid, u32 seq,\n }\n \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)\n+\t\t\tint cmd, struct bridge_vlan_info *vinfo, bool *changed)\n {\n \tint err = 0;\n \n@@ -517,21 +517,24 @@ static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,\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\tif (err)\n-\t\t\t\tbreak;\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}\n+\t\tif (!err)\n+\t\t\t*changed = true;\n \t\tbreak;\n \n \tcase RTM_DELLINK:\n \t\tif (p) {\n-\t\t\tnbp_vlan_delete(p, vinfo->vid);\n-\t\t\tif (vinfo->flags & BRIDGE_VLAN_INFO_MASTER)\n-\t\t\t\tbr_vlan_delete(p->br, vinfo->vid);\n-\t\t} else {\n-\t\t\tbr_vlan_delete(br, vinfo->vid);\n+\t\t\tif (!nbp_vlan_delete(p, vinfo->vid))\n+\t\t\t\t*changed = true;\n+\n+\t\t\tif ((vinfo->flags & BRIDGE_VLAN_INFO_MASTER) &&\n+\t\t\t    !br_vlan_delete(p->br, vinfo->vid))\n+\t\t\t\t*changed = true;\n+\t\t} else if (!br_vlan_delete(br, vinfo->vid)) {\n+\t\t\t*changed = true;\n \t\t}\n \t\tbreak;\n \t}\n@@ -542,7 +545,8 @@ static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,\n static int br_process_vlan_info(struct net_bridge *br,\n \t\t\t\tstruct net_bridge_port *p, int cmd,\n \t\t\t\tstruct bridge_vlan_info *vinfo_curr,\n-\t\t\t\tstruct bridge_vlan_info **vinfo_last)\n+\t\t\t\tstruct bridge_vlan_info **vinfo_last,\n+\t\t\t\tbool *changed)\n {\n \tif (!vinfo_curr->vid || vinfo_curr->vid >= VLAN_VID_MASK)\n \t\treturn -EINVAL;\n@@ -572,7 +576,7 @@ static int br_process_vlan_info(struct net_bridge *br,\n \t\t       sizeof(struct bridge_vlan_info));\n \t\tfor (v = (*vinfo_last)->vid; v <= vinfo_curr->vid; v++) {\n \t\t\ttmp_vinfo.vid = v;\n-\t\t\terr = br_vlan_info(br, p, cmd, &tmp_vinfo);\n+\t\t\terr = br_vlan_info(br, p, cmd, &tmp_vinfo, changed);\n \t\t\tif (err)\n \t\t\t\tbreak;\n \t\t}\n@@ -581,13 +585,13 @@ static int br_process_vlan_info(struct net_bridge *br,\n \t\treturn err;\n \t}\n \n-\treturn br_vlan_info(br, p, cmd, vinfo_curr);\n+\treturn br_vlan_info(br, p, cmd, vinfo_curr, changed);\n }\n \n static int br_afspec(struct net_bridge *br,\n \t\t     struct net_bridge_port *p,\n \t\t     struct nlattr *af_spec,\n-\t\t     int cmd)\n+\t\t     int cmd, bool *changed)\n {\n \tstruct bridge_vlan_info *vinfo_curr = NULL;\n \tstruct bridge_vlan_info *vinfo_last = NULL;\n@@ -607,7 +611,8 @@ static int br_afspec(struct net_bridge *br,\n \t\t\t\treturn err;\n \t\t\terr = br_process_vlan_tunnel_info(br, p, cmd,\n \t\t\t\t\t\t\t  &tinfo_curr,\n-\t\t\t\t\t\t\t  &tinfo_last);\n+\t\t\t\t\t\t\t  &tinfo_last,\n+\t\t\t\t\t\t\t  changed);\n \t\t\tif (err)\n \t\t\t\treturn err;\n \t\t\tbreak;\n@@ -616,7 +621,7 @@ static int br_afspec(struct net_bridge *br,\n \t\t\t\treturn -EINVAL;\n \t\t\tvinfo_curr = nla_data(attr);\n \t\t\terr = br_process_vlan_info(br, p, cmd, vinfo_curr,\n-\t\t\t\t\t\t   &vinfo_last);\n+\t\t\t\t\t\t   &vinfo_last, changed);\n \t\t\tif (err)\n \t\t\t\treturn err;\n \t\t\tbreak;\n@@ -804,6 +809,7 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)\n \tstruct nlattr *afspec;\n \tstruct net_bridge_port *p;\n \tstruct nlattr *tb[IFLA_BRPORT_MAX + 1];\n+\tbool changed = false;\n \tint err = 0;\n \n \tprotinfo = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_PROTINFO);\n@@ -839,14 +845,15 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)\n \t\t}\n \t\tif (err)\n \t\t\tgoto out;\n+\t\tchanged = true;\n \t}\n \n \tif (afspec) {\n \t\terr = br_afspec((struct net_bridge *)netdev_priv(dev), p,\n-\t\t\t\tafspec, RTM_SETLINK);\n+\t\t\t\tafspec, RTM_SETLINK, &changed);\n \t}\n \n-\tif (err == 0)\n+\tif (changed)\n \t\tbr_ifinfo_notify(RTM_NEWLINK, p);\n out:\n \treturn err;\n@@ -857,6 +864,7 @@ int br_dellink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)\n {\n \tstruct nlattr *afspec;\n \tstruct net_bridge_port *p;\n+\tbool changed = false;\n \tint err = 0;\n \n \tafspec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);\n@@ -869,8 +877,8 @@ int br_dellink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)\n \t\treturn -EINVAL;\n \n \terr = br_afspec((struct net_bridge *)netdev_priv(dev), p,\n-\t\t\tafspec, RTM_DELLINK);\n-\tif (err == 0)\n+\t\t\tafspec, RTM_DELLINK, &changed);\n+\tif (changed)\n \t\t/* Send RTM_NEWLINK because userspace\n \t\t * expects RTM_NEWLINK for vlan dels\n \t\t */\ndiff --git a/net/bridge/br_netlink_tunnel.c b/net/bridge/br_netlink_tunnel.c\nindex 3712c7f0e00c..da8cb99fd259 100644\n--- a/net/bridge/br_netlink_tunnel.c\n+++ b/net/bridge/br_netlink_tunnel.c\n@@ -198,7 +198,7 @@ static const struct nla_policy vlan_tunnel_policy[IFLA_BRIDGE_VLAN_TUNNEL_MAX +\n };\n \n static int br_vlan_tunnel_info(struct net_bridge_port *p, int cmd,\n-\t\t\t       u16 vid, u32 tun_id)\n+\t\t\t       u16 vid, u32 tun_id, bool *changed)\n {\n \tint err = 0;\n \n@@ -208,9 +208,12 @@ static int br_vlan_tunnel_info(struct net_bridge_port *p, int cmd,\n \tswitch (cmd) {\n \tcase RTM_SETLINK:\n \t\terr = nbp_vlan_tunnel_info_add(p, vid, tun_id);\n+\t\tif (!err)\n+\t\t\t*changed = true;\n \t\tbreak;\n \tcase RTM_DELLINK:\n-\t\tnbp_vlan_tunnel_info_delete(p, vid);\n+\t\tif (!nbp_vlan_tunnel_info_delete(p, vid))\n+\t\t\t*changed = true;\n \t\tbreak;\n \t}\n \n@@ -254,7 +257,8 @@ int br_parse_vlan_tunnel_info(struct nlattr *attr,\n int br_process_vlan_tunnel_info(struct net_bridge *br,\n \t\t\t\tstruct net_bridge_port *p, int cmd,\n \t\t\t\tstruct vtunnel_info *tinfo_curr,\n-\t\t\t\tstruct vtunnel_info *tinfo_last)\n+\t\t\t\tstruct vtunnel_info *tinfo_last,\n+\t\t\t\tbool *changed)\n {\n \tint err;\n \n@@ -272,7 +276,7 @@ int br_process_vlan_tunnel_info(struct net_bridge *br,\n \t\t\treturn -EINVAL;\n \t\tt = tinfo_last->tunid;\n \t\tfor (v = tinfo_last->vid; v <= tinfo_curr->vid; v++) {\n-\t\t\terr = br_vlan_tunnel_info(p, cmd, v, t);\n+\t\t\terr = br_vlan_tunnel_info(p, cmd, v, t, changed);\n \t\t\tif (err)\n \t\t\t\treturn err;\n \t\t\tt++;\n@@ -283,7 +287,7 @@ int br_process_vlan_tunnel_info(struct net_bridge *br,\n \t\tif (tinfo_last->flags)\n \t\t\treturn -EINVAL;\n \t\terr = br_vlan_tunnel_info(p, cmd, tinfo_curr->vid,\n-\t\t\t\t\t  tinfo_curr->tunid);\n+\t\t\t\t\t  tinfo_curr->tunid, changed);\n \t\tif (err)\n \t\t\treturn err;\n \t\tmemset(tinfo_last, 0, sizeof(struct vtunnel_info));\ndiff --git a/net/bridge/br_private_tunnel.h b/net/bridge/br_private_tunnel.h\nindex 4a447a378ab3..a259471bfd78 100644\n--- a/net/bridge/br_private_tunnel.h\n+++ b/net/bridge/br_private_tunnel.h\n@@ -26,7 +26,8 @@ int br_process_vlan_tunnel_info(struct net_bridge *br,\n \t\t\t\tstruct net_bridge_port *p,\n \t\t\t\tint cmd,\n \t\t\t\tstruct vtunnel_info *tinfo_curr,\n-\t\t\t\tstruct vtunnel_info *tinfo_last);\n+\t\t\t\tstruct vtunnel_info *tinfo_last,\n+\t\t\t\tbool *changed);\n int br_get_vlan_tunnel_info_size(struct net_bridge_vlan_group *vg);\n int br_fill_vlan_tunnel_info(struct sk_buff *skb,\n \t\t\t     struct net_bridge_vlan_group *vg);\n",
    "prefixes": [
        "net-next",
        "v4",
        "1/2"
    ]
}