From patchwork Thu Jan 10 17:04:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756265 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BEECE13B4 for ; Thu, 10 Jan 2019 17:04:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AB71D29AC2 for ; Thu, 10 Jan 2019 17:04:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9F8B129B55; Thu, 10 Jan 2019 17:04:58 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 16D7A29AC2 for ; Thu, 10 Jan 2019 17:04:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729001AbfAJRE5 (ORCPT ); Thu, 10 Jan 2019 12:04:57 -0500 Received: from mail-wr1-f66.google.com ([209.85.221.66]:32899 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728266AbfAJRE4 (ORCPT ); Thu, 10 Jan 2019 12:04:56 -0500 Received: by mail-wr1-f66.google.com with SMTP id c14so12298205wrr.0 for ; Thu, 10 Jan 2019 09:04:54 -0800 (PST) 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=e5A0OWSKfCDmuSlAF2SqifLaJPcgGpU1nwI2BDbCEnk=; b=ZMV8eA+sfn1foGB3OO9dlYlmYtFuDw6QaxeFUY68PlkC3DVBdkdXQKVJqGuszyeRH2 QWvodV757X0LC0LieAV4F/sVBNs9JwZfu3Tn2gyVV/B6pR4NMipngGZ7Q+PrkhcVMjnM mLY0m1TwrInhVy8lCKNruHVutJYdCEeg9KURVAyCAvqnbhtIdtGeMXgsNqtUX2b/NuIz Ck0jOkQFXUPayldmY5SxdBRa0iGCMEwQi2G+IFRAXeUseQemh61uVuhZ4gomywsVOHDh EQ8dYPdnwuoM1EyAeCoFbIXH4spmYQUKe8Gm6hfAPfvH5Uqlh8BM4dzuFK/ZHbYdUnAR ErTw== 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=e5A0OWSKfCDmuSlAF2SqifLaJPcgGpU1nwI2BDbCEnk=; b=R9whDd4MbRArM9o737gTHzhpBtIKMr8Iq01xmWO6Qp6Fy/SpIF7VwPn0hpDfN9bmRv CcsUzLrUmQn86mCDiswrb/5zVUurGqMBLJUoyjXdNuCcCXDntOSUOgTlBfcv1Kild8u4 3u12FN3P84KHZWiFJZDk1PzAUU3CQrFo+s1P24xEd7VHaSoLcyt/1saieyhL2T0/pxSP mBrScnUeP79NFTj1EKo86ifsafYfbiI0LTJ+mdXDGKmBq8j5MwahUHfs8T9+yj6r+A1g nJm9tuhjgpdJishP2d+NLJGGEw7Xi5b1sSH8Zg0ILAOeFSqSh2ppM09+vwbHqf53Ia5N s8yA== X-Gm-Message-State: AJcUukdzAnIXYpWWyDC6oGZNhKSMVeVcrfK7yxewZ52f0fBhDiPLyXqB GvhMegMtefw6QjEx1RVeSWg= X-Google-Smtp-Source: ALg8bN7w333ge/zIVq8KkeUMkeMO2oGUzIobMc5LamzIGAY/8BsererZD7qgSGWgFAyY+TMxOFedJA== X-Received: by 2002:a5d:4dc8:: with SMTP id f8mr10364897wru.45.1547139893460; Thu, 10 Jan 2019 09:04:53 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.04.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:04:52 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 01/17] fsnotify: annotate directory entry modification events Date: Thu, 10 Jan 2019 19:04:28 +0200 Message-Id: <20190110170444.30616-2-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 "dirent" events are referring to events that modify directory entries, such as create,delete,rename. Those events should always be reported on a watched directory, regardless if FS_EVENT_ON_CHILD is set on the watch mask. fsnotify_nameremove() and fsnotify_move() were modified to no longer set the FS_EVENT_ON_CHILD event bit. This is a semantic change to align with the "dirent" event definition. It has no effect on any existing backend, because dnotify, inotify and audit always requets the child events and fanotify does not get the delete,rename events. The fsnotify_dirent() helper is used instead of fsnotify_parent() to report a dirent event to dentry->d_parent without FS_EVENT_ON_CHILD and regardless if parent has the FS_EVENT_ON_CHILD bit set. Unlike fsnotify_parent(), fsnotify_dirent() assumes that dentry->d_name and dentry->d_parent are stable. For fsnotify_create()/fsnotify_mkdir(), this assumption is abviously correct. For fsnotify_nameremove(), it is less trvial, so we use dget_parent() and take_dentry_name_snapshot() to grab stable references. Signed-off-by: Amir Goldstein --- include/linux/fsnotify.h | 68 ++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 2ccb08cb5d6a..116907928c7f 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -17,8 +17,22 @@ #include #include +/* + * Notify this @dir inode about a change in the directory entry @dentry. + * + * Unlike fsnotify_parent(), the event will be reported regardless of the + * FS_EVENT_ON_CHILD mask on the parent inode. + */ +static inline int fsnotify_dirent(struct inode *dir, struct dentry *dentry, + __u32 mask) +{ + return fsnotify(dir, mask, d_inode(dentry), FSNOTIFY_EVENT_INODE, + dentry->d_name.name, 0); +} + /* Notify this dentry's parent about a child's events. */ -static inline int fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask) +static inline int fsnotify_parent(const struct path *path, + struct dentry *dentry, __u32 mask) { if (!dentry) dentry = path->dentry; @@ -85,8 +99,8 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, { struct inode *source = moved->d_inode; u32 fs_cookie = fsnotify_get_cookie(); - __u32 old_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_FROM); - __u32 new_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_TO); + __u32 old_dir_mask = FS_MOVED_FROM; + __u32 new_dir_mask = FS_MOVED_TO; const unsigned char *new_name = moved->d_name.name; if (old_dir == new_dir) @@ -128,15 +142,54 @@ static inline void fsnotify_vfsmount_delete(struct vfsmount *mnt) /* * fsnotify_nameremove - a filename was removed from a directory + * + * Called from d_delete() and nfs_complete_sillyrename(). + * The latter is called from nfs client ->unlink() ->rmdir() ->rename() + * under parent vfs inode lock. + * + * Most filesystems call d_delete() from ->unlink() ->rmdir() ->rename() + * ops under parent vfs inode lock. + * + * Some pseudo filesystems call d_delete() without parent inode lock. + * Those filesystems have no ->rename() op and they do not call + * d_move() directly, so d_parent and d_name are stable by definition. + * Examples: devpts, efivarfs, rpc_pipefs, functionfs. + * + * Some clustered filesystems call d_delete() on remote nodes, not under + * vfs parent inode lock, but they use cluster distributed locks on local + * and remote nodes. Those filesystems call d_delete() under their cluster + * lock. Examples: + * - in ceph_fill_trace() under CEPH_MDS_R_PARENT_LOCKED + * - in ocfs2_dentry_convert_worker() under ocfs2_dentry_lock + * But those filesystems also call d_move() under the same cluster lock + * (i.e. FS_RENAME_DOES_D_MOVE), so d_parent and d_name are also stable. + * + * However, to be on the safe side and be reselient to future callers + * and out of tree users of d_delete(), we do not assume that d_parent and + * d_name are stable and we use dget_parent() and take_dentry_name_snapshot() + * to grab stable references. */ static inline void fsnotify_nameremove(struct dentry *dentry, int isdir) { + struct dentry *parent; + struct name_snapshot name; __u32 mask = FS_DELETE; + /* d_delete() of pseudo inode? (e.g. __ns_get_path() playing tricks) */ + if (IS_ROOT(dentry)) + return; + if (isdir) mask |= FS_ISDIR; - fsnotify_parent(NULL, dentry, mask); + parent = dget_parent(dentry); + take_dentry_name_snapshot(&name, dentry); + + fsnotify(d_inode(parent), mask, d_inode(dentry), FSNOTIFY_EVENT_INODE, + name.name, 0); + + release_dentry_name_snapshot(&name); + dput(parent); } /* @@ -155,7 +208,7 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry) { audit_inode_child(inode, dentry, AUDIT_TYPE_CHILD_CREATE); - fsnotify(inode, FS_CREATE, dentry->d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0); + fsnotify_dirent(inode, dentry, FS_CREATE); } /* @@ -176,12 +229,9 @@ static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct */ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) { - __u32 mask = (FS_CREATE | FS_ISDIR); - struct inode *d_inode = dentry->d_inode; - audit_inode_child(inode, dentry, AUDIT_TYPE_CHILD_CREATE); - fsnotify(inode, mask, d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0); + fsnotify_dirent(inode, dentry, FS_CREATE | FS_ISDIR); } /* From patchwork Thu Jan 10 17:04:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756263 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EE40E13B4 for ; Thu, 10 Jan 2019 17:04:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DA8AE29AC2 for ; Thu, 10 Jan 2019 17:04:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CE6D229B55; Thu, 10 Jan 2019 17:04:57 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 6B05329AC2 for ; Thu, 10 Jan 2019 17:04:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728999AbfAJRE5 (ORCPT ); Thu, 10 Jan 2019 12:04:57 -0500 Received: from mail-wr1-f65.google.com ([209.85.221.65]:35781 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728995AbfAJRE4 (ORCPT ); Thu, 10 Jan 2019 12:04:56 -0500 Received: by mail-wr1-f65.google.com with SMTP id 96so12250280wrb.2 for ; Thu, 10 Jan 2019 09:04:55 -0800 (PST) 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=/RXJW/vzjOzgP3J1gPPKjZxog4WrinVi+jeCLAKErWc=; b=B+XeUxIlynnrXDsEeo9gcxqXSXwtizQNEmL0wnZRkcFeByE4U4mZDhwIs+XqJPEC8O zL4w5ZdVP2fmaeoVtlWmxbS4FQIEZNw2sKjTv7FZSJWeE4lVZ+uNXXLX6V/doca9H3tP HiuBIU2lx/LNmt723yOaQRy0obTVJzmAlT90MdT5itd0tkOqEPvBz1O+Qm0P9g2BPQ3D fDq2cB+eet+acuLETJfr+KCVK4OKf2r9LnT2S8RdReC3QbndxIV7KjFOmiAbnU3LQRis vo1Zd36HGZ0cjm0UaPLoWP3H3mw72L7Xwg7H0pc0JFM2XKVgD54eEJ758JJmNUL1TkgV y3ig== 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=/RXJW/vzjOzgP3J1gPPKjZxog4WrinVi+jeCLAKErWc=; b=XNXOaDDzvP883uVhtUz/G5WPbAs75/mvPiuckfAkNUNj0GAD9ojIbsy6ShUkye4Kw0 sRTDAT/nGUDNp2+5H/L1ZJt9QQ34mvt6eLq5SoX9v0dNnhd6k2EXf4WUvCj3zTzJ4fKJ Mw2RTmRri+iuv1+n+ZW8BmpcqWK6hgrvAI2Gwih1lze03C73WZXeM1SUu8wB/DZn7iLB 9PVJwGDwEbqcCt4vKpUhUW2ouWbmMMBu43SOq6j8N2JTANOeelqvKwzEb9rPonOO69PR 5KWqWl5NDm0/41mp4tuMmIq/TgG4EgeaXZVK3RMvgwBYgmL1xGwJQXKftoRkklir39vw g+Cw== X-Gm-Message-State: AJcUukechetkuG+4dlQPvfDiKSEEbui7mrG7b2P2RNWR90ktVEOUifHC wQe6Ud2cR0oJvnqq3yupIEoqdkzp X-Google-Smtp-Source: ALg8bN71ESxPPzn0Ud+6kypn3q7VREf3ob1E5ga5nWRniXHt08N9Mmy2XZC3R47isCRJ9QsdudcruA== X-Received: by 2002:adf:b649:: with SMTP id i9mr10384744wre.70.1547139894533; Thu, 10 Jan 2019 09:04:54 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.04.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:04:54 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 02/17] fsnotify: remove dirent events from FS_EVENTS_POSS_ON_CHILD mask Date: Thu, 10 Jan 2019 19:04:29 +0200 Message-Id: <20190110170444.30616-3-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 "dirent" events are referring to events that modify directory entries, such as create,delete,rename. Those events are always be reported on a watched directory, regardless if FS_EVENT_ON_CHILD is set on the watch mask. ALL_FSNOTIFY_DIRENT_EVENTS defines all the dirent event types and those event types are removed from FS_EVENTS_POSS_ON_CHILD. That means for a directory with an inotify watch and only dirent events in the mask (i.e. create,delete,move), all children dentries will no longer have the DCACHE_FSNOTIFY_PARENT_WATCHED flag set. This will allow all events that happen on children to be optimized away in __fsnotify_parent() without the need to dereference child->d_parent->d_inode->i_fsnotify_mask. Since the dirent events are never repoted via __fsnotify_parent(), this results in no change of logic, but only an optimization. Signed-off-by: Amir Goldstein --- include/linux/fsnotify_backend.h | 36 +++++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 7639774e7475..7f195d43efaf 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h @@ -59,27 +59,33 @@ * dnotify and inotify. */ #define FS_EVENT_ON_CHILD 0x08000000 -/* This is a list of all events that may get sent to a parernt based on fs event - * happening to inodes inside that directory */ -#define FS_EVENTS_POSS_ON_CHILD (FS_ACCESS | FS_MODIFY | FS_ATTRIB |\ - FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN |\ - FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\ - FS_DELETE | FS_OPEN_PERM | FS_ACCESS_PERM | \ - FS_OPEN_EXEC | FS_OPEN_EXEC_PERM) - #define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO) +/* + * Directory entry modification events - reported only to directory + * where entry is modified and not to a watching parent. + * The watching parent may get an FS_ATTRIB|FS_EVENT_ON_CHILD event + * when a directory entry inside a child subdir changes. + */ +#define ALL_FSNOTIFY_DIRENT_EVENTS (FS_CREATE | FS_DELETE | FS_MOVE) + #define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM | \ FS_OPEN_EXEC_PERM) +/* + * This is a list of all events that may get sent to a parent based on fs event + * happening to inodes inside that directory. + */ +#define FS_EVENTS_POSS_ON_CHILD (ALL_FSNOTIFY_PERM_EVENTS | \ + FS_ACCESS | FS_MODIFY | FS_ATTRIB | \ + FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | \ + FS_OPEN | FS_OPEN_EXEC) + /* Events that can be reported to backends */ -#define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \ - FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN | \ - FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \ - FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \ - FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \ - FS_OPEN_PERM | FS_ACCESS_PERM | FS_DN_RENAME | \ - FS_OPEN_EXEC | FS_OPEN_EXEC_PERM) +#define ALL_FSNOTIFY_EVENTS (ALL_FSNOTIFY_DIRENT_EVENTS | \ + FS_EVENTS_POSS_ON_CHILD | \ + FS_DELETE_SELF | FS_MOVE_SELF | FS_DN_RENAME | \ + FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED) /* Extra flags that may be reported with event or control handling of events */ #define ALL_FSNOTIFY_FLAGS (FS_EXCL_UNLINK | FS_ISDIR | FS_IN_ONESHOT | \ From patchwork Thu Jan 10 17:04:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756267 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 343CE13BF for ; Thu, 10 Jan 2019 17:05:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1F7BA29B52 for ; Thu, 10 Jan 2019 17:05:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 12DB629B55; Thu, 10 Jan 2019 17:05:00 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 DD24F29AC2 for ; Thu, 10 Jan 2019 17:04:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728266AbfAJRE6 (ORCPT ); Thu, 10 Jan 2019 12:04:58 -0500 Received: from mail-wm1-f49.google.com ([209.85.128.49]:40908 "EHLO mail-wm1-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728959AbfAJRE5 (ORCPT ); Thu, 10 Jan 2019 12:04:57 -0500 Received: by mail-wm1-f49.google.com with SMTP id f188so12754541wmf.5 for ; Thu, 10 Jan 2019 09:04:56 -0800 (PST) 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=+XGKyv15a0ptcvxoKedMcpUarslSIbK+hEOdhJMZe+U=; b=LuboaFdyRDr50s9BV0rJAeJ2FcoZV+7eeywvTnHu6syt3beTDs8qlc/JGMqQ/Owulf JbY0iwInlvjkdn1cuAhNbNJTuZdGMOALcl+Lq4Px5iEdwIne3Tg1/9F2aUbzi3dEN43i Iut9fxWcCDBoWj8u+i6FrOBMCiYShwANhe158jtEAPzYcdlfhOF2wnUhFT0oN0C0ZPQu +qfFgE/q+qMQuagr0gyC0zAGN+iRQ9hRBUij608k8Hd1Xak3YH/yaDMbIjbQq0EaBrqv Sg/hKFqknTccgQYQwohkHLEkIbfmiNOlG00VxsOJmq5ZNnjKzjroK0l/1FyFHkvWndX2 CtRA== 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=+XGKyv15a0ptcvxoKedMcpUarslSIbK+hEOdhJMZe+U=; b=PuZG6svKLh/R60rwtTuhDQwS0pqf6LqE4/mFhHPJv27g/aMntEWoAUnoz3zN9SBnzf 4FqzbUcUJc5BH2nu9K8btf7yo9fKzVl9YguOYyjE7Ny+cYItxg2JfF2TmvDE6rqmZnwW OMC8X1y4OCoJEzfyjtD/A0Y78yOv39ryUd8T8rQ79yaGeYlIeX1uXSrNe9f+olIy4Syt FwQPn2Fjvas0FuDEmT2ZRHV45obvHXzarwgjdhO9SZnJOz/kYbkUf2Onykiah96KKm7k grlvYXKpHWBgjiFP4dnC/16dQPWh9GdkPmC6wD4lHsg5zxkHMlgJSq9NqFfPioH9dnK7 +/ZQ== X-Gm-Message-State: AJcUukfKiAz45cC28fj4fQGv1Bes3vSicTI5YimuoTfaGFmJon/I3FYZ PVX9fsaQp9Dcn19ziWHgWjk= X-Google-Smtp-Source: ALg8bN5aCjAvpMc6Owj2DmZ2Zwsx3YA51I6QyyamTDbHMuEUZD1e+JJJWVi4XLyglzgwYGcAwoD+Lw== X-Received: by 2002:a1c:a401:: with SMTP id n1mr11198690wme.101.1547139895867; Thu, 10 Jan 2019 09:04:55 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.04.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:04:55 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 03/17] fsnotify: send all event types to super block marks Date: Thu, 10 Jan 2019 19:04:30 +0200 Message-Id: <20190110170444.30616-4-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 So far, existence of super block marks was checked only on events with data type FSNOTIFY_EVENT_PATH. Use the super block of the "to_tell" inode to report the events of all event types to super block marks. This change has no effect on current backends. Soon, this will allow fanotify backend to receive all event types on a super block mark. Signed-off-by: Amir Goldstein --- fs/notify/fsnotify.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index ecf09b6243d9..df06f3da166c 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c @@ -328,16 +328,15 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, const unsigned char *file_name, u32 cookie) { struct fsnotify_iter_info iter_info = {}; - struct super_block *sb = NULL; + struct super_block *sb = to_tell->i_sb; struct mount *mnt = NULL; - __u32 mnt_or_sb_mask = 0; + __u32 mnt_or_sb_mask = sb->s_fsnotify_mask; int ret = 0; __u32 test_mask = (mask & ALL_FSNOTIFY_EVENTS); if (data_is == FSNOTIFY_EVENT_PATH) { mnt = real_mount(((const struct path *)data)->mnt); - sb = mnt->mnt.mnt_sb; - mnt_or_sb_mask = mnt->mnt_fsnotify_mask | sb->s_fsnotify_mask; + mnt_or_sb_mask |= mnt->mnt_fsnotify_mask; } /* An event "on child" is not intended for a mount/sb mark */ if (mask & FS_EVENT_ON_CHILD) @@ -350,8 +349,8 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, * SRCU because we have no references to any objects and do not * need SRCU to keep them "alive". */ - if (!to_tell->i_fsnotify_marks && - (!mnt || (!mnt->mnt_fsnotify_marks && !sb->s_fsnotify_marks))) + if (!to_tell->i_fsnotify_marks && !sb->s_fsnotify_marks && + (!mnt || !mnt->mnt_fsnotify_marks)) return 0; /* * if this is a modify event we may need to clear the ignored masks @@ -366,11 +365,11 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is, iter_info.marks[FSNOTIFY_OBJ_TYPE_INODE] = fsnotify_first_mark(&to_tell->i_fsnotify_marks); + iter_info.marks[FSNOTIFY_OBJ_TYPE_SB] = + fsnotify_first_mark(&sb->s_fsnotify_marks); if (mnt) { iter_info.marks[FSNOTIFY_OBJ_TYPE_VFSMOUNT] = fsnotify_first_mark(&mnt->mnt_fsnotify_marks); - iter_info.marks[FSNOTIFY_OBJ_TYPE_SB] = - fsnotify_first_mark(&sb->s_fsnotify_marks); } /* From patchwork Thu Jan 10 17:04:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756269 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9686113BF for ; Thu, 10 Jan 2019 17:05:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8062029B55 for ; Thu, 10 Jan 2019 17:05:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 712AF29D01; Thu, 10 Jan 2019 17:05:02 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 A13EF29B55 for ; Thu, 10 Jan 2019 17:05:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729029AbfAJRFB (ORCPT ); Thu, 10 Jan 2019 12:05:01 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:33478 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728959AbfAJRFA (ORCPT ); Thu, 10 Jan 2019 12:05:00 -0500 Received: by mail-wm1-f67.google.com with SMTP id r24so138796wmh.0 for ; Thu, 10 Jan 2019 09:04:58 -0800 (PST) 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=Eqm1R0y4Ty35QhhxcEBi4DeY/p+omFJCVmaveqExOZs=; b=SRdBhgNxRMN1FXqtFlRDTBcfUaEdSqCo+Gb8COzkkNzt4N942jHAMUsp5bJfmOVXoA XlQt/Fp4PqLKSsP95OUcdTpZTMEuMNELfWa0KmVm4kTxBVzWsgHMRShLYlyMDt4JawEN 6c7Jwt8iR3hssbRq1OhzYKJBrqQ6rhHFaBtYRFkx0VhA7Z4DWGa2sZqKE+nAN+BTSlxT q8vqPQe6w9hXq2G/0GCviNkT2KfcqFq4T6IIPBHD6cPGsEg+QiJLJ2QDxKFmEDNAXrcL YPRBQozKZMpmE5TgYEBpP9kHr6xcJdclLKgV2dYMkHPM8uIEWPNGFLiRMKWou6uJ3DE3 Wcew== 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=Eqm1R0y4Ty35QhhxcEBi4DeY/p+omFJCVmaveqExOZs=; b=Zpnw8e4dLMYMqRN8wg6j9z0IWrOS+cOAIOJbyZ//EDNJQ/5OCD7VMklCjmsftxzBUv UxENbKVjO+YyUrtVkfSjgaFIL/NlD3Y42eJU+Nt8zFLkzca5wliiS81YbRSZTkv0mHDr ZGBj14FeoZ8eBl30z2+RgGM105GV7Lx8k7JSe3Ry/jhiHpZCLI/hTrcvJffY74IFvetj r4OahGK6sB0P9ReNNqK5pFq3ZTyWfkCA8Jy3O76CQxqliRj4BLU/+u8MSLkhZLCZXdES /eXEalgT+xlZnFbVSM8YDZgWwI8qlkLdjOzECBE/objatjh8g2g82y5W4I6HcSdSm/M5 lKJQ== X-Gm-Message-State: AJcUukekh9SpY2W0Cc9rVBVk7tkTe9+XZw6LUSnJ4TGmDHUZA+zVAhks foYijMLfYq9X0mPwy+bKo4k= X-Google-Smtp-Source: ALg8bN4u9WXICpOm1lm/t+ZxaSVQKGjBhuXAPu5zl32RJ8BnGtE8oF3QBuf8zGsMSkRZycnwJjmJfw== X-Received: by 2002:a1c:4807:: with SMTP id v7mr10909954wma.53.1547139897266; Thu, 10 Jan 2019 09:04:57 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.04.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:04:56 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 04/17] fsnotify: move mask out of struct fsnotify_event Date: Thu, 10 Jan 2019 19:04:31 +0200 Message-Id: <20190110170444.30616-5-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 Common fsnotify_event helpers have no need for the mask field. It is only used by backend code, so move the field out of the abstract fsnotify_event struct and into the concrete backend event structs. This change packs struct inotify_event_info better on 64bit machine and will allow us to cram some more fields into struct fanotify_event_info. Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 11 +++++++---- fs/notify/fanotify/fanotify.h | 1 + fs/notify/fanotify/fanotify_user.c | 10 +++++----- fs/notify/inotify/inotify.h | 1 + fs/notify/inotify/inotify_fsnotify.c | 9 +++++---- fs/notify/inotify/inotify_user.c | 5 +++-- fs/notify/notification.c | 22 +--------------------- include/linux/fsnotify_backend.h | 10 ++++++---- 8 files changed, 29 insertions(+), 40 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index 3723f3d18d20..98197802bbfb 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -36,20 +36,22 @@ static bool should_merge(struct fsnotify_event *old_fsn, static int fanotify_merge(struct list_head *list, struct fsnotify_event *event) { struct fsnotify_event *test_event; + struct fanotify_event_info *new; pr_debug("%s: list=%p event=%p\n", __func__, list, event); + new = FANOTIFY_E(event); /* * Don't merge a permission event with any other event so that we know * the event structure we have created in fanotify_handle_event() is the * one we should check for permission response. */ - if (fanotify_is_perm_event(event->mask)) + if (fanotify_is_perm_event(new->mask)) return 0; list_for_each_entry_reverse(test_event, list, list) { if (should_merge(test_event, event)) { - test_event->mask |= event->mask; + FANOTIFY_E(test_event)->mask |= new->mask; return 1; } } @@ -173,7 +175,8 @@ struct fanotify_event_info *fanotify_alloc_event(struct fsnotify_group *group, if (!event) goto out; init: __maybe_unused - fsnotify_init_event(&event->fse, inode, mask); + fsnotify_init_event(&event->fse, inode); + event->mask = mask; if (FAN_GROUP_FLAG(group, FAN_REPORT_TID)) event->pid = get_pid(task_pid(current)); else @@ -280,7 +283,7 @@ static void fanotify_free_event(struct fsnotify_event *fsn_event) event = FANOTIFY_E(fsn_event); path_put(&event->path); put_pid(event->pid); - if (fanotify_is_perm_event(fsn_event->mask)) { + if (fanotify_is_perm_event(event->mask)) { kmem_cache_free(fanotify_perm_event_cachep, FANOTIFY_PE(fsn_event)); return; diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h index ea05b8a401e7..e630d787d4c3 100644 --- a/fs/notify/fanotify/fanotify.h +++ b/fs/notify/fanotify/fanotify.h @@ -14,6 +14,7 @@ extern struct kmem_cache *fanotify_perm_event_cachep; */ struct fanotify_event_info { struct fsnotify_event fse; + u32 mask; /* * We hold ref to this path so it may be dereferenced at any point * during this object's lifetime diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 9c870b0d2b56..dea47d07cc29 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -131,9 +131,9 @@ static int fill_event_metadata(struct fsnotify_group *group, metadata->metadata_len = FAN_EVENT_METADATA_LEN; metadata->vers = FANOTIFY_METADATA_VERSION; metadata->reserved = 0; - metadata->mask = fsn_event->mask & FANOTIFY_OUTGOING_EVENTS; + metadata->mask = event->mask & FANOTIFY_OUTGOING_EVENTS; metadata->pid = pid_vnr(event->pid); - if (unlikely(fsn_event->mask & FAN_Q_OVERFLOW)) + if (unlikely(event->mask & FAN_Q_OVERFLOW)) metadata->fd = FAN_NOFD; else { metadata->fd = create_fd(group, event, file); @@ -230,7 +230,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, fanotify_event_metadata.event_len)) goto out_close_fd; - if (fanotify_is_perm_event(event->mask)) + if (fanotify_is_perm_event(FANOTIFY_E(event)->mask)) FANOTIFY_PE(event)->fd = fd; if (fd != FAN_NOFD) @@ -316,7 +316,7 @@ static ssize_t fanotify_read(struct file *file, char __user *buf, * Permission events get queued to wait for response. Other * events can be destroyed now. */ - if (!fanotify_is_perm_event(kevent->mask)) { + if (!fanotify_is_perm_event(FANOTIFY_E(kevent)->mask)) { fsnotify_destroy_event(group, kevent); } else { if (ret <= 0) { @@ -401,7 +401,7 @@ static int fanotify_release(struct inode *ignored, struct file *file) */ while (!fsnotify_notify_queue_is_empty(group)) { fsn_event = fsnotify_remove_first_event(group); - if (!(fsn_event->mask & FANOTIFY_PERM_EVENTS)) { + if (!(FANOTIFY_E(fsn_event)->mask & FANOTIFY_PERM_EVENTS)) { spin_unlock(&group->notification_lock); fsnotify_destroy_event(group, fsn_event); spin_lock(&group->notification_lock); diff --git a/fs/notify/inotify/inotify.h b/fs/notify/inotify/inotify.h index 7e4578d35b61..74ae60305189 100644 --- a/fs/notify/inotify/inotify.h +++ b/fs/notify/inotify/inotify.h @@ -5,6 +5,7 @@ struct inotify_event_info { struct fsnotify_event fse; + u32 mask; int wd; u32 sync_cookie; int name_len; diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c index f4184b4f3815..fe97299975f2 100644 --- a/fs/notify/inotify/inotify_fsnotify.c +++ b/fs/notify/inotify/inotify_fsnotify.c @@ -43,11 +43,11 @@ static bool event_compare(struct fsnotify_event *old_fsn, { struct inotify_event_info *old, *new; - if (old_fsn->mask & FS_IN_IGNORED) - return false; old = INOTIFY_E(old_fsn); new = INOTIFY_E(new_fsn); - if ((old_fsn->mask == new_fsn->mask) && + if (old->mask & FS_IN_IGNORED) + return false; + if ((old->mask == new->mask) && (old_fsn->inode == new_fsn->inode) && (old->name_len == new->name_len) && (!old->name_len || !strcmp(old->name, new->name))) @@ -114,7 +114,8 @@ int inotify_handle_event(struct fsnotify_group *group, } fsn_event = &event->fse; - fsnotify_init_event(fsn_event, inode, mask); + fsnotify_init_event(fsn_event, inode); + event->mask = mask; event->wd = i_mark->wd; event->sync_cookie = cookie; event->name_len = len; diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index 105576daca4a..2cec820de151 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c @@ -189,7 +189,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, */ pad_name_len = round_event_name_len(fsn_event); inotify_event.len = pad_name_len; - inotify_event.mask = inotify_mask_to_arg(fsn_event->mask); + inotify_event.mask = inotify_mask_to_arg(event->mask); inotify_event.wd = event->wd; inotify_event.cookie = event->sync_cookie; @@ -634,7 +634,8 @@ static struct fsnotify_group *inotify_new_group(unsigned int max_events) return ERR_PTR(-ENOMEM); } group->overflow_event = &oevent->fse; - fsnotify_init_event(group->overflow_event, NULL, FS_Q_OVERFLOW); + fsnotify_init_event(group->overflow_event, NULL); + oevent->mask = FS_Q_OVERFLOW; oevent->wd = -1; oevent->sync_cookie = 0; oevent->name_len = 0; diff --git a/fs/notify/notification.c b/fs/notify/notification.c index 3c3e36745f59..027d5d5bb90e 100644 --- a/fs/notify/notification.c +++ b/fs/notify/notification.c @@ -71,7 +71,7 @@ void fsnotify_destroy_event(struct fsnotify_group *group, struct fsnotify_event *event) { /* Overflow events are per-group and we don't want to free them */ - if (!event || event->mask == FS_Q_OVERFLOW) + if (!event || event == group->overflow_event) return; /* * If the event is still queued, we have a problem... Do an unreliable @@ -194,23 +194,3 @@ void fsnotify_flush_notify(struct fsnotify_group *group) } spin_unlock(&group->notification_lock); } - -/* - * fsnotify_create_event - Allocate a new event which will be sent to each - * group's handle_event function if the group was interested in this - * particular event. - * - * @inode the inode which is supposed to receive the event (sometimes a - * parent of the inode to which the event happened. - * @mask what actually happened. - * @data pointer to the object which was actually affected - * @data_type flag indication if the data is a file, path, inode, nothing... - * @name the filename, if available - */ -void fsnotify_init_event(struct fsnotify_event *event, struct inode *inode, - u32 mask) -{ - INIT_LIST_HEAD(&event->list); - event->inode = inode; - event->mask = mask; -} diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 7f195d43efaf..1e4b88bd1443 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h @@ -135,7 +135,6 @@ struct fsnotify_event { struct list_head list; /* inode may ONLY be dereferenced during handle_event(). */ struct inode *inode; /* either the inode the event happened to or its parent */ - u32 mask; /* the type of access, bitwise OR for FS_* event types */ }; /* @@ -485,9 +484,12 @@ extern void fsnotify_put_mark(struct fsnotify_mark *mark); extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info); extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info); -/* put here because inotify does some weird stuff when destroying watches */ -extern void fsnotify_init_event(struct fsnotify_event *event, - struct inode *to_tell, u32 mask); +static inline void fsnotify_init_event(struct fsnotify_event *event, + struct inode *inode) +{ + INIT_LIST_HEAD(&event->list); + event->inode = inode; +} #else From patchwork Thu Jan 10 17:04:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756271 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8566713B4 for ; Thu, 10 Jan 2019 17:05:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 709C029B55 for ; Thu, 10 Jan 2019 17:05:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 63AB429D01; Thu, 10 Jan 2019 17:05:03 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 BAAC529B55 for ; Thu, 10 Jan 2019 17:05:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729037AbfAJRFC (ORCPT ); Thu, 10 Jan 2019 12:05:02 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:39578 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729020AbfAJRFB (ORCPT ); Thu, 10 Jan 2019 12:05:01 -0500 Received: by mail-wm1-f67.google.com with SMTP id y8so2171680wmi.4 for ; Thu, 10 Jan 2019 09:04:59 -0800 (PST) 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=iwr+nzwe3sXTK2vwItjaVygSVabPnUoX0Wyj03lPMn0=; b=m3mo7KQp0TJf/FyRijndICWEYUx9xxQT5acim9HE4ultt3qW7/PUV6fZg94IcfKrlL QhyBRi+CHi4hY89K75/2cMobx+hmQD3htMtMW5hww4Fcu7I7c2X+0+m5KNvCRqU657tQ 68iHR3LcFcUGQbg5zL+txyqhXPBmwu2uA3cEoyiDK0Cog733iOtR/DlN9Q5LiRzdFe6X 5abk4PKc3ty/tbQC1XC96ut+OwP16zYYEI0suLxrm2jKphy6UvJufY+umppPmFRXJhEe V80osg0pBiWgsNMdy394UqfT2W+HAhpheWFsLJfzej5PcjfOcShszhPEdq6rjrWg+t9w zDQw== 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=iwr+nzwe3sXTK2vwItjaVygSVabPnUoX0Wyj03lPMn0=; b=bKYK/0qxoNbVAX+8ErcjCVu6SwxBn4jBcsGGfwwAfp1a8GMBwsyiavXmLVdZenO40Z Cg/QBEtrovy0NAEoI6/OolkLuUekV7WBvWCgv1sJmxYTkN1uScgZEN90I/njELr94QYo AbWAXsxvS3oj86+siYhhWL4ZHyvd2896z7waJCU0lWSwA6MLCtrYc9kYu4LzL6Zjsqky EVmVLR0L6WZiym2NHKfCIgDPBloc7/CBPdXYK86TpXhTGHUFLRB8Q2WCnPryuwApb72c M2sCp0vBIXKjJV1auqZtrC6B1jvPTYAGQykGTGiYDiISOFDyb/V79k67GmukQ36epggt BopQ== X-Gm-Message-State: AJcUukeoPo+vTC+2gSND5HqszZQWKAB76SZeZgYN21z4rg46Rc2csi6D YebOVCRUZN2z8zWvJeWsaTU= X-Google-Smtp-Source: ALg8bN7BQVX90aedMppQ1W/nyig/MDo0Ua6484w1FSE4lZXJy2COQfNp1p5udtcxFNY9nr6eNmvrfQ== X-Received: by 2002:a1c:e345:: with SMTP id a66mr10420364wmh.12.1547139898541; Thu, 10 Jan 2019 09:04:58 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.04.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:04:57 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 05/17] fanotify: rename struct fanotify_{,perm_}event_info Date: Thu, 10 Jan 2019 19:04:32 +0200 Message-Id: <20190110170444.30616-6-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 struct fanotify_event_info "inherits" from struct fsnotify_event and therefore a more appropriate (and short) name for it is fanotify_event. Same for struct fanotify_perm_event_info, which now "inherits" from struct fanotify_event. We plan to reuse the name struct fanotify_event_info for user visible event info record format. Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 16 ++++++++-------- fs/notify/fanotify/fanotify.h | 16 ++++++++-------- fs/notify/fanotify/fanotify_user.c | 20 ++++++++++---------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index 98197802bbfb..d8e3b6e50844 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -19,7 +19,7 @@ static bool should_merge(struct fsnotify_event *old_fsn, struct fsnotify_event *new_fsn) { - struct fanotify_event_info *old, *new; + struct fanotify_event *old, *new; pr_debug("%s: old=%p new=%p\n", __func__, old_fsn, new_fsn); old = FANOTIFY_E(old_fsn); @@ -36,7 +36,7 @@ static bool should_merge(struct fsnotify_event *old_fsn, static int fanotify_merge(struct list_head *list, struct fsnotify_event *event) { struct fsnotify_event *test_event; - struct fanotify_event_info *new; + struct fanotify_event *new; pr_debug("%s: list=%p event=%p\n", __func__, list, event); new = FANOTIFY_E(event); @@ -60,7 +60,7 @@ static int fanotify_merge(struct list_head *list, struct fsnotify_event *event) } static int fanotify_get_response(struct fsnotify_group *group, - struct fanotify_perm_event_info *event, + struct fanotify_perm_event *event, struct fsnotify_iter_info *iter_info) { int ret; @@ -143,11 +143,11 @@ static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, ~marks_ignored_mask; } -struct fanotify_event_info *fanotify_alloc_event(struct fsnotify_group *group, +struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, struct inode *inode, u32 mask, const struct path *path) { - struct fanotify_event_info *event = NULL; + struct fanotify_event *event = NULL; gfp_t gfp = GFP_KERNEL_ACCOUNT; /* @@ -162,7 +162,7 @@ struct fanotify_event_info *fanotify_alloc_event(struct fsnotify_group *group, memalloc_use_memcg(group->memcg); if (fanotify_is_perm_event(mask)) { - struct fanotify_perm_event_info *pevent; + struct fanotify_perm_event *pevent; pevent = kmem_cache_alloc(fanotify_perm_event_cachep, gfp); if (!pevent) @@ -200,7 +200,7 @@ static int fanotify_handle_event(struct fsnotify_group *group, struct fsnotify_iter_info *iter_info) { int ret = 0; - struct fanotify_event_info *event; + struct fanotify_event *event; struct fsnotify_event *fsn_event; BUILD_BUG_ON(FAN_ACCESS != FS_ACCESS); @@ -278,7 +278,7 @@ static void fanotify_free_group_priv(struct fsnotify_group *group) static void fanotify_free_event(struct fsnotify_event *fsn_event) { - struct fanotify_event_info *event; + struct fanotify_event *event; event = FANOTIFY_E(fsn_event); path_put(&event->path); diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h index e630d787d4c3..898b5b2bc1c7 100644 --- a/fs/notify/fanotify/fanotify.h +++ b/fs/notify/fanotify/fanotify.h @@ -12,7 +12,7 @@ extern struct kmem_cache *fanotify_perm_event_cachep; * fanotify_handle_event() and freed when the information is retrieved by * userspace */ -struct fanotify_event_info { +struct fanotify_event { struct fsnotify_event fse; u32 mask; /* @@ -30,16 +30,16 @@ struct fanotify_event_info { * group->notification_list to group->fanotify_data.access_list to wait for * user response. */ -struct fanotify_perm_event_info { - struct fanotify_event_info fae; +struct fanotify_perm_event { + struct fanotify_event fae; int response; /* userspace answer to question */ int fd; /* fd we passed to userspace for this event */ }; -static inline struct fanotify_perm_event_info * +static inline struct fanotify_perm_event * FANOTIFY_PE(struct fsnotify_event *fse) { - return container_of(fse, struct fanotify_perm_event_info, fae.fse); + return container_of(fse, struct fanotify_perm_event, fae.fse); } static inline bool fanotify_is_perm_event(u32 mask) @@ -48,11 +48,11 @@ static inline bool fanotify_is_perm_event(u32 mask) mask & FANOTIFY_PERM_EVENTS; } -static inline struct fanotify_event_info *FANOTIFY_E(struct fsnotify_event *fse) +static inline struct fanotify_event *FANOTIFY_E(struct fsnotify_event *fse) { - return container_of(fse, struct fanotify_event_info, fse); + return container_of(fse, struct fanotify_event, fse); } -struct fanotify_event_info *fanotify_alloc_event(struct fsnotify_group *group, +struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, struct inode *inode, u32 mask, const struct path *path); diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index dea47d07cc29..55cd87b0cc26 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -73,7 +73,7 @@ static struct fsnotify_event *get_one_event(struct fsnotify_group *group, } static int create_fd(struct fsnotify_group *group, - struct fanotify_event_info *event, + struct fanotify_event *event, struct file **file) { int client_fd; @@ -120,13 +120,13 @@ static int fill_event_metadata(struct fsnotify_group *group, struct file **file) { int ret = 0; - struct fanotify_event_info *event; + struct fanotify_event *event; pr_debug("%s: group=%p metadata=%p event=%p\n", __func__, group, metadata, fsn_event); *file = NULL; - event = container_of(fsn_event, struct fanotify_event_info, fse); + event = container_of(fsn_event, struct fanotify_event, fse); metadata->event_len = FAN_EVENT_METADATA_LEN; metadata->metadata_len = FAN_EVENT_METADATA_LEN; metadata->vers = FANOTIFY_METADATA_VERSION; @@ -144,10 +144,10 @@ static int fill_event_metadata(struct fsnotify_group *group, return ret; } -static struct fanotify_perm_event_info *dequeue_event( +static struct fanotify_perm_event *dequeue_event( struct fsnotify_group *group, int fd) { - struct fanotify_perm_event_info *event, *return_e = NULL; + struct fanotify_perm_event *event, *return_e = NULL; spin_lock(&group->notification_lock); list_for_each_entry(event, &group->fanotify_data.access_list, @@ -169,7 +169,7 @@ static struct fanotify_perm_event_info *dequeue_event( static int process_access_response(struct fsnotify_group *group, struct fanotify_response *response_struct) { - struct fanotify_perm_event_info *event; + struct fanotify_perm_event *event; int fd = response_struct->fd; int response = response_struct->response; @@ -370,7 +370,7 @@ static ssize_t fanotify_write(struct file *file, const char __user *buf, size_t static int fanotify_release(struct inode *ignored, struct file *file) { struct fsnotify_group *group = file->private_data; - struct fanotify_perm_event_info *event, *next; + struct fanotify_perm_event *event, *next; struct fsnotify_event *fsn_event; /* @@ -688,7 +688,7 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) struct fsnotify_group *group; int f_flags, fd; struct user_struct *user; - struct fanotify_event_info *oevent; + struct fanotify_event *oevent; pr_debug("%s: flags=%x event_f_flags=%x\n", __func__, flags, event_f_flags); @@ -955,10 +955,10 @@ static int __init fanotify_user_setup(void) fanotify_mark_cache = KMEM_CACHE(fsnotify_mark, SLAB_PANIC|SLAB_ACCOUNT); - fanotify_event_cachep = KMEM_CACHE(fanotify_event_info, SLAB_PANIC); + fanotify_event_cachep = KMEM_CACHE(fanotify_event, SLAB_PANIC); if (IS_ENABLED(CONFIG_FANOTIFY_ACCESS_PERMISSIONS)) { fanotify_perm_event_cachep = - KMEM_CACHE(fanotify_perm_event_info, SLAB_PANIC); + KMEM_CACHE(fanotify_perm_event, SLAB_PANIC); } return 0; From patchwork Thu Jan 10 17:04:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756273 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3B170159A for ; Thu, 10 Jan 2019 17:05:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 282AC29B55 for ; Thu, 10 Jan 2019 17:05:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1C2AB29D01; Thu, 10 Jan 2019 17:05:04 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 ACD9B29B55 for ; Thu, 10 Jan 2019 17:05:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729058AbfAJRFD (ORCPT ); Thu, 10 Jan 2019 12:05:03 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:34943 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729014AbfAJRFC (ORCPT ); Thu, 10 Jan 2019 12:05:02 -0500 Received: by mail-wm1-f66.google.com with SMTP id t200so12889890wmt.0 for ; Thu, 10 Jan 2019 09:05:00 -0800 (PST) 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=7lZDukbCM8gF1GEOUQguVFTtFSDjATbQz/IvDNxJJJ0=; b=IFGiU52xyc23glskrhoWFOMWjUHsxjm4BAvkwF+5xu4XJHd/1woR5bxwkg/qN9qyTy wpqAIzzR4Aif0t7qjjUMdyGpxogvyid/xOWcL+qDSAHfgRcbXt0wMYE888CQihalo/9k nXZA5GraP/XcYSRMHJfdjkEMuaQGu2Yal6EuI2NBrMxfEz9Z4xHtMChAkFvmBRgLdqQq 5Dnlz8/aRfu2zMCPYguimtUtMkC6ANUMNUdkJog4aqH3NI3RanbJ2wEaGgwMeaEj5yfi duq4KRtmtsHC4dOkOBJiPf0T57Z4X26J1yZ6VhE2TqK2frrFBb8AE/ioyMvVjYno0pPI vIYA== 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=7lZDukbCM8gF1GEOUQguVFTtFSDjATbQz/IvDNxJJJ0=; b=LyOPxALL2vQ9HJNS+aRzLkayT7fezN5rfz/YKNDxosEoSO+d8aUVPmvkukEDiNfocD O1OzrtKatamD+f8F+OdqaSTrWRSe2uu+Dl7gyTwBzFuM84xtq9ulviWKDOucja7bk89a TYvOY85I+hk3eS0FpRL5wGkIjb7JGDr4aUJDwwfkItkfUeQGkTCOrKXwWprnxPOYkYWy 9GSa22ptckBGp99qmNkp9Rqdj/6GURGu4xl3CMWx4LDnPh2mzvapXZTGh/UiI/GNYXaJ soQJYrGSAUPnXMr9CFmR7YCJBf6rbDbN91RGzsQhCQt7OKhcArMCwVeg8NiqCAgOR/yA pjCw== X-Gm-Message-State: AJcUukcraPprTwpkh1NV1sPQAM1fme20vR5mpszrD1TXVlH9m/owJv5N eZkQOMfjrMofEIoLB4XiNEc= X-Google-Smtp-Source: ALg8bN5tNCFGg+9mURbiPKbQFjxq6KZlZGU7QG9AgJg2SPsj4AGQafiBdamTzVrPYki3s5ppm1ksRg== X-Received: by 2002:a1c:4346:: with SMTP id q67mr11112023wma.114.1547139899725; Thu, 10 Jan 2019 09:04:59 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.04.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:04:59 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 06/17] fanotify: open code fill_event_metadata() Date: Thu, 10 Jan 2019 19:04:33 +0200 Message-Id: <20190110170444.30616-7-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 The helper is quite trivial and open coding it will make it easier to implement copying event fid info to user. Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify_user.c | 69 +++++++++++------------------- 1 file changed, 26 insertions(+), 43 deletions(-) diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 55cd87b0cc26..2f4901ac090c 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -114,36 +114,6 @@ static int create_fd(struct fsnotify_group *group, return client_fd; } -static int fill_event_metadata(struct fsnotify_group *group, - struct fanotify_event_metadata *metadata, - struct fsnotify_event *fsn_event, - struct file **file) -{ - int ret = 0; - struct fanotify_event *event; - - pr_debug("%s: group=%p metadata=%p event=%p\n", __func__, - group, metadata, fsn_event); - - *file = NULL; - event = container_of(fsn_event, struct fanotify_event, fse); - metadata->event_len = FAN_EVENT_METADATA_LEN; - metadata->metadata_len = FAN_EVENT_METADATA_LEN; - metadata->vers = FANOTIFY_METADATA_VERSION; - metadata->reserved = 0; - metadata->mask = event->mask & FANOTIFY_OUTGOING_EVENTS; - metadata->pid = pid_vnr(event->pid); - if (unlikely(event->mask & FAN_Q_OVERFLOW)) - metadata->fd = FAN_NOFD; - else { - metadata->fd = create_fd(group, event, file); - if (metadata->fd < 0) - ret = metadata->fd; - } - - return ret; -} - static struct fanotify_perm_event *dequeue_event( struct fsnotify_group *group, int fd) { @@ -205,37 +175,50 @@ static int process_access_response(struct fsnotify_group *group, } static ssize_t copy_event_to_user(struct fsnotify_group *group, - struct fsnotify_event *event, + struct fsnotify_event *fsn_event, char __user *buf, size_t count) { - struct fanotify_event_metadata fanotify_event_metadata; + struct fanotify_event_metadata metadata; + struct fanotify_event *event; struct file *f; int fd, ret; - pr_debug("%s: group=%p event=%p\n", __func__, group, event); + pr_debug("%s: group=%p event=%p\n", __func__, group, fsn_event); - ret = fill_event_metadata(group, &fanotify_event_metadata, event, &f); - if (ret < 0) - return ret; + event = container_of(fsn_event, struct fanotify_event, fse); + metadata.event_len = FAN_EVENT_METADATA_LEN; + metadata.metadata_len = FAN_EVENT_METADATA_LEN; + metadata.vers = FANOTIFY_METADATA_VERSION; + metadata.reserved = 0; + metadata.mask = event->mask & FANOTIFY_OUTGOING_EVENTS; + metadata.pid = pid_vnr(event->pid); + + if (unlikely(event->mask & FAN_Q_OVERFLOW)) { + fd = FAN_NOFD; + } else { + fd = create_fd(group, event, &f); + if (fd < 0) + return fd; + } + metadata.fd = fd; - fd = fanotify_event_metadata.fd; ret = -EFAULT; /* * Sanity check copy size in case get_one_event() and * fill_event_metadata() event_len sizes ever get out of sync. */ - if (WARN_ON_ONCE(fanotify_event_metadata.event_len > count)) + if (WARN_ON_ONCE(metadata.event_len > count)) goto out_close_fd; - if (copy_to_user(buf, &fanotify_event_metadata, - fanotify_event_metadata.event_len)) + + if (copy_to_user(buf, &metadata, metadata.event_len)) goto out_close_fd; - if (fanotify_is_perm_event(FANOTIFY_E(event)->mask)) - FANOTIFY_PE(event)->fd = fd; + if (fanotify_is_perm_event(event->mask)) + FANOTIFY_PE(fsn_event)->fd = fd; if (fd != FAN_NOFD) fd_install(fd, f); - return fanotify_event_metadata.event_len; + return metadata.event_len; out_close_fd: if (fd != FAN_NOFD) { From patchwork Thu Jan 10 17:04:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756275 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2FDA413B4 for ; Thu, 10 Jan 2019 17:05:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B5C729B68 for ; Thu, 10 Jan 2019 17:05:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0FB0E29D24; Thu, 10 Jan 2019 17:05:06 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 4F66529B68 for ; Thu, 10 Jan 2019 17:05:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729149AbfAJRFE (ORCPT ); Thu, 10 Jan 2019 12:05:04 -0500 Received: from mail-wr1-f65.google.com ([209.85.221.65]:45719 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728959AbfAJRFE (ORCPT ); Thu, 10 Jan 2019 12:05:04 -0500 Received: by mail-wr1-f65.google.com with SMTP id t6so12176453wrr.12 for ; Thu, 10 Jan 2019 09:05:01 -0800 (PST) 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=41DgcMKK3EPUqCvO/Uvm5LS1fGai8LcgaD9746/8r60=; b=pi5WuoFdeehqYb4UWnXR3qRjPryZEGLnstJk2KfIKy6glTpmY4dHQJuNiH6NOfrOFn 3v16ButrxXilpACu81AcqfV1pdZzUp9dHhKdlYvabvD2j9XqIzWoGRc2SWoLULNC11Cs Oo2piVujKapkB8kFtYChhIj/pZV5Cwb15kXTaguESCr5HQ4JKffSOCBnPndNM0MaN7gd eSAqdHHfe/eaPRSFfLK0vtMXgxh23jWOKmxNe6DsQ+CVJCIARz9F+EtyKhuKUkphY73W +C+4mr6IeqPAGelq2Tli24wdAWTxst6wi1xX1+CJk1M7S90up2nI24nmgAEAShTg6PWS ot5Q== 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=41DgcMKK3EPUqCvO/Uvm5LS1fGai8LcgaD9746/8r60=; b=Ml6jxkqcl9VJXvHgXheDQrEhh9+Qyb0AgWKIYxWAmYIdpKb/Z6NYrcIXyIbXYd8jB9 yZNkMC3uPf0uHjwh1Wn8QRy+REHuSgvHoEU/+0MVmymhp4+D1ISqhsQIejcLXtP0wERB abgVGuvPv1rhkk4J6zYuN5B9e/qrxbGGC0OcFNPMlK+nd7fv2MGHyCE62kNzuSEC/1D3 Jm1od3CTsbFllnNr2pISgOjLPe6zUpyEVzVkO2RhUE685W3Sxw8LigHbYrQ5/7zfYrPa fFg0wJAjlQ75n8401AH034EpZv6NL6+sX9ZNInhcEZtBvlcJkXeY7f1a3EJh8MhmeRUx QrPA== X-Gm-Message-State: AJcUuke95FF4W5zx3EjHRSvQBRhyZbukrFta7D0akUiPGI/UnZEPzfVF m/AUC+2/FeTQs6pvgv3Q4KV9/CGT X-Google-Smtp-Source: ALg8bN4/CJ2y6FkONLxbnND1w3wK/LjNdVcaNkmnmaDxrxa9wKVeeYeTgbYl7ovl4bflr9/uKiaX2w== X-Received: by 2002:adf:e6ce:: with SMTP id y14mr10477360wrm.239.1547139901040; Thu, 10 Jan 2019 09:05:01 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.04.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:00 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 07/17] fanotify: encode file identifier for FAN_REPORT_FID Date: Thu, 10 Jan 2019 19:04:34 +0200 Message-Id: <20190110170444.30616-8-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 user requests the flag FAN_REPORT_FID in fanotify_init(), a unique file identifier of the event target object will be reported with the event. The file identifier includes the filesystem's fsid (i.e. from statfs(2)) and an NFS file handle of the file (i.e. from name_to_handle_at(2)). The file identifier makes holding the path reference and passing a file descriptor to user redundant, so those are disabled in a group with FAN_REPORT_FID. Encode fid and store it in event for a group with FAN_REPORT_FID. Up to 12 bytes of file handle on 32bit arch (16 bytes on 64bit arch) are stored inline in fanotify_event struct. Larger file handles are stored in an external allocated buffer. On failure to encode fid, we print a warning and queue the event without the fid information. Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 81 +++++++++++++++++++++++++++--- fs/notify/fanotify/fanotify.h | 78 ++++++++++++++++++++++++++-- fs/notify/fanotify/fanotify_user.c | 6 +-- include/uapi/linux/fanotify.h | 1 + 4 files changed, 153 insertions(+), 13 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index d8e3b6e50844..e431f63c9f58 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "fanotify.h" @@ -25,10 +26,18 @@ static bool should_merge(struct fsnotify_event *old_fsn, old = FANOTIFY_E(old_fsn); new = FANOTIFY_E(new_fsn); - if (old_fsn->inode == new_fsn->inode && old->pid == new->pid && - old->path.mnt == new->path.mnt && - old->path.dentry == new->path.dentry) - return true; + if (old_fsn->inode != new_fsn->inode || old->pid != new->pid || + old->fh_type != new->fh_type || old->fh_len != new->fh_len) + return false; + + if (fanotify_event_has_path(old)) { + return old->path.mnt == new->path.mnt && + old->path.dentry == new->path.dentry; + } else if (fanotify_event_has_fid(old)) { + return fanotify_fid_equal(&old->fid, &new->fid, old->fh_len); + } + + /* Do not merge events if we failed to encode fid */ return false; } @@ -143,6 +152,57 @@ static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, ~marks_ignored_mask; } +static int fanotify_encode_fid(struct fanotify_event *event, + const struct path *path, gfp_t gfp) +{ + struct fanotify_fid *fid = &event->fid; + int dwords, bytes = 0; + struct kstatfs stat; + int err, type; + + stat.f_fsid.val[0] = stat.f_fsid.val[1] = 0; + fid->ext_fh = NULL; + dwords = 0; + err = -ENOENT; + type = exportfs_encode_fh(path->dentry, NULL, &dwords, 0); + if (!dwords) + goto out_err; + + err = vfs_statfs(path, &stat); + if (err) + goto out_err; + + bytes = dwords << 2; + if (bytes > FANOTIFY_INLINE_FH_LEN) { + /* Treat failure to allocate fh as failure to allocate event */ + err = -ENOMEM; + fid->ext_fh = kmalloc(bytes, gfp); + if (!fid->ext_fh) + goto out_err; + } + + type = exportfs_encode_fh(path->dentry, fanotify_fid_fh(fid, bytes), + &dwords, 0); + err = -EINVAL; + if (!type || type == FILEID_INVALID || bytes != dwords << 2) + goto out_err; + + fid->fsid = stat.f_fsid; + event->fh_len = bytes; + + return type; + +out_err: + pr_warn_ratelimited("fanotify: failed to encode fid (fsid=%x.%x, type=%d, bytes=%d, err=%i)\n", + stat.f_fsid.val[0], stat.f_fsid.val[1], + type, bytes, err); + kfree(fid->ext_fh); + fid->ext_fh = NULL; + event->fh_len = 0; + + return FILEID_INVALID; +} + struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, struct inode *inode, u32 mask, const struct path *path) @@ -181,10 +241,16 @@ init: __maybe_unused event->pid = get_pid(task_pid(current)); else event->pid = get_pid(task_tgid(current)); - if (path) { + event->fh_len = 0; + if (path && FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { + /* Report the event without a file identifier on encode error */ + event->fh_type = fanotify_encode_fid(event, path, gfp); + } else if (path) { + event->fh_type = FILEID_ROOT; event->path = *path; path_get(&event->path); } else { + event->fh_type = FILEID_INVALID; event->path.mnt = NULL; event->path.dentry = NULL; } @@ -281,7 +347,10 @@ static void fanotify_free_event(struct fsnotify_event *fsn_event) struct fanotify_event *event; event = FANOTIFY_E(fsn_event); - path_put(&event->path); + if (fanotify_event_has_path(event)) + path_put(&event->path); + else if (fanotify_event_has_ext_fh(event)) + kfree(event->fid.ext_fh); put_pid(event->pid); if (fanotify_is_perm_event(event->mask)) { kmem_cache_free(fanotify_perm_event_cachep, diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h index 898b5b2bc1c7..271482fb9611 100644 --- a/fs/notify/fanotify/fanotify.h +++ b/fs/notify/fanotify/fanotify.h @@ -2,11 +2,49 @@ #include #include #include +#include extern struct kmem_cache *fanotify_mark_cache; extern struct kmem_cache *fanotify_event_cachep; extern struct kmem_cache *fanotify_perm_event_cachep; +/* + * 3 dwords are sufficient for most local fs (64bit ino, 32bit generation). + * For 32bit arch, fid increases the size of fanotify_event by 12 bytes and + * fh_* fields increase the size of fanotify_event by another 4 bytes. + * For 64bit arch, fid increases the size of fanotify_fid by 8 bytes and + * fh_* fields are packed in a hole after mask. + */ +#if BITS_PER_LONG == 32 +#define FANOTIFY_INLINE_FH_LEN (3 << 2) +#else +#define FANOTIFY_INLINE_FH_LEN (4 << 2) +#endif + +struct fanotify_fid { + __kernel_fsid_t fsid; + union { + unsigned char fh[FANOTIFY_INLINE_FH_LEN]; + unsigned char *ext_fh; + }; +}; + +static inline void *fanotify_fid_fh(struct fanotify_fid *fid, + unsigned int fh_len) +{ + return fh_len <= FANOTIFY_INLINE_FH_LEN ? fid->fh : fid->ext_fh; +} + +static inline bool fanotify_fid_equal(struct fanotify_fid *fid1, + struct fanotify_fid *fid2, + unsigned int fh_len) +{ + return fid1->fsid.val[0] == fid2->fsid.val[0] && + fid1->fsid.val[1] == fid2->fsid.val[1] && + !memcmp(fanotify_fid_fh(fid1, fh_len), + fanotify_fid_fh(fid2, fh_len), fh_len); +} + /* * Structure for normal fanotify events. It gets allocated in * fanotify_handle_event() and freed when the information is retrieved by @@ -16,13 +54,47 @@ struct fanotify_event { struct fsnotify_event fse; u32 mask; /* - * We hold ref to this path so it may be dereferenced at any point - * during this object's lifetime + * Those fields are outside fanotify_fid to pack fanotify_event nicely + * on 64bit arch and to use fh_type as an indication of whether path + * or fid are used in the union: + * FILEID_ROOT (0) for path, > 0 for fid, FILEID_INVALID for neither. */ - struct path path; + u8 fh_type; + u8 fh_len; + u16 pad; + union { + /* + * We hold ref to this path so it may be dereferenced at any + * point during this object's lifetime + */ + struct path path; + /* + * With FAN_REPORT_FID, we do not hold any reference on the + * victim object. Instead we store its NFS file handle and its + * filesystem's fsid as a unique identifier. + */ + struct fanotify_fid fid; + }; struct pid *pid; }; +static inline bool fanotify_event_has_path(struct fanotify_event *event) +{ + return event->fh_type == FILEID_ROOT; +} + +static inline bool fanotify_event_has_fid(struct fanotify_event *event) +{ + return event->fh_type != FILEID_ROOT && + event->fh_type != FILEID_INVALID; +} + +static inline bool fanotify_event_has_ext_fh(struct fanotify_event *event) +{ + return fanotify_event_has_fid(event) && + event->fh_len > FANOTIFY_INLINE_FH_LEN; +} + /* * Structure for permission fanotify events. It gets allocated and freed in * fanotify_handle_event() since we wait there for user response. When the diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 2f4901ac090c..68a1cb18ddd8 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -181,7 +181,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, struct fanotify_event_metadata metadata; struct fanotify_event *event; struct file *f; - int fd, ret; + int ret, fd = FAN_NOFD; pr_debug("%s: group=%p event=%p\n", __func__, group, fsn_event); @@ -193,9 +193,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, metadata.mask = event->mask & FANOTIFY_OUTGOING_EVENTS; metadata.pid = pid_vnr(event->pid); - if (unlikely(event->mask & FAN_Q_OVERFLOW)) { - fd = FAN_NOFD; - } else { + if (fanotify_event_has_path(event)) { fd = create_fd(group, event, &f); if (fd < 0) return fd; diff --git a/include/uapi/linux/fanotify.h b/include/uapi/linux/fanotify.h index 909c98fcace2..d07f3cbc2786 100644 --- a/include/uapi/linux/fanotify.h +++ b/include/uapi/linux/fanotify.h @@ -44,6 +44,7 @@ /* Flags to determine fanotify event format */ #define FAN_REPORT_TID 0x00000100 /* event->pid is thread id */ +#define FAN_REPORT_FID 0x00000200 /* Report unique file id */ /* Deprecated - do not use this in programs and do not add new flags here! */ #define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK | \ From patchwork Thu Jan 10 17:04:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756277 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 986E913B4 for ; Thu, 10 Jan 2019 17:05:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8494129B55 for ; Thu, 10 Jan 2019 17:05:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7629629AC2; Thu, 10 Jan 2019 17:05:08 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 D014929AC2 for ; Thu, 10 Jan 2019 17:05:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729161AbfAJRFG (ORCPT ); Thu, 10 Jan 2019 12:05:06 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:40874 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729014AbfAJRFF (ORCPT ); Thu, 10 Jan 2019 12:05:05 -0500 Received: by mail-wr1-f68.google.com with SMTP id p4so12227802wrt.7; Thu, 10 Jan 2019 09:05:03 -0800 (PST) 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=TbsKielCxTPPC/9Y965tIpBTh5Y7ixaS+LQJvKrfj5Y=; b=hyUveTaOqNf3saJhlznfDFSXmB95Tj5ZOSmJdUaHP6e3vjiNYCXoA4FB3p9N578Oqi FezAibI5gRuZergUgDF2wcuv5GmUUriJG7yJruzAuGl85zF/M1oHQ9xLrcJRpySGPj3V UxkMVNq29dNCzVZH29xnPFWgKBIBUEzQyQgkncLad/BHNJTuVwvQqqOdBY4jBtOqY7OG ZwkyxMZD5mnc+msGp/LT5vXdGuy/efcDmWyMFHLPHlWhmIIGjsQgU8xr5MBswlXJFePn msXW4+2QCH5x+CQwM9+dUqhNA+NPqoBtIlQjXj+JGdAU7UcUbucUmixAQ6AzHeaWMYPL g6Yw== 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=TbsKielCxTPPC/9Y965tIpBTh5Y7ixaS+LQJvKrfj5Y=; b=LWQ5lm/f3PjwG3rdQSUHcS21h4T0M9bPtDFflNYzF+CbZmIEwFkNywRDjy6/mOw/eI VH8QsRdVWRIJktZCDPJ+KgMxMjGOVPL2DNMmXxGt8vIlLdDuejOb9MJCXwbxWnEHsQ9x cKYnd9SbumUWXOg6oLTG+tMaeX+T7TPBttjTW0IdQ3twwFDZv6aF9/B5yaIKl4DnLGGS 1ehRwyrEgbHPe2VzgN47jJy6hZgLLDgBeF97R+amI9W4iuiTL9ijjjTLxW71J+PMhA0K INEpy0BgNQveiaeAtIHA7nPC4T5BAYjB9rar7vY/WDvnqabjjxE8HbmEcAtym1K5CwgD gqvA== X-Gm-Message-State: AJcUukeMEPmigOtRlcK+zVOkEi6bGexcmxsFgALHQi5Oy4HrG3z2SJgr zd+LLGKb/JrkrmBCHjd2LW+8aq95 X-Google-Smtp-Source: ALg8bN7jR8ibSpn+TvSAzRYK8X1W2UWEQc8OsKtlJPBXWTlo/DY5oextRSPjYBwzE/95A9YlgZPzGw== X-Received: by 2002:adf:9422:: with SMTP id 31mr10783464wrq.106.1547139902728; Thu, 10 Jan 2019 09:05:02 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:01 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v5 08/17] fanotify: copy event fid info to user Date: Thu, 10 Jan 2019 19:04:35 +0200 Message-Id: <20190110170444.30616-9-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 If group requested FAN_REPORT_FID and event has file identifier, copy that information to user reading the event after event metadata. fid information is formatted as struct fanotify_event_info_fid that includes a generic header struct fanotify_event_info_header, so that other info types could be defined in the future using the same header. metadata->event_len includes the length of the fid information. The fid information includes the filesystem's fsid (see statfs(2)) followed by an NFS file handle of the file that could be passed as an argument to open_by_handle_at(2). Cc: Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.h | 5 ++ fs/notify/fanotify/fanotify_user.c | 82 ++++++++++++++++++++++++++++-- include/uapi/linux/fanotify.h | 20 ++++++++ 3 files changed, 102 insertions(+), 5 deletions(-) diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h index 271482fb9611..4aafc7144c3d 100644 --- a/fs/notify/fanotify/fanotify.h +++ b/fs/notify/fanotify/fanotify.h @@ -95,6 +95,11 @@ static inline bool fanotify_event_has_ext_fh(struct fanotify_event *event) event->fh_len > FANOTIFY_INLINE_FH_LEN; } +static inline void *fanotify_event_fh(struct fanotify_event *event) +{ + return fanotify_fid_fh(&event->fid, event->fh_len); +} + /* * Structure for permission fanotify events. It gets allocated and freed in * fanotify_handle_event() since we wait there for user response. When the diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 68a1cb18ddd8..bd42e681a052 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -47,6 +47,18 @@ struct kmem_cache *fanotify_mark_cache __read_mostly; struct kmem_cache *fanotify_event_cachep __read_mostly; struct kmem_cache *fanotify_perm_event_cachep __read_mostly; +#define FANOTIFY_EVENT_ALIGN (sizeof(struct fanotify_event_info_header)) + +static int fanotify_event_info_len(struct fanotify_event *event) +{ + if (!fanotify_event_has_fid(event)) + return 0; + + return roundup(sizeof(struct fanotify_event_info_fid) + + sizeof(struct file_handle) + event->fh_len, + FANOTIFY_EVENT_ALIGN); +} + /* * Get an fsnotify notification event if one exists and is small * enough to fit in "count". Return an error pointer if the count @@ -57,6 +69,9 @@ struct kmem_cache *fanotify_perm_event_cachep __read_mostly; static struct fsnotify_event *get_one_event(struct fsnotify_group *group, size_t count) { + size_t event_size = FAN_EVENT_METADATA_LEN; + struct fanotify_event *event; + assert_spin_locked(&group->notification_lock); pr_debug("%s: group=%p count=%zd\n", __func__, group, count); @@ -64,11 +79,18 @@ static struct fsnotify_event *get_one_event(struct fsnotify_group *group, if (fsnotify_notify_queue_is_empty(group)) return NULL; - if (FAN_EVENT_METADATA_LEN > count) + if (FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { + event = FANOTIFY_E(fsnotify_peek_first_event(group)); + event_size += fanotify_event_info_len(event); + } + + if (event_size > count) return ERR_PTR(-EINVAL); - /* held the notification_lock the whole time, so this is the - * same event we peeked above */ + /* + * Held the notification_lock the whole time, so this is the + * same event we peeked above + */ return fsnotify_remove_first_event(group); } @@ -174,6 +196,48 @@ static int process_access_response(struct fsnotify_group *group, return 0; } +static int copy_fid_to_user(struct fanotify_event *event, char __user *buf) +{ + struct fanotify_event_info_fid info = { }; + struct file_handle handle = { }; + size_t fh_len = event->fh_len; + size_t len = fanotify_event_info_len(event); + + if (!len) + return 0; + + if (WARN_ON_ONCE(len < sizeof(info) + sizeof(handle) + fh_len)) + return -EFAULT; + + /* Copy event info fid header followed by vaiable sized file handle */ + info.hdr.info_type = FAN_EVENT_INFO_TYPE_FID; + info.hdr.len = len; + info.fsid = event->fid.fsid; + if (copy_to_user(buf, &info, sizeof(info))) + return -EFAULT; + + buf += sizeof(info); + len -= sizeof(info); + handle.handle_type = event->fh_type; + handle.handle_bytes = fh_len; + if (copy_to_user(buf, &handle, sizeof(handle))) + return -EFAULT; + + buf += sizeof(handle); + len -= sizeof(handle); + if (copy_to_user(buf, fanotify_event_fh(event), fh_len)) + return -EFAULT; + + /* Pad with 0's */ + buf += fh_len; + len -= fh_len; + WARN_ON_ONCE(len < 0 || len >= FANOTIFY_EVENT_ALIGN); + if (len > 0 && clear_user(buf, len)) + return -EFAULT; + + return 0; +} + static ssize_t copy_event_to_user(struct fsnotify_group *group, struct fsnotify_event *fsn_event, char __user *buf, size_t count) @@ -197,6 +261,8 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, fd = create_fd(group, event, &f); if (fd < 0) return fd; + } else if (fanotify_event_has_fid(event)) { + metadata.event_len += fanotify_event_info_len(event); } metadata.fd = fd; @@ -208,14 +274,20 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, if (WARN_ON_ONCE(metadata.event_len > count)) goto out_close_fd; - if (copy_to_user(buf, &metadata, metadata.event_len)) + if (copy_to_user(buf, &metadata, FAN_EVENT_METADATA_LEN)) goto out_close_fd; if (fanotify_is_perm_event(event->mask)) FANOTIFY_PE(fsn_event)->fd = fd; - if (fd != FAN_NOFD) + if (fanotify_event_has_path(event)) { fd_install(fd, f); + } else if (fanotify_event_has_fid(event)) { + ret = copy_fid_to_user(event, buf + FAN_EVENT_METADATA_LEN); + if (ret < 0) + return ret; + } + return metadata.event_len; out_close_fd: diff --git a/include/uapi/linux/fanotify.h b/include/uapi/linux/fanotify.h index d07f3cbc2786..959ae2bdc7ca 100644 --- a/include/uapi/linux/fanotify.h +++ b/include/uapi/linux/fanotify.h @@ -107,6 +107,26 @@ struct fanotify_event_metadata { __s32 pid; }; +#define FAN_EVENT_INFO_TYPE_FID 1 + +/* Variable length info record following event metadata */ +struct fanotify_event_info_header { + __u8 info_type; + __u8 pad; + __u16 len; +}; + +/* Unique file identifier info record */ +struct fanotify_event_info_fid { + struct fanotify_event_info_header hdr; + __kernel_fsid_t fsid; + /* + * Following is an opaque struct file_handle that can be passed as + * an argument to open_by_handle_at(2). + */ + unsigned char handle[0]; +}; + struct fanotify_response { __s32 fd; __u32 response; From patchwork Thu Jan 10 17:04:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756279 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7D1BA13B4 for ; Thu, 10 Jan 2019 17:05:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6976029AC2 for ; Thu, 10 Jan 2019 17:05:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5DE1F29B68; Thu, 10 Jan 2019 17:05:09 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 DD6B929AC2 for ; Thu, 10 Jan 2019 17:05:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729169AbfAJRFH (ORCPT ); Thu, 10 Jan 2019 12:05:07 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:54630 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728959AbfAJRFH (ORCPT ); Thu, 10 Jan 2019 12:05:07 -0500 Received: by mail-wm1-f65.google.com with SMTP id a62so11993875wmh.4; Thu, 10 Jan 2019 09:05:04 -0800 (PST) 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=4+WqDnnUGCh2XoATSBHBrwcD1kmWLsijyoT1kfDpuvA=; b=YaPacYrimV3VpNkbmvb6qiF+IIt2r4+OdORkrQcM4Eyc6lzHtFT+pwplCAaPmHX6wu XiwTthuf5hAncGY+WGcQ32KX6jJmaP+mjd2faMXXd93BY6Qdyb9ZjyvnKdWALHyUJ4bw J44GkLn9JdFg2LtMhJSf7OqrNS+GUImzg41Z+bTQKonycSxjSHLJTcHBZiivfGZ/qKcz O714fVL1xWE4b9hlPouRTPsE0smNsHQR/xla/nOECNYWsmrB+I4jpNa8Nw/xLgCbsCes aX1pfCInmO+0BTafLZMqOoZa3Ysi4i9Rr8C1/4m0bMlbYWo/MriD33xZbstMEF9a7VEs bP5A== 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=4+WqDnnUGCh2XoATSBHBrwcD1kmWLsijyoT1kfDpuvA=; b=RssKDBgv/sN861I/uGyr4Rc+7MMCqDlaRfWVCdR2N2CmxnzZrflSQkn697VOmxdIKt rqKKhVexQddw+2pzcSPtG1Zn6FFjdyk4I9rASYzgfcAsKu6eItUNC8DLezwzKnl9WBC0 gLdioAsekuUXFpDUPe/WJGaBPSl7IWTKlZH8P03wFOHjG7Jkz5QBXEE7vhN4fRaM/qWY xosT68H+OI/ZWCInd1Y/CxlPvrexooSI8/diXptuwiB5YgC3+7nPaxVu8fq6q3akRWhX JVH5suFaEQMuRWqKOYVRDNmNxMj8AED5/w0i9nTUsi+MJXBWRWPlM7DKFdpYZIUyW6d5 FP3Q== X-Gm-Message-State: AJcUukeSO5P+jbimdXDBoybynx4PhqpPCHUgrLHdFFYjsQADABy0yZew lfEXtSoBxbWnabVDhHLwMc4= X-Google-Smtp-Source: ALg8bN4xblcr9vCrwp8jrkcik9aw3WAHgMWwqpC/YiA48QnLkN9gDAgsg7tCn6QJAcVUx0VgqgOoqw== X-Received: by 2002:a1c:e488:: with SMTP id b130mr10852885wmh.124.1547139904064; Thu, 10 Jan 2019 09:05:04 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:03 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v5 09/17] fanotify: enable FAN_REPORT_FID init flag Date: Thu, 10 Jan 2019 19:04:36 +0200 Message-Id: <20190110170444.30616-10-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 setting up an fanotify listener, user may request to get fid information in event instead of an open file descriptor. The fid obtained with event on a watched object contains the file handle returned by name_to_handle_at(2) and fsid returned by statfs(2). Restrict FAN_REPORT_FID to class FAN_CLASS_NOTIF, because we have have no good reason to support reporting fid on permission events. When setting a mark, we need to make sure that the filesystem supports encoding file handles with name_to_handle_at(2) and that statfs(2) encodes a non-zero fsid. Cc: Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify_user.c | 61 +++++++++++++++++++++++++++++- include/linux/fanotify.h | 2 +- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index bd42e681a052..211ec6332d31 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include @@ -768,6 +770,10 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) return -EINVAL; } + if ((flags & FAN_REPORT_FID) && + (flags & FANOTIFY_CLASS_BITS) != FAN_CLASS_NOTIF) + return -EINVAL; + user = get_current_user(); if (atomic_read(&user->fanotify_listeners) > FANOTIFY_DEFAULT_MAX_LISTENERS) { free_uid(user); @@ -854,6 +860,52 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) return fd; } +/* Check if filesystem can encode a unique fid */ +static int fanotify_test_fid(struct path *path) +{ + struct kstatfs stat, root_stat; + struct path root = { + .mnt = path->mnt, + .dentry = path->dentry->d_sb->s_root, + }; + int err; + + /* + * Make sure path is not in filesystem with zero fsid (e.g. tmpfs). + */ + err = vfs_statfs(path, &stat); + if (err) + return err; + + if (!stat.f_fsid.val[0] && !stat.f_fsid.val[1]) + return -ENODEV; + + /* + * Make sure path is not inside a filesystem subvolume (e.g. btrfs) + * which uses a different fsid than sb root. + */ + err = vfs_statfs(&root, &root_stat); + if (err) + return err; + + if (root_stat.f_fsid.val[0] != stat.f_fsid.val[0] || + root_stat.f_fsid.val[1] != stat.f_fsid.val[1]) + return -EXDEV; + + /* + * We need to make sure that the file system supports at least + * encoding a file handle so user can use name_to_handle_at() to + * compare fid returned with event to the file handle of watched + * objects. However, name_to_handle_at() requires that the + * filesystem also supports decoding file handles. + */ + if (!path->dentry->d_sb->s_export_op || + !path->dentry->d_sb->s_export_op->fh_to_dentry) + return -EOPNOTSUPP; + + return 0; +} + static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, int dfd, const char __user *pathname) { @@ -939,6 +991,12 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, if (ret) goto fput_and_out; + if (FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { + ret = fanotify_test_fid(&path); + if (ret) + goto path_put_and_out; + } + /* inode held in place by reference to path; group by fget on fd */ if (mark_type == FAN_MARK_INODE) inode = path.dentry->d_inode; @@ -967,6 +1025,7 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, ret = -EINVAL; } +path_put_and_out: path_put(&path); fput_and_out: fdput(f); @@ -1003,7 +1062,7 @@ COMPAT_SYSCALL_DEFINE6(fanotify_mark, */ static int __init fanotify_user_setup(void) { - BUILD_BUG_ON(HWEIGHT32(FANOTIFY_INIT_FLAGS) != 7); + BUILD_BUG_ON(HWEIGHT32(FANOTIFY_INIT_FLAGS) != 8); BUILD_BUG_ON(HWEIGHT32(FANOTIFY_MARK_FLAGS) != 9); fanotify_mark_cache = KMEM_CACHE(fsnotify_mark, diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h index 9e2142795335..f59be967f72b 100644 --- a/include/linux/fanotify.h +++ b/include/linux/fanotify.h @@ -19,7 +19,7 @@ FAN_CLASS_PRE_CONTENT) #define FANOTIFY_INIT_FLAGS (FANOTIFY_CLASS_BITS | \ - FAN_REPORT_TID | \ + FAN_REPORT_TID | FAN_REPORT_FID | \ FAN_CLOEXEC | FAN_NONBLOCK | \ FAN_UNLIMITED_QUEUE | FAN_UNLIMITED_MARKS) From patchwork Thu Jan 10 17:04:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756281 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DD6E613BF for ; Thu, 10 Jan 2019 17:05:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C8EE929B55 for ; Thu, 10 Jan 2019 17:05:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BCA3C29D01; Thu, 10 Jan 2019 17:05:10 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 9287F29AC2 for ; Thu, 10 Jan 2019 17:05:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729170AbfAJRFI (ORCPT ); Thu, 10 Jan 2019 12:05:08 -0500 Received: from mail-wr1-f66.google.com ([209.85.221.66]:46319 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729023AbfAJRFI (ORCPT ); Thu, 10 Jan 2019 12:05:08 -0500 Received: by mail-wr1-f66.google.com with SMTP id l9so12187495wrt.13 for ; Thu, 10 Jan 2019 09:05:06 -0800 (PST) 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=hF5eKk03h+POX4Mbx5dUs36hewy2QXHcQNUrwPgKMZ4=; b=sQ2K7V52i+5x/sPgC5fxD63IOLBQ1P5Orbvi/CihvkwOLpDLRrLsdC63UFKesZzjAI FkgZiWb7qOvVac70YVDPq8f2lVrqQEBnsPLe5dZ8M28eeOGYLMNbCxE4cldFPq6LKAAF eP1u+A3T7XLjlhXc6TP7CwyE1Rfz9WsVxOjbRjOWCEzvXjAtXJlGonH6KA4jlux26JsU w3NeEj8RU+IBY2SOghonbN8we1A+iGJ28D6SLJO6dPQMZzOwMRDGhyhtqkmHsVOpklGy Ki2qVQ4baBFnDtuUN4FhZ12Fx6wgTl6HM8rPWHzw/+Cz/hCfPXQWHmhZyXdyP2e530NO oytQ== 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=hF5eKk03h+POX4Mbx5dUs36hewy2QXHcQNUrwPgKMZ4=; b=sCou2Itv6yh/v2UJO7Uyt+jJOOhTyVFNvN8xFmkMtzYvdkuMg8Bt2Oo0GvsSKZ8YwQ p7slbfdlrbVMQw3lUNOuDq3EVsRCcB49FyfHjMGs7pwZovwrASZRpPGJl0aVYu50Erru 559/tPbsW+AHggBdpXmU3J9NxVZYEdCS5F1ERZ1zEQeFlqj/5DRPzOAcyRJ1unFA4Lle 9Ud1+xhZh1unchKXjOxjgbnOlm2WMvH8rtCdFzp4CGXg1X1VALSmr020/ZrBDInDHTBE E36kYmkmMJf1oAz5kFvaYi1L64+j9v8tPX1oy7YaF7RrCkgAvt3hu3FeuAM7WzIVseMq Jr+w== X-Gm-Message-State: AJcUukcF9l8Qdnh1UXqZIEC/OzdO5qZGPWH+eyzWoxJ3E7fQ3TCVHk+q du09Wgx2aGBl5McAp/NYEI4= X-Google-Smtp-Source: ALg8bN7IUlP643vTqs3r1h7Q+/1huO3FhSM0LMt1IIJ0Ks6I0wgXC7kjkBts3jpzwirFB+WW+dOWng== X-Received: by 2002:a5d:46cd:: with SMTP id g13mr10470604wrs.49.1547139905501; Thu, 10 Jan 2019 09:05:05 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:04 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 10/17] fanotify: cache fsid in fsnotify_mark_connector Date: Thu, 10 Jan 2019 19:04:37 +0200 Message-Id: <20190110170444.30616-11-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 For FAN_REPORT_FID, we need to encode fid with fsid of the filesystem on every event. To avoid having to call vfs_statfs() on every event to get fsid, we store the fsid in fsnotify_mark_connector on the first time we add a mark and on handle event we use the cached fsid. Subsequent calls to add mark on the same object are expected to pass the same fsid, so the call will fail on cached fsid mismatch. If an event is reported on several mark types (inode, mount, filesystem), all connectors should already have the same fsid, so we use the cached fsid from the first connector. Suggested-by: Jan Kara Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 51 +++++++++++++++++------- fs/notify/fanotify/fanotify.h | 5 ++- fs/notify/fanotify/fanotify_user.c | 62 ++++++++++++++++++------------ fs/notify/mark.c | 47 +++++++++++++++++----- include/linux/fsnotify_backend.h | 24 +++++++++--- 5 files changed, 135 insertions(+), 54 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index e431f63c9f58..1bbf8b90dd83 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -153,14 +153,16 @@ static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, } static int fanotify_encode_fid(struct fanotify_event *event, - const struct path *path, gfp_t gfp) + const struct path *path, gfp_t gfp, + __kernel_fsid_t *fsid) { struct fanotify_fid *fid = &event->fid; int dwords, bytes = 0; - struct kstatfs stat; int err, type; - stat.f_fsid.val[0] = stat.f_fsid.val[1] = 0; + if (!fsid) + goto out_err; + fid->ext_fh = NULL; dwords = 0; err = -ENOENT; @@ -168,10 +170,6 @@ static int fanotify_encode_fid(struct fanotify_event *event, if (!dwords) goto out_err; - err = vfs_statfs(path, &stat); - if (err) - goto out_err; - bytes = dwords << 2; if (bytes > FANOTIFY_INLINE_FH_LEN) { /* Treat failure to allocate fh as failure to allocate event */ @@ -187,14 +185,14 @@ static int fanotify_encode_fid(struct fanotify_event *event, if (!type || type == FILEID_INVALID || bytes != dwords << 2) goto out_err; - fid->fsid = stat.f_fsid; + fid->fsid = *fsid; event->fh_len = bytes; return type; out_err: pr_warn_ratelimited("fanotify: failed to encode fid (fsid=%x.%x, type=%d, bytes=%d, err=%i)\n", - stat.f_fsid.val[0], stat.f_fsid.val[1], + fsid ? fsid->val[0] : 0, fsid ? fsid->val[1] : 0, type, bytes, err); kfree(fid->ext_fh); fid->ext_fh = NULL; @@ -204,8 +202,9 @@ static int fanotify_encode_fid(struct fanotify_event *event, } struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, - struct inode *inode, u32 mask, - const struct path *path) + struct inode *inode, u32 mask, + const struct path *path, + __kernel_fsid_t *fsid) { struct fanotify_event *event = NULL; gfp_t gfp = GFP_KERNEL_ACCOUNT; @@ -244,7 +243,7 @@ init: __maybe_unused event->fh_len = 0; if (path && FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { /* Report the event without a file identifier on encode error */ - event->fh_type = fanotify_encode_fid(event, path, gfp); + event->fh_type = fanotify_encode_fid(event, path, gfp, fsid); } else if (path) { event->fh_type = FILEID_ROOT; event->path = *path; @@ -259,6 +258,28 @@ init: __maybe_unused return event; } +/* + * Get cached fsid of the filesystem containing the object from any connector. + * All connectors are supposed to have the same fsid, but we do not verify that + * here. + */ +static __kernel_fsid_t *fanotify_get_fsid(struct fsnotify_iter_info *iter_info, + __kernel_fsid_t *fsid) +{ + int type; + + fsnotify_foreach_obj_type(type) { + if (!fsnotify_iter_should_report_type(iter_info, type)) + continue; + + *fsid = iter_info->marks[type]->connector->fsid; + if (!WARN_ON_ONCE(!fsid->val[0] && !fsid->val[1])) + return fsid; + } + + return NULL; +} + static int fanotify_handle_event(struct fsnotify_group *group, struct inode *inode, u32 mask, const void *data, int data_type, @@ -268,6 +289,7 @@ static int fanotify_handle_event(struct fsnotify_group *group, int ret = 0; struct fanotify_event *event; struct fsnotify_event *fsn_event; + __kernel_fsid_t __fsid, *fsid = NULL; BUILD_BUG_ON(FAN_ACCESS != FS_ACCESS); BUILD_BUG_ON(FAN_MODIFY != FS_MODIFY); @@ -300,7 +322,10 @@ static int fanotify_handle_event(struct fsnotify_group *group, return 0; } - event = fanotify_alloc_event(group, inode, mask, data); + if (FAN_GROUP_FLAG(group, FAN_REPORT_FID)) + fsid = fanotify_get_fsid(iter_info, &__fsid); + + event = fanotify_alloc_event(group, inode, mask, data, fsid); ret = -ENOMEM; if (unlikely(!event)) { /* diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h index 4aafc7144c3d..5b072afa4e19 100644 --- a/fs/notify/fanotify/fanotify.h +++ b/fs/notify/fanotify/fanotify.h @@ -131,5 +131,6 @@ static inline struct fanotify_event *FANOTIFY_E(struct fsnotify_event *fse) } struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, - struct inode *inode, u32 mask, - const struct path *path); + struct inode *inode, u32 mask, + const struct path *path, + __kernel_fsid_t *fsid); diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 211ec6332d31..467e6431fbe9 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -653,7 +653,8 @@ static __u32 fanotify_mark_add_to_mask(struct fsnotify_mark *fsn_mark, static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group, fsnotify_connp_t *connp, - unsigned int type) + unsigned int type, + __kernel_fsid_t *fsid) { struct fsnotify_mark *mark; int ret; @@ -666,7 +667,7 @@ static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group, return ERR_PTR(-ENOMEM); fsnotify_init_mark(mark, group); - ret = fsnotify_add_mark_locked(mark, connp, type, 0); + ret = fsnotify_add_mark_locked_fsid(mark, connp, type, 0, fsid); if (ret) { fsnotify_put_mark(mark); return ERR_PTR(ret); @@ -678,7 +679,8 @@ static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group, static int fanotify_add_mark(struct fsnotify_group *group, fsnotify_connp_t *connp, unsigned int type, - __u32 mask, unsigned int flags) + __u32 mask, unsigned int flags, + __kernel_fsid_t *fsid) { struct fsnotify_mark *fsn_mark; __u32 added; @@ -686,7 +688,7 @@ static int fanotify_add_mark(struct fsnotify_group *group, mutex_lock(&group->mark_mutex); fsn_mark = fsnotify_find_mark(connp, group); if (!fsn_mark) { - fsn_mark = fanotify_add_new_mark(group, connp, type); + fsn_mark = fanotify_add_new_mark(group, connp, type, fsid); if (IS_ERR(fsn_mark)) { mutex_unlock(&group->mark_mutex); return PTR_ERR(fsn_mark); @@ -703,23 +705,23 @@ static int fanotify_add_mark(struct fsnotify_group *group, static int fanotify_add_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt, __u32 mask, - unsigned int flags) + unsigned int flags, __kernel_fsid_t *fsid) { return fanotify_add_mark(group, &real_mount(mnt)->mnt_fsnotify_marks, - FSNOTIFY_OBJ_TYPE_VFSMOUNT, mask, flags); + FSNOTIFY_OBJ_TYPE_VFSMOUNT, mask, flags, fsid); } static int fanotify_add_sb_mark(struct fsnotify_group *group, - struct super_block *sb, __u32 mask, - unsigned int flags) + struct super_block *sb, __u32 mask, + unsigned int flags, __kernel_fsid_t *fsid) { return fanotify_add_mark(group, &sb->s_fsnotify_marks, - FSNOTIFY_OBJ_TYPE_SB, mask, flags); + FSNOTIFY_OBJ_TYPE_SB, mask, flags, fsid); } static int fanotify_add_inode_mark(struct fsnotify_group *group, struct inode *inode, __u32 mask, - unsigned int flags) + unsigned int flags, __kernel_fsid_t *fsid) { pr_debug("%s: group=%p inode=%p\n", __func__, group, inode); @@ -734,7 +736,7 @@ static int fanotify_add_inode_mark(struct fsnotify_group *group, return 0; return fanotify_add_mark(group, &inode->i_fsnotify_marks, - FSNOTIFY_OBJ_TYPE_INODE, mask, flags); + FSNOTIFY_OBJ_TYPE_INODE, mask, flags, fsid); } /* fanotify syscalls */ @@ -798,7 +800,7 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) atomic_inc(&user->fanotify_listeners); group->memcg = get_mem_cgroup_from_mm(current->mm); - oevent = fanotify_alloc_event(group, NULL, FS_Q_OVERFLOW, NULL); + oevent = fanotify_alloc_event(group, NULL, FS_Q_OVERFLOW, NULL, NULL); if (unlikely(!oevent)) { fd = -ENOMEM; goto out_destroy_group; @@ -861,9 +863,9 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) } /* Check if filesystem can encode a unique fid */ -static int fanotify_test_fid(struct path *path) +static int fanotify_test_fid(struct path *path, struct kstatfs *stat) { - struct kstatfs stat, root_stat; + struct kstatfs root_stat; struct path root = { .mnt = path->mnt, .dentry = path->dentry->d_sb->s_root, @@ -873,11 +875,11 @@ static int fanotify_test_fid(struct path *path) /* * Make sure path is not in filesystem with zero fsid (e.g. tmpfs). */ - err = vfs_statfs(path, &stat); + err = vfs_statfs(path, stat); if (err) return err; - if (!stat.f_fsid.val[0] && !stat.f_fsid.val[1]) + if (!stat->f_fsid.val[0] && !stat->f_fsid.val[1]) return -ENODEV; /* @@ -888,8 +890,8 @@ static int fanotify_test_fid(struct path *path) if (err) return err; - if (root_stat.f_fsid.val[0] != stat.f_fsid.val[0] || - root_stat.f_fsid.val[1] != stat.f_fsid.val[1]) + if (root_stat.f_fsid.val[0] != stat->f_fsid.val[0] || + root_stat.f_fsid.val[1] != stat->f_fsid.val[1]) return -EXDEV; /* @@ -914,6 +916,8 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, struct fsnotify_group *group; struct fd f; struct path path; + struct kstatfs stat; + __kernel_fsid_t *fsid = NULL; u32 valid_mask = FANOTIFY_EVENTS | FANOTIFY_EVENT_FLAGS; unsigned int mark_type = flags & FANOTIFY_MARK_TYPE_BITS; int ret; @@ -992,9 +996,11 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, goto fput_and_out; if (FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { - ret = fanotify_test_fid(&path); + ret = fanotify_test_fid(&path, &stat); if (ret) goto path_put_and_out; + + fsid = &stat.f_fsid; } /* inode held in place by reference to path; group by fget on fd */ @@ -1007,19 +1013,25 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, switch (flags & (FAN_MARK_ADD | FAN_MARK_REMOVE)) { case FAN_MARK_ADD: if (mark_type == FAN_MARK_MOUNT) - ret = fanotify_add_vfsmount_mark(group, mnt, mask, flags); + ret = fanotify_add_vfsmount_mark(group, mnt, mask, + flags, fsid); else if (mark_type == FAN_MARK_FILESYSTEM) - ret = fanotify_add_sb_mark(group, mnt->mnt_sb, mask, flags); + ret = fanotify_add_sb_mark(group, mnt->mnt_sb, mask, + flags, fsid); else - ret = fanotify_add_inode_mark(group, inode, mask, flags); + ret = fanotify_add_inode_mark(group, inode, mask, + flags, fsid); break; case FAN_MARK_REMOVE: if (mark_type == FAN_MARK_MOUNT) - ret = fanotify_remove_vfsmount_mark(group, mnt, mask, flags); + ret = fanotify_remove_vfsmount_mark(group, mnt, mask, + flags); else if (mark_type == FAN_MARK_FILESYSTEM) - ret = fanotify_remove_sb_mark(group, mnt->mnt_sb, mask, flags); + ret = fanotify_remove_sb_mark(group, mnt->mnt_sb, mask, + flags); else - ret = fanotify_remove_inode_mark(group, inode, mask, flags); + ret = fanotify_remove_inode_mark(group, inode, mask, + flags); break; default: ret = -EINVAL; diff --git a/fs/notify/mark.c b/fs/notify/mark.c index d2dd16cb5989..3c5f39cc7fa3 100644 --- a/fs/notify/mark.c +++ b/fs/notify/mark.c @@ -82,6 +82,7 @@ #include #include #include +#include #include @@ -481,7 +482,8 @@ int fsnotify_compare_groups(struct fsnotify_group *a, struct fsnotify_group *b) } static int fsnotify_attach_connector_to_object(fsnotify_connp_t *connp, - unsigned int type) + unsigned int type, + __kernel_fsid_t *fsid) { struct inode *inode = NULL; struct fsnotify_mark_connector *conn; @@ -493,6 +495,11 @@ static int fsnotify_attach_connector_to_object(fsnotify_connp_t *connp, INIT_HLIST_HEAD(&conn->list); conn->type = type; conn->obj = connp; + /* Cache fsid of filesystem containing the object */ + if (fsid) + conn->fsid = *fsid; + else + conn->fsid.val[0] = conn->fsid.val[1] = 0; if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) inode = igrab(fsnotify_conn_inode(conn)); /* @@ -544,7 +551,7 @@ static struct fsnotify_mark_connector *fsnotify_grab_connector( */ static int fsnotify_add_mark_list(struct fsnotify_mark *mark, fsnotify_connp_t *connp, unsigned int type, - int allow_dups) + int allow_dups, __kernel_fsid_t *fsid) { struct fsnotify_mark *lmark, *last = NULL; struct fsnotify_mark_connector *conn; @@ -553,15 +560,36 @@ static int fsnotify_add_mark_list(struct fsnotify_mark *mark, if (WARN_ON(!fsnotify_valid_obj_type(type))) return -EINVAL; + + /* Backend is expected to check for zero fsid (e.g. tmpfs) */ + if (fsid && WARN_ON_ONCE(!fsid->val[0] && !fsid->val[1])) + return -ENODEV; + restart: spin_lock(&mark->lock); conn = fsnotify_grab_connector(connp); if (!conn) { spin_unlock(&mark->lock); - err = fsnotify_attach_connector_to_object(connp, type); + err = fsnotify_attach_connector_to_object(connp, type, fsid); if (err) return err; goto restart; + } else if (fsid && (conn->fsid.val[0] || conn->fsid.val[1]) && + (fsid->val[0] != conn->fsid.val[0] || + fsid->val[1] != conn->fsid.val[1])) { + /* + * Backend is expected to check for non uniform fsid + * (e.g. btrfs), but maybe we missed something? + * Only allow setting conn->fsid once to non zero fsid. + * inotify and non-fid fanotify groups do not set nor test + * conn->fsid. + */ + pr_warn_ratelimited("%s: fsid mismatch on object of type %u: %x.%x != %x.%x\n", + __func__, conn->type, + fsid->val[0], fsid->val[1], + conn->fsid.val[0], conn->fsid.val[1]); + err = -EXDEV; + goto out_err; } /* is mark the first mark? */ @@ -604,9 +632,9 @@ static int fsnotify_add_mark_list(struct fsnotify_mark *mark, * These marks may be used for the fsnotify backend to determine which * event types should be delivered to which group. */ -int fsnotify_add_mark_locked(struct fsnotify_mark *mark, - fsnotify_connp_t *connp, unsigned int type, - int allow_dups) +int fsnotify_add_mark_locked_fsid(struct fsnotify_mark *mark, + fsnotify_connp_t *connp, unsigned int type, + int allow_dups, __kernel_fsid_t *fsid) { struct fsnotify_group *group = mark->group; int ret = 0; @@ -627,7 +655,7 @@ int fsnotify_add_mark_locked(struct fsnotify_mark *mark, fsnotify_get_mark(mark); /* for g_list */ spin_unlock(&mark->lock); - ret = fsnotify_add_mark_list(mark, connp, type, allow_dups); + ret = fsnotify_add_mark_list(mark, connp, type, allow_dups, fsid); if (ret) goto err; @@ -648,13 +676,14 @@ int fsnotify_add_mark_locked(struct fsnotify_mark *mark, } int fsnotify_add_mark(struct fsnotify_mark *mark, fsnotify_connp_t *connp, - unsigned int type, int allow_dups) + unsigned int type, int allow_dups, __kernel_fsid_t *fsid) { int ret; struct fsnotify_group *group = mark->group; mutex_lock(&group->mark_mutex); - ret = fsnotify_add_mark_locked(mark, connp, type, allow_dups); + ret = fsnotify_add_mark_locked_fsid(mark, connp, type, allow_dups, + fsid); mutex_unlock(&group->mark_mutex); return ret; } diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 1e4b88bd1443..b66c4199d629 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h @@ -293,6 +293,7 @@ typedef struct fsnotify_mark_connector __rcu *fsnotify_connp_t; struct fsnotify_mark_connector { spinlock_t lock; unsigned int type; /* Type of object [lock] */ + __kernel_fsid_t fsid; /* fsid of filesystem containing object */ union { /* Object pointer [lock] */ fsnotify_connp_t *obj; @@ -433,20 +434,32 @@ extern void fsnotify_init_mark(struct fsnotify_mark *mark, /* Find mark belonging to given group in the list of marks */ extern struct fsnotify_mark *fsnotify_find_mark(fsnotify_connp_t *connp, struct fsnotify_group *group); +/* Get cached fsid of filesystem containing object */ +extern int fsnotify_get_conn_fsid(const struct fsnotify_mark_connector *conn, + __kernel_fsid_t *fsid); /* attach the mark to the object */ extern int fsnotify_add_mark(struct fsnotify_mark *mark, fsnotify_connp_t *connp, unsigned int type, - int allow_dups); -extern int fsnotify_add_mark_locked(struct fsnotify_mark *mark, - fsnotify_connp_t *connp, unsigned int type, - int allow_dups); + int allow_dups, __kernel_fsid_t *fsid); +extern int fsnotify_add_mark_locked_fsid(struct fsnotify_mark *mark, + fsnotify_connp_t *connp, + unsigned int type, int allow_dups, + __kernel_fsid_t *fsid); +static inline int fsnotify_add_mark_locked(struct fsnotify_mark *mark, + fsnotify_connp_t *connp, + unsigned int type, int allow_dups) +{ + return fsnotify_add_mark_locked_fsid(mark, connp, type, allow_dups, + NULL); +} + /* attach the mark to the inode */ static inline int fsnotify_add_inode_mark(struct fsnotify_mark *mark, struct inode *inode, int allow_dups) { return fsnotify_add_mark(mark, &inode->i_fsnotify_marks, - FSNOTIFY_OBJ_TYPE_INODE, allow_dups); + FSNOTIFY_OBJ_TYPE_INODE, allow_dups, NULL); } static inline int fsnotify_add_inode_mark_locked(struct fsnotify_mark *mark, struct inode *inode, @@ -455,6 +468,7 @@ static inline int fsnotify_add_inode_mark_locked(struct fsnotify_mark *mark, return fsnotify_add_mark_locked(mark, &inode->i_fsnotify_marks, FSNOTIFY_OBJ_TYPE_INODE, allow_dups); } + /* given a group and a mark, flag mark to be freed when all references are dropped */ extern void fsnotify_destroy_mark(struct fsnotify_mark *mark, struct fsnotify_group *group); From patchwork Thu Jan 10 17:04:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756283 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3ED56159A for ; Thu, 10 Jan 2019 17:05:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2B3C129AC2 for ; Thu, 10 Jan 2019 17:05:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1FCBF29D01; Thu, 10 Jan 2019 17:05:11 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 A774329B68 for ; Thu, 10 Jan 2019 17:05:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729197AbfAJRFK (ORCPT ); Thu, 10 Jan 2019 12:05:10 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:53071 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728959AbfAJRFJ (ORCPT ); Thu, 10 Jan 2019 12:05:09 -0500 Received: by mail-wm1-f66.google.com with SMTP id m1so11990964wml.2 for ; Thu, 10 Jan 2019 09:05:07 -0800 (PST) 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=WyHRaU/VRAng0csQ6QFDoFzWZ9FQwMMiw8mjnaBs5B8=; b=i5yxorjGDy+48FOeDWJz5VxWEcOLRZxgD0649SIA5TMxZw+BI3ifetqjzR6zR5pLNA 7CvSaX6WnQqO+vGdHwAvqRVxjeyieGbbIGYLW0QQ8h8jJKd/IcR6yEx2MGTNyjan4zD5 AfYErzbF22kNwH798U6ZkpnY4o4ynPR1vP9iDjTEbElHsgbkGgEZqPxFWspYnoO0qVmw NlhLVHRJ0VTNEGr5nSNsiE17gNf9o4cL542eKX00yjJE7Ftp07jxtKtpUDZUH0gqgGPS 5QrNIBba1B8L+itejV+j94jCgR6e8/Fm89vJbogipojYuxp22hSGsgyPN17ZuboqJ1tw WmGA== 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=WyHRaU/VRAng0csQ6QFDoFzWZ9FQwMMiw8mjnaBs5B8=; b=aRErw/bTbz6nG2tpcozkrhpZ5xSDiMKr/4xmz5esc+IRuOsAlgJwvEKKL1bXez5vri YnHA0HXWZOaODHGwp10BphlsCP6kpW/wYa174XEk6g3cWX9wijGzw0a4pVKQukChlSZi wrBXLCLTEmESnnFTYhCX9JaMKTTQVC0VcruUjv9VHvvqm63Jk7dpy/LJ0eLIf2DqTty6 2VrUgzU43xG5ayITUk7VAEbZXKMkpL67GqSnT4fooEiUK7CWY3YqTDlTYOZuuKyDJ/c/ oCYguUkRQkyNi9l91kQwHVjr9zdD3o1yxXoJpLfJNaCaAYA8h/0iO7UnoBS2hQzL5i14 eSSw== X-Gm-Message-State: AJcUukcQbhpDFW5T2ESqlvvdRlLFccXk7N8e/3kMJDFK3ODK+izGl+5v /onoyjhBrQiXPEUlYWHUSlddWJch X-Google-Smtp-Source: ALg8bN6HOh8fYit6PRNaOkdMUK02JYm9QAn2/DzGgUmUyq5a285Neci3n/kvu4MZmYRviuq24uu4AA== X-Received: by 2002:a1c:4683:: with SMTP id t125mr2460763wma.9.1547139906849; Thu, 10 Jan 2019 09:05:06 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:06 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org, Al Viro Subject: [PATCH v5 11/17] vfs: add vfs_get_fsid() helper Date: Thu, 10 Jan 2019 19:04:38 +0200 Message-Id: <20190110170444.30616-12-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 Wrapper around statfs() interface. Cc: Al Viro Signed-off-by: Amir Goldstein --- fs/statfs.c | 14 ++++++++++++++ include/linux/statfs.h | 3 +++ 2 files changed, 17 insertions(+) diff --git a/fs/statfs.c b/fs/statfs.c index f0216629621d..eea7af6f2f22 100644 --- a/fs/statfs.c +++ b/fs/statfs.c @@ -67,6 +67,20 @@ static int statfs_by_dentry(struct dentry *dentry, struct kstatfs *buf) return retval; } +int vfs_get_fsid(struct dentry *dentry, __kernel_fsid_t *fsid) +{ + struct kstatfs st; + int error; + + error = statfs_by_dentry(dentry, &st); + if (error) + return error; + + *fsid = st.f_fsid; + return 0; +} +EXPORT_SYMBOL(vfs_get_fsid); + int vfs_statfs(const struct path *path, struct kstatfs *buf) { int error; diff --git a/include/linux/statfs.h b/include/linux/statfs.h index 3142e98546ac..9bc69edb8f18 100644 --- a/include/linux/statfs.h +++ b/include/linux/statfs.h @@ -41,4 +41,7 @@ struct kstatfs { #define ST_NODIRATIME 0x0800 /* do not update directory access times */ #define ST_RELATIME 0x1000 /* update atime relative to mtime/ctime */ +struct dentry; +extern int vfs_get_fsid(struct dentry *dentry, __kernel_fsid_t *fsid); + #endif From patchwork Thu Jan 10 17:04:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756285 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 458F013B4 for ; Thu, 10 Jan 2019 17:05:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 314DC29AC2 for ; Thu, 10 Jan 2019 17:05:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 25A4029D01; Thu, 10 Jan 2019 17:05:12 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 BE66F29AC2 for ; Thu, 10 Jan 2019 17:05:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729222AbfAJRFL (ORCPT ); Thu, 10 Jan 2019 12:05:11 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:51953 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729023AbfAJRFK (ORCPT ); Thu, 10 Jan 2019 12:05:10 -0500 Received: by mail-wm1-f66.google.com with SMTP id b11so11995854wmj.1 for ; Thu, 10 Jan 2019 09:05:09 -0800 (PST) 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=/Z2VSKAn1MvuCP5v3GkIAZfHPLgClZFgO2XoyNw6kcM=; b=WPLPgpHAmlPK0ww9cDSJYuF3Wryi62k/TQ4nI9DlkD4JsWxZlx5b2qIfYCAvs/psx6 GDjScMAXWdexCQbTA+uxTVDLgONOoJ7AG80B7ywP9pmoDRLVFRt/QfpiuR8PoRc2SgG6 liKpE+MJDv18o7/tQ5NM6rRZR6+/gjsadd3w7KaVP4B1O6shYVS+rqoeM7Wqpguuv2bQ vq5uOJN19WROfCLX4NoWb5qpbKd1SGBEM/st/nDKThNhY0bbtBqjGXxQYkg7bv2bsxfx V2LzrPXB1dZ19ugGLaDiQ4P7fDYCg/RgjoKaihEDGHJ/IUySE4v4ZTEuIwrdUZCpO0xh 5ptw== 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=/Z2VSKAn1MvuCP5v3GkIAZfHPLgClZFgO2XoyNw6kcM=; b=Q1wMNVSBgONor3LJT4JCIZ8Ib6yk8pDvi2Y1OhQb9gQkKA62ZXxLtXpL+2yehkgH6O FJ+nkgV80+6FnPiaBDlHFr6fLTHjby/HWWYkc345LQohze9BNv0N9VijtGjRjeZRqW/h QKq07KqOUAblpIFWlLii4x5RopR4CA7OCin+4I7v5hZE2l0KG+cmIk8P4L0GDqnl9p0s 842Yw9SpEe50bjSUoMavxjV4DVa7jBmT87zO5vRMUpdccgR29qlbNF9uX9YD+6vyIg4m ZXSl9OSZ2XqNqvEBE6+XQRJtEqjPkSDY9j9tTIluIoH3SGw0GJ+R7WHIB2uZlM1vw8wS JW6g== X-Gm-Message-State: AJcUukfSBKJgDK537PWCW3q6ZL750i0VVBKJsW2sKTljlVqmaHMWRAP7 htMQ6Sf4YdR5Jw7HHBtV0ZY= X-Google-Smtp-Source: ALg8bN47PafAJJYRZv/cpPfrnPQR6EkSV9N2PwfZi7Ig33AQ60nVBqNgu524xJtz7zxaXPbnv/G4pg== X-Received: by 2002:a1c:b189:: with SMTP id a131mr11057744wmf.38.1547139908350; Thu, 10 Jan 2019 09:05:08 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:07 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 12/17] fanotify: use vfs_get_fsid() helper instead of vfs_statfs() Date: Thu, 10 Jan 2019 19:04:39 +0200 Message-Id: <20190110170444.30616-13-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 is a cleanup that doesn't change any logic. Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify_user.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 467e6431fbe9..4254bfedb40b 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -863,35 +863,31 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) } /* Check if filesystem can encode a unique fid */ -static int fanotify_test_fid(struct path *path, struct kstatfs *stat) +static int fanotify_test_fid(struct path *path, __kernel_fsid_t *fsid) { - struct kstatfs root_stat; - struct path root = { - .mnt = path->mnt, - .dentry = path->dentry->d_sb->s_root, - }; + __kernel_fsid_t root_fsid; int err; /* * Make sure path is not in filesystem with zero fsid (e.g. tmpfs). */ - err = vfs_statfs(path, stat); + err = vfs_get_fsid(path->dentry, fsid); if (err) return err; - if (!stat->f_fsid.val[0] && !stat->f_fsid.val[1]) + if (!fsid->val[0] && !fsid->val[1]) return -ENODEV; /* * Make sure path is not inside a filesystem subvolume (e.g. btrfs) * which uses a different fsid than sb root. */ - err = vfs_statfs(&root, &root_stat); + err = vfs_get_fsid(path->dentry->d_sb->s_root, &root_fsid); if (err) return err; - if (root_stat.f_fsid.val[0] != stat->f_fsid.val[0] || - root_stat.f_fsid.val[1] != stat->f_fsid.val[1]) + if (root_fsid.val[0] != fsid->val[0] || + root_fsid.val[1] != fsid->val[1]) return -EXDEV; /* @@ -916,8 +912,7 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, struct fsnotify_group *group; struct fd f; struct path path; - struct kstatfs stat; - __kernel_fsid_t *fsid = NULL; + __kernel_fsid_t __fsid, *fsid = NULL; u32 valid_mask = FANOTIFY_EVENTS | FANOTIFY_EVENT_FLAGS; unsigned int mark_type = flags & FANOTIFY_MARK_TYPE_BITS; int ret; @@ -996,11 +991,11 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, goto fput_and_out; if (FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { - ret = fanotify_test_fid(&path, &stat); + ret = fanotify_test_fid(&path, &__fsid); if (ret) goto path_put_and_out; - fsid = &stat.f_fsid; + fsid = &__fsid; } /* inode held in place by reference to path; group by fget on fd */ From patchwork Thu Jan 10 17:04:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756287 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CEF2813BF for ; Thu, 10 Jan 2019 17:05:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B9CE429AC2 for ; Thu, 10 Jan 2019 17:05:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ADEFF29D01; Thu, 10 Jan 2019 17:05:13 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 3F8DA29AC2 for ; Thu, 10 Jan 2019 17:05:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729256AbfAJRFM (ORCPT ); Thu, 10 Jan 2019 12:05:12 -0500 Received: from mail-wr1-f65.google.com ([209.85.221.65]:41928 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729240AbfAJRFM (ORCPT ); Thu, 10 Jan 2019 12:05:12 -0500 Received: by mail-wr1-f65.google.com with SMTP id x10so12199963wrs.8 for ; Thu, 10 Jan 2019 09:05:10 -0800 (PST) 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=qddB0e7rz0R06Lt2FEgpJdHOIx510I9h425BmQU+sPc=; b=dmWXMr2PKayVuof2qMWQ72MMd+XOhTR75/TlUbYqKwC1NWm+dGClpHzkaqrdo3jTil 5hq+2A//xsu1tf4aFiRs70hKCtVFTCLmVJurvd3kH2j6ZYOQvxjM92yStQC6QdfvYoPS /JAOeSqWYlaGKAhfxZbwoEzG3k7NoDPxQwmvXQCf02DGViK/5PzhTcl/FEjhRqS2nhoa J9GuuDVjd0jndzyJ77dWMdWugPlJdqb+ODFwUl5lm72zSeJbw+B2x9YoZW45hmIOStkd qTuWBy/31fXEmhV+OOlLusptQwM/3nzyBcUTEJb9a9DnPPWgV6uqyvI6+akrFfmj/eaK 9s+w== 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=qddB0e7rz0R06Lt2FEgpJdHOIx510I9h425BmQU+sPc=; b=elhzXbiAy6dh3fJNqNfXaaoIEMXiJOgGNAKvRMCyrJTnJHumU0GhJQa/tmceOis4zg /GTCmLxObIThHgRwbz0fVy4CmWFj4abeK8FoikULDSDsETKOzqXiAbZZZdO6BqZ1uJBx gDS1IUfynT37xP2X0cJTgqn+9p59BXtspkwxDno6d73ecY2i0Anie7a+FAILghw2WtTX NfHGE8htM4nkmHNz6RBSqng4E3gIiXYf022D5QTF6zZJXQRTjVJzFVAH1rPlwXD5xuKg 3NVTPZlif5Z4mwvPXTbddYcZeij3+c4BJntwNDwlPsWQSr/98PKdYES9raqaFSaQShbS 4Z/Q== X-Gm-Message-State: AJcUukdwsrFQwZOyunsY5MLtNakEePqpHBd5uDYskIbeTYKeSrO/fnN8 EwDEZbNCRMgXXOTfWAf0z+T1DTR3 X-Google-Smtp-Source: ALg8bN4XV0o/PMn7ZosWVAuJ8o0rJq07mQYh6MJtk/OW6IkOJULCjVe+zo4E6WU7/tjLNGK3Oxr9+A== X-Received: by 2002:adf:f703:: with SMTP id r3mr9797558wrp.93.1547139909673; Thu, 10 Jan 2019 09:05:09 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:09 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 13/17] fsnotify: report FS_ISDIR flag with MOVE_SELF and DELETE_SELF events Date: Thu, 10 Jan 2019 19:04:40 +0200 Message-Id: <20190110170444.30616-14-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 We need to report FS_ISDIR flag with MOVE_SELF and DELETE_SELF events for fanotify, because fanotify API requires the user to explicitly request events on directories by FAN_ONDIR flag. inotify never reported IN_ISDIR with those events. It looks like an oversight, but to avoid the risk of breaking existing inotify programs, mask the FS_ISDIR flag out when reprting those events to inotify backend. We also add the FS_ISDIR flag with FS_ATTRIB event in the case of rename over an empty target directory. inotify did not report IN_ISDIR in this case, but it normally does report IN_ISDIR along with IN_ATTRIB event, so in this case, we do not mask out the FS_ISDIR flag. Signed-off-by: Amir Goldstein --- fs/notify/inotify/inotify_fsnotify.c | 9 +++++++++ include/linux/fsnotify.h | 23 +++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c index fe97299975f2..ff30abd6a49b 100644 --- a/fs/notify/inotify/inotify_fsnotify.c +++ b/fs/notify/inotify/inotify_fsnotify.c @@ -113,6 +113,15 @@ int inotify_handle_event(struct fsnotify_group *group, return -ENOMEM; } + /* + * We now report FS_ISDIR flag with MOVE_SELF and DELETE_SELF events + * for fanotify. inotify never reported IN_ISDIR with those events. + * It looks like an oversight, but to avoid the risk of breaking + * existing inotify programs, mask the flag out from those events. + */ + if (mask & (IN_MOVE_SELF | IN_DELETE_SELF)) + mask &= ~IN_ISDIR; + fsn_event = &event->fse; fsnotify_init_event(fsn_event, inode); event->mask = mask; diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 116907928c7f..bec2e8f66012 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -87,7 +87,12 @@ static inline int fsnotify_perm(struct file *file, int mask) */ static inline void fsnotify_link_count(struct inode *inode) { - fsnotify(inode, FS_ATTRIB, inode, FSNOTIFY_EVENT_INODE, NULL, 0); + __u32 mask = FS_ATTRIB; + + if (S_ISDIR(inode->i_mode)) + mask |= FS_ISDIR; + + fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); } /* @@ -95,12 +100,14 @@ static inline void fsnotify_link_count(struct inode *inode) */ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, const unsigned char *old_name, - int isdir, struct inode *target, struct dentry *moved) + int isdir, struct inode *target, + struct dentry *moved) { struct inode *source = moved->d_inode; u32 fs_cookie = fsnotify_get_cookie(); __u32 old_dir_mask = FS_MOVED_FROM; __u32 new_dir_mask = FS_MOVED_TO; + __u32 mask = FS_MOVE_SELF; const unsigned char *new_name = moved->d_name.name; if (old_dir == new_dir) @@ -111,6 +118,9 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, new_dir_mask |= FS_ISDIR; } + if (d_is_dir(moved)) + mask |= FS_ISDIR; + fsnotify(old_dir, old_dir_mask, source, FSNOTIFY_EVENT_INODE, old_name, fs_cookie); fsnotify(new_dir, new_dir_mask, source, FSNOTIFY_EVENT_INODE, new_name, @@ -120,7 +130,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, fsnotify_link_count(target); if (source) - fsnotify(source, FS_MOVE_SELF, moved->d_inode, FSNOTIFY_EVENT_INODE, NULL, 0); + fsnotify(source, mask, source, FSNOTIFY_EVENT_INODE, NULL, 0); audit_inode_child(new_dir, moved, AUDIT_TYPE_CHILD_CREATE); } @@ -197,7 +207,12 @@ static inline void fsnotify_nameremove(struct dentry *dentry, int isdir) */ static inline void fsnotify_inoderemove(struct inode *inode) { - fsnotify(inode, FS_DELETE_SELF, inode, FSNOTIFY_EVENT_INODE, NULL, 0); + __u32 mask = FS_DELETE_SELF; + + if (S_ISDIR(inode->i_mode)) + mask |= FS_ISDIR; + + fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); __fsnotify_inode_delete(inode); } From patchwork Thu Jan 10 17:04:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756289 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AD01713BF for ; Thu, 10 Jan 2019 17:05:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 95EDC29AC2 for ; Thu, 10 Jan 2019 17:05:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 871A029D01; Thu, 10 Jan 2019 17:05:14 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 37FB529AC2 for ; Thu, 10 Jan 2019 17:05:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729264AbfAJRFN (ORCPT ); Thu, 10 Jan 2019 12:05:13 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:41933 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728959AbfAJRFM (ORCPT ); Thu, 10 Jan 2019 12:05:12 -0500 Received: by mail-wr1-f67.google.com with SMTP id x10so12200059wrs.8 for ; Thu, 10 Jan 2019 09:05:11 -0800 (PST) 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=6cN3su4u2jUfsZmXaU4xp7LlS77GvUXPiVgggO9Rp/Y=; b=U/R6ffdpUdWQwy3Gv7pcxVX6ymqZtXlRNUx5fOqb5xPAm/eKcTptZsHuu3VwroAKqY XvAtroEaM3GltroSaB05ABJtw8RFG5cMX7hb89yBT6Yv0pTQU4BVbtF2ZhQsuxIpGhxv Il3smXdXQr5yLCEkz9pz1BLczV5MaUfTey9ztTPnITNIOnb2LYBDAVINVPJnu+1L0DRM 2Y5w4F4KysHLYoE/EJsoCKQQfVSi9dJ2pRfYCnGl2trO82brJmsL5R6Hj9E20LwbXeEZ j3qkNJwUTh3dR8YXLNcyx7zTn2qrDk7EgqZxNRCGNvruypidjsg+mXiHMKPOq+8rOzVY tAAA== 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=6cN3su4u2jUfsZmXaU4xp7LlS77GvUXPiVgggO9Rp/Y=; b=UkBkqBMnF3ZjlnB+F8Bg9wtUfplZXTw5h1xEQOdZTT2pPXGh3uKBOGNmtc1kZ91ZOB d2TIV7QdBcYsICFq4fT0ZC2HEKK9xqXf72RoAc+cXYHPZjGJGuQjlcFpCvdDuKD/WqM+ ldMRzfr/a4LumSWrafpzWFGFJFrdQ2E48PZkFI4D/hrZEuabRdZl/lorZvsCbL4HEXk+ 01uMuCxwL+FhHaAdayyM61ry0UdhTrvKsPV3ajeK6MTyQrejw8uYcq9pujnDrI4N9rqm K2PcEls3+OqCeYu2n4s/LniWHGYvX0NfmiyyB0DAv8tbyrzk7dFolfNWiKj92e9QHqIP DHrw== X-Gm-Message-State: AJcUukddhZEZCgnMBfzwlUIBTJyKhgRw8hM0gbM8IVfk3Af/x7zGu5Mo u6HQUND7tNqAiOGNZvXRHRg= X-Google-Smtp-Source: ALg8bN6u4Yq35TiKAHfPyC440gsD3yONEHB0LOWxeO5c8Krv2LlyFlIu1mJy1Rv/6Lf694NANSLUMw== X-Received: by 2002:adf:fdc2:: with SMTP id i2mr10430239wrs.117.1547139911237; Thu, 10 Jan 2019 09:05:11 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:10 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 14/17] fanotify: check FS_ISDIR flag instead of d_is_dir() Date: Thu, 10 Jan 2019 19:04:41 +0200 Message-Id: <20190110170444.30616-15-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 All fsnotify hooks set the FS_ISDIR flag for events that happen on directory victim inodes except for fsnotify_perm(). Add the missing FS_ISDIR flag in fsnotify_perm() hook and let fanotify_group_event_mask() check the FS_ISDIR flag instead of checking if path argument is a directory. This is needed for fanotify support for event types that do not carry path information. Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 2 +- include/linux/fsnotify.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index 1bbf8b90dd83..fcb98ea99508 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -144,7 +144,7 @@ static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, marks_ignored_mask |= mark->ignored_mask; } - if (d_is_dir(path->dentry) && + if (event_mask & FS_ISDIR && !(marks_mask & FS_ISDIR & ~marks_ignored_mask)) return 0; diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index bec2e8f66012..80b782d399bd 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -79,6 +79,9 @@ static inline int fsnotify_perm(struct file *file, int mask) fsnotify_mask = FS_ACCESS_PERM; } + if (S_ISDIR(inode->i_mode)) + fsnotify_mask |= FS_ISDIR; + return fsnotify_path(inode, path, fsnotify_mask); } From patchwork Thu Jan 10 17:04:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756291 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6286913B4 for ; Thu, 10 Jan 2019 17:05:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4EA6D29AC2 for ; Thu, 10 Jan 2019 17:05:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 42B5E29D01; Thu, 10 Jan 2019 17:05:16 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 9A1A629AC2 for ; Thu, 10 Jan 2019 17:05:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729287AbfAJRFP (ORCPT ); Thu, 10 Jan 2019 12:05:15 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:36332 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729240AbfAJRFO (ORCPT ); Thu, 10 Jan 2019 12:05:14 -0500 Received: by mail-wr1-f67.google.com with SMTP id u4so12244943wrp.3 for ; Thu, 10 Jan 2019 09:05:13 -0800 (PST) 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=x1LEwPM1Vy7GgRKNCsAauAj9enilOSYNTrekyRKTA90=; b=AH46afFxHo+s5u1pYwdce7yE64mdrBViYx3+K4+gASwFeeoAMTvBVad1eUU/jH9tof E5nydl6DdgtK8kLgmb+SKEIPOQbiG2MMKEAyEFS06js6OB85wp6dd4MgHdT3GnFoVyVv P+NNXbMglwNo5J9LynAZvSSSsxd9dkOCIl89qT/P5DltpMI7wssxMAHQ+al9Oxo+JFig AeTow2Ojr8PQhh9tFZ7G33ZhBOeg9nS8bnlBRgIHT+VtghwJxSPZHmcm2DcEBal1cF3Q 9a35S7mj3QnNmr53J7fDjfTE+fO+mZOuHvgfHPsHQHt3xZ4kAS+ucYKWpBAzgL3z8/RX W4bw== 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=x1LEwPM1Vy7GgRKNCsAauAj9enilOSYNTrekyRKTA90=; b=PixJhWEs59UerXpv+4SI5qHMq/bQ5enCgvk/1K0TEEZetTlfqBmEmuXZhJjBHsP5Jy OQF5vFkvXey/45x6ZCjzlN9c2UJSL4u75+2vYyaToCslcK9279LwtCLvMkJw2ynn9oRX Vm3PKHLWL/X4+Ha3+b4GhJhbRV6UULcsocla6EJKq+iRU5juLTQz3mo4fTPMAKhWrMFl XEzYMQ3NloUX85Syg2NWr5tnBLgo0sNFY430gJ0RiNRT2Ir9CqULx2W7Lqige+TG/9F/ 3xufXBv8FOz91JqU3F5jxZeML6CrjRByh0xfBL2dgZndnIpKPZCi2TNgUvoHC23aqPH8 xhGg== X-Gm-Message-State: AJcUukdv/uxmt0+Xi/+UsWavrk03ZdsoGoit/vyNfmgu4EFm3OMT6mH8 IZA5hDrj4CldW6B9Iu1RQI8= X-Google-Smtp-Source: ALg8bN7WNbJCL/f9d1/8T5l2pe4HTbnyUIsw6h1nP5JGzxudcP9JxytMWq1oh98QezDN3BTderC7EA== X-Received: by 2002:adf:f785:: with SMTP id q5mr10616959wrp.9.1547139912511; Thu, 10 Jan 2019 09:05:12 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:11 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org Subject: [PATCH v5 15/17] fanotify: support events with data type FSNOTIFY_EVENT_INODE Date: Thu, 10 Jan 2019 19:04:42 +0200 Message-Id: <20190110170444.30616-16-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 data type is FSNOTIFY_EVENT_INODE, we don't have a refernece to the mount, so we will not be able to open a file descriptor when user reads the event. However, if the listener has enabled reporting file identifier with the FAN_REPORT_FID init flag, we allow reporting those events and we use an identifier inode to encode fid. The inode to use as identifier when reporting fid depends on the event. For dirent modification events, we report the modified directory inode and we report the "victim" inode otherwise. For example: FS_ATTRIB reports the child inode even if reported on a watched parent. FS_CREATE reports the modified dir inode and not the created inode. Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 67 ++++++++++++++++++++---------- fs/notify/fanotify/fanotify.h | 2 +- fs/notify/fanotify/fanotify_user.c | 3 +- 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index fcb98ea99508..e3ca1632feb8 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -96,7 +96,7 @@ static int fanotify_get_response(struct fsnotify_group *group, pr_debug("%s: group=%p event=%p about to return ret=%d\n", __func__, group, event, ret); - + return ret; } @@ -106,9 +106,10 @@ static int fanotify_get_response(struct fsnotify_group *group, * been included within the event mask, but have not been explicitly * requested by the user, will not be present in the returned mask. */ -static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, - u32 event_mask, const void *data, - int data_type) +static u32 fanotify_group_event_mask(struct fsnotify_group *group, + struct fsnotify_iter_info *iter_info, + u32 event_mask, const void *data, + int data_type) { __u32 marks_mask = 0, marks_ignored_mask = 0; const struct path *path = data; @@ -118,14 +119,14 @@ static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, pr_debug("%s: report_mask=%x mask=%x data=%p data_type=%d\n", __func__, iter_info->report_mask, event_mask, data, data_type); - /* If we don't have enough info to send an event to userspace say no */ - if (data_type != FSNOTIFY_EVENT_PATH) - return 0; - - /* Sorry, fanotify only gives a damn about files and dirs */ - if (!d_is_reg(path->dentry) && - !d_can_lookup(path->dentry)) + if (data_type == FSNOTIFY_EVENT_PATH) { + /* Path type events are only relevant for files and dirs */ + if (!d_is_reg(path->dentry) && !d_can_lookup(path->dentry)) + return 0; + } else if (!FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { + /* Events without path data require FAN_REPORT_FID */ return 0; + } fsnotify_foreach_obj_type(type) { if (!fsnotify_iter_should_report_type(iter_info, type)) @@ -153,7 +154,7 @@ static u32 fanotify_group_event_mask(struct fsnotify_iter_info *iter_info, } static int fanotify_encode_fid(struct fanotify_event *event, - const struct path *path, gfp_t gfp, + struct inode *inode, gfp_t gfp, __kernel_fsid_t *fsid) { struct fanotify_fid *fid = &event->fid; @@ -166,7 +167,7 @@ static int fanotify_encode_fid(struct fanotify_event *event, fid->ext_fh = NULL; dwords = 0; err = -ENOENT; - type = exportfs_encode_fh(path->dentry, NULL, &dwords, 0); + type = exportfs_encode_inode_fh(inode, NULL, &dwords, NULL); if (!dwords) goto out_err; @@ -179,8 +180,8 @@ static int fanotify_encode_fid(struct fanotify_event *event, goto out_err; } - type = exportfs_encode_fh(path->dentry, fanotify_fid_fh(fid, bytes), - &dwords, 0); + type = exportfs_encode_inode_fh(inode, fanotify_fid_fh(fid, bytes), + &dwords, NULL); err = -EINVAL; if (!type || type == FILEID_INVALID || bytes != dwords << 2) goto out_err; @@ -201,13 +202,34 @@ static int fanotify_encode_fid(struct fanotify_event *event, return FILEID_INVALID; } +/* + * The inode to use as indentifier when reporting fid depends on the event. + * Report the modified directory inode on dirent modification events. + * Report the "victim" inode otherwise. + * For example: + * FS_ATTRIB reports the child inode even if reported on a watched parent. + * FS_CREATE reports the modified dir inode and not the created inode. + */ +static struct inode *fanotify_fid_inode(struct inode *to_tell, u32 event_mask, + const void *data, int data_type) +{ + if (event_mask & ALL_FSNOTIFY_DIRENT_EVENTS) + return to_tell; + else if (data_type == FSNOTIFY_EVENT_INODE) + return (struct inode *)data; + else if (data_type == FSNOTIFY_EVENT_PATH) + return d_inode(((struct path *)data)->dentry); + return NULL; +} + struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, struct inode *inode, u32 mask, - const struct path *path, + const void *data, int data_type, __kernel_fsid_t *fsid) { struct fanotify_event *event = NULL; gfp_t gfp = GFP_KERNEL_ACCOUNT; + struct inode *id = fanotify_fid_inode(inode, mask, data, data_type); /* * For queues with unlimited length lost events are not expected and @@ -241,12 +263,12 @@ init: __maybe_unused else event->pid = get_pid(task_tgid(current)); event->fh_len = 0; - if (path && FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { + if (id && FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { /* Report the event without a file identifier on encode error */ - event->fh_type = fanotify_encode_fid(event, path, gfp, fsid); - } else if (path) { + event->fh_type = fanotify_encode_fid(event, id, gfp, fsid); + } else if (data_type == FSNOTIFY_EVENT_PATH) { event->fh_type = FILEID_ROOT; - event->path = *path; + event->path = *((struct path *)data); path_get(&event->path); } else { event->fh_type = FILEID_INVALID; @@ -306,7 +328,8 @@ static int fanotify_handle_event(struct fsnotify_group *group, BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 12); - mask = fanotify_group_event_mask(iter_info, mask, data, data_type); + mask = fanotify_group_event_mask(group, iter_info, mask, data, + data_type); if (!mask) return 0; @@ -325,7 +348,7 @@ static int fanotify_handle_event(struct fsnotify_group *group, if (FAN_GROUP_FLAG(group, FAN_REPORT_FID)) fsid = fanotify_get_fsid(iter_info, &__fsid); - event = fanotify_alloc_event(group, inode, mask, data, fsid); + event = fanotify_alloc_event(group, inode, mask, data, data_type, fsid); ret = -ENOMEM; if (unlikely(!event)) { /* diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h index 5b072afa4e19..e84d68c6840a 100644 --- a/fs/notify/fanotify/fanotify.h +++ b/fs/notify/fanotify/fanotify.h @@ -132,5 +132,5 @@ static inline struct fanotify_event *FANOTIFY_E(struct fsnotify_event *fse) struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, struct inode *inode, u32 mask, - const struct path *path, + const void *data, int data_type, __kernel_fsid_t *fsid); diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 4254bfedb40b..8ac3ebc7b5ed 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -800,7 +800,8 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) atomic_inc(&user->fanotify_listeners); group->memcg = get_mem_cgroup_from_mm(current->mm); - oevent = fanotify_alloc_event(group, NULL, FS_Q_OVERFLOW, NULL, NULL); + oevent = fanotify_alloc_event(group, NULL, FS_Q_OVERFLOW, NULL, + FSNOTIFY_EVENT_NONE, NULL); if (unlikely(!oevent)) { fd = -ENOMEM; goto out_destroy_group; From patchwork Thu Jan 10 17:04:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756293 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7CED213BF for ; Thu, 10 Jan 2019 17:05:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6845229D32 for ; Thu, 10 Jan 2019 17:05:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5A2DC29D2E; Thu, 10 Jan 2019 17:05:19 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 C697229D2E for ; Thu, 10 Jan 2019 17:05:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729299AbfAJRFR (ORCPT ); Thu, 10 Jan 2019 12:05:17 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:39610 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729240AbfAJRFR (ORCPT ); Thu, 10 Jan 2019 12:05:17 -0500 Received: by mail-wm1-f65.google.com with SMTP id y8so2172698wmi.4; Thu, 10 Jan 2019 09:05:14 -0800 (PST) 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=qSccVV6Otbqpch3ieKeZpfOo5HgnPslSindncvHF53E=; b=ROwBO+UGL/2dlg7csT51iiye27auiJ6R4b0lMRzWAFULdd1f6juG458+HyvRBX4M4W BXxImUyGVnn2UwYsawknJbW9Tc6FwTOfDAHVTO+N7rfeEVya4MANUQdApb/0H1brtTcb In+dn1+lctT6puYhJqpM1L0u57oSr/BqR23RHZugz/8cZFdf2/M7D8LoKorUYq1z7Vfy xsmqDR76cpbATkVEmL8EqQ3TCONqlklTGij0wyYtygLTrqaDAvgmvzVgw58RtBmVLo+G gvgOuxTOK+MVNBf12jr+DOr84cEs+Ul5X5wkydjYkiYLYtm0SN7Ecfe5gTW3mM3TZfJ1 +BYA== 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=qSccVV6Otbqpch3ieKeZpfOo5HgnPslSindncvHF53E=; b=WuxmP2OYRxCWFsGcCeZF4kazN5Pu942EbGXxjQ9VEAzF4FA5tnx645fuMeNReRw4Hs f32cL54UnUW2+uhnLh/+sIztLXhE6K6VB8ZDP1LQA/XC3pfHpLaYNqXG8cbUOD3efPfd 4QB8gptWStwrmorkoJssIjt37AuiF40bkL3PDMhDGHt7d6XwozGK0sMBE07BxzksOe0a H+pdF7KxSIZB53rTx+6K2YrOktJE4du5UAAN9RRr9idfd9iNyJG/7yUXD5DPcGxSZFIE O7ezY4hjaWB1Su2dtx3Kx7f5gCj6z+tY1ck9ye+7YwJaLSZfHabaWA24GD6fzUvZ5lgx axIA== X-Gm-Message-State: AJcUukdLRG/cUnYaZsglAz6KGWMmOLaF+3qmsTrhEUjTCBAxxWDOTgdr oq4o8xzhZozyVYfzoG8sQOc= X-Google-Smtp-Source: ALg8bN7yQgORLxyAJCKfwzAJ/09ikNpqhoyyoLn5bhO9IFGv/27viAwtbPjwu4XKP/5yUialLQEB6g== X-Received: by 2002:a1c:f319:: with SMTP id q25mr10609531wmq.151.1547139913974; Thu, 10 Jan 2019 09:05:13 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:13 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v5 16/17] fanotify: add support for create/attrib/move/delete events Date: Thu, 10 Jan 2019 19:04:43 +0200 Message-Id: <20190110170444.30616-17-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 Add support for events with data type FSNOTIFY_EVENT_INODE (e.g. create/attrib/move/delete) for inode and filesystem mark types. The "inode" events do not carry enough information (i.e. path) to report event->fd, so we do not allow setting a mask for those events unless group supports reporting fid. The "inode" events are not supported on a mount mark, because they do not carry enough information (i.e. path) to be filtered by mount point. The "dirent" events (create/move/delete) report the fid of the parent directory where events took place without specifying the filename of the child. In the future, fanotify may get support for reporting filename information for those events. Cc: Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 9 ++++++++- fs/notify/fanotify/fanotify_user.c | 12 ++++++++++++ include/linux/fanotify.h | 22 ++++++++++++++++++++-- include/uapi/linux/fanotify.h | 8 ++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index e3ca1632feb8..4ba9c2233965 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -315,9 +315,16 @@ static int fanotify_handle_event(struct fsnotify_group *group, BUILD_BUG_ON(FAN_ACCESS != FS_ACCESS); BUILD_BUG_ON(FAN_MODIFY != FS_MODIFY); + BUILD_BUG_ON(FAN_ATTRIB != FS_ATTRIB); BUILD_BUG_ON(FAN_CLOSE_NOWRITE != FS_CLOSE_NOWRITE); BUILD_BUG_ON(FAN_CLOSE_WRITE != FS_CLOSE_WRITE); BUILD_BUG_ON(FAN_OPEN != FS_OPEN); + BUILD_BUG_ON(FAN_MOVED_TO != FS_MOVED_TO); + BUILD_BUG_ON(FAN_MOVED_FROM != FS_MOVED_FROM); + BUILD_BUG_ON(FAN_CREATE != FS_CREATE); + BUILD_BUG_ON(FAN_DELETE != FS_DELETE); + BUILD_BUG_ON(FAN_DELETE_SELF != FS_DELETE_SELF); + BUILD_BUG_ON(FAN_MOVE_SELF != FS_MOVE_SELF); BUILD_BUG_ON(FAN_EVENT_ON_CHILD != FS_EVENT_ON_CHILD); BUILD_BUG_ON(FAN_Q_OVERFLOW != FS_Q_OVERFLOW); BUILD_BUG_ON(FAN_OPEN_PERM != FS_OPEN_PERM); @@ -326,7 +333,7 @@ static int fanotify_handle_event(struct fsnotify_group *group, BUILD_BUG_ON(FAN_OPEN_EXEC != FS_OPEN_EXEC); BUILD_BUG_ON(FAN_OPEN_EXEC_PERM != FS_OPEN_EXEC_PERM); - BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 12); + BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 19); mask = fanotify_group_event_mask(group, iter_info, mask, data, data_type); diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 8ac3ebc7b5ed..4ef6002072cc 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -976,6 +976,18 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, group->priority == FS_PRIO_0) goto fput_and_out; + /* + * Events with data type inode do not carry enough information to report + * event->fd, so we do not allow setting a mask for inode events unless + * group supports reporting fid. + * inode events are not supported on a mount mark, because they do not + * carry enough information (i.e. path) to be filtered by mount point. + */ + if (mask & FANOTIFY_INODE_EVENTS && + (!FAN_GROUP_FLAG(group, FAN_REPORT_FID) || + mark_type == FAN_MARK_MOUNT)) + goto fput_and_out; + if (flags & FAN_MARK_FLUSH) { ret = 0; if (mark_type == FAN_MARK_MOUNT) diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h index f59be967f72b..e9d45387089f 100644 --- a/include/linux/fanotify.h +++ b/include/linux/fanotify.h @@ -35,10 +35,28 @@ FAN_MARK_IGNORED_SURV_MODIFY | \ FAN_MARK_FLUSH) -/* Events that user can request to be notified on */ -#define FANOTIFY_EVENTS (FAN_ACCESS | FAN_MODIFY | \ +/* + * Events that can be reported with data type FSNOTIFY_EVENT_PATH. + * Note that FAN_MODIFY can also be reported with data type + * FSNOTIFY_EVENT_INODE. + */ +#define FANOTIFY_PATH_EVENTS (FAN_ACCESS | FAN_MODIFY | \ FAN_CLOSE | FAN_OPEN | FAN_OPEN_EXEC) +/* + * Directory entry modification events - reported only to directory + * where entry is modified and not to a watching parent. + */ +#define FANOTIFY_DIRENT_EVENTS (FAN_MOVE | FAN_CREATE | FAN_DELETE) + +/* Events that can only be reported with data type FSNOTIFY_EVENT_INODE */ +#define FANOTIFY_INODE_EVENTS (FANOTIFY_DIRENT_EVENTS | \ + FAN_ATTRIB | FAN_MOVE_SELF | FAN_DELETE_SELF) + +/* Events that user can request to be notified on */ +#define FANOTIFY_EVENTS (FANOTIFY_PATH_EVENTS | \ + FANOTIFY_INODE_EVENTS) + /* Events that require a permission response from user */ #define FANOTIFY_PERM_EVENTS (FAN_OPEN_PERM | FAN_ACCESS_PERM | \ FAN_OPEN_EXEC_PERM) diff --git a/include/uapi/linux/fanotify.h b/include/uapi/linux/fanotify.h index 959ae2bdc7ca..b9effa6f8503 100644 --- a/include/uapi/linux/fanotify.h +++ b/include/uapi/linux/fanotify.h @@ -7,9 +7,16 @@ /* the following events that user-space can register for */ #define FAN_ACCESS 0x00000001 /* File was accessed */ #define FAN_MODIFY 0x00000002 /* File was modified */ +#define FAN_ATTRIB 0x00000004 /* Metadata changed */ #define FAN_CLOSE_WRITE 0x00000008 /* Writtable file closed */ #define FAN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed */ #define FAN_OPEN 0x00000020 /* File was opened */ +#define FAN_MOVED_FROM 0x00000040 /* File was moved from X */ +#define FAN_MOVED_TO 0x00000080 /* File was moved to Y */ +#define FAN_CREATE 0x00000100 /* Subfile was created */ +#define FAN_DELETE 0x00000200 /* Subfile was deleted */ +#define FAN_DELETE_SELF 0x00000400 /* Self was deleted */ +#define FAN_MOVE_SELF 0x00000800 /* Self was moved */ #define FAN_OPEN_EXEC 0x00001000 /* File was opened for exec */ #define FAN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ @@ -24,6 +31,7 @@ /* helper events */ #define FAN_CLOSE (FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE) /* close */ +#define FAN_MOVE (FAN_MOVED_FROM | FAN_MOVED_TO) /* moves */ /* flags used for fanotify_init() */ #define FAN_CLOEXEC 0x00000001 From patchwork Thu Jan 10 17:04:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10756295 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DB54C159A for ; Thu, 10 Jan 2019 17:05:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C645529D2E for ; Thu, 10 Jan 2019 17:05:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BAA4D29D32; Thu, 10 Jan 2019 17:05:19 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 4F46029D31 for ; Thu, 10 Jan 2019 17:05:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729307AbfAJRFS (ORCPT ); Thu, 10 Jan 2019 12:05:18 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:33510 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729294AbfAJRFS (ORCPT ); Thu, 10 Jan 2019 12:05:18 -0500 Received: by mail-wm1-f66.google.com with SMTP id r24so139421wmh.0; Thu, 10 Jan 2019 09:05:15 -0800 (PST) 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=Ue5b2S4IAmlJ1MNnfX/p6A9UJzyNCBhQ0I+YP2hbWKY=; b=jA70CR/mZYc7m6XGsQppprhL0ochBQhnuX96tnDiVyllAnE0/5oQ8KWPOqT8zEVBcY hypu0W1vH77UhJHNMslHABzF6+ddlgS+ILv68h1ejBeXsiKzDRFltOLZ+3aeu4gU4wsg iq8wVTdvpG8JcTwSIh8z51vUO4X1IOgpviTtb29b1FXvF0RnnfKinHMTPSP4K4lkrrrB NRb+fDy+smROJ+gs4Cixi3gvY5OCAki+4LyaKRfRLcZISOr7MtlgEw4Jec9y2Fe8bWar 2PZPd2Ey9slCMhrOWchuwwz8PlV4QcqYNJqjyC32zk2MYQHLvBxWdtYQ76pfvoIDvV2K kSBw== 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=Ue5b2S4IAmlJ1MNnfX/p6A9UJzyNCBhQ0I+YP2hbWKY=; b=ahLm7WcOGJeNhopFWSMkBE+NoE4B90klzVW8V5d8NBZe0i/54smgXeX9vIUml8LKpH D873VtiEDZo7xCF1JW2xjFkbehV/+nZVBY0sv8mEoEhoF4g0RxEb09ZLfMKEC6sdFPxi wBHF4G52c15ZM5QuaX4Ggc6TjCBvw4IPFk+xgHGuA70Kp2OxkNkWkrCwy++R83xwtMbj Jk+SCwkDRvBUN+9G/IJLzSvdN5aS2nWrQ+AhXaDM/BJMnCPLH2jqLze4BNzpRS09wSqf xP1taR5iySR+qbvyBha4HWo00ibRF/AvDgjsgG3bITZ/59bK16+5i6EDhym65bdPbN7n OSkg== X-Gm-Message-State: AJcUukcIlWSm5vft34Gd/982Erlj0VXzKQU2Tl8z68ahVfr13vyV55Z/ POPnkKERB46wFWDGR8bqxfU= X-Google-Smtp-Source: ALg8bN6B+frsOoYYgRqTY3w5qCUOy6Y6925aKWTVy2UdJvlcHU8c7nNrpVl8/Jo+JupTnKY8ioPgiA== X-Received: by 2002:a1c:1d8e:: with SMTP id d136mr10353718wmd.98.1547139915278; Thu, 10 Jan 2019 09:05:15 -0800 (PST) Received: from amir-VirtualBox.ctera.local ([188.120.129.201]) by smtp.gmail.com with ESMTPSA id m4sm5725868wmi.3.2019.01.10.09.05.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Jan 2019 09:05:14 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v5 17/17] fanotify: report FAN_ONDIR to listener with FAN_REPORT_FID Date: Thu, 10 Jan 2019 19:04:44 +0200 Message-Id: <20190110170444.30616-18-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190110170444.30616-1-amir73il@gmail.com> References: <20190110170444.30616-1-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 dirent modification events (create/delete/move) do not carry the child entry name/inode information. Instead, we report FAN_ONDIR for mkdir/rmdir so user can differentiate them from creat/unlink. This is consistent with inotify reporting IN_ISDIR with dirent events and is useful for implementing recursive directory tree watcher. We avoid merging dirent events referring to subdirs with dirent events referring to non subdirs, otherwise, user won't be able to tell from a mask FAN_CREATE|FAN_DELETE|FAN_ONDIR if it describes mkdir+unlink pair or rmdir+create pair of events. For backward compatibility and consistency, do not report FAN_ONDIR to user in legacy fanotify mode (reporting fd) and report FAN_ONDIR to user in FAN_REPORT_FID mode for all event types. Cc: Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 34 +++++++++++++++++++++++++++++++--- include/linux/fanotify.h | 2 +- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index 4ba9c2233965..8ccca3cd866a 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -34,7 +34,16 @@ static bool should_merge(struct fsnotify_event *old_fsn, return old->path.mnt == new->path.mnt && old->path.dentry == new->path.dentry; } else if (fanotify_event_has_fid(old)) { - return fanotify_fid_equal(&old->fid, &new->fid, old->fh_len); + /* + * We want to merge many dirent events in the same dir (i.e. + * creates/unlinks/renames), but we do not want to merge dirent + * events referring to subdirs with dirent events referring to + * non subdirs, otherwise, user won't be able to tell from a + * mask FAN_CREATE|FAN_DELETE|FAN_ONDIR if it describes mkdir+ + * unlink pair or rmdir+create pair of events. + */ + return (old->mask & FS_ISDIR) == (new->mask & FS_ISDIR) && + fanotify_fid_equal(&old->fid, &new->fid, old->fh_len); } /* Do not merge events if we failed to encode fid */ @@ -112,6 +121,7 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group, int data_type) { __u32 marks_mask = 0, marks_ignored_mask = 0; + __u32 test_mask, user_mask = FANOTIFY_OUTGOING_EVENTS; const struct path *path = data; struct fsnotify_mark *mark; int type; @@ -145,12 +155,30 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group, marks_ignored_mask |= mark->ignored_mask; } + test_mask = event_mask & marks_mask & ~marks_ignored_mask; + + /* + * dirent modification events (create/delete/move) do not carry the + * child entry name/inode information. Instead, we report FAN_ONDIR + * for mkdir/rmdir so user can differentiate them from creat/unlink. + * + * For backward compatibility and consistency, do not report FAN_ONDIR + * to user in legacy fanotify mode (reporting fd) and report FAN_ONDIR + * to user in FAN_REPORT_FID mode for all event types. + */ + if (FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { + /* Do not report FAN_ONDIR without any event */ + if (!(test_mask & ~FAN_ONDIR)) + return 0; + } else { + user_mask &= ~FAN_ONDIR; + } + if (event_mask & FS_ISDIR && !(marks_mask & FS_ISDIR & ~marks_ignored_mask)) return 0; - return event_mask & FANOTIFY_OUTGOING_EVENTS & marks_mask & - ~marks_ignored_mask; + return test_mask & user_mask; } static int fanotify_encode_fid(struct fanotify_event *event, diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h index e9d45387089f..b79fa9bb7359 100644 --- a/include/linux/fanotify.h +++ b/include/linux/fanotify.h @@ -67,7 +67,7 @@ /* Events that may be reported to user */ #define FANOTIFY_OUTGOING_EVENTS (FANOTIFY_EVENTS | \ FANOTIFY_PERM_EVENTS | \ - FAN_Q_OVERFLOW) + FAN_Q_OVERFLOW | FAN_ONDIR) #define ALL_FANOTIFY_EVENT_BITS (FANOTIFY_OUTGOING_EVENTS | \ FANOTIFY_EVENT_FLAGS)