lkml.org 
[lkml]   [2018]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 023/246] skip LAYOUTRETURN if layout is invalid
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Olga Kornievskaia <olga.kornievskaia@gmail.com>

    [ Upstream commit 93b7f7ad2018d2037559b1d0892417864c78b371 ]

    Currently, when IO to DS fails, client returns the layout and
    retries against the MDS. However, then on umounting (inode eviction)
    it returns the layout again.

    This is because pnfs_return_layout() was changed in
    commit d78471d32bb6 ("pnfs/blocklayout: set PNFS_LAYOUTRETURN_ON_ERROR")
    to always set NFS_LAYOUT_RETURN_REQUESTED so even if we returned
    the layout, it will be returned again. Instead, let's also check
    if we have already marked the layout invalid.

    Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/nfs/pnfs.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/fs/nfs/pnfs.c
    +++ b/fs/nfs/pnfs.c
    @@ -1126,7 +1126,7 @@ _pnfs_return_layout(struct inode *ino)
    LIST_HEAD(tmp_list);
    nfs4_stateid stateid;
    int status = 0;
    - bool send;
    + bool send, valid_layout;

    dprintk("NFS: %s for inode %lu\n", __func__, ino->i_ino);

    @@ -1147,6 +1147,7 @@ _pnfs_return_layout(struct inode *ino)
    goto out_put_layout_hdr;
    spin_lock(&ino->i_lock);
    }
    + valid_layout = pnfs_layout_is_valid(lo);
    pnfs_clear_layoutcommit(ino, &tmp_list);
    pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL, 0);

    @@ -1160,7 +1161,8 @@ _pnfs_return_layout(struct inode *ino)
    }

    /* Don't send a LAYOUTRETURN if list was initially empty */
    - if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags)) {
    + if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) ||
    + !valid_layout) {
    spin_unlock(&ino->i_lock);
    dprintk("NFS: %s no layout segments to return\n", __func__);
    goto out_put_layout_hdr;

    \
     
     \ /
      Last update: 2018-08-01 20:09    [W:2.515 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site