]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
nfs41: Backchannel: Add a backchannel slot table to the session
authorRicardo Labiaga <Ricardo.Labiaga@netapp.com>
Wed, 1 Apr 2009 13:23:33 +0000 (09:23 -0400)
committerBenny Halevy <bhalevy@panasas.com>
Wed, 17 Jun 2009 21:11:42 +0000 (14:11 -0700)
Defines a new 'struct nfs4_slot_table' in the 'struct nfs4_session'
for use by the backchannel.  Initializes, resets, and destroys the backchannel
slot table in the same manner the forechannel slot table is initialized,
reset, and destroyed.

The sequenceid for each slot in the backchannel slot table is initialized
to 0, whereas the forechannel slotid's sequenceid is set to 1.

Signed-off-by: Ricardo Labiaga <Ricardo.Labiaga@netapp.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
fs/nfs/nfs4proc.c
include/linux/nfs_fs_sb.h

index c3019ad8589379ea6ccb031a6657c1bcb285a8fa..57dabb8a048e494d1df269dec09d5e8769a3d997 100644 (file)
@@ -4414,9 +4414,30 @@ static int nfs4_reset_slot_tables(struct nfs4_session *session)
                        session->fc_attrs.max_reqs,
                        session->fc_slot_table.max_slots,
                        1);
+       if (status)
+               return status;
+
+       status = nfs4_reset_slot_table(&session->bc_slot_table,
+                       session->bc_attrs.max_reqs,
+                       session->bc_slot_table.max_slots,
+                       0);
        return status;
 }
 
+/* Destroy the slot table */
+static void nfs4_destroy_slot_tables(struct nfs4_session *session)
+{
+       if (session->fc_slot_table.slots != NULL) {
+               kfree(session->fc_slot_table.slots);
+               session->fc_slot_table.slots = NULL;
+       }
+       if (session->bc_slot_table.slots != NULL) {
+               kfree(session->bc_slot_table.slots);
+               session->bc_slot_table.slots = NULL;
+       }
+       return;
+}
+
 /*
  * Initialize slot table
  */
@@ -4470,17 +4491,15 @@ static int nfs4_init_slot_tables(struct nfs4_session *session)
 
        status = nfs4_init_slot_table(&session->fc_slot_table,
                        session->fc_attrs.max_reqs, 1);
-       return status;
-}
+       if (status)
+               return status;
 
-/* Destroy the slot table */
-static void nfs4_destroy_slot_table(struct nfs4_session *session)
-{
-       if (session->fc_slot_table.slots == NULL)
-               return;
-       kfree(session->fc_slot_table.slots);
-       session->fc_slot_table.slots = NULL;
-       return;
+       status = nfs4_init_slot_table(&session->bc_slot_table,
+                       session->bc_attrs.max_reqs, 0);
+       if (status)
+               nfs4_destroy_slot_tables(session);
+
+       return status;
 }
 
 struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp)
@@ -4503,7 +4522,12 @@ struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp)
 
        tbl = &session->fc_slot_table;
        spin_lock_init(&tbl->slot_tbl_lock);
-       rpc_init_wait_queue(&tbl->slot_tbl_waitq, "Slot table");
+       rpc_init_wait_queue(&tbl->slot_tbl_waitq, "ForeChannel Slot table");
+
+       tbl = &session->bc_slot_table;
+       spin_lock_init(&tbl->slot_tbl_lock);
+       rpc_init_wait_queue(&tbl->slot_tbl_waitq, "BackChannel Slot table");
+
        session->clp = clp;
        return session;
 }
@@ -4515,7 +4539,7 @@ void nfs4_destroy_session(struct nfs4_session *session)
                __func__, session->clp->cl_rpcclient->cl_xprt);
        xprt_destroy_backchannel(session->clp->cl_rpcclient->cl_xprt,
                                NFS41_BC_MIN_CALLBACKS);
-       nfs4_destroy_slot_table(session);
+       nfs4_destroy_slot_tables(session);
        kfree(session);
 }
 
index d0902ccec9cedaa3eab23f75c8ea9ad9c07379bb..19fe15d120429c25b0f36d3abdb9e3d359114f83 100644 (file)
@@ -205,7 +205,7 @@ struct nfs4_session {
        struct nfs4_channel_attrs       fc_attrs;
        struct nfs4_slot_table          fc_slot_table;
        struct nfs4_channel_attrs       bc_attrs;
-                                       /* back channel has one slot */
+       struct nfs4_slot_table          bc_slot_table;
        struct nfs_client               *clp;
 };