• Amir Goldstein's avatar
    ovl: fix corner case of non-unique st_dev;st_ino · 9c6d8f13
    Amir Goldstein authored
    On non-samefs overlay without xino, non pure upper inodes should use a
    pseudo_dev assigned to each unique lower fs and pure upper inodes use the
    real upper st_dev.
    
    It is fine for an overlay pure upper inode to use the same st_dev;st_ino
    values as the real upper inode, because the content of those two different
    filesystem objects is always the same.
    
    In this case, however:
     - two filesystems, A and B
     - upper layer is on A
     - lower layer 1 is also on A
     - lower layer 2 is on B
    
    Non pure upper overlay inode, whose origin is in layer 1 will have the same
    st_dev;st_ino values as the real lower inode. This may result with a false
    positive results of 'diff' between the real lower and copied up overlay
    inode.
    
    Fix this by using the upper st_dev;st_ino values in this case.  This breaks
    the property of constant st_dev;st_ino across copy up of this case. This
    breakage will be fixed by a later patch.
    
    Fixes: 5148626b ("ovl: allocate anon bdev per unique lower fs")
    Cc: stable@vger.kernel.org # v4.17+
    Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    9c6d8f13
inode.c 25.5 KB