diff mbox series

[RFC,v4,33/36] fuse-bpf: Add default filter op

Message ID 20240329015351.624249-34-drosen@google.com (mailing list archive)
State New
Headers show
Series Fuse-BPF and plans on merging with Fuse Passthrough | expand

Commit Message

Daniel Rosenberg March 29, 2024, 1:53 a.m. UTC
Add a default bpf func to call if the specific one is not present.
Useful if you wish to track when different ops are handled.

Signed-off-by: Daniel Rosenberg <drosen@google.com>
---
 fs/fuse/backing.c        | 136 +++++++++++++++++++++------------------
 include/linux/bpf_fuse.h |   2 +
 include/uapi/linux/bpf.h |   1 +
 3 files changed, 77 insertions(+), 62 deletions(-)
diff mbox series

Patch

diff --git a/fs/fuse/backing.c b/fs/fuse/backing.c
index 9227e62b8734..ec554a2bc93f 100644
--- a/fs/fuse/backing.c
+++ b/fs/fuse/backing.c
@@ -244,6 +244,12 @@  static inline void bpf_fuse_free_alloced(struct bpf_fuse_args *fa)
 						&fa.info, &feo);	\
 		else							\
 			bpf_next = BPF_FUSE_CONTINUE;			\
+		if (bpf_next == BPF_FUSE_CALL_DEFAULT) {		\
+			if (fuse_ops->default_filter)			\
+				bpf_next = fuse_ops->default_filter(&fa.info); \
+			else						\
+				bpf_next = BPF_FUSE_CONTINUE;		\
+		}							\
 		if (bpf_next < 0) {					\
 			error = bpf_next;				\
 			break;						\
@@ -283,6 +289,12 @@  static inline void bpf_fuse_free_alloced(struct bpf_fuse_args *fa)
 		fa.info.opcode |= FUSE_POSTFILTER;			\
 		if (bpf_next == BPF_FUSE_POSTFILTER)			\
 			bpf_next = call_postfilter(fuse_ops, &fa.info, &feo);\
+		if (bpf_next == BPF_FUSE_CALL_DEFAULT) {		\
+			if (fuse_ops->default_filter)			\
+				bpf_next = fuse_ops->default_filter(&fa.info); \
+			else						\
+				bpf_next = BPF_FUSE_CONTINUE;		\
+		}							\
 		if (bpf_next < 0) {					\
 			error = bpf_next;				\
 			break;						\
@@ -611,7 +623,7 @@  static int fuse_open_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *
 		if (ops->opendir_prefilter)
 			return ops->opendir_prefilter(meta, &open->in);
 	}
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_open_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -625,7 +637,7 @@  static int fuse_open_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 		if (ops->opendir_postfilter)
 			return ops->opendir_postfilter(meta, &open->in, &open->out);
 	}
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_open_backing(struct bpf_fuse_args *fa, int *out,
@@ -767,7 +779,7 @@  static int fuse_create_open_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta
 {
 	if (ops->create_open_prefilter)
 		return ops->create_open_prefilter(meta, &args->in, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_create_open_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -775,7 +787,7 @@  static int fuse_create_open_postfilter(struct fuse_ops *ops, struct bpf_fuse_met
 {
 	if (ops->create_open_postfilter)
 		return ops->create_open_postfilter(meta, &args->in, &args->name, &args->entry_out, &args->open_out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_open_file_backing(struct inode *inode, struct file *file)
@@ -931,7 +943,7 @@  static int fuse_release_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->release_prefilter)
 		return ops->release_prefilter(meta, args);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_release_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -939,7 +951,7 @@  static int fuse_release_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->release_postfilter)
 		return ops->release_postfilter(meta, args);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_releasedir_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -947,7 +959,7 @@  static int fuse_releasedir_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_
 {
 	if (ops->releasedir_prefilter)
 		return ops->releasedir_prefilter(meta, args);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_releasedir_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -955,7 +967,7 @@  static int fuse_releasedir_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta
 {
 	if (ops->releasedir_postfilter)
 		return ops->releasedir_postfilter(meta, args);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_release_backing(struct bpf_fuse_args *fa, int *out,
@@ -1022,7 +1034,7 @@  static int fuse_flush_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->flush_prefilter)
 		return ops->flush_prefilter(meta, args);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_flush_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1030,7 +1042,7 @@  static int fuse_flush_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->flush_postfilter)
 		return ops->flush_postfilter(meta, args);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_flush_backing(struct bpf_fuse_args *fa, int *out, struct file *file, fl_owner_t id)
@@ -1102,7 +1114,7 @@  static int fuse_lseek_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->lseek_prefilter)
 		return ops->lseek_prefilter(meta, &args->in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_lseek_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1110,7 +1122,7 @@  static int fuse_lseek_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->lseek_postfilter)
 		return ops->lseek_postfilter(meta, &args->in, &args->out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_lseek_backing(struct bpf_fuse_args *fa, loff_t *out,
@@ -1217,7 +1229,7 @@  static int fuse_copy_file_range_prefilter(struct fuse_ops *ops, struct bpf_fuse_
 {
 	if (ops->copy_file_range_prefilter)
 		return ops->copy_file_range_prefilter(meta, &args->in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_copy_file_range_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1225,7 +1237,7 @@  static int fuse_copy_file_range_postfilter(struct fuse_ops *ops, struct bpf_fuse
 {
 	if (ops->copy_file_range_postfilter)
 		return ops->copy_file_range_postfilter(meta, &args->in, &args->out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_copy_file_range_backing(struct bpf_fuse_args *fa, ssize_t *out, struct file *file_in,
@@ -1303,7 +1315,7 @@  static int fuse_fsync_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->fsync_prefilter)
 		return ops->fsync_prefilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_fsync_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1311,7 +1323,7 @@  static int fuse_fsync_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->fsync_postfilter)
 		return ops->fsync_postfilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_fsync_backing(struct bpf_fuse_args *fa, int *out,
@@ -1376,7 +1388,7 @@  static int fuse_dir_fsync_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_i
 {
 	if (ops->dir_fsync_prefilter)
 		return ops->fsync_prefilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_dir_fsync_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1384,7 +1396,7 @@  static int fuse_dir_fsync_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_
 {
 	if (ops->dir_fsync_postfilter)
 		return ops->dir_fsync_postfilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 int fuse_bpf_dir_fsync(int *out, struct inode *inode, struct file *file, loff_t start, loff_t end, int datasync)
@@ -1466,7 +1478,7 @@  static int fuse_getxattr_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->getxattr_prefilter)
 		return ops->getxattr_prefilter(meta, &args->in, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_getxattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1474,7 +1486,7 @@  static int fuse_getxattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_i
 {
 	if (ops->getxattr_postfilter)
 		return ops->getxattr_postfilter(meta, &args->in, &args->name, &args->value, &args->out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_getxattr_backing(struct bpf_fuse_args *fa, int *out,
@@ -1580,7 +1592,7 @@  static int fuse_listxattr_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_i
 {
 	if (ops->listxattr_prefilter)
 		return ops->listxattr_prefilter(meta, &args->in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_listxattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1588,7 +1600,7 @@  static int fuse_listxattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_
 {
 	if (ops->listxattr_postfilter)
 		return ops->listxattr_postfilter(meta, &args->in, &args->value, &args->out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_listxattr_backing(struct bpf_fuse_args *fa, ssize_t *out, struct dentry *dentry,
@@ -1701,7 +1713,7 @@  static int fuse_setxattr_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->setxattr_prefilter)
 		return ops->setxattr_prefilter(meta, &args->in, &args->name, &args->value);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_setxattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1709,7 +1721,7 @@  static int fuse_setxattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_i
 {
 	if (ops->setxattr_postfilter)
 		return ops->setxattr_postfilter(meta, &args->in, &args->name, &args->value);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_setxattr_backing(struct bpf_fuse_args *fa, int *out, struct dentry *dentry,
@@ -1777,7 +1789,7 @@  static int fuse_removexattr_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta
 {
 	if (ops->removexattr_prefilter)
 		return ops->removexattr_prefilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_removexattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1785,7 +1797,7 @@  static int fuse_removexattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_met
 {
 	if (ops->removexattr_postfilter)
 		return ops->removexattr_postfilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_removexattr_backing(struct bpf_fuse_args *fa, int *out,
@@ -1904,7 +1916,7 @@  static int fuse_file_read_iter_prefilter(struct fuse_ops *ops, struct bpf_fuse_m
 {
 	if (ops->read_iter_prefilter)
 		return ops->read_iter_prefilter(meta, &args->in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_file_read_iter_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -1912,7 +1924,7 @@  static int fuse_file_read_iter_postfilter(struct fuse_ops *ops, struct bpf_fuse_
 {
 	if (ops->read_iter_postfilter)
 		return ops->read_iter_postfilter(meta, &args->in, &args->out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 // TODO: use backing-file.c
@@ -2044,7 +2056,7 @@  static int fuse_write_iter_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_
 {
 	if (ops->write_iter_prefilter)
 		return ops->write_iter_prefilter(meta, &args->in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_write_iter_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -2052,7 +2064,7 @@  static int fuse_write_iter_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta
 {
 	if (ops->write_iter_postfilter)
 		return ops->write_iter_postfilter(meta, &args->in, &args->out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_file_write_iter_backing(struct bpf_fuse_args *fa, ssize_t *out,
@@ -2232,7 +2244,7 @@  static int fuse_file_fallocate_prefilter(struct fuse_ops *ops, struct bpf_fuse_m
 {
 	if (ops->file_fallocate_prefilter)
 		return ops->file_fallocate_prefilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_file_fallocate_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -2240,7 +2252,7 @@  static int fuse_file_fallocate_postfilter(struct fuse_ops *ops, struct bpf_fuse_
 {
 	if (ops->file_fallocate_postfilter)
 		return ops->file_fallocate_postfilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_file_fallocate_backing(struct bpf_fuse_args *fa, int *out,
@@ -2339,7 +2351,7 @@  static int fuse_lookup_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->lookup_prefilter)
 		return ops->lookup_prefilter(meta, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_lookup_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -2347,7 +2359,7 @@  static int fuse_lookup_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->lookup_postfilter)
 		return ops->lookup_postfilter(meta, &args->name, &args->out, &args->bpf_entries);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_lookup_backing(struct bpf_fuse_args *fa, struct dentry **out, struct inode *dir,
@@ -2603,7 +2615,7 @@  static int fuse_mknod_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->mknod_prefilter)
 		return ops->mknod_prefilter(meta, &args->in, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_mknod_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -2611,7 +2623,7 @@  static int fuse_mknod_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->mknod_postfilter)
 		return ops->mknod_postfilter(meta, &args->in, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_mknod_backing(struct bpf_fuse_args *fa, int *out,
@@ -2773,7 +2785,7 @@  static int fuse_mkdir_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->mkdir_prefilter)
 		return ops->mkdir_prefilter(meta, &args->in, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_mkdir_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -2781,7 +2793,7 @@  static int fuse_mkdir_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->mkdir_prefilter)
 		return ops->mkdir_postfilter(meta, &args->in, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 int fuse_bpf_mkdir(int *out, struct inode *dir, struct dentry *entry, umode_t mode)
@@ -2827,7 +2839,7 @@  static int fuse_rmdir_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->rmdir_prefilter)
 		return ops->rmdir_prefilter(meta, name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_rmdir_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -2835,7 +2847,7 @@  static int fuse_rmdir_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->rmdir_postfilter)
 		return ops->rmdir_postfilter(meta, name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_rmdir_backing(struct bpf_fuse_args *fa, int *out,
@@ -3020,7 +3032,7 @@  static int fuse_rename2_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->rename2_prefilter)
 		return ops->rename2_prefilter(meta, &args->in, &args->old_name, &args->new_name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_rename2_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3028,7 +3040,7 @@  static int fuse_rename2_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->rename2_postfilter)
 		return ops->rename2_postfilter(meta, &args->in, &args->old_name, &args->new_name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_rename2_backing(struct bpf_fuse_args *fa, int *out,
@@ -3124,7 +3136,7 @@  static int fuse_rename_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->rename_prefilter)
 		return ops->rename_prefilter(meta, &args->in, &args->old_name, &args->new_name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_rename_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3132,7 +3144,7 @@  static int fuse_rename_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->rename_postfilter)
 		return ops->rename_postfilter(meta, &args->in, &args->old_name, &args->new_name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_rename_backing(struct bpf_fuse_args *fa, int *out,
@@ -3195,7 +3207,7 @@  static int fuse_unlink_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->unlink_prefilter)
 		return ops->unlink_prefilter(meta, name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_unlink_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3203,7 +3215,7 @@  static int fuse_unlink_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->unlink_postfilter)
 		return ops->unlink_postfilter(meta, name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_unlink_backing(struct bpf_fuse_args *fa, int *out, struct inode *dir, struct dentry *entry)
@@ -3300,7 +3312,7 @@  static int fuse_link_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *
 {
 	if (ops->link_prefilter)
 		return ops->link_prefilter(meta, &args->in, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_link_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3308,7 +3320,7 @@  static int fuse_link_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->link_postfilter)
 		return ops->link_postfilter(meta, &args->in, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 
@@ -3433,7 +3445,7 @@  static int fuse_getattr_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->getattr_prefilter)
 		return ops->getattr_prefilter(meta, &args->in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_getattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3441,7 +3453,7 @@  static int fuse_getattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->getattr_postfilter)
 		return ops->getattr_postfilter(meta, &args->in, &args->out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 /* TODO: unify with overlayfs */
@@ -3597,7 +3609,7 @@  static int fuse_setattr_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->setattr_prefilter)
 		return ops->setattr_prefilter(meta, &args->in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_setattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3605,7 +3617,7 @@  static int fuse_setattr_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->setattr_postfilter)
 		return ops->setattr_postfilter(meta, &args->in, &args->out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_setattr_backing(struct bpf_fuse_args *fa, int *out,
@@ -3680,7 +3692,7 @@  static int fuse_statfs_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->statfs_prefilter)
 		return ops->statfs_prefilter(meta);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_statfs_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3688,7 +3700,7 @@  static int fuse_statfs_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->statfs_postfilter)
 		return ops->statfs_postfilter(meta, out);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_statfs_backing(struct bpf_fuse_args *fa, int *out,
@@ -3801,7 +3813,7 @@  static int fuse_get_link_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->get_link_prefilter)
 		return ops->get_link_prefilter(meta, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_get_link_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3809,7 +3821,7 @@  static int fuse_get_link_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_i
 {
 	if (ops->get_link_postfilter)
 		return ops->get_link_postfilter(meta, &args->name);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_get_link_backing(struct bpf_fuse_args *fa, const char **out,
@@ -3907,7 +3919,7 @@  static int fuse_symlink_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->symlink_prefilter)
 		return ops->symlink_prefilter(meta, &args->name, &args->path);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_symlink_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -3915,7 +3927,7 @@  static int fuse_symlink_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->symlink_postfilter)
 		return ops->symlink_postfilter(meta, &args->name, &args->path);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_symlink_backing(struct bpf_fuse_args *fa, int *out,
@@ -4047,7 +4059,7 @@  static int fuse_readdir_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->readdir_prefilter)
 		return ops->readdir_prefilter(meta, &args->in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_readdir_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -4055,7 +4067,7 @@  static int fuse_readdir_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_in
 {
 	if (ops->readdir_postfilter)
 		return ops->readdir_postfilter(meta, &args->in, &args->out, &args->buffer);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 struct fusebpf_ctx {
@@ -4223,7 +4235,7 @@  static int fuse_access_prefilter(struct fuse_ops *ops, struct bpf_fuse_meta_info
 {
 	if (ops->access_prefilter)
 		return ops->access_prefilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_access_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_info *meta,
@@ -4231,7 +4243,7 @@  static int fuse_access_postfilter(struct fuse_ops *ops, struct bpf_fuse_meta_inf
 {
 	if (ops->access_postfilter)
 		return ops->access_postfilter(meta, in);
-	return BPF_FUSE_CONTINUE;
+	return BPF_FUSE_CALL_DEFAULT;
 }
 
 static int fuse_access_backing(struct bpf_fuse_args *fa, int *out, struct inode *inode, int mask)
diff --git a/include/linux/bpf_fuse.h b/include/linux/bpf_fuse.h
index 15646ba59c41..0747790c47ec 100644
--- a/include/linux/bpf_fuse.h
+++ b/include/linux/bpf_fuse.h
@@ -86,6 +86,8 @@  static inline unsigned bpf_fuse_arg_size(const struct bpf_fuse_arg *arg)
 }
 
 struct fuse_ops {
+	uint32_t (*default_filter)(const struct bpf_fuse_meta_info *meta);
+
 	uint32_t (*open_prefilter)(const struct bpf_fuse_meta_info *meta,
 				struct fuse_open_in *in);
 	uint32_t (*open_postfilter)(const struct bpf_fuse_meta_info *meta,
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 46c1a3e3166d..fe8b485c9335 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -7467,6 +7467,7 @@  struct bpf_iter_num {
 #define BPF_FUSE_USER_PREFILTER		2
 #define BPF_FUSE_POSTFILTER		3
 #define BPF_FUSE_USER_POSTFILTER	4
+#define BPF_FUSE_CALL_DEFAULT		5
 
 /* Op Code Filter values for BPF Programs */
 #define FUSE_OPCODE_FILTER	0x0ffff