VFS regression with 9pfs ("Lookup would have caused loop")

From: Will Deacon
Date: Mon Sep 23 2024 - 06:05:24 EST


Hi Eric,

I'm trying to use kvmtool to run a simple guest under an Android host
but, for v6.9+ guest kernels, 'init' reliably fails to run from a 9pfs
mount because VFS emits this error:

| VFS: Lookup of 'com.android.runtime' in 9p 9p would have caused loop

The host directory being shared is a little odd, as it has symlinks out
to other mount points. In the guest, /apex is a symlink to /host/apex.
On the host, /apex/com.android.runtime is a mounted loopback device:

/dev/block/loop13 on /apex/com.android.runtime type ext4 (ro,dirsync,seclabel,nodev,noatime)

This used to work prior to 724a08450f74 ("fs/9p: simplify iget to remove
unnecessary paths") and it looks like Oleg ran into something similar
before:

https://lore.kernel.org/all/20240408141436.GA17022@xxxxxxxxxx/

although he worked around it by driving QEMU with different options.

I can confirm that reverting the following commits gets mainline guests
working again for me:

724a08450f74 "fs/9p: simplify iget to remove unnecessary paths"
11763a8598f8 "fs/9p: fix uaf in in v9fs_stat2inode_dotl"
10211b4a23cf "fs/9p: remove redundant pointer v9ses"
d05dcfdf5e16 " fs/9p: mitigate inode collisions"

Do you have any better ideas? I'm happy to test anything you might have,
since this is 100% reproducible on my setup.

Cheers,

Will