mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-25 12:00:22 +09:00
ANDROID: fuse-bpf: use target instead of parent inode to execute backing revalidate
Usually as a result of initial fuse lookup with bpf enabled we have following dentry: ----------------------------------------------------------------- | dentry /storage/emulated/0/Android/data | | inode | | backing_inode: /pass_through/emulated/0/Android/data | ----------------------------------------------------------------- Every communication with this folder will have to go through fuse_dentry_revalidate(dentry, flags) which can move forward by: 1. If the timeout is not reached, just ignore it 2. If entry has backing_inode and bpf is not against it, execute revalidate on backing FS (inside kernel) 3. Move to userspace to revalidate But for some reason currently, we're checking parent inode (not one that we wanna revalidate) to have backing inode that we can use to execute operations on. Basically, the whole flow looks like this: 1. Receiving revalidate event for fuse_dentry_revalidate(/storage/emulated/0/Android/data, flags) 2. Checking .../0/Android/ inode to have backing inode <------------------------ Primary problem is HERE 3. Moving to the userspace with pf_lookup(/storage/emulated/0/Android, data) 4. Even though successfully handled lookup on the fuse daemon side, kernel cannot interpret the result due to fuse_simple_request and fuse_lookup_init logic changes <------- Secondary problem is HERE 5. Because of the problems I mentioned before, full lookup is triggered on the kernel side so we receive the second pf_lookup to the userspace Fixing primary problem by executing backing revalidate on the current inode (not the parent one). Bug: 234346312 Test: Manually made sure don't have any userspace calls for interactions inside directory with backing one. Test: Manually check youtube app is successfully saving exo cache into the external storage cache folder. Test: atest --test-mapping packages/providers/MediaProvider Signed-off-by: Dmitrii Merkurev <dimorinny@google.com> Change-Id: Id57f1944302076d93ebef255533dfc53e8c30f20
This commit is contained in:
@@ -212,7 +212,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
|
||||
{
|
||||
struct fuse_err_ret fer;
|
||||
|
||||
fer = fuse_bpf_backing(entry->d_parent->d_inode,
|
||||
fer = fuse_bpf_backing(inode,
|
||||
struct fuse_lookup_io,
|
||||
fuse_lookup_initialize,
|
||||
fuse_revalidate_backing,
|
||||
|
||||
Reference in New Issue
Block a user