From patchwork Sun Jul 22 08:17:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikolay Aleksandrov X-Patchwork-Id: 947460 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="DfL9yfCc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41YHZ01k3Gz9s55 for ; Sun, 22 Jul 2018 18:18:16 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728204AbeGVJOF (ORCPT ); Sun, 22 Jul 2018 05:14:05 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:51461 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727865AbeGVJOE (ORCPT ); Sun, 22 Jul 2018 05:14:04 -0400 Received: by mail-wm0-f66.google.com with SMTP id h3-v6so12597454wmb.1 for ; Sun, 22 Jul 2018 01:18:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=oBM6zg5fXFcRQ5HFaX1H1DkgSWeWoN1HkkiyemVfP/E=; b=DfL9yfCcZU5iWHeyFNQ4CjXZSYWb8BXhAOMzk3IOZeCSeJPFI6TLEeDw8Wl9H+/HGG OP3VEk37iZ1aCkSJSjSsKBzSdM5j63ReakwE/IOx3ZF8naSqXigDRSS0O6eF7S0HbosG qrXbJy00BSP5wjjtzTGcc5WLQClnvO2kgUiMU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=oBM6zg5fXFcRQ5HFaX1H1DkgSWeWoN1HkkiyemVfP/E=; b=RqIENSWpHyJRQx7q8AVaNKtMmE7sPBuVDKCQuFkD/nre4v3FRW3MnwbtWvtQVne3W4 R7fGOb9l8bpHpIMXX5e1wb7vwERW8s0ykU9LvezQjKr3oW9uaqn/vzP9cXAcySvuHGHM HTzPKlM6/0gomGht96didH5tWDUEzGNNrXyzv7oJE53Nt0EDBulKEoy7rdjmum61Xe5Q tolfiXwYrtyS6Uxmp4BhuBDIscS0is5tmsITRUTgXoP/i+sMqd/CZt2GO79VHwuVyW6b 7INuRvKjd8Y3RYRGSlvdoKvFKQTfqKzu+0xda3OVNwOMiMl1jIdppmVaVOvFllO+DQ1N j/Qw== X-Gm-Message-State: AOUpUlHknhpkETVD+zH5ig/tM8oenAgtQelyZ2ZNus9rrFjZd9N0H3Fs UJg7n6d02Y11qfug8yNeyZj7yjovtMs= X-Google-Smtp-Source: AAOMgpceDuoYDgWwrV1NMVMons2iC31oNL3xIu6DjpltyTK3lipXT777mjgbYOmpEmy/qJCRnloZVA== X-Received: by 2002:a1c:20cb:: with SMTP id g194-v6mr5203653wmg.102.1532247490957; Sun, 22 Jul 2018 01:18:10 -0700 (PDT) Received: from localhost.localdomain (95-42-17-99.ip.btc-net.bg. [95.42.17.99]) by smtp.gmail.com with ESMTPSA id i15-v6sm635697wrw.75.2018.07.22.01.18.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 22 Jul 2018 01:18:10 -0700 (PDT) From: Nikolay Aleksandrov To: netdev@vger.kernel.org Cc: roopa@cumulusnetworks.com, davem@davemloft.net, anuradhak@cumulusnetworks.com, wkok@cumulusnetworks.com, stephen@networkplumber.org, bridge@lists.linux-foundation.org, Nikolay Aleksandrov Subject: [PATCH net-next v2 1/2] net: bridge: add support for raw sysfs port options Date: Sun, 22 Jul 2018 11:17:44 +0300 Message-Id: <20180722081745.23272-2-nikolay@cumulusnetworks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180722081745.23272-1-nikolay@cumulusnetworks.com> References: <20180722081745.23272-1-nikolay@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds a new alternative store callback for port sysfs options which takes a raw value (buf) and can use it directly. It is needed for the backup port sysfs support since we have to pass the device by its name. Signed-off-by: Nikolay Aleksandrov --- There are a few checkpatch warnings here because of the old code, I've noted them in my todo and will send separate patch for simple_strtoul and the function prototypes. v2: Use kstrndup/kfree instead of casting the const buf. In order to avoid using GFP_ATOMIC or always allocating I kept the spinlock inside each branch. net/bridge/br_sysfs_if.c | 56 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/net/bridge/br_sysfs_if.c b/net/bridge/br_sysfs_if.c index f99c5bf5c906..c4f5c83c92d2 100644 --- a/net/bridge/br_sysfs_if.c +++ b/net/bridge/br_sysfs_if.c @@ -25,6 +25,15 @@ struct brport_attribute { struct attribute attr; ssize_t (*show)(struct net_bridge_port *, char *); int (*store)(struct net_bridge_port *, unsigned long); + int (*store_raw)(struct net_bridge_port *, char *); +}; + +#define BRPORT_ATTR_RAW(_name, _mode, _show, _store) \ +const struct brport_attribute brport_attr_##_name = { \ + .attr = {.name = __stringify(_name), \ + .mode = _mode }, \ + .show = _show, \ + .store_raw = _store, \ }; #define BRPORT_ATTR(_name, _mode, _show, _store) \ @@ -270,27 +279,46 @@ static ssize_t brport_store(struct kobject *kobj, struct brport_attribute *brport_attr = to_brport_attr(attr); struct net_bridge_port *p = to_brport(kobj); ssize_t ret = -EINVAL; - char *endp; unsigned long val; + char *endp; if (!ns_capable(dev_net(p->dev)->user_ns, CAP_NET_ADMIN)) return -EPERM; - val = simple_strtoul(buf, &endp, 0); - if (endp != buf) { - if (!rtnl_trylock()) - return restart_syscall(); - if (p->dev && p->br && brport_attr->store) { - spin_lock_bh(&p->br->lock); - ret = brport_attr->store(p, val); - spin_unlock_bh(&p->br->lock); - if (!ret) { - br_ifinfo_notify(RTM_NEWLINK, NULL, p); - ret = count; - } + if (!rtnl_trylock()) + return restart_syscall(); + + if (!p->dev || !p->br) + goto out_unlock; + + if (brport_attr->store_raw) { + char *buf_copy; + + buf_copy = kstrndup(buf, count, GFP_KERNEL); + if (!buf_copy) { + ret = -ENOMEM; + goto out_unlock; } - rtnl_unlock(); + spin_lock_bh(&p->br->lock); + ret = brport_attr->store_raw(p, buf_copy); + spin_unlock_bh(&p->br->lock); + kfree(buf_copy); + } else if (brport_attr->store) { + val = simple_strtoul(buf, &endp, 0); + if (endp == buf) + goto out_unlock; + spin_lock_bh(&p->br->lock); + ret = brport_attr->store(p, val); + spin_unlock_bh(&p->br->lock); } + + if (!ret) { + br_ifinfo_notify(RTM_NEWLINK, NULL, p); + ret = count; + } +out_unlock: + rtnl_unlock(); + return ret; }