Commit 86eaa130 authored by Amir Goldstein's avatar Amir Goldstein Committed by Miklos Szeredi

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: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 37b12916
...@@ -105,12 +105,20 @@ int ovl_getattr(const struct path *path, struct kstat *stat, ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment