lkml.org 
[lkml]   [2014]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 06/32] NFSv4.1: nfs4_destroy_session must call rpc_destroy_waitqueue
    Date
    3.12-stable review patch.  If anyone has any objections, please let me know.

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

    From: Trond Myklebust <trond.myklebust@primarydata.com>

    commit 20b9a9024540a775395d5d1f41eec0ec6ec41f9b upstream.

    There may still be timers active on the session waitqueues. Make sure
    that we kill them before freeing the memory.

    Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/nfs/nfs4client.c | 2 +-
    fs/nfs/nfs4session.c | 25 ++++++++++++++++++++-----
    fs/nfs/nfs4session.h | 2 +-
    3 files changed, 22 insertions(+), 7 deletions(-)

    --- a/fs/nfs/nfs4client.c
    +++ b/fs/nfs/nfs4client.c
    @@ -169,7 +169,7 @@ void nfs41_shutdown_client(struct nfs_cl
    void nfs40_shutdown_client(struct nfs_client *clp)
    {
    if (clp->cl_slot_tbl) {
    - nfs4_release_slot_table(clp->cl_slot_tbl);
    + nfs4_shutdown_slot_table(clp->cl_slot_tbl);
    kfree(clp->cl_slot_tbl);
    }
    }
    --- a/fs/nfs/nfs4session.c
    +++ b/fs/nfs/nfs4session.c
    @@ -231,14 +231,23 @@ out:
    return ret;
    }

    +/*
    + * nfs4_release_slot_table - release all slot table entries
    + */
    +static void nfs4_release_slot_table(struct nfs4_slot_table *tbl)
    +{
    + nfs4_shrink_slot_table(tbl, 0);
    +}
    +
    /**
    - * nfs4_release_slot_table - release resources attached to a slot table
    + * nfs4_shutdown_slot_table - release resources attached to a slot table
    * @tbl: slot table to shut down
    *
    */
    -void nfs4_release_slot_table(struct nfs4_slot_table *tbl)
    +void nfs4_shutdown_slot_table(struct nfs4_slot_table *tbl)
    {
    - nfs4_shrink_slot_table(tbl, 0);
    + nfs4_release_slot_table(tbl);
    + rpc_destroy_wait_queue(&tbl->slot_tbl_waitq);
    }

    /**
    @@ -422,7 +431,7 @@ void nfs41_update_target_slotid(struct n
    spin_unlock(&tbl->slot_tbl_lock);
    }

    -static void nfs4_destroy_session_slot_tables(struct nfs4_session *session)
    +static void nfs4_release_session_slot_tables(struct nfs4_session *session)
    {
    nfs4_release_slot_table(&session->fc_slot_table);
    nfs4_release_slot_table(&session->bc_slot_table);
    @@ -450,7 +459,7 @@ int nfs4_setup_session_slot_tables(struc
    if (status && tbl->slots == NULL)
    /* Fore and back channel share a connection so get
    * both slot tables or neither */
    - nfs4_destroy_session_slot_tables(ses);
    + nfs4_release_session_slot_tables(ses);
    return status;
    }

    @@ -470,6 +479,12 @@ struct nfs4_session *nfs4_alloc_session(
    return session;
    }

    +static void nfs4_destroy_session_slot_tables(struct nfs4_session *session)
    +{
    + nfs4_shutdown_slot_table(&session->fc_slot_table);
    + nfs4_shutdown_slot_table(&session->bc_slot_table);
    +}
    +
    void nfs4_destroy_session(struct nfs4_session *session)
    {
    struct rpc_xprt *xprt;
    --- a/fs/nfs/nfs4session.h
    +++ b/fs/nfs/nfs4session.h
    @@ -74,7 +74,7 @@ enum nfs4_session_state {

    extern int nfs4_setup_slot_table(struct nfs4_slot_table *tbl,
    unsigned int max_reqs, const char *queue);
    -extern void nfs4_release_slot_table(struct nfs4_slot_table *tbl);
    +extern void nfs4_shutdown_slot_table(struct nfs4_slot_table *tbl);
    extern struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl);
    extern void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot);
    extern void nfs4_slot_tbl_drain_complete(struct nfs4_slot_table *tbl);



    \
     
     \ /
      Last update: 2014-02-19 03:41    [W:3.127 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site