From: Ioannis Angelakopoulos <iangelak@redhat.com>
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 <iangelak@redhat.com>
Subject: [RFC PATCH 6/7] FUSE,Fsnotify: Add the fuse_fsnotify_event inode operation
Date: Mon, 25 Oct 2021 16:46:33 -0400 [thread overview]
Message-ID: <20211025204634.2517-7-iangelak@redhat.com> (raw)
In-Reply-To: <20211025204634.2517-1-iangelak@redhat.com>
To avoid duplicate events we need to "suppress" the local events generated
by the guest kernel for FUSE inodes. To achieve this we introduce a new
inode operation "fuse_fsnotify_event". Any VFS operation on a FUSE inode
that calls the fsnotify subsystem will call this function.
Specifically, the new inode operation "fuse_fsnotify_event" is called by
the "fsnotify" wrapper function in fsnotify.c, if the inode is a FUSE
inode. In turn "fuse_fsnotify_event" will check if the remote inotify is
enabled and if yes the event will be dropped, since the local inotify
events should be "suppressed". If the remote inotify is not enabled the
event will go through as expected.
In the case where the remote inotify is enabled, FUSE will directly call
"__fsnotify" to send the remote events to user space and not the "fsnotify"
wrapper.
Signed-off-by: Ioannis Angelakopoulos <iangelak@redhat.com>
---
fs/fuse/dir.c | 27 +++++++++++++++++++++++++++
include/linux/fs.h | 3 +++
2 files changed, 30 insertions(+)
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index f666aafc8d3f..d36f85bd4dda 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -1831,6 +1831,30 @@ static int fuse_fsnotify_update_mark(struct inode *inode, uint32_t action,
return fuse_fsnotify_send_request(inode, mask, action, group);
}
+static int fuse_fsnotify_event(__u32 mask, const void *data, int data_type,
+ struct inode *dir, const struct qstr *file_name,
+ struct inode *inode, u32 cookie)
+{
+ struct fuse_mount *fm = NULL;
+
+ if (inode != NULL)
+ fm = get_fuse_mount(inode);
+ else
+ fm = get_fuse_mount(dir);
+
+ /* Remote inotify supported. Do nothing */
+ if (!(fm->fc->no_fsnotify)) {
+ return 0;
+ /*
+ * Remote inotify not supported. Call the __fsnotify function
+ * directly
+ */
+ } else {
+ return __fsnotify(mask, data, data_type, dir, file_name,
+ inode, cookie);
+ }
+}
+
static const struct inode_operations fuse_dir_inode_operations = {
.lookup = fuse_lookup,
.mkdir = fuse_mkdir,
@@ -1851,6 +1875,7 @@ static const struct inode_operations fuse_dir_inode_operations = {
.fileattr_get = fuse_fileattr_get,
.fileattr_set = fuse_fileattr_set,
.fsnotify_update = fuse_fsnotify_update_mark,
+ .fsnotify_event = fuse_fsnotify_event,
};
static const struct file_operations fuse_dir_operations = {
@@ -1874,6 +1899,7 @@ static const struct inode_operations fuse_common_inode_operations = {
.fileattr_get = fuse_fileattr_get,
.fileattr_set = fuse_fileattr_set,
.fsnotify_update = fuse_fsnotify_update_mark,
+ .fsnotify_event = fuse_fsnotify_event,
};
static const struct inode_operations fuse_symlink_inode_operations = {
@@ -1882,6 +1908,7 @@ static const struct inode_operations fuse_symlink_inode_operations = {
.getattr = fuse_getattr,
.listxattr = fuse_listxattr,
.fsnotify_update = fuse_fsnotify_update_mark,
+ .fsnotify_event = fuse_fsnotify_event,
};
void fuse_init_common(struct inode *inode)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 86bcc44e3ab8..ed6b62e2131a 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2151,6 +2151,9 @@ struct inode_operations {
int (*fileattr_get)(struct dentry *dentry, struct fileattr *fa);
int (*fsnotify_update)(struct inode *inode, uint32_t action,
uint64_t group, uint32_t mask);
+ int (*fsnotify_event)(__u32 mask, const void *data, int data_type,
+ struct inode *dir, const struct qstr *file_name,
+ struct inode *inode, u32 cookie);
} ____cacheline_aligned;
static inline ssize_t call_read_iter(struct file *file, struct kiocb *kio,
--
2.33.0
next prev parent reply other threads:[~2021-10-25 20:47 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-25 20:46 [RFC PATCH 0/7] Inotify support in FUSE and virtiofs Ioannis Angelakopoulos
2021-10-25 20:46 ` [RFC PATCH 1/7] FUSE: Add the fsnotify opcode and in/out structs to FUSE Ioannis Angelakopoulos
2021-10-26 14:56 ` Amir Goldstein
2021-10-26 18:28 ` Amir Goldstein
[not found] ` <CAO17o20+jiij64y7b3eKoCjG5b_mLZj6o1LSnZ7+8exN3dFYEg@mail.gmail.com>
2021-10-27 5:46 ` Amir Goldstein
2021-10-27 21:46 ` Vivek Goyal
2021-10-28 4:13 ` Amir Goldstein
2021-10-28 14:20 ` Vivek Goyal
2021-10-25 20:46 ` [RFC PATCH 2/7] FUSE: Add the remote inotify support capability " Ioannis Angelakopoulos
2021-10-25 20:46 ` [RFC PATCH 3/7] FUSE,Inotify,Fsnotify,VFS: Add the fuse_fsnotify_update_mark inode operation Ioannis Angelakopoulos
2021-10-26 15:06 ` Amir Goldstein
2021-11-01 17:49 ` Vivek Goyal
2021-11-02 7:34 ` Amir Goldstein
2021-10-25 20:46 ` [RFC PATCH 4/7] FUSE: Add the fuse_fsnotify_send_request to FUSE Ioannis Angelakopoulos
2021-10-25 20:46 ` [RFC PATCH 5/7] Fsnotify: Add a wrapper around the fsnotify function Ioannis Angelakopoulos
2021-10-26 14:37 ` Amir Goldstein
2021-10-26 15:38 ` Vivek Goyal
2021-10-25 20:46 ` Ioannis Angelakopoulos [this message]
2021-10-25 20:46 ` [RFC PATCH 7/7] virtiofs: Add support for handling the remote fsnotify notifications Ioannis Angelakopoulos
2021-10-26 15:23 ` [RFC PATCH 0/7] Inotify support in FUSE and virtiofs Amir Goldstein
2021-10-26 15:52 ` Vivek Goyal
2021-10-26 18:19 ` Amir Goldstein
2021-10-26 16:18 ` Vivek Goyal
2021-10-26 17:59 ` Amir Goldstein
2021-10-26 18:27 ` Vivek Goyal
2021-10-26 19:04 ` Amir Goldstein
[not found] ` <CAO17o20sdKAWQN6w7Oe0Ze06qcK+J=6rrmA_aWGnY__MRVDCKw@mail.gmail.com>
2021-10-27 5:59 ` Amir Goldstein
2021-10-27 13:23 ` Jan Kara
2021-10-27 20:29 ` Vivek Goyal
2021-10-27 20:37 ` Vivek Goyal
2021-11-02 11:09 ` Jan Kara
2021-11-02 12:54 ` Amir Goldstein
2021-11-02 20:34 ` Vivek Goyal
2021-11-03 7:31 ` Amir Goldstein
2021-11-03 22:29 ` Vivek Goyal
2021-11-04 5:19 ` Amir Goldstein
2021-11-03 10:09 ` Jan Kara
2021-11-03 11:17 ` Amir Goldstein
2021-11-03 22:36 ` Vivek Goyal
2021-11-04 5:29 ` Amir Goldstein
2021-11-04 10:03 ` Jan Kara
2021-11-05 14:30 ` Vivek Goyal
2021-11-10 6:28 ` Amir Goldstein
2021-11-11 17:30 ` Jan Kara
2021-11-11 20:52 ` Amir Goldstein
2021-10-27 20:24 ` Vivek Goyal
2021-10-28 5:11 ` Amir Goldstein
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211025204634.2517-7-iangelak@redhat.com \
--to=iangelak@redhat.com \
--cc=amir73il@gmail.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=vgoyal@redhat.com \
--cc=viro@zeniv.linux.org.uk \
--cc=virtio-fs@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®