ovl: unbless lower st_ino of unverified origin
On a malformed overlay, several redirected dirs can point to the same dir on a lower layer. This presents a similar challenge as broken hardlinks, because different objects in the overlay can return the same st_ino/st_dev pair from stat(2). For broken hardlinks, we do not provide constant st_ino on copy up to avoid this inconsistency. When NFS export feature is enabled, apply the same logic to files and directories with unverified lower origin. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
37b12916c0
commit
86eaa13046
@ -105,12 +105,20 @@ int ovl_getattr(const struct path *path, struct kstat *stat,
|
|||||||
* Lower hardlinks may be broken on copy up to different
|
* Lower hardlinks may be broken on copy up to different
|
||||||
* upper files, so we cannot use the lower origin st_ino
|
* upper files, so we cannot use the lower origin st_ino
|
||||||
* for those different files, even for the same fs case.
|
* for those different files, even for the same fs case.
|
||||||
|
*
|
||||||
|
* Similarly, several redirected dirs can point to the
|
||||||
|
* same dir on a lower layer. With the "verify_lower"
|
||||||
|
* feature, we do not use the lower origin st_ino, if
|
||||||
|
* we haven't verified that this redirect is unique.
|
||||||
|
*
|
||||||
* With inodes index enabled, it is safe to use st_ino
|
* With inodes index enabled, it is safe to use st_ino
|
||||||
* of an indexed hardlinked origin. The index validates
|
* of an indexed origin. The index validates that the
|
||||||
* that the upper hardlink is not broken.
|
* upper hardlink is not broken and that a redirected
|
||||||
|
* dir is the only redirect to that origin.
|
||||||
*/
|
*/
|
||||||
if (is_dir || lowerstat.nlink == 1 ||
|
if (ovl_test_flag(OVL_INDEX, d_inode(dentry)) ||
|
||||||
ovl_test_flag(OVL_INDEX, d_inode(dentry)))
|
(!ovl_verify_lower(dentry->d_sb) &&
|
||||||
|
(is_dir || lowerstat.nlink == 1)))
|
||||||
stat->ino = lowerstat.ino;
|
stat->ino = lowerstat.ino;
|
||||||
|
|
||||||
if (samefs)
|
if (samefs)
|
||||||
|
Loading…
Reference in New Issue
Block a user