From 73ed3d189ee5f2ee2a5133a758d0af3ba6810ceb Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Wed, 12 Jan 2022 19:29:56 +0000 Subject: [PATCH] UPSTREAM: ANDROID: fuse-bpf: Support inotify Test: fuse_test, atest CtsOsTestCases:android.os.cts.FileObserverTest Bug: 202785178 Signed-off-by: Daniel Rosenberg Signed-off-by: Paul Lawrence Signed-off-by: Alessio Balsini Change-Id: I88719a8ab23c2042fb8f50462f023e247aa4b6c3 --- fs/fuse/backing.c | 23 +++++++++++++++++++++++ fs/fuse/dir.c | 13 +++++++++++++ fs/fuse/fuse_i.h | 10 ++++++++++ 3 files changed, 46 insertions(+) diff --git a/fs/fuse/backing.c b/fs/fuse/backing.c index d201e59a7086..8f9f4e146023 100644 --- a/fs/fuse/backing.c +++ b/fs/fuse/backing.c @@ -1026,6 +1026,29 @@ void *fuse_revalidate_finalize(struct fuse_args *fa, struct inode *dir, return 0; } +int fuse_canonical_path_initialize(struct fuse_args *fa, + struct fuse_dummy_io *fdi, + const struct path *path, + struct path *canonical_path) +{ + fa->opcode = FUSE_CANONICAL_PATH; + return 0; +} + +int fuse_canonical_path_backing(struct fuse_args *fa, const struct path *path, + struct path *canonical_path) +{ + get_fuse_backing_path(path->dentry, canonical_path); + return 0; +} + +void *fuse_canonical_path_finalize(struct fuse_args *fa, + const struct path *path, + struct path *canonical_path) +{ + return NULL; +} + int fuse_mknod_initialize( struct fuse_args *fa, struct fuse_mknod_in *fmi, struct inode *dir, struct dentry *entry, umode_t mode, dev_t rdev) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index e04b3c77397f..f4208e8da51d 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -331,6 +331,19 @@ static void fuse_dentry_canonical_path(const struct path *path, struct path *can char *path_name; int err; + +#ifdef CONFIG_FUSE_BPF + struct fuse_err_ret fer; + + fer = fuse_bpf_backing(inode, struct fuse_dummy_io, + fuse_canonical_path_initialize, + fuse_canonical_path_backing, + fuse_canonical_path_finalize, path, + canonical_path); + if (fer.ret) + return; +#endif + path_name = (char *)get_zeroed_page(GFP_KERNEL); if (!path_name) goto default_path; diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 7adb8f4a6224..47bcd722a88b 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -1521,6 +1521,16 @@ int fuse_revalidate_backing(struct fuse_args *fa, struct inode *dir, void *fuse_revalidate_finalize(struct fuse_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags); +int fuse_canonical_path_initialize(struct fuse_args *fa, + struct fuse_dummy_io *fdi, + const struct path *path, + struct path *canonical_path); +int fuse_canonical_path_backing(struct fuse_args *fa, const struct path *path, + struct path *canonical_path); +void *fuse_canonical_path_finalize(struct fuse_args *fa, + const struct path *path, + struct path *canonical_path); + struct fuse_getattr_io { struct fuse_getattr_in fgi; struct fuse_attr_out fao;