• Vivek Goyal's avatar
    ovl: clear ATTR_OPEN from attr->ia_valid · 15fd2ea9
    Vivek Goyal authored
    As of now during open(), we don't pass bunch of flags to underlying
    filesystem. O_TRUNC is one of these. Normally this is not a problem as VFS
    calls ->setattr() with zero size and underlying filesystem sets file size
    to 0.
    
    But when overlayfs is running on top of virtiofs, it has an optimization
    where it does not send setattr request to server if dectects that
    truncation is part of open(O_TRUNC). It assumes that server already zeroed
    file size as part of open(O_TRUNC).
    
    fuse_do_setattr() {
            if (attr->ia_valid & ATTR_OPEN) {
                    /*
                     * No need to send request to userspace, since actual
                     * truncation has already been done by OPEN.  But still
                     * need to truncate page cache.
                     */
            }
    }
    
    IOW, fuse expects O_TRUNC to be passed to it as part of open flags.
    
    But currently overlayfs does not pass O_TRUNC to underlying filesystem
    hence fuse/virtiofs breaks. Setup overlayfs on top of virtiofs and
    following does not zero the file size of a file is either upper only or has
    already been copied up.
    
    fd = open(foo.txt, O_TRUNC | O_WRONLY);
    
    There are two ways to fix this. Either pass O_TRUNC to underlying
    filesystem or clear ATTR_OPEN from attr->ia_valid so that fuse ends up
    sending a SETATTR request to server. Miklos is concerned that O_TRUNC might
    have side affects so it is better to clear ATTR_OPEN for now. Hence this
    patch clears ATTR_OPEN from attr->ia_valid.
    
    I found this problem while running unionmount-testsuite. With this patch,
    unionmount-testsuite passes with overlayfs on top of virtiofs.
    Signed-off-by: default avatarVivek Goyal <vgoyal@redhat.com>
    Fixes: bccece1e ("ovl: allow remote upper")
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    15fd2ea9
inode.c 27.9 KB