• Miklos Szeredi's avatar
    vfs: do get_write_access() on upper layer of overlayfs · 4d0c5ba2
    Miklos Szeredi authored
    The problem with writecount is: we want consistent handling of it for
    underlying filesystems as well as overlayfs.  Making sure i_writecount is
    correct on all layers is difficult.  Instead this patch makes sure that
    when write access is acquired, it's always done on the underlying writable
    layer (called the upper layer).  We must also make sure to look at the
    writecount on this layer when checking for conflicting leases.
    
    Open for write already updates the upper layer's writecount.  Leaving only
    truncate.
    
    For truncate copy up must happen before get_write_access() so that the
    writecount is updated on the upper layer.  Problem with this is if
    something fails after that, then copy-up was done needlessly.  E.g. if
    break_lease() was interrupted.  Probably not a big deal in practice.
    
    Another interesting case is if there's a denywrite on a lower file that is
    then opened for write or truncated.  With this patch these will succeed,
    which is somewhat counterintuitive.  But I think it's still acceptable,
    considering that the copy-up does actually create a different file, so the
    old, denywrite mapping won't be touched.
    
    On non-overlayfs d_real() is an identity function and d_real_inode() is
    equivalent to d_inode() so this patch doesn't change behavior in that case.
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    Acked-by: default avatarJeff Layton <jlayton@poochiereds.net>
    Cc: "J. Bruce Fields" <bfields@fieldses.org>
    4d0c5ba2
locks.c 71.8 KB