From patchwork Thu Apr 5 13:18:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10324573 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 8130B600CB for ; Thu, 5 Apr 2018 13:17:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 71A15291AA for ; Thu, 5 Apr 2018 13:17:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 66B2A291AE; Thu, 5 Apr 2018 13:17:17 +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 F0FA9291AA for ; Thu, 5 Apr 2018 13:17:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751506AbeDENRO (ORCPT ); Thu, 5 Apr 2018 09:17:14 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:37940 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751165AbeDENRH (ORCPT ); Thu, 5 Apr 2018 09:17:07 -0400 Received: by mail-wm0-f67.google.com with SMTP id i3so6994861wmf.3; Thu, 05 Apr 2018 06:17:06 -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=vX5DiXLOo4y0AvOf2AA1wilpMV/TQLxxltN6I0lKnxE=; b=PrAngDNYZoabFQKUlcrWW0EplKQ9z7hA7pMmBsDuDO6RKPnk73MSIoHuQLaNL3J6AD IPUboao4R6Ztm3Tl9cAO8B3x3C32YvfPEf5e/uh4DQYCFHpr3vFEqGgva/IzAYDa8MTF 5bBJMp6GBlAySRRiHnbB0MdS4XPtwu1/DTxD7YnE/mZgh7JrCcWTkKrn0DifEbHufeGe g4PcuZJJy61nq0gQERKWEfwjWXzCyTKgO6ZFtvgnJjf2BsrC0y5jCLjNh301FUZAH6oG 14k/Cl3iJmiEJsctiLfmnxJdE6hOwS37qmqG4JOW0XC4OYOqoqjCwAjPBdv2dR7tyFoa MwOQ== 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=vX5DiXLOo4y0AvOf2AA1wilpMV/TQLxxltN6I0lKnxE=; b=UPF5oGY3T8CqnRfwiWR5sLhTfsc3JStDc6ARxDuaiVdpKyjRc0GsAKv6gz3JNMdkIp 5Y39HTpfww6PIrA8XaY30Toa3ZuAkx1pD4lkegtpOg8fbuuPaysuLM2YauqQ+jNCuCri YKxGZ5wTlbnuepZ3IrtWDubQj4hxqdNLYBrYOSRsj/MR2HBJ/RglQs8aJ8tvNAocrg2Q 0JeMYJdjGvtx3HtZRUcY7SYvoeG+NpR4Zg1Fsu6xwcv9p1bXbNJ6KGXS+O/wGsQoB4IX z7XpbDcMUTgnl6tuWuhVx2KfaY9Z29w7ojslntuZExp+Y16Ccyc1MXB8BNDxTULKuxZL ZNYA== X-Gm-Message-State: ALQs6tA4Ewhna6W0lwygXEzdvhoKVL/gAAGP/2PFgkbshhwlCOqvePi4 SwaT/5MzI1tRphk8w9+LaMo= X-Google-Smtp-Source: AIpwx4/kzPGJcwuxRnQrMzIqQVUCGehi58nAk0w7IYjx/KiP0VUZ5563VuaYnaMfHKheJZvb3VOwkA== X-Received: by 10.28.237.3 with SMTP id l3mr8333698wmh.125.1522934226208; Thu, 05 Apr 2018 06:17:06 -0700 (PDT) Received: from localhost.localdomain ([141.226.13.13]) by smtp.gmail.com with ESMTPSA id p197sm3108398wme.43.2018.04.05.06.17.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 05 Apr 2018 06:17:05 -0700 (PDT) From: Amir Goldstein To: Jan Kara Cc: Miklos Szeredi , Marko Rauhamaa , linux-fsdevel@vger.kernel.org, stable Subject: [PATCH v2 01/20] fanotify: fix logic of events on child Date: Thu, 5 Apr 2018 16:18:02 +0300 Message-Id: <1522934301-6520-2-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1522934301-6520-1-git-send-email-amir73il@gmail.com> References: <1522934301-6520-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 When event on child inodes are sent to the parent inode mark and parent inode mark was not marked with FAN_EVENT_ON_CHILD, the event will not be delivered to the listener process. However, if the same process also has a mount mark, the event to the parent inode will be delivered regadless of the mount mark mask. This behavior is incorrect in the case where the mount mark mask does not contain the specific event type. For example, the process adds a mark on a directory with mask FAN_MODIFY (without FAN_EVENT_ON_CHILD) and a mount mark with mask FAN_CLOSE_NOWRITE (without FAN_ONDIR). A modify event on a file inside that directory (and inside that mount) should not create a FAN_MODIFY event, because neither of the marks requested to get that event on the file. Fixes: 1968f5eed54c ("fanotify: use both marks when possible") Cc: stable Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index 6702a6a0bbb5..e0e6a9d627df 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -92,7 +92,7 @@ static bool fanotify_should_send_event(struct fsnotify_mark *inode_mark, u32 event_mask, const void *data, int data_type) { - __u32 marks_mask, marks_ignored_mask; + __u32 marks_mask = 0, marks_ignored_mask = 0; const struct path *path = data; pr_debug("%s: inode_mark=%p vfsmnt_mark=%p mask=%x data=%p" @@ -108,24 +108,20 @@ static bool fanotify_should_send_event(struct fsnotify_mark *inode_mark, !d_can_lookup(path->dentry)) return false; - if (inode_mark && vfsmnt_mark) { - marks_mask = (vfsmnt_mark->mask | inode_mark->mask); - marks_ignored_mask = (vfsmnt_mark->ignored_mask | inode_mark->ignored_mask); - } else if (inode_mark) { - /* - * if the event is for a child and this inode doesn't care about - * events on the child, don't send it! - */ - if ((event_mask & FS_EVENT_ON_CHILD) && - !(inode_mark->mask & FS_EVENT_ON_CHILD)) - return false; - marks_mask = inode_mark->mask; - marks_ignored_mask = inode_mark->ignored_mask; - } else if (vfsmnt_mark) { - marks_mask = vfsmnt_mark->mask; - marks_ignored_mask = vfsmnt_mark->ignored_mask; - } else { - BUG(); + /* + * if the event is for a child and this inode doesn't care about + * events on the child, don't send it! + */ + if (inode_mark && + (!(event_mask & FS_EVENT_ON_CHILD) || + (inode_mark->mask & FS_EVENT_ON_CHILD))) { + marks_mask |= inode_mark->mask; + marks_ignored_mask |= inode_mark->ignored_mask; + } + + if (vfsmnt_mark) { + marks_mask |= vfsmnt_mark->mask; + marks_ignored_mask |= vfsmnt_mark->ignored_mask; } if (d_is_dir(path->dentry) &&