Move OWNER reference master=>main. am: 1fb60689ad am: b89666002b

Original change: https://android-review.googlesource.com/c/platform/system/bpfprogs/+/2662745

Change-Id: Ibc084e9480cf1a73fefd8212f079b555570a975a
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/fuseMedia.c b/fuseMedia.c
index cba94c5..41d5406 100644
--- a/fuseMedia.c
+++ b/fuseMedia.c
@@ -34,16 +34,34 @@
             const char* name = fa->in_args[0].value;
 
             bpf_printk("LOOKUP_PREFILTER: %lx %s", fa->nodeid, name);
-            // Using backing implementation but remove bpf_action for children files/directories
-            // in the postfilter.
             return FUSE_BPF_BACKING | FUSE_BPF_POST_FILTER;
         }
 
         case FUSE_LOOKUP | FUSE_POSTFILTER: {
+            struct fuse_entry_out* feo = fa->out_args[0].value;
             struct fuse_entry_bpf_out* febo = fa->out_args[1].value;
+            uint64_t uid_gid = bpf_get_current_uid_gid();
+            uint32_t uid = uid_gid;
+            uint32_t gid = uid_gid >> 32;
 
             febo->bpf_action = FUSE_ACTION_REMOVE;
-            return FUSE_BPF_BACKING;
+
+            /* If the decision is easy, make it here for performance */
+            if (fa->error_in || (feo->attr.mode & 0001) ||
+                ((feo->attr.mode & 0010) && gid == feo->attr.gid) ||
+                ((feo->attr.mode & 0100) && uid == feo->attr.uid))
+                return 0;
+
+            /* Delegate to the daemon */
+            return FUSE_BPF_USER_FILTER;
+        }
+
+        case FUSE_READDIR | FUSE_PREFILTER: {
+            return FUSE_BPF_BACKING | FUSE_BPF_POST_FILTER;
+        }
+
+        case FUSE_READDIR | FUSE_POSTFILTER: {
+            return FUSE_BPF_USER_FILTER;
         }
 
         default: