From patchwork Fri Jan 15 17:30:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tejun Heo X-Patchwork-Id: 568243 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 9E351140BAB for ; Sat, 16 Jan 2016 04:30:47 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=b8Q2YsjX; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754344AbcAORaT (ORCPT ); Fri, 15 Jan 2016 12:30:19 -0500 Received: from mail-yk0-f170.google.com ([209.85.160.170]:34506 "EHLO mail-yk0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753386AbcAORaQ (ORCPT ); Fri, 15 Jan 2016 12:30:16 -0500 Received: by mail-yk0-f170.google.com with SMTP id a85so472581788ykb.1; Fri, 15 Jan 2016 09:30:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=02pYKC8e5eUBeXQn1dXBhN09+RlbcISrsAuoHGgTGes=; b=b8Q2YsjXLh9oK1P/ctvPvs0z7wpTe1Kcgdo5YfchILTazZ/gbxBtte3OO5COQ6Obaz yIMvgCUxwBJukE+8wPwemD+GZwmcnDUsmrJAmpvZ5PFJXj0hMea/U9a6QreIP6qzi3wg l0Dfn85dKNcKUYEsDOHuAThICkclKgd7UoDceriYRwMKp33njxWRN5RHdjAQyFE6+glS +ChmNWwmq+lEw5pZNPdkeJhNigH/P33tFqN6afhIdfQb/B9TaVaRlK3fx+eutFxPN7Mp DIm4wOx82lJUefqFPdN3JVKvhHtgED7pUQoc9DFvlXwuZhmtDCvV3RCFFHcf7A/U9jKW zRGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-type:content-disposition :in-reply-to:user-agent; bh=02pYKC8e5eUBeXQn1dXBhN09+RlbcISrsAuoHGgTGes=; b=Nu4/fzVMbE0FrmGIO3F7XEEKgPglE0ZQjdrwx0lVprbJX5TxmLKfsoz9F4FqG+tzvj 6a+rytQpZZbcVK/jRFV+cqAJtDplBYfPhhn65A8Z7jBU5yBTTSGhWpzrPR0zX9dc2pQM oKKOg3x+emz6ffJddT/kYGw3HIdlIG7S4nInGVimmF2z+NcV18eKFJ2kx8VP17qCMJRa we8GAEOQwfHcftKeP4q4ONSf7h9PqhviW0hZK5ZHGU5sxs44QK6FchWuyLC7wzza38Qc Wng4XczH7Uisekd8ECQh+R4cjurr5Nh8Wk/bFo24qfiCD5XKUD1sLNwRMXM1jdh//eT0 QMow== X-Gm-Message-State: ALoCoQnK0snABdBsGMJDlmWA55M6NR/0fa9wqJv9dqDV6Yyke8qfVPkzTecaA/HalfjJ8hmEX7xc2GN6raPH6Gu/+kVZ+en3XQ== X-Received: by 10.37.87.138 with SMTP id l132mr1266744ybb.180.1452879015169; Fri, 15 Jan 2016 09:30:15 -0800 (PST) Received: from localhost ([2620:10d:c091:200::b:e08d]) by smtp.gmail.com with ESMTPSA id z129sm8708924ywb.26.2016.01.15.09.30.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 15 Jan 2016 09:30:14 -0800 (PST) Date: Fri, 15 Jan 2016 12:30:14 -0500 From: Tejun Heo To: Greg Kroah-Hartman , Geert Uytterhoeven Cc: "David S. Miller" , pablo@netfilter.org, Patrick McHardy , kadlec@blackhole.kfki.hu, Daniel Borkmann , daniel.wagner@bmw-carit.de, nhorman@tuxdriver.com, Zefan Li , Johannes Weiner , "netdev@vger.kernel.org" , netfilter-devel@vger.kernel.org, coreteam@netfilter.org, cgroups@vger.kernel.org, "linux-kernel@vger.kernel.org" , kernel-team@fb.com, ninasc@fb.com, Josh Triplett Subject: [PATCH] kernfs: make kernfs_walk_ns() use kernfs_pr_cont_buf[] Message-ID: <20160115173014.GI3520@mtj.duckdns.org> References: <1449527935-27056-1-git-send-email-tj@kernel.org> <1449527935-27056-3-git-send-email-tj@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org kernfs_walk_ns() uses a static path_buf[PATH_MAX] to separate out path components. Keeping around the 4k buffer just for kernfs_walk_ns() is wasteful. This patch makes it piggyback on kernfs_pr_cont_buf[] instead. This requires kernfs_walk_ns() to hold kernfs_rename_lock. Signed-off-by: Tejun Heo Reported-by: Geert Uytterhoeven --- Hello, Greg, can you please route this one? Thanks. fs/kernfs/dir.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -698,15 +698,22 @@ static struct kernfs_node *kernfs_walk_n const unsigned char *path, const void *ns) { - static char path_buf[PATH_MAX]; /* protected by kernfs_mutex */ - size_t len = strlcpy(path_buf, path, PATH_MAX); - char *p = path_buf; - char *name; + size_t len; + char *p, *name; lockdep_assert_held(&kernfs_mutex); - if (len >= PATH_MAX) + /* grab kernfs_rename_lock to piggy back on kernfs_pr_cont_buf */ + spin_lock_irq(&kernfs_rename_lock); + + len = strlcpy(kernfs_pr_cont_buf, path, sizeof(kernfs_pr_cont_buf)); + + if (len >= sizeof(kernfs_pr_cont_buf)) { + spin_unlock_irq(&kernfs_rename_lock); return NULL; + } + + p = kernfs_pr_cont_buf; while ((name = strsep(&p, "/")) && parent) { if (*name == '\0') @@ -714,6 +721,8 @@ static struct kernfs_node *kernfs_walk_n parent = kernfs_find_ns(parent, name, ns); } + spin_unlock_irq(&kernfs_rename_lock); + return parent; }