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;