On 5/12/21 7:55 AM, Max Reitz wrote: > Mount point directories represent two inodes: On one hand, they are a > normal directory on their parent filesystem. On the other, they are > the > root node of the filesystem mounted there. Thus, they have two inode > IDs. > > Right now, we only report the latter inode ID (i.e. the inode ID of > the > mounted filesystem's root node). This is fine once the guest has > auto-mounted a submount there (so this inode ID goes with a device ID > that is distinct from the parent filesystem), but before the > auto-mount, > they have the device ID of the parent and the inode ID for the > submount. > This is problematic because this is likely exactly the same > st_dev/st_ino combination as the parent filesystem's root node. This > leads to problems for example with `find`, which will thus complain > about a filesystem loop if it has visited the parent filesystem's root > node before, and then refuse to descend into the submount. > > There is a way to find the mount directory's original inode ID, and > that > is to readdir(3) the parent directory, look for the mount directory, > and > read the dirent.d_ino field. Using this, we can let lookup and > readdirplus return that original inode ID, which the guest will thus > show until the submount is auto-mounted. (Then, it will invoke > getattr > and that stat(2) call will return the inode ID for the submount.) > > Signed-off-by: Max Reitz <mre...@redhat.com> > ---
This is a clever way of uncovering the inode ID. Reviewed-by: Connor Kuehl <cku...@redhat.com>