ovl: avoid possible inode number collisions with xino=on
authorAmir Goldstein <amir73il@gmail.com>
Fri, 21 Feb 2020 14:34:44 +0000 (16:34 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Fri, 27 Mar 2020 15:51:02 +0000 (16:51 +0100)
commitdfe51d47b7eeb5642ed92558b62eeff558f00eda
treefe0716c7482cdaa3395aa306375c90715ffaf412
parent4d314f7859dc1925ee28b4d4e74f6f3a80e6f34b
ovl: avoid possible inode number collisions with xino=on

When xino feature is enabled and a real directory inode number overflows
the lower xino bits, we cannot map this directory inode number to a unique
and persistent inode number and we fall back to the real inode st_ino and
overlay st_dev.

The real inode st_ino with high bits may collide with a lower inode number
on overlay st_dev that was mapped using xino.

To avoid possible collision with legitimate xino values, map a non
persistent inode number to a dedicated range in the xino address space.
The dedicated range is created by adding one more bit to the number of
reserved high xino bits.  We could have added just one more fsid, but that
would have had the undesired effect of changing persistent overlay inode
numbers on kernel or require more complex xino mapping code.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/inode.c
fs/overlayfs/readdir.c
fs/overlayfs/super.c