Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp563852pxb; Mon, 25 Oct 2021 13:51:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJydGCXwIwSeymGMOZqth0THENtVb00Ydeaq3dgLIiLxN/RxbC3OKGouF0vFbXJokVurx9QJ X-Received: by 2002:a05:6402:84a:: with SMTP id b10mr29128316edz.257.1635195098022; Mon, 25 Oct 2021 13:51:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635195098; cv=none; d=google.com; s=arc-20160816; b=eZrSbdV90nAvWJze8BF0xqynWVV45hjVURlIsL2DTUOnqp4Hysy3NHVK74cUytyThl FL0hdqLFm7zsBJKBSt2d2+obhOaT5qFH81esX43uMuG/BMRnkoVISTQXJLHVDIbuG5dt YfyPizFOC6I+LoZ6+awbLw7Ekk2rlb0GNfujTuBPoIIAVNMXDoeFcM3J80Dh1bO7WZXL pdg/AFBOik9D/5QnbnJsj8tjAOhJx/w3cKKtIeG9ZEMaIPPquhMOr337J5xw1WQHoHbk sw/uadaWgOwxccOh3hpPdsugPEQVeAzeHys4S3cri5TuWDrX/E6hMBiv08H96Ts0Zyoh wRQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=09SGIwvH71lusGh2SsqD4pyPf/FPnpYM6/0fxV5wwro=; b=r9Ncylu5Rj1WbNObN8z5aP48LbpRy/OjGdauoA0xSPM//RbiwyCmCTsxjIhu7pWJIA P80DHYa1z3LzP4VtNavutEe+d3wgn2l5XwH8PqnQwXBlzpTJXutpbHXLgeqt5hNzOW3y Tzbeo5SNMNyHxNTCOHpTbr4X3xAMAoQ3KXgJnSOhYgb7XOg1I+rPf+ERbMPiRaZoCydf BILcYuQzyzd8cSSqfXh71kq1+fmheMzUDTZDpowq7fGBgceTjgdJBc5JlSwa0g19aOG4 jRs2oZRLwt8DiDJ+oTKMdkyblcAkJS4Mi67hR7s/71u8Ha1ihspqENIfh1sHMrYFhZSq 0VoA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=frpC3Aem; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dt7si3175238ejc.688.2021.10.25.13.51.12; Mon, 25 Oct 2021 13:51:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=frpC3Aem; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233835AbhJYUuI (ORCPT + 99 others); Mon, 25 Oct 2021 16:50:08 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:37337 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233543AbhJYUuB (ORCPT ); Mon, 25 Oct 2021 16:50:01 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635194858; 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=frpC3Aem2cVwaxUOBg1MA/QfRppA9XJp7Xy/T7ML6mvOgHP1QQxKNbw+lhIRIQPVOH8QHK CmjoCk8iJYnq1fSgz2TLIcvGm6O1JIZgjkSVnvquH8yip2v5owP8NY09cIryXIxbIWOkUb hSNU0DuG/NIaMXM2lnNdQYQMxhaU93k= 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-kernel@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