Blame view

fs/nfs/nfs4session.h 4.97 KB
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
1
2
3
4
5
6
7
8
  /*
   * fs/nfs/nfs4session.h
   *
   * Copyright (c) 2012 Trond Myklebust <Trond.Myklebust@netapp.com>
   *
   */
  #ifndef __LINUX_FS_NFS_NFS4SESSION_H
  #define __LINUX_FS_NFS_NFS4SESSION_H
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
9
  /* maximum number of slots to use */
bc4b2a86a   Andy Adamson   NFSv4.1 Increase ...
10
  #define NFS4_DEF_SLOT_TABLE_SIZE (64U)
5405fc44c   Trond Myklebust   NFSv4.x: Add kern...
11
  #define NFS4_DEF_CB_SLOT_TABLE_SIZE (1U)
0ca3f4825   Trond Myklebust   NFSv4.1: Set the ...
12
  #define NFS4_MAX_SLOT_TABLE (1024U)
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
13
14
15
16
17
18
19
20
21
  #define NFS4_NO_SLOT ((u32)-1)
  
  #if IS_ENABLED(CONFIG_NFS_V4)
  
  /* Sessions slot seqid */
  struct nfs4_slot {
  	struct nfs4_slot_table	*table;
  	struct nfs4_slot	*next;
  	unsigned long		generation;
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
22
23
  	u32			slot_nr;
  	u32		 	seq_nr;
07e8dcbda   Trond Myklebust   NFSv4.1: Defer bu...
24
  	unsigned int		interrupted : 1,
0a014a44a   Trond Myklebust   NFSv4.1: Don't de...
25
  				privileged : 1,
07e8dcbda   Trond Myklebust   NFSv4.1: Defer bu...
26
  				seq_done : 1;
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
27
28
29
  };
  
  /* Sessions */
774d5f14e   Andy Adamson   NFSv4.1 Fix a pNF...
30
31
32
  enum nfs4_slot_tbl_state {
  	NFS4_SLOT_TBL_DRAINING,
  };
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
33
34
35
36
37
38
39
  #define SLOT_TABLE_SZ DIV_ROUND_UP(NFS4_MAX_SLOT_TABLE, 8*sizeof(long))
  struct nfs4_slot_table {
  	struct nfs4_session *session;		/* Parent session */
  	struct nfs4_slot *slots;		/* seqid per slot */
  	unsigned long   used_slots[SLOT_TABLE_SZ]; /* used/unused bitmap */
  	spinlock_t	slot_tbl_lock;
  	struct rpc_wait_queue	slot_tbl_waitq;	/* allocators may wait here */
045d2a6d0   Trond Myklebust   NFSv4.1: Delay ca...
40
  	wait_queue_head_t	slot_waitq;	/* Completion wait on slot */
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
41
42
43
44
45
46
  	u32		max_slots;		/* # slots in table */
  	u32		max_slotid;		/* Max allowed slotid value */
  	u32		highest_used_slotid;	/* sent to server on each SEQ.
  						 * op for dynamic resizing */
  	u32		target_highest_slotid;	/* Server max_slot target */
  	u32		server_highest_slotid;	/* Server highest slotid */
1fa806442   Trond Myklebust   NFSv4.1: Try to e...
47
48
  	s32		d_target_highest_slotid; /* Derivative */
  	s32		d2_target_highest_slotid; /* 2nd derivative */
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
49
50
51
  	unsigned long	generation;		/* Generation counter for
  						   target_highest_slotid */
  	struct completion complete;
774d5f14e   Andy Adamson   NFSv4.1 Fix a pNF...
52
  	unsigned long	slot_tbl_state;
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  };
  
  /*
   * Session related parameters
   */
  struct nfs4_session {
  	struct nfs4_sessionid		sess_id;
  	u32				flags;
  	unsigned long			session_state;
  	u32				hash_alg;
  	u32				ssv_len;
  
  	/* The fore and back channel */
  	struct nfs4_channel_attrs	fc_attrs;
  	struct nfs4_slot_table		fc_slot_table;
  	struct nfs4_channel_attrs	bc_attrs;
  	struct nfs4_slot_table		bc_slot_table;
  	struct nfs_client		*clp;
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
71
72
73
74
  };
  
  enum nfs4_session_state {
  	NFS4_SESSION_INITING,
e11259f92   Trond Myklebust   NFSv4.1: Clear th...
75
  	NFS4_SESSION_ESTABLISHED,
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
76
  };
744aa5253   Chuck Lever   NFS: Add global h...
77
78
  extern int nfs4_setup_slot_table(struct nfs4_slot_table *tbl,
  		unsigned int max_reqs, const char *queue);
20b9a9024   Trond Myklebust   NFSv4.1: nfs4_des...
79
  extern void nfs4_shutdown_slot_table(struct nfs4_slot_table *tbl);
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
80
  extern struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl);
