From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BAABDC433F5 for ; Mon, 25 Oct 2021 20:47:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A30A760F46 for ; Mon, 25 Oct 2021 20:47:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233641AbhJYUuF (ORCPT ); Mon, 25 Oct 2021 16:50:05 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:40747 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233806AbhJYUt7 (ORCPT ); Mon, 25 Oct 2021 16:49:59 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635194856; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=09SGIwvH71lusGh2SsqD4pyPf/FPnpYM6/0fxV5wwro=; b=CfT/52EdtuUxzAy0bMTnfycKItPNopdojPUIEMRKweFaaamucZE1Yc6dlMtS360q/JG1Bo Mex9c/QIg7h4bFllca2D814nc4acmWbD3q3P3T6daR5eFPnaqbxAI9Yt4HGBcIA2mZK7Sm H7JEeucZB6khoPw/t5gPy0gcmcDKbYk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-258-lDxdUi2eMUGp0VhC-W6jqg-1; Mon, 25 Oct 2021 16:47:34 -0400 X-MC-Unique: lDxdUi2eMUGp0VhC-W6jqg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6F87B10A8E03; Mon, 25 Oct 2021 20:47:33 +0000 (UTC) Received: from iangelak.redhat.com (unknown [10.22.32.161]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7DA6660BF1; Mon, 25 Oct 2021 20:47:32 +0000 (UTC) From: Ioannis Angelakopoulos To: linux-fsdevel@vger.kernel.org, virtio-fs@redhat.com, linux-kernel@vger.kernel.org, jack@suse.cz, amir73il@gmail.com, viro@zeniv.linux.org.uk, miklos@szeredi.hu, vgoyal@redhat.com Cc: Ioannis Angelakopoulos Subject: [RFC PATCH 5/7] Fsnotify: Add a wrapper around the fsnotify function Date: Mon, 25 Oct 2021 16:46:32 -0400 Message-Id: <20211025204634.2517-6-iangelak@redhat.com> In-Reply-To: <20211025204634.2517-1-iangelak@redhat.com> References: <20211025204634.2517-1-iangelak@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Generally, inotify events are generated locally by calling the "fsnotify" function in fs/notify/fsnotify.c and various helper functions. However, now we expect events to arrive from the FUSE server. Thus, without any intervention a user space application will receive two events. One event is generated locally and one arrives from the server. Hence, to avoid duplicate events we need to "suppress" the local events generated by the guest kernel for FUSE inodes. To achieve this we add a wrapper around the "fsnotify" function in fs/notify/fsnotify.c that checks if the remote inotify is enabled and based on the check either it "suppresses" or lets through a local event. The wrapper will be called in the place of the original "fsnotify" call that is responsible for the event notification (now renamed as "__fsnotify"). When the remote inotify is not enabled, all local events will be let through as expected. This process is completely transparent to user space. Signed-off-by: Ioannis Angelakopoulos --- fs/notify/fsnotify.c | 35 ++++++++++++++++++++++++++++++-- include/linux/fsnotify_backend.h | 14 ++++++++++++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index 963e6ce75b96..848a824c29c4 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c @@ -440,7 +440,7 @@ static void fsnotify_iter_next(struct fsnotify_iter_info *iter_info) } /* - * fsnotify - This is the main call to fsnotify. + * __fsnotify - This is the main call to fsnotify. * * The VFS calls into hook specific functions in linux/fsnotify.h. * Those functions then in turn call here. Here will call out to all of the @@ -459,7 +459,7 @@ static void fsnotify_iter_next(struct fsnotify_iter_info *iter_info) * if both are non-NULL event may be reported to both. * @cookie: inotify rename cookie */ -int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir, +int __fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir, const struct qstr *file_name, struct inode *inode, u32 cookie) { const struct path *path = fsnotify_data_path(data, data_type); @@ -552,6 +552,37 @@ int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir, return ret; } + +/* + * Wrapper around fsnotify. The main functionality is to filter local events in + * case the inode belongs to a filesystem that supports remote events + */ +int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir, + const struct qstr *file_name, struct inode *inode, u32 cookie) +{ + + if (inode != NULL || dir != NULL) { + /* + * Check if the fsnotify_event operation is available which + * will let the remote inotify events go through and suppress + * the local events + */ + if (inode && inode->i_op->fsnotify_event) { + return inode->i_op->fsnotify_event(mask, data, + data_type, dir, + file_name, inode, + cookie); + } + if (dir && dir->i_op->fsnotify_event) { + return dir->i_op->fsnotify_event(mask, data, + data_type, dir, + file_name, inode, + cookie); + } + } + + return __fsnotify(mask, data, data_type, dir, file_name, inode, cookie); +} EXPORT_SYMBOL_GPL(fsnotify); static __init int fsnotify_init(void) diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 1ce66748a2d2..8cfbd685f1c0 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h @@ -408,10 +408,15 @@ struct fsnotify_mark { /* called from the vfs helpers */ -/* main fsnotify call to send events */ +/* fsnotify call wrapper */ extern int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir, const struct qstr *name, struct inode *inode, u32 cookie); + +/* main fsnotify call to send events */ +extern int __fsnotify(__u32 mask, const void *data, int data_type, + struct inode *dir, const struct qstr *name, + struct inode *inode, u32 cookie); extern int __fsnotify_parent(struct dentry *dentry, __u32 mask, const void *data, int data_type); extern void __fsnotify_inode_delete(struct inode *inode); @@ -595,6 +600,13 @@ static inline int fsnotify(__u32 mask, const void *data, int data_type, return 0; } +static inline int __fsnotify(__u32 mask, const void *data, int data_type, + struct inode *dir, const struct qstr *name, + struct inode *inode, u32 cookie) +{ + return 0; +} + static inline int __fsnotify_parent(struct dentry *dentry, __u32 mask, const void *data, int data_type) { -- 2.33.0