• Miklos Szeredi's avatar
    ovl: fix filattr copy-up failure · 5b0a414d
    Miklos Szeredi authored
    This regression can be reproduced with ntfs-3g and overlayfs:
    
      mkdir lower upper work overlay
      dd if=/dev/zero of=ntfs.raw bs=1M count=2
      mkntfs -F ntfs.raw
      mount ntfs.raw lower
      touch lower/file.txt
      mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work - overlay
      mv overlay/file.txt overlay/file2.txt
    
    mv fails and (misleadingly) prints
    
      mv: cannot move 'overlay/file.txt' to a subdirectory of itself, 'overlay/file2.txt'
    
    The reason is that ovl_copy_fileattr() is triggered due to S_NOATIME being
    set on all inodes (by fuse) regardless of fileattr.
    
    ovl_copy_fileattr() tries to retrieve file attributes from lower file, but
    that fails because filesystem does not support this ioctl (this should fail
    with ENOTTY, but ntfs-3g return EINVAL instead).  This failure is
    propagated to origial operation (in this case rename) that triggered the
    copy-up.
    
    The fix is to ignore ENOTTY and EINVAL errors from fileattr_get() in copy
    up.  This also requires turning the internal ENOIOCTLCMD into ENOTTY.
    
    As a further measure to prevent unnecessary failures, only try the
    fileattr_get/set on upper if there are any flags to copy up.
    
    Side note: a number of filesystems set S_NOATIME (and sometimes other inode
    flags) irrespective of fileattr flags.  This causes unnecessary calls
    during copy up, which might lead to a performance issue, especially if
    latency is high.  To fix this, the kernel would need to differentiate
    between the two cases.  E.g. introduce SB_NOATIME_UPDATE, a per-sb variant
    of S_NOATIME.  SB_NOATIME doesn't work, because that's interpreted as
    "filesystem doesn't store an atime attribute"
    Reported-and-tested-by: default avatarKevin Locke <kevin@kevinlocke.name>
    Fixes: 72db8211 ("ovl: copy up sync/noatime fileattr flags")
    Cc: <stable@vger.kernel.org> # v5.15
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    5b0a414d
inode.c 31.7 KB