Blame view

fs/nfs/nfs4session.h 5.19 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
2
3
4
5
6
7
8
9
  /*
   * 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...
10
  /* maximum number of slots to use */
bc4b2a86a   Andy Adamson   NFSv4.1 Increase ...
11
  #define NFS4_DEF_SLOT_TABLE_SIZE (64U)
067c46967   Trond Myklebust   NFSv4.1: Bump the...
12
  #define NFS4_DEF_CB_SLOT_TABLE_SIZE (16U)
0ca3f4825   Trond Myklebust   NFSv4.1: Set the ...
13
  #define NFS4_MAX_SLOT_TABLE (1024U)
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
14
15
16
17
18
19
20
21
22
  #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...
23
24
  	u32			slot_nr;
  	u32		 	seq_nr;
3453d5708   Trond Myklebust   NFSv4.1: Avoid fa...
25
26
27
  	u32		 	seq_nr_last_acked;
  	u32		 	seq_nr_highest_sent;
  	unsigned int		privileged : 1,
07e8dcbda   Trond Myklebust   NFSv4.1: Defer bu...
28
  				seq_done : 1;
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
29
30
31
  };
  
  /* Sessions */
774d5f14e   Andy Adamson   NFSv4.1 Fix a pNF...
32
33
34
  enum nfs4_slot_tbl_state {
  	NFS4_SLOT_TBL_DRAINING,
  };
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
35
36
37
38
39
40
41
  #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...
42
  	wait_queue_head_t	slot_waitq;	/* Completion wait on slot */
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
43
44
45
46
47
48
  	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...
49
50
  	s32		d_target_highest_slotid; /* Derivative */
  	s32		d2_target_highest_slotid; /* 2nd derivative */
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
51
52
53
  	unsigned long	generation;		/* Generation counter for
  						   target_highest_slotid */
  	struct completion complete;
774d5f14e   Andy Adamson   NFSv4.1 Fix a pNF...
54
  	unsigned long	slot_tbl_state;
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  };
  
  /*
   * 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...
73
74
75
76
  };
  
  enum nfs4_session_state {
  	NFS4_SESSION_INITING,
e11259f92   Trond Myklebust   NFSv4.1: Clear th...
77
  	NFS4_SESSION_ESTABLISHED,
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
78
  };
744aa5253   Chuck Lever   NFS: Add global h...
79
80
  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...
81
  extern void nfs4_shutdown_slot_table(struct nfs4_slot_table *tbl);
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
82
  extern struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl);
810d82e68   Trond Myklebust   NFSv4.x: Allow mu...
83
  extern struct nfs4_slot *nfs4_lookup_slot(struct nfs4_slot_table *tbl, u32 slotid);
045d2a6d0   Trond Myklebust   NFSv4.1: Delay ca...
84
85
86
  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...
87
  extern bool nfs4_try_to_lock_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot);
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
88
  extern void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot);
9d33059c1   Chuck Lever   NFS: Enable slot ...
89
  extern void nfs4_slot_tbl_drain_complete(struct nfs4_slot_table *tbl);
9d33059c1   Chuck Lever   NFS: Enable slot ...
90
91
92
93
94
95
96
97
  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...
98
99
100
101
102
  static inline bool nfs4_test_locked_slot(const struct nfs4_slot_table *tbl,
  		u32 slotid)
  {
  	return !!test_bit(slotid, tbl->used_slots);
  }
172d9de15   Anna Schumaker   NFS: Change nfs4_...
103
  static inline struct nfs4_session *nfs4_get_session(const struct nfs_client *clp)
efc6f4aa7   Anna Schumaker   NFS: Move nfs4_ge...
104
  {
172d9de15   Anna Schumaker   NFS: Change nfs4_...
105
  	return clp->cl_session;
efc6f4aa7   Anna Schumaker   NFS: Move nfs4_ge...
106
  }
9d33059c1   Chuck Lever   NFS: Enable slot ...
107
108
109
  #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...
110
111
112
  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 ...
113
114
115
116
117
  
  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 ...
118
  extern int nfs4_init_session(struct nfs_client *clp);
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
119
  extern int nfs4_init_ds_session(struct nfs_client *, unsigned long);
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
  /*
   * 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...
136
137
138
139
140
  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...
141
142
143
144
145
146
147
148
149
150
  #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 ...
151
  #else /* defined(CONFIG_NFS_V4_1) */
18aad3d55   Andy Adamson   NFSv4.1 Refactor ...
152
  static inline int nfs4_init_session(struct nfs_client *clp)
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
153
154
155
  {
  	return 0;
  }
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
156
157
158
159
160
161
162
163
164
165
166
167
  /*
   * 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;
  }
ad05cc0f0   Anna Schumaker   NFS: Make trace_n...
168
  #define nfs_session_id_hash(session) (0)
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
169
  #endif /* defined(CONFIG_NFS_V4_1) */
76e697ba7   Trond Myklebust   NFSv4.1: Move slo...
170
  #endif /* IS_ENABLED(CONFIG_NFS_V4) */
73e39aaa8   Trond Myklebust   NFSv4.1: Cleanup ...
171
  #endif /* __LINUX_FS_NFS_NFS4SESSION_H */