lkml.org 
[lkml]   [2015]   [Apr]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19 036/101] nfsd: return correct openowner when there is a race to put one in the hash
    Date
    3.19-stable review patch.  If anyone has any objections, please let me know.

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

    From: Jeff Layton <jlayton@poochiereds.net>

    commit c5952338bfc234e54deda45b7228f610a545e28a upstream.

    alloc_init_open_stateowner can return an already freed entry if there is
    a race to put openowners in the hashtable.

    In commit 7ffb588086e9, we changed it so that we allocate and initialize
    an openowner, and then check to see if a matching one got stuffed into
    the hashtable in the meantime. If it did, then we free the one we just
    allocated and take a reference on the one already there. There is a bug
    here though. The code will then return the pointer to the one that was
    allocated (and has now been freed).

    This wasn't evident before as this race almost never occurred. The Linux
    kernel client used to serialize requests for a single openowner. That
    has changed now with v4.0 kernels, and this race can now easily occur.

    Fixes: 7ffb588086e9
    Cc: Trond Myklebust <trond.myklebust@primarydata.com>
    Reported-by: Christoph Hellwig <hch@infradead.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

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

    --- a/fs/nfsd/nfs4state.c
    +++ b/fs/nfsd/nfs4state.c
    @@ -3228,7 +3228,7 @@ alloc_init_open_stateowner(unsigned int
    } else
    nfs4_free_openowner(&oo->oo_owner);
    spin_unlock(&clp->cl_lock);
    - return oo;
    + return ret;
    }

    static void init_open_stateid(struct nfs4_ol_stateid *stp, struct nfs4_file *fp, struct nfsd4_open *open) {



    \
     
     \ /
      Last update: 2015-04-17 16:01    [W:3.746 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site