]> Pileus Git - ~andy/linux/blobdiff - fs/nfs/nfs4session.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[~andy/linux] / fs / nfs / nfs4session.c
index 36e21cb29d65971dff3f1b104d5685a8cae27d83..cf883c7ae053322626b8aa3c5b18861cd81f0085 100644 (file)
 
 #define NFSDBG_FACILITY                NFSDBG_STATE
 
+static void nfs4_init_slot_table(struct nfs4_slot_table *tbl, const char *queue)
+{
+       tbl->highest_used_slotid = NFS4_NO_SLOT;
+       spin_lock_init(&tbl->slot_tbl_lock);
+       rpc_init_priority_wait_queue(&tbl->slot_tbl_waitq, queue);
+       init_completion(&tbl->complete);
+}
+
 /*
  * nfs4_shrink_slot_table - free retired slots from the slot table
  */
@@ -44,6 +52,17 @@ static void nfs4_shrink_slot_table(struct nfs4_slot_table  *tbl, u32 newsize)
        }
 }
 
+/**
+ * nfs4_slot_tbl_drain_complete - wake waiters when drain is complete
+ * @tbl - controlling slot table
+ *
+ */
+void nfs4_slot_tbl_drain_complete(struct nfs4_slot_table *tbl)
+{
+       if (nfs4_slot_tbl_draining(tbl))
+               complete(&tbl->complete);
+}
+
 /*
  * nfs4_free_slot - free a slot and efficiently update slot table.
  *
@@ -76,7 +95,7 @@ void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot)
                        nfs4_slot_tbl_drain_complete(tbl);
                }
        }
-       dprintk("%s: slotid %u highest_used_slotid %d\n", __func__,
+       dprintk("%s: slotid %u highest_used_slotid %u\n", __func__,
                slotid, tbl->highest_used_slotid);
 }
 
@@ -146,9 +165,9 @@ struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl)
        ret->generation = tbl->generation;
 
 out:
-       dprintk("<-- %s used_slots=%04lx highest_used=%d slotid=%d \n",
+       dprintk("<-- %s used_slots=%04lx highest_used=%u slotid=%u\n",
                __func__, tbl->used_slots[0], tbl->highest_used_slotid,
-               !IS_ERR(ret) ? ret->slot_nr : -1);
+               !IS_ERR(ret) ? ret->slot_nr : NFS4_NO_SLOT);
        return ret;
 }
 
@@ -191,7 +210,7 @@ static int nfs4_realloc_slot_table(struct nfs4_slot_table *tbl,
 {
        int ret;
 
-       dprintk("--> %s: max_reqs=%u, tbl->max_slots %d\n", __func__,
+       dprintk("--> %s: max_reqs=%u, tbl->max_slots %u\n", __func__,
                max_reqs, tbl->max_slots);
 
        if (max_reqs > NFS4_MAX_SLOT_TABLE)
@@ -205,18 +224,36 @@ static int nfs4_realloc_slot_table(struct nfs4_slot_table *tbl,
        nfs4_reset_slot_table(tbl, max_reqs - 1, ivalue);
        spin_unlock(&tbl->slot_tbl_lock);
 
-       dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__,
+       dprintk("%s: tbl=%p slots=%p max_slots=%u\n", __func__,
                tbl, tbl->slots, tbl->max_slots);
 out:
        dprintk("<-- %s: return %d\n", __func__, ret);
        return ret;
 }
 
-/* Destroy the slot table */
-static void nfs4_destroy_slot_tables(struct nfs4_session *session)
+/**
+ * nfs4_release_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)
+{
+       nfs4_shrink_slot_table(tbl, 0);
+}
+
+/**
+ * nfs4_setup_slot_table - prepare a stand-alone slot table for use
+ * @tbl: slot table to set up
+ * @max_reqs: maximum number of requests allowed
+ * @queue: name to give RPC wait queue
+ *
+ * Returns zero on success, or a negative errno.
+ */
+int nfs4_setup_slot_table(struct nfs4_slot_table *tbl, unsigned int max_reqs,
+               const char *queue)
 {
-       nfs4_shrink_slot_table(&session->fc_slot_table, 0);
-       nfs4_shrink_slot_table(&session->bc_slot_table, 0);
+       nfs4_init_slot_table(tbl, queue);
+       return nfs4_realloc_slot_table(tbl, max_reqs, 0);
 }
 
 static bool nfs41_assign_slot(struct rpc_task *task, void *pslot)
