lkml.org 
[lkml]   [2021]   [Jan]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 129/152] NFS: nfs_delegation_find_inode_server must first reference the superblock
    Date
    From: Trond Myklebust <trond.myklebust@hammerspace.com>

    commit 113aac6d567bda783af36d08f73bfda47d8e9a40 upstream.

    Before referencing the inode, we must ensure that the superblock can be
    referenced. Otherwise, we can end up with iput() calling superblock
    operations that are no longer valid or accessible.

    Fixes: e39d8a186ed0 ("NFSv4: Fix an Oops during delegation callbacks")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/nfs/delegation.c | 12 +++++++-----
    1 file changed, 7 insertions(+), 5 deletions(-)

    --- a/fs/nfs/delegation.c
    +++ b/fs/nfs/delegation.c
    @@ -1011,22 +1011,24 @@ nfs_delegation_find_inode_server(struct
    const struct nfs_fh *fhandle)
    {
    struct nfs_delegation *delegation;
    - struct inode *freeme, *res = NULL;
    + struct super_block *freeme = NULL;
    + struct inode *res = NULL;

    list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
    spin_lock(&delegation->lock);
    if (delegation->inode != NULL &&
    !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) &&
    nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) {
    - freeme = igrab(delegation->inode);
    - if (freeme && nfs_sb_active(freeme->i_sb))
    - res = freeme;
    + if (nfs_sb_active(server->super)) {
    + freeme = server->super;
    + res = igrab(delegation->inode);
    + }
    spin_unlock(&delegation->lock);
    if (res != NULL)
    return res;
    if (freeme) {
    rcu_read_unlock();
    - iput(freeme);
    + nfs_sb_deactive(freeme);
    rcu_read_lock();
    }
    return ERR_PTR(-EAGAIN);

    \
     
     \ /
      Last update: 2021-01-18 13:29    [W:4.087 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site