diff options
author | Chung-Chiang Cheng <cccheng@synology.com> | 2023-03-22 14:25:19 +0800 |
---|---|---|
committer | Christian Brauner <brauner@kernel.org> | 2023-04-04 15:57:24 +0200 |
commit | 983652c691990b3257a07f67f4263eb847baa82d (patch) | |
tree | 15d3201ca0564af3e5b0005db13571cfa1734aac | |
parent | 364595a6851bf64e1c38224ae68f5dd6651906d1 (diff) | |
download | lwn-983652c691990b3257a07f67f4263eb847baa82d.tar.gz lwn-983652c691990b3257a07f67f4263eb847baa82d.zip |
splice: report related fsnotify events
The fsnotify ACCESS and MODIFY event are missing when manipulating a file
with splice(2).
Signed-off-by: Chung-Chiang Cheng <cccheng@synology.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Acked-by: Jan Kara <jack@suse.cz>
Message-Id: <20230322062519.409752-1-cccheng@synology.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
-rw-r--r-- | fs/splice.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/splice.c b/fs/splice.c index 2c3dec2b6dfa..0af8d150394f 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -30,6 +30,7 @@ #include <linux/export.h> #include <linux/syscalls.h> #include <linux/uio.h> +#include <linux/fsnotify.h> #include <linux/security.h> #include <linux/gfp.h> #include <linux/socket.h> @@ -1165,6 +1166,9 @@ long do_splice(struct file *in, loff_t *off_in, struct file *out, ret = do_splice_from(ipipe, out, &offset, len, flags); file_end_write(out); + if (ret > 0) + fsnotify_modify(out); + if (!off_out) out->f_pos = offset; else @@ -1188,6 +1192,10 @@ long do_splice(struct file *in, loff_t *off_in, struct file *out, flags |= SPLICE_F_NONBLOCK; ret = splice_file_to_pipe(in, opipe, &offset, len, flags); + + if (ret > 0) + fsnotify_access(in); + if (!off_in) in->f_pos = offset; else |