@@ -273,6 +310,8 @@ void nfs41_wake_slot_table(struct nfs4_slot_table *tbl)
        }
 }
 
+#if defined(CONFIG_NFS_V4_1)
+
 static void nfs41_set_max_slotid_locked(struct nfs4_slot_table *tbl,
                u32 target_highest_slotid)
 {
@@ -383,6 +422,12 @@ void nfs41_update_target_slotid(struct nfs4_slot_table *tbl,
        spin_unlock(&tbl->slot_tbl_lock);
 }
 
+static void nfs4_destroy_session_slot_tables(struct nfs4_session *session)
+{
+       nfs4_release_slot_table(&session->fc_slot_table);
+       nfs4_release_slot_table(&session->bc_slot_table);
+}
+
 /*
  * Initialize or reset the forechannel and backchannel tables
  */
@@ -405,31 +450,20 @@ int nfs4_setup_session_slot_tables(struct nfs4_session *ses)
        if (status && tbl->slots == NULL)
                /* Fore and back channel share a connection so get
                 * both slot tables or neither */
-               nfs4_destroy_slot_tables(ses);
+               nfs4_destroy_session_slot_tables(ses);
        return status;
 }
 
 struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp)
 {
        struct nfs4_session *session;
-       struct nfs4_slot_table *tbl;
 
        session = kzalloc(sizeof(struct nfs4_session), GFP_NOFS);
        if (!session)
                return NULL;
 
-       tbl = &session->fc_slot_table;
-       tbl->highest_used_slotid = NFS4_NO_SLOT;
-       spin_lock_init(&tbl->slot_tbl_lock);
-       rpc_init_priority_wait_queue(&tbl->slot_tbl_waitq, "ForeChannel Slot table");
-       init_completion(&tbl->complete);
-
-       tbl = &session->bc_slot_table;
-       tbl->highest_used_slotid = NFS4_NO_SLOT;
-       spin_lock_init(&tbl->slot_tbl_lock);
-       rpc_init_wait_queue(&tbl->slot_tbl_waitq, "BackChannel Slot table");
-       init_completion(&tbl->complete);
-
+       nfs4_init_slot_table(&session->fc_slot_table, "ForeChannel Slot table");
+       nfs4_init_slot_table(&session->bc_slot_table, "BackChannel Slot table");
        session->session_state = 1<<NFS4_SESSION_INITING;
 
        session->clp = clp;
@@ -441,7 +475,7 @@ void nfs4_destroy_session(struct nfs4_session *session)
        struct rpc_xprt *xprt;
        struct rpc_cred *cred;
 
-       cred = nfs4_get_exchange_id_cred(session->clp);
+       cred = nfs4_get_clid_cred(session->clp);
        nfs4_proc_destroy_session(session, cred);
        if (cred)
                put_rpccred(cred);
@@ -452,7 +486,7 @@ void nfs4_destroy_session(struct nfs4_session *session)
        dprintk("%s Destroy backchannel for xprt %p\n",
                __func__, xprt);
        xprt_destroy_backchannel(xprt, NFS41_BC_MIN_CALLBACKS);
-       nfs4_destroy_slot_tables(session);
+       nfs4_destroy_session_slot_tables(session);
        kfree(session);
 }
 
@@ -513,4 +547,4 @@ int nfs4_init_ds_session(struct nfs_client *clp, unsigned long lease_time)
 }
 EXPORT_SYMBOL_GPL(nfs4_init_ds_session);
 
-
+#endif /* defined(CONFIG_NFS_V4_1) */