nfsd41: sessions basic data types
authorAndy Adamson <andros@netapp.com>
Fri, 3 Apr 2009 05:27:43 +0000 (08:27 +0300)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Sat, 4 Apr 2009 00:41:13 +0000 (17:41 -0700)
This patch provides basic data structures representing the nfs41
sessions and slots, plus helpers for keeping a reference count
on the session and freeing it.

Note that our server only support a headerpadsz of 0 and
it ignores backchannel attributes at the moment.

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[nfsd41: remove headerpadsz from channel attributes]
[nfsd41: embed nfsd4_channel in nfsd4_session]
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[nfsd41: use bool inuse for slot state]
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[nfsd41 remove sl_session from nfsd4_slot]
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfs4state.c
include/linux/nfsd/state.h

index 070e9e5c0452da816dfcaa52c04ad038e377dd83..8c70f12159b6a39e81519c9e7e6a12725e4e46d2 100644 (file)
@@ -382,6 +382,24 @@ static void release_openowner(struct nfs4_stateowner *sop)
        nfs4_put_stateowner(sop);
 }
 
+static void
+release_session(struct nfsd4_session *ses)
+{
+       list_del(&ses->se_hash);
+       list_del(&ses->se_perclnt);
+       nfsd4_put_session(ses);
+}
+
+void
+free_session(struct kref *kref)
+{
+       struct nfsd4_session *ses;
+
+       ses = container_of(kref, struct nfsd4_session, se_ref);
+       kfree(ses->se_slots);
+       kfree(ses);
+}
+
 static inline void
 renew_client(struct nfs4_client *clp)
 {
index a6e4a00fa3927023291147c57a2700b7e6f212b1..baea7f1fdb4a8db6b0ab3f6b319c3282a85b00d9 100644 (file)
@@ -99,6 +99,39 @@ struct nfs4_callback {
        struct rpc_clnt *       cb_client;
 };
 
+struct nfsd4_slot {
+       bool                            sl_inuse;
+       u32                             sl_seqid;
+};
+
+struct nfsd4_session {
+       struct kref             se_ref;
+       struct list_head        se_hash;        /* hash by sessionid */
+       struct list_head        se_perclnt;
+       u32                     se_flags;
+       struct nfs4_client      *se_client;     /* for expire_client */
+       struct nfs4_sessionid   se_sessionid;
+       u32                     se_fmaxreq_sz;
+       u32                     se_fmaxresp_sz;
+       u32                     se_fmaxresp_cached;
+       u32                     se_fmaxops;
+       u32                     se_fnumslots;
+       struct nfsd4_slot       *se_slots;      /* forward channel slots */
+};
+
+static inline void
+nfsd4_put_session(struct nfsd4_session *ses)
+{
+       extern void free_session(struct kref *kref);
+       kref_put(&ses->se_ref, free_session);
+}
+
+static inline void
+nfsd4_get_session(struct nfsd4_session *ses)
+{
+       kref_get(&ses->se_ref);
+}
+
 #define HEXDIR_LEN     33 /* hex version of 16 byte md5 of cl_name plus '\0' */
 
 /*