lkml.org 
[lkml]   [2020]   [Jul]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 171/215] ovl: relax WARN_ON() when decoding lower directory file handle
    Date
    From: Amir Goldstein <amir73il@gmail.com>

    commit 124c2de2c0aee96271e4ddab190083d8aa7aa71a upstream.

    Decoding a lower directory file handle to overlay path with cold
    inode/dentry cache may go as follows:

    1. Decode real lower file handle to lower dir path
    2. Check if lower dir is indexed (was copied up)
    3. If indexed, get the upper dir path from index
    4. Lookup upper dir path in overlay
    5. If overlay path found, verify that overlay lower is the lower dir
    from step 1

    On failure to verify step 5 above, user will get an ESTALE error and a
    WARN_ON will be printed.

    A mismatch in step 5 could be a result of lower directory that was renamed
    while overlay was offline, after that lower directory has been copied up
    and indexed.

    This is a scripted reproducer based on xfstest overlay/052:

    # Create lower subdir
    create_dirs
    create_test_files $lower/lowertestdir/subdir
    mount_dirs
    # Copy up lower dir and encode lower subdir file handle
    touch $SCRATCH_MNT/lowertestdir
    test_file_handles $SCRATCH_MNT/lowertestdir/subdir -p -o $tmp.fhandle
    # Rename lower dir offline
    unmount_dirs
    mv $lower/lowertestdir $lower/lowertestdir.new/
    mount_dirs
    # Attempt to decode lower subdir file handle
    test_file_handles $SCRATCH_MNT -p -i $tmp.fhandle

    Since this WARN_ON() can be triggered by user we need to relax it.

    Fixes: 4b91c30a5a19 ("ovl: lookup connected ancestor of dir in inode cache")
    Cc: <stable@vger.kernel.org> # v4.16+
    Signed-off-by: Amir Goldstein <amir73il@gmail.com>
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/overlayfs/export.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/fs/overlayfs/export.c
    +++ b/fs/overlayfs/export.c
    @@ -482,7 +482,7 @@ static struct dentry *ovl_lookup_real_in
    if (IS_ERR_OR_NULL(this))
    return this;

    - if (WARN_ON(ovl_dentry_real_at(this, layer->idx) != real)) {
    + if (ovl_dentry_real_at(this, layer->idx) != real) {
    dput(this);
    this = ERR_PTR(-EIO);
    }

    \
     
     \ /
      Last update: 2020-07-20 18:24    [W:5.295 / U:0.352 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site