810d82e68   Trond Myklebust   NFSv4.x: Allow mu...
81
  extern struct nfs4_slot *nfs4_lookup_slot(struct nfs4_slot_table *tbl, u32 slotid);
045d2a6d0   Trond Myklebust   NFSv4.1: Delay ca...
82
83
84
  extern int nfs4_slot_wait_on_seqid(struct nfs4_slot_table *tbl,
  		u32 slotid, u32 seq_nr,
  		unsigned long timeout);
810d82e68   Trond Myklebust   NFSv4.x: Allow mu...
85
  extern bool nfs4_try_to_lock_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot);
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
86
  extern void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot);
9d33059c1   Chuck Lever   NFS: Enable slot ...
87
  extern void nfs4_slot_tbl_drain_complete(struct nfs4_slot_table *tbl);
9d33059c1   Chuck Lever   NFS: Enable slot ...
88
89
90
91
92
93
94
95
  bool nfs41_wake_and_assign_slot(struct nfs4_slot_table *tbl,
  		struct nfs4_slot *slot);
  void nfs41_wake_slot_table(struct nfs4_slot_table *tbl);
  
  static inline bool nfs4_slot_tbl_draining(struct nfs4_slot_table *tbl)
  {
  	return !!test_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state);
  }
810d82e68   Trond Myklebust   NFSv4.x: Allow mu...
96
97
98
99
100
  static inline bool nfs4_test_locked_slot(const struct nfs4_slot_table *tbl,
  		u32 slotid)
  {
  	return !!test_bit(slotid, tbl->used_slots);
  }
9d33059c1   Chuck Lever   NFS: Enable slot ...
101
102
103
  #if defined(CONFIG_NFS_V4_1)
  extern void nfs41_set_target_slotid(struct nfs4_slot_table *tbl,
  		u32 target_highest_slotid);
1cec16abf   Chuck Lever   When CONFIG_NFS_V...
104
105
106
  extern void nfs41_update_target_slotid(struct nfs4_slot_table *tbl,
  		struct nfs4_slot *slot,
  		struct nfs4_sequence_res *res);
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
107
108
109
110
111
  
  extern int nfs4_setup_session_slot_tables(struct nfs4_session *ses);
  
  extern struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp);
  extern void nfs4_destroy_session(struct nfs4_session *session);
18aad3d55   Andy Adamson   NFSv4.1 Refactor ...
112
  extern int nfs4_init_session(struct nfs_client *clp);
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
113
  extern int nfs4_init_ds_session(struct nfs_client *, unsigned long);
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  /*
   * Determine if sessions are in use.
   */
  static inline int nfs4_has_session(const struct nfs_client *clp)
  {
  	if (clp->cl_session)
  		return 1;
  	return 0;
  }
  
  static inline int nfs4_has_persistent_session(const struct nfs_client *clp)
  {
  	if (nfs4_has_session(clp))
  		return (clp->cl_session->flags & SESSION4_PERSIST);
  	return 0;
  }
79969dd12   Trond Myklebust   NFSv4.1: Clean up...
130
131
132
133
134
  static inline void nfs4_copy_sessionid(struct nfs4_sessionid *dst,
  		const struct nfs4_sessionid *src)
  {
  	memcpy(dst->data, src->data, NFS4_MAX_SESSIONID_LEN);
  }
2f92ae343   Trond Myklebust   NFSv4.1: Add trac...
135
136
137
138
139
140
141
142
143
144
  #ifdef CONFIG_CRC32
  /*
   * nfs_session_id_hash - calculate the crc32 hash for the session id
   * @session - pointer to session
   */
  #define nfs_session_id_hash(sess_id) \
  	(~crc32_le(0xFFFFFFFF, &(sess_id)->data[0], sizeof((sess_id)->data)))
  #else
  #define nfs_session_id_hash(session) (0)
  #endif
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
145
  #else /* defined(CONFIG_NFS_V4_1) */
18aad3d55   Andy Adamson   NFSv4.1 Refactor ...
146
  static inline int nfs4_init_session(struct nfs_client *clp)
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
147
148
149
  {
  	return 0;
  }
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
150
151
152
153
154
155
156
157
158
159
160
161
  /*
   * Determine if sessions are in use.
   */
  static inline int nfs4_has_session(const struct nfs_client *clp)
  {
  	return 0;
  }
  
  static inline int nfs4_has_persistent_session(const struct nfs_client *clp)
  {
  	return 0;
  }
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
162
  #endif /* defined(CONFIG_NFS_V4_1) */
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
163
  #endif /* IS_ENABLED(CONFIG_NFS_V4) */
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
164
  #endif /* __LINUX_FS_NFS_NFS4SESSION_H */