From patchwork Wed Jun 7 07:51:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9770815 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 0FB1A60364 for ; Wed, 7 Jun 2017 07:51:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EE0832848D for ; Wed, 7 Jun 2017 07:51:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E268F28528; Wed, 7 Jun 2017 07:51:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8F6B22848D for ; Wed, 7 Jun 2017 07:51:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751506AbdFGHvd (ORCPT ); Wed, 7 Jun 2017 03:51:33 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:32878 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751203AbdFGHva (ORCPT ); Wed, 7 Jun 2017 03:51:30 -0400 Received: by mail-wr0-f194.google.com with SMTP id v104so470961wrb.0; Wed, 07 Jun 2017 00:51:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=8nqQu9/ttFjSQb95axzG7N9eNyb1cGAwall13ryCYN8=; b=gOEolxRxviOyDT8t1WI7U0XG++LdgRrPTQZJGfv7o+QQqwrbJdLLq2HaaRQV/2FWNS J4z4GkowGPpxu7ZjS07YlGrhF0qjj1ntwnFGwi9rLyoGkGy3Tv3czj1kXcGo4m4d/xj4 JyUiQpZizVk/WHsdkk5rhU/1ax7PBOVMNjTLmDsCu2JG3Hm2fWYZDo9XJZJcvUL1nclT 1abAO1eidkCtI5OQ9sq+DN7NX/nbaBCUphWYtfETCQFG7fkOyhM2K5/DhH+7H+hHOtBd cS67bD9KazqU+3lJ3L8hQw/8NG8Sx7cOYK9JXSVn/Bd9abrOklfP6NEwPPGSE10FRN8j vPcQ== 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=8nqQu9/ttFjSQb95axzG7N9eNyb1cGAwall13ryCYN8=; b=tq8++NgQu67D63L/VJqHusnRikE1VkA+GptTDTCzqbXbUdS6ATAzu0MEUVQ050VrRE FYO1kB10zdiOqaO9l+Vh97DrC/MD6kQ/fiCu767/hPeNefATZHGWFUAGC41AN4yhJSOa +V9wnfjqxI51UECFozoGM6AVK59MhCh3tZVGt7w8nd7b4qvY5Px8FX3kDrAJ4n5nEv3P 9bitxaAFAM7XBwvw9MHVGO9ugzr0HQVU7Lc1VylttbuRwMNYt2SJHk5+XaN7K24AQm4G vBHGfRR2fSFkcAMaPESH6Y+s288u63bWpodQxLbOIuJRuMxu06ROMzONeAmwhPl3sqwK tUDQ== X-Gm-Message-State: AODbwcDe1wD78Mk+tai/U7gydD9g9skWTIiGMTx6XRcFqMN7n7YlKgI+ R3lspzrusx1AsA== X-Received: by 10.223.162.217 with SMTP id t25mr19041369wra.173.1496821889369; Wed, 07 Jun 2017 00:51:29 -0700 (PDT) Received: from amir-VirtualBox.lan (bzq-79-179-137-123.red.bezeqint.net. [79.179.137.123]) by smtp.gmail.com with ESMTPSA id 91sm307202wrn.24.2017.06.07.00.51.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 07 Jun 2017 00:51:28 -0700 (PDT) From: Amir Goldstein To: Miklos Szeredi Cc: Al Viro , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v2 12/20] ovl: fix nlink leak in ovl_rename() Date: Wed, 7 Jun 2017 10:51:16 +0300 Message-Id: <1496821884-5178-13-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1496821884-5178-1-git-send-email-amir73il@gmail.com> References: <1496821884-5178-1-git-send-email-amir73il@gmail.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch fixes an overlay inode nlink leak in the case where ovl_rename() renames over a non-dir. This is not so critical, because overlay inode doesn't rely on nlink dropping to zero for inode deletion. Signed-off-by: Amir Goldstein --- fs/overlayfs/dir.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 4f0096fee276..a60c075f62f6 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -891,6 +891,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, bool old_opaque; bool new_opaque; bool cleanup_whiteout = false; + bool new_drop_nlink = false; bool overwrite = !(flags & RENAME_EXCHANGE); bool is_dir = d_is_dir(old); bool new_is_dir = d_is_dir(new); @@ -952,6 +953,8 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, flags |= RENAME_EXCHANGE; cleanup_whiteout = true; } + if (!new_is_dir && new->d_inode) + new_drop_nlink = true; } old_upperdir = ovl_dentry_upper(old->d_parent); @@ -1046,6 +1049,9 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, if (cleanup_whiteout) ovl_cleanup(old_upperdir->d_inode, newdentry); + if (new_drop_nlink) + drop_nlink(new->d_inode); + ovl_dentry_version_inc(old->d_parent); ovl_dentry_version_inc(new->d_parent);