~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/nfsd/nfs4state.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/nfsd/nfs4state.c (Version linux-6.12-rc7) and /fs/nfsd/nfs4state.c (Version linux-6.5.13)


  1 /*                                                  1 /*
  2 *  Copyright (c) 2001 The Regents of the Unive      2 *  Copyright (c) 2001 The Regents of the University of Michigan.
  3 *  All rights reserved.                             3 *  All rights reserved.
  4 *                                                   4 *
  5 *  Kendrick Smith <kmsmith@umich.edu>               5 *  Kendrick Smith <kmsmith@umich.edu>
  6 *  Andy Adamson <kandros@umich.edu>                 6 *  Andy Adamson <kandros@umich.edu>
  7 *                                                   7 *
  8 *  Redistribution and use in source and binary      8 *  Redistribution and use in source and binary forms, with or without
  9 *  modification, are permitted provided that t      9 *  modification, are permitted provided that the following conditions
 10 *  are met:                                        10 *  are met:
 11 *                                                  11 *
 12 *  1. Redistributions of source code must reta     12 *  1. Redistributions of source code must retain the above copyright
 13 *     notice, this list of conditions and the      13 *     notice, this list of conditions and the following disclaimer.
 14 *  2. Redistributions in binary form must repr     14 *  2. Redistributions in binary form must reproduce the above copyright
 15 *     notice, this list of conditions and the      15 *     notice, this list of conditions and the following disclaimer in the
 16 *     documentation and/or other materials pro     16 *     documentation and/or other materials provided with the distribution.
 17 *  3. Neither the name of the University nor t     17 *  3. Neither the name of the University nor the names of its
 18 *     contributors may be used to endorse or p     18 *     contributors may be used to endorse or promote products derived
 19 *     from this software without specific prio     19 *     from this software without specific prior written permission.
 20 *                                                  20 *
 21 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY     21 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 22 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO,      22 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 23 *  MERCHANTABILITY AND FITNESS FOR A PARTICULA     23 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 24 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS O     24 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 25 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECI     25 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 26 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT L     26 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 27 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,      27 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 28 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND O     28 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 29 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIAB     29 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 30 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY     30 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 31 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILIT     31 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 32 *                                                  32 *
 33 */                                                 33 */
 34                                                    34 
 35 #include <linux/file.h>                            35 #include <linux/file.h>
 36 #include <linux/fs.h>                              36 #include <linux/fs.h>
 37 #include <linux/slab.h>                            37 #include <linux/slab.h>
 38 #include <linux/namei.h>                           38 #include <linux/namei.h>
 39 #include <linux/swap.h>                            39 #include <linux/swap.h>
 40 #include <linux/pagemap.h>                         40 #include <linux/pagemap.h>
 41 #include <linux/ratelimit.h>                       41 #include <linux/ratelimit.h>
 42 #include <linux/sunrpc/svcauth_gss.h>              42 #include <linux/sunrpc/svcauth_gss.h>
 43 #include <linux/sunrpc/addr.h>                     43 #include <linux/sunrpc/addr.h>
 44 #include <linux/jhash.h>                           44 #include <linux/jhash.h>
 45 #include <linux/string_helpers.h>                  45 #include <linux/string_helpers.h>
 46 #include <linux/fsnotify.h>                        46 #include <linux/fsnotify.h>
 47 #include <linux/rhashtable.h>                      47 #include <linux/rhashtable.h>
 48 #include <linux/nfs_ssc.h>                         48 #include <linux/nfs_ssc.h>
 49                                                    49 
 50 #include "xdr4.h"                                  50 #include "xdr4.h"
 51 #include "xdr4cb.h"                                51 #include "xdr4cb.h"
 52 #include "vfs.h"                                   52 #include "vfs.h"
 53 #include "current_stateid.h"                       53 #include "current_stateid.h"
 54                                                    54 
 55 #include "netns.h"                                 55 #include "netns.h"
 56 #include "pnfs.h"                                  56 #include "pnfs.h"
 57 #include "filecache.h"                             57 #include "filecache.h"
 58 #include "trace.h"                                 58 #include "trace.h"
 59                                                    59 
 60 #define NFSDDBG_FACILITY                NFSDDB     60 #define NFSDDBG_FACILITY                NFSDDBG_PROC
 61                                                    61 
 62 #define all_ones {{ ~0, ~0}, ~0}               !!  62 #define all_ones {{~0,~0},~0}
 63 static const stateid_t one_stateid = {             63 static const stateid_t one_stateid = {
 64         .si_generation = ~0,                       64         .si_generation = ~0,
 65         .si_opaque = all_ones,                     65         .si_opaque = all_ones,
 66 };                                                 66 };
 67 static const stateid_t zero_stateid = {            67 static const stateid_t zero_stateid = {
 68         /* all fields zero */                      68         /* all fields zero */
 69 };                                                 69 };
 70 static const stateid_t currentstateid = {          70 static const stateid_t currentstateid = {
 71         .si_generation = 1,                        71         .si_generation = 1,
 72 };                                                 72 };
 73 static const stateid_t close_stateid = {           73 static const stateid_t close_stateid = {
 74         .si_generation = 0xffffffffU,              74         .si_generation = 0xffffffffU,
 75 };                                                 75 };
 76                                                    76 
 77 static u64 current_sessionid = 1;                  77 static u64 current_sessionid = 1;
 78                                                    78 
 79 #define ZERO_STATEID(stateid) (!memcmp((statei     79 #define ZERO_STATEID(stateid) (!memcmp((stateid), &zero_stateid, sizeof(stateid_t)))
 80 #define ONE_STATEID(stateid)  (!memcmp((statei     80 #define ONE_STATEID(stateid)  (!memcmp((stateid), &one_stateid, sizeof(stateid_t)))
 81 #define CURRENT_STATEID(stateid) (!memcmp((sta     81 #define CURRENT_STATEID(stateid) (!memcmp((stateid), &currentstateid, sizeof(stateid_t)))
 82 #define CLOSE_STATEID(stateid)  (!memcmp((stat     82 #define CLOSE_STATEID(stateid)  (!memcmp((stateid), &close_stateid, sizeof(stateid_t)))
 83                                                    83 
 84 /* forward declarations */                         84 /* forward declarations */
 85 static bool check_for_locks(struct nfs4_file *     85 static bool check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner);
 86 static void nfs4_free_ol_stateid(struct nfs4_s     86 static void nfs4_free_ol_stateid(struct nfs4_stid *stid);
 87 void nfsd4_end_grace(struct nfsd_net *nn);         87 void nfsd4_end_grace(struct nfsd_net *nn);
 88 static void _free_cpntf_state_locked(struct nf     88 static void _free_cpntf_state_locked(struct nfsd_net *nn, struct nfs4_cpntf_state *cps);
 89 static void nfsd4_file_hash_remove(struct nfs4     89 static void nfsd4_file_hash_remove(struct nfs4_file *fi);
 90 static void deleg_reaper(struct nfsd_net *nn); << 
 91                                                    90 
 92 /* Locking: */                                     91 /* Locking: */
 93                                                    92 
 94 /*                                                 93 /*
 95  * Currently used for the del_recall_lru and f     94  * Currently used for the del_recall_lru and file hash table.  In an
 96  * effort to decrease the scope of the client_     95  * effort to decrease the scope of the client_mutex, this spinlock may
 97  * eventually cover more:                          96  * eventually cover more:
 98  */                                                97  */
 99 static DEFINE_SPINLOCK(state_lock);                98 static DEFINE_SPINLOCK(state_lock);
100                                                    99 
101 enum nfsd4_st_mutex_lock_subclass {               100 enum nfsd4_st_mutex_lock_subclass {
102         OPEN_STATEID_MUTEX = 0,                   101         OPEN_STATEID_MUTEX = 0,
103         LOCK_STATEID_MUTEX = 1,                   102         LOCK_STATEID_MUTEX = 1,
104 };                                                103 };
105                                                   104 
106 /*                                                105 /*
107  * A waitqueue for all in-progress 4.0 CLOSE o    106  * A waitqueue for all in-progress 4.0 CLOSE operations that are waiting for
108  * the refcount on the open stateid to drop.      107  * the refcount on the open stateid to drop.
109  */                                               108  */
110 static DECLARE_WAIT_QUEUE_HEAD(close_wq);         109 static DECLARE_WAIT_QUEUE_HEAD(close_wq);
111                                                   110 
112 /*                                                111 /*
113  * A waitqueue where a writer to clients/#/ctl    112  * A waitqueue where a writer to clients/#/ctl destroying a client can
114  * wait for cl_rpc_users to drop to 0 and then    113  * wait for cl_rpc_users to drop to 0 and then for the client to be
115  * unhashed.                                      114  * unhashed.
116  */                                               115  */
117 static DECLARE_WAIT_QUEUE_HEAD(expiry_wq);        116 static DECLARE_WAIT_QUEUE_HEAD(expiry_wq);
118                                                   117 
119 static struct kmem_cache *client_slab;            118 static struct kmem_cache *client_slab;
120 static struct kmem_cache *openowner_slab;         119 static struct kmem_cache *openowner_slab;
121 static struct kmem_cache *lockowner_slab;         120 static struct kmem_cache *lockowner_slab;
122 static struct kmem_cache *file_slab;              121 static struct kmem_cache *file_slab;
123 static struct kmem_cache *stateid_slab;           122 static struct kmem_cache *stateid_slab;
124 static struct kmem_cache *deleg_slab;             123 static struct kmem_cache *deleg_slab;
125 static struct kmem_cache *odstate_slab;           124 static struct kmem_cache *odstate_slab;
126                                                   125 
127 static void free_session(struct nfsd4_session     126 static void free_session(struct nfsd4_session *);
128                                                   127 
129 static const struct nfsd4_callback_ops nfsd4_c    128 static const struct nfsd4_callback_ops nfsd4_cb_recall_ops;
130 static const struct nfsd4_callback_ops nfsd4_c    129 static const struct nfsd4_callback_ops nfsd4_cb_notify_lock_ops;
131 static const struct nfsd4_callback_ops nfsd4_c << 
132                                                   130 
133 static struct workqueue_struct *laundry_wq;       131 static struct workqueue_struct *laundry_wq;
134                                                   132 
135 int nfsd4_create_laundry_wq(void)                 133 int nfsd4_create_laundry_wq(void)
136 {                                                 134 {
137         int rc = 0;                               135         int rc = 0;
138                                                   136 
139         laundry_wq = alloc_workqueue("%s", WQ_    137         laundry_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, "nfsd4");
140         if (laundry_wq == NULL)                   138         if (laundry_wq == NULL)
141                 rc = -ENOMEM;                     139                 rc = -ENOMEM;
142         return rc;                                140         return rc;
143 }                                                 141 }
144                                                   142 
145 void nfsd4_destroy_laundry_wq(void)               143 void nfsd4_destroy_laundry_wq(void)
146 {                                                 144 {
147         destroy_workqueue(laundry_wq);            145         destroy_workqueue(laundry_wq);
148 }                                                 146 }
149                                                   147 
150 static bool is_session_dead(struct nfsd4_sessi    148 static bool is_session_dead(struct nfsd4_session *ses)
151 {                                                 149 {
152         return ses->se_flags & NFS4_SESSION_DE    150         return ses->se_flags & NFS4_SESSION_DEAD;
153 }                                                 151 }
154                                                   152 
155 static __be32 mark_session_dead_locked(struct     153 static __be32 mark_session_dead_locked(struct nfsd4_session *ses, int ref_held_by_me)
156 {                                                 154 {
157         if (atomic_read(&ses->se_ref) > ref_he    155         if (atomic_read(&ses->se_ref) > ref_held_by_me)
158                 return nfserr_jukebox;            156                 return nfserr_jukebox;
159         ses->se_flags |= NFS4_SESSION_DEAD;       157         ses->se_flags |= NFS4_SESSION_DEAD;
160         return nfs_ok;                            158         return nfs_ok;
161 }                                                 159 }
162                                                   160 
163 static bool is_client_expired(struct nfs4_clie    161 static bool is_client_expired(struct nfs4_client *clp)
164 {                                                 162 {
165         return clp->cl_time == 0;                 163         return clp->cl_time == 0;
166 }                                                 164 }
167                                                   165 
168 static void nfsd4_dec_courtesy_client_count(st    166 static void nfsd4_dec_courtesy_client_count(struct nfsd_net *nn,
169                                         struct    167                                         struct nfs4_client *clp)
170 {                                                 168 {
171         if (clp->cl_state != NFSD4_ACTIVE)        169         if (clp->cl_state != NFSD4_ACTIVE)
172                 atomic_add_unless(&nn->nfsd_co    170                 atomic_add_unless(&nn->nfsd_courtesy_clients, -1, 0);
173 }                                                 171 }
174                                                   172 
175 static __be32 get_client_locked(struct nfs4_cl    173 static __be32 get_client_locked(struct nfs4_client *clp)
176 {                                                 174 {
177         struct nfsd_net *nn = net_generic(clp-    175         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
178                                                   176 
179         lockdep_assert_held(&nn->client_lock);    177         lockdep_assert_held(&nn->client_lock);
180                                                   178 
181         if (is_client_expired(clp))               179         if (is_client_expired(clp))
182                 return nfserr_expired;            180                 return nfserr_expired;
183         atomic_inc(&clp->cl_rpc_users);           181         atomic_inc(&clp->cl_rpc_users);
184         nfsd4_dec_courtesy_client_count(nn, cl    182         nfsd4_dec_courtesy_client_count(nn, clp);
185         clp->cl_state = NFSD4_ACTIVE;             183         clp->cl_state = NFSD4_ACTIVE;
186         return nfs_ok;                            184         return nfs_ok;
187 }                                                 185 }
188                                                   186 
189 /* must be called under the client_lock */        187 /* must be called under the client_lock */
190 static inline void                                188 static inline void
191 renew_client_locked(struct nfs4_client *clp)      189 renew_client_locked(struct nfs4_client *clp)
192 {                                                 190 {
193         struct nfsd_net *nn = net_generic(clp-    191         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
194                                                   192 
195         if (is_client_expired(clp)) {             193         if (is_client_expired(clp)) {
196                 WARN_ON(1);                       194                 WARN_ON(1);
197                 printk("%s: client (clientid %    195                 printk("%s: client (clientid %08x/%08x) already expired\n",
198                         __func__,                 196                         __func__,
199                         clp->cl_clientid.cl_bo    197                         clp->cl_clientid.cl_boot,
200                         clp->cl_clientid.cl_id    198                         clp->cl_clientid.cl_id);
201                 return;                           199                 return;
202         }                                         200         }
203                                                   201 
204         list_move_tail(&clp->cl_lru, &nn->clie    202         list_move_tail(&clp->cl_lru, &nn->client_lru);
205         clp->cl_time = ktime_get_boottime_seco    203         clp->cl_time = ktime_get_boottime_seconds();
206         nfsd4_dec_courtesy_client_count(nn, cl    204         nfsd4_dec_courtesy_client_count(nn, clp);
207         clp->cl_state = NFSD4_ACTIVE;             205         clp->cl_state = NFSD4_ACTIVE;
208 }                                                 206 }
209                                                   207 
210 static void put_client_renew_locked(struct nfs    208 static void put_client_renew_locked(struct nfs4_client *clp)
211 {                                                 209 {
212         struct nfsd_net *nn = net_generic(clp-    210         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
213                                                   211 
214         lockdep_assert_held(&nn->client_lock);    212         lockdep_assert_held(&nn->client_lock);
215                                                   213 
216         if (!atomic_dec_and_test(&clp->cl_rpc_    214         if (!atomic_dec_and_test(&clp->cl_rpc_users))
217                 return;                           215                 return;
218         if (!is_client_expired(clp))              216         if (!is_client_expired(clp))
219                 renew_client_locked(clp);         217                 renew_client_locked(clp);
220         else                                      218         else
221                 wake_up_all(&expiry_wq);          219                 wake_up_all(&expiry_wq);
222 }                                                 220 }
223                                                   221 
224 static void put_client_renew(struct nfs4_clien    222 static void put_client_renew(struct nfs4_client *clp)
225 {                                                 223 {
226         struct nfsd_net *nn = net_generic(clp-    224         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
227                                                   225 
228         if (!atomic_dec_and_lock(&clp->cl_rpc_    226         if (!atomic_dec_and_lock(&clp->cl_rpc_users, &nn->client_lock))
229                 return;                           227                 return;
230         if (!is_client_expired(clp))              228         if (!is_client_expired(clp))
231                 renew_client_locked(clp);         229                 renew_client_locked(clp);
232         else                                      230         else
233                 wake_up_all(&expiry_wq);          231                 wake_up_all(&expiry_wq);
234         spin_unlock(&nn->client_lock);            232         spin_unlock(&nn->client_lock);
235 }                                                 233 }
236                                                   234 
237 static __be32 nfsd4_get_session_locked(struct     235 static __be32 nfsd4_get_session_locked(struct nfsd4_session *ses)
238 {                                                 236 {
239         __be32 status;                            237         __be32 status;
240                                                   238 
241         if (is_session_dead(ses))                 239         if (is_session_dead(ses))
242                 return nfserr_badsession;         240                 return nfserr_badsession;
243         status = get_client_locked(ses->se_cli    241         status = get_client_locked(ses->se_client);
244         if (status)                               242         if (status)
245                 return status;                    243                 return status;
246         atomic_inc(&ses->se_ref);                 244         atomic_inc(&ses->se_ref);
247         return nfs_ok;                            245         return nfs_ok;
248 }                                                 246 }
249                                                   247 
250 static void nfsd4_put_session_locked(struct nf    248 static void nfsd4_put_session_locked(struct nfsd4_session *ses)
251 {                                                 249 {
252         struct nfs4_client *clp = ses->se_clie    250         struct nfs4_client *clp = ses->se_client;
253         struct nfsd_net *nn = net_generic(clp-    251         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
254                                                   252 
255         lockdep_assert_held(&nn->client_lock);    253         lockdep_assert_held(&nn->client_lock);
256                                                   254 
257         if (atomic_dec_and_test(&ses->se_ref)     255         if (atomic_dec_and_test(&ses->se_ref) && is_session_dead(ses))
258                 free_session(ses);                256                 free_session(ses);
259         put_client_renew_locked(clp);             257         put_client_renew_locked(clp);
260 }                                                 258 }
261                                                   259 
262 static void nfsd4_put_session(struct nfsd4_ses    260 static void nfsd4_put_session(struct nfsd4_session *ses)
263 {                                                 261 {
264         struct nfs4_client *clp = ses->se_clie    262         struct nfs4_client *clp = ses->se_client;
265         struct nfsd_net *nn = net_generic(clp-    263         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
266                                                   264 
267         spin_lock(&nn->client_lock);              265         spin_lock(&nn->client_lock);
268         nfsd4_put_session_locked(ses);            266         nfsd4_put_session_locked(ses);
269         spin_unlock(&nn->client_lock);            267         spin_unlock(&nn->client_lock);
270 }                                                 268 }
271                                                   269 
272 static struct nfsd4_blocked_lock *                270 static struct nfsd4_blocked_lock *
273 find_blocked_lock(struct nfs4_lockowner *lo, s    271 find_blocked_lock(struct nfs4_lockowner *lo, struct knfsd_fh *fh,
274                         struct nfsd_net *nn)      272                         struct nfsd_net *nn)
275 {                                                 273 {
276         struct nfsd4_blocked_lock *cur, *found    274         struct nfsd4_blocked_lock *cur, *found = NULL;
277                                                   275 
278         spin_lock(&nn->blocked_locks_lock);       276         spin_lock(&nn->blocked_locks_lock);
279         list_for_each_entry(cur, &lo->lo_block    277         list_for_each_entry(cur, &lo->lo_blocked, nbl_list) {
280                 if (fh_match(fh, &cur->nbl_fh)    278                 if (fh_match(fh, &cur->nbl_fh)) {
281                         list_del_init(&cur->nb    279                         list_del_init(&cur->nbl_list);
282                         WARN_ON(list_empty(&cu    280                         WARN_ON(list_empty(&cur->nbl_lru));
283                         list_del_init(&cur->nb    281                         list_del_init(&cur->nbl_lru);
284                         found = cur;              282                         found = cur;
285                         break;                    283                         break;
286                 }                                 284                 }
287         }                                         285         }
288         spin_unlock(&nn->blocked_locks_lock);     286         spin_unlock(&nn->blocked_locks_lock);
289         if (found)                                287         if (found)
290                 locks_delete_block(&found->nbl    288                 locks_delete_block(&found->nbl_lock);
291         return found;                             289         return found;
292 }                                                 290 }
293                                                   291 
294 static struct nfsd4_blocked_lock *                292 static struct nfsd4_blocked_lock *
295 find_or_allocate_block(struct nfs4_lockowner *    293 find_or_allocate_block(struct nfs4_lockowner *lo, struct knfsd_fh *fh,
296                         struct nfsd_net *nn)      294                         struct nfsd_net *nn)
297 {                                                 295 {
298         struct nfsd4_blocked_lock *nbl;           296         struct nfsd4_blocked_lock *nbl;
299                                                   297 
300         nbl = find_blocked_lock(lo, fh, nn);      298         nbl = find_blocked_lock(lo, fh, nn);
301         if (!nbl) {                               299         if (!nbl) {
302                 nbl = kmalloc(sizeof(*nbl), GF !! 300                 nbl= kmalloc(sizeof(*nbl), GFP_KERNEL);
303                 if (nbl) {                        301                 if (nbl) {
304                         INIT_LIST_HEAD(&nbl->n    302                         INIT_LIST_HEAD(&nbl->nbl_list);
305                         INIT_LIST_HEAD(&nbl->n    303                         INIT_LIST_HEAD(&nbl->nbl_lru);
306                         fh_copy_shallow(&nbl->    304                         fh_copy_shallow(&nbl->nbl_fh, fh);
307                         locks_init_lock(&nbl->    305                         locks_init_lock(&nbl->nbl_lock);
308                         kref_init(&nbl->nbl_kr    306                         kref_init(&nbl->nbl_kref);
309                         nfsd4_init_cb(&nbl->nb    307                         nfsd4_init_cb(&nbl->nbl_cb, lo->lo_owner.so_client,
310                                         &nfsd4    308                                         &nfsd4_cb_notify_lock_ops,
311                                         NFSPRO    309                                         NFSPROC4_CLNT_CB_NOTIFY_LOCK);
312                 }                                 310                 }
313         }                                         311         }
314         return nbl;                               312         return nbl;
315 }                                                 313 }
316                                                   314 
317 static void                                       315 static void
318 free_nbl(struct kref *kref)                       316 free_nbl(struct kref *kref)
319 {                                                 317 {
320         struct nfsd4_blocked_lock *nbl;           318         struct nfsd4_blocked_lock *nbl;
321                                                   319 
322         nbl = container_of(kref, struct nfsd4_    320         nbl = container_of(kref, struct nfsd4_blocked_lock, nbl_kref);
323         locks_release_private(&nbl->nbl_lock); << 
324         kfree(nbl);                               321         kfree(nbl);
325 }                                                 322 }
326                                                   323 
327 static void                                       324 static void
328 free_blocked_lock(struct nfsd4_blocked_lock *n    325 free_blocked_lock(struct nfsd4_blocked_lock *nbl)
329 {                                                 326 {
330         locks_delete_block(&nbl->nbl_lock);       327         locks_delete_block(&nbl->nbl_lock);
                                                   >> 328         locks_release_private(&nbl->nbl_lock);
331         kref_put(&nbl->nbl_kref, free_nbl);       329         kref_put(&nbl->nbl_kref, free_nbl);
332 }                                                 330 }
333                                                   331 
334 static void                                       332 static void
335 remove_blocked_locks(struct nfs4_lockowner *lo    333 remove_blocked_locks(struct nfs4_lockowner *lo)
336 {                                                 334 {
337         struct nfs4_client *clp = lo->lo_owner    335         struct nfs4_client *clp = lo->lo_owner.so_client;
338         struct nfsd_net *nn = net_generic(clp-    336         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
339         struct nfsd4_blocked_lock *nbl;           337         struct nfsd4_blocked_lock *nbl;
340         LIST_HEAD(reaplist);                      338         LIST_HEAD(reaplist);
341                                                   339 
342         /* Dequeue all blocked locks */           340         /* Dequeue all blocked locks */
343         spin_lock(&nn->blocked_locks_lock);       341         spin_lock(&nn->blocked_locks_lock);
344         while (!list_empty(&lo->lo_blocked)) {    342         while (!list_empty(&lo->lo_blocked)) {
345                 nbl = list_first_entry(&lo->lo    343                 nbl = list_first_entry(&lo->lo_blocked,
346                                         struct    344                                         struct nfsd4_blocked_lock,
347                                         nbl_li    345                                         nbl_list);
348                 list_del_init(&nbl->nbl_list);    346                 list_del_init(&nbl->nbl_list);
349                 WARN_ON(list_empty(&nbl->nbl_l    347                 WARN_ON(list_empty(&nbl->nbl_lru));
350                 list_move(&nbl->nbl_lru, &reap    348                 list_move(&nbl->nbl_lru, &reaplist);
351         }                                         349         }
352         spin_unlock(&nn->blocked_locks_lock);     350         spin_unlock(&nn->blocked_locks_lock);
353                                                   351 
354         /* Now free them */                       352         /* Now free them */
355         while (!list_empty(&reaplist)) {          353         while (!list_empty(&reaplist)) {
356                 nbl = list_first_entry(&reapli    354                 nbl = list_first_entry(&reaplist, struct nfsd4_blocked_lock,
357                                         nbl_lr    355                                         nbl_lru);
358                 list_del_init(&nbl->nbl_lru);     356                 list_del_init(&nbl->nbl_lru);
359                 free_blocked_lock(nbl);           357                 free_blocked_lock(nbl);
360         }                                         358         }
361 }                                                 359 }
362                                                   360 
363 static void                                       361 static void
364 nfsd4_cb_notify_lock_prepare(struct nfsd4_call    362 nfsd4_cb_notify_lock_prepare(struct nfsd4_callback *cb)
365 {                                                 363 {
366         struct nfsd4_blocked_lock       *nbl =    364         struct nfsd4_blocked_lock       *nbl = container_of(cb,
367                                                   365                                                 struct nfsd4_blocked_lock, nbl_cb);
368         locks_delete_block(&nbl->nbl_lock);       366         locks_delete_block(&nbl->nbl_lock);
369 }                                                 367 }
370                                                   368 
371 static int                                        369 static int
372 nfsd4_cb_notify_lock_done(struct nfsd4_callbac    370 nfsd4_cb_notify_lock_done(struct nfsd4_callback *cb, struct rpc_task *task)
373 {                                                 371 {
374         trace_nfsd_cb_notify_lock_done(&zero_s    372         trace_nfsd_cb_notify_lock_done(&zero_stateid, task);
375                                                   373 
376         /*                                        374         /*
377          * Since this is just an optimization,    375          * Since this is just an optimization, we don't try very hard if it
378          * turns out not to succeed. We'll req    376          * turns out not to succeed. We'll requeue it on NFS4ERR_DELAY, and
379          * just quit trying on anything else.     377          * just quit trying on anything else.
380          */                                       378          */
381         switch (task->tk_status) {                379         switch (task->tk_status) {
382         case -NFS4ERR_DELAY:                      380         case -NFS4ERR_DELAY:
383                 rpc_delay(task, 1 * HZ);          381                 rpc_delay(task, 1 * HZ);
384                 return 0;                         382                 return 0;
385         default:                                  383         default:
386                 return 1;                         384                 return 1;
387         }                                         385         }
388 }                                                 386 }
389                                                   387 
390 static void                                       388 static void
391 nfsd4_cb_notify_lock_release(struct nfsd4_call    389 nfsd4_cb_notify_lock_release(struct nfsd4_callback *cb)
392 {                                                 390 {
393         struct nfsd4_blocked_lock       *nbl =    391         struct nfsd4_blocked_lock       *nbl = container_of(cb,
394                                                   392                                                 struct nfsd4_blocked_lock, nbl_cb);
395                                                   393 
396         free_blocked_lock(nbl);                   394         free_blocked_lock(nbl);
397 }                                                 395 }
398                                                   396 
399 static const struct nfsd4_callback_ops nfsd4_c    397 static const struct nfsd4_callback_ops nfsd4_cb_notify_lock_ops = {
400         .prepare        = nfsd4_cb_notify_lock    398         .prepare        = nfsd4_cb_notify_lock_prepare,
401         .done           = nfsd4_cb_notify_lock    399         .done           = nfsd4_cb_notify_lock_done,
402         .release        = nfsd4_cb_notify_lock    400         .release        = nfsd4_cb_notify_lock_release,
403         .opcode         = OP_CB_NOTIFY_LOCK,   << 
404 };                                                401 };
405                                                   402 
406 /*                                                403 /*
407  * We store the NONE, READ, WRITE, and BOTH bi    404  * We store the NONE, READ, WRITE, and BOTH bits separately in the
408  * st_{access,deny}_bmap field of the stateid,    405  * st_{access,deny}_bmap field of the stateid, in order to track not
409  * only what share bits are currently in force    406  * only what share bits are currently in force, but also what
410  * combinations of share bits previous opens h    407  * combinations of share bits previous opens have used.  This allows us
411  * to enforce the recommendation in               408  * to enforce the recommendation in
412  * https://datatracker.ietf.org/doc/html/rfc75    409  * https://datatracker.ietf.org/doc/html/rfc7530#section-16.19.4 that
413  * the server return an error if the client at    410  * the server return an error if the client attempt to downgrade to a
414  * combination of share bits not explicable by    411  * combination of share bits not explicable by closing some of its
415  * previous opens.                                412  * previous opens.
416  *                                                413  *
417  * This enforcement is arguably incomplete, si    414  * This enforcement is arguably incomplete, since we don't keep
418  * track of access/deny bit combinations; so,     415  * track of access/deny bit combinations; so, e.g., we allow:
419  *                                                416  *
420  *      OPEN allow read, deny write               417  *      OPEN allow read, deny write
421  *      OPEN allow both, deny none                418  *      OPEN allow both, deny none
422  *      DOWNGRADE allow read, deny none           419  *      DOWNGRADE allow read, deny none
423  *                                                420  *
424  * which we should reject.                        421  * which we should reject.
425  *                                                422  *
426  * But you could also argue that our current c    423  * But you could also argue that our current code is already overkill,
427  * since it only exists to return NFS4ERR_INVA    424  * since it only exists to return NFS4ERR_INVAL on incorrect client
428  * behavior.                                      425  * behavior.
429  */                                               426  */
430 static unsigned int                               427 static unsigned int
431 bmap_to_share_mode(unsigned long bmap)            428 bmap_to_share_mode(unsigned long bmap)
432 {                                                 429 {
433         int i;                                    430         int i;
434         unsigned int access = 0;                  431         unsigned int access = 0;
435                                                   432 
436         for (i = 1; i < 4; i++) {                 433         for (i = 1; i < 4; i++) {
437                 if (test_bit(i, &bmap))           434                 if (test_bit(i, &bmap))
438                         access |= i;              435                         access |= i;
439         }                                         436         }
440         return access;                            437         return access;
441 }                                                 438 }
442                                                   439 
443 /* set share access for a given stateid */        440 /* set share access for a given stateid */
444 static inline void                                441 static inline void
445 set_access(u32 access, struct nfs4_ol_stateid     442 set_access(u32 access, struct nfs4_ol_stateid *stp)
446 {                                                 443 {
447         unsigned char mask = 1 << access;         444         unsigned char mask = 1 << access;
448                                                   445 
449         WARN_ON_ONCE(access > NFS4_SHARE_ACCES    446         WARN_ON_ONCE(access > NFS4_SHARE_ACCESS_BOTH);
450         stp->st_access_bmap |= mask;              447         stp->st_access_bmap |= mask;
451 }                                                 448 }
452                                                   449 
453 /* clear share access for a given stateid */      450 /* clear share access for a given stateid */
454 static inline void                                451 static inline void
455 clear_access(u32 access, struct nfs4_ol_statei    452 clear_access(u32 access, struct nfs4_ol_stateid *stp)
456 {                                                 453 {
457         unsigned char mask = 1 << access;         454         unsigned char mask = 1 << access;
458                                                   455 
459         WARN_ON_ONCE(access > NFS4_SHARE_ACCES    456         WARN_ON_ONCE(access > NFS4_SHARE_ACCESS_BOTH);
460         stp->st_access_bmap &= ~mask;             457         stp->st_access_bmap &= ~mask;
461 }                                                 458 }
462                                                   459 
463 /* test whether a given stateid has access */     460 /* test whether a given stateid has access */
464 static inline bool                                461 static inline bool
465 test_access(u32 access, struct nfs4_ol_stateid    462 test_access(u32 access, struct nfs4_ol_stateid *stp)
466 {                                                 463 {
467         unsigned char mask = 1 << access;         464         unsigned char mask = 1 << access;
468                                                   465 
469         return (bool)(stp->st_access_bmap & ma    466         return (bool)(stp->st_access_bmap & mask);
470 }                                                 467 }
471                                                   468 
472 /* set share deny for a given stateid */          469 /* set share deny for a given stateid */
473 static inline void                                470 static inline void
474 set_deny(u32 deny, struct nfs4_ol_stateid *stp    471 set_deny(u32 deny, struct nfs4_ol_stateid *stp)
475 {                                                 472 {
476         unsigned char mask = 1 << deny;           473         unsigned char mask = 1 << deny;
477                                                   474 
478         WARN_ON_ONCE(deny > NFS4_SHARE_DENY_BO    475         WARN_ON_ONCE(deny > NFS4_SHARE_DENY_BOTH);
479         stp->st_deny_bmap |= mask;                476         stp->st_deny_bmap |= mask;
480 }                                                 477 }
481                                                   478 
482 /* clear share deny for a given stateid */        479 /* clear share deny for a given stateid */
483 static inline void                                480 static inline void
484 clear_deny(u32 deny, struct nfs4_ol_stateid *s    481 clear_deny(u32 deny, struct nfs4_ol_stateid *stp)
485 {                                                 482 {
486         unsigned char mask = 1 << deny;           483         unsigned char mask = 1 << deny;
487                                                   484 
488         WARN_ON_ONCE(deny > NFS4_SHARE_DENY_BO    485         WARN_ON_ONCE(deny > NFS4_SHARE_DENY_BOTH);
489         stp->st_deny_bmap &= ~mask;               486         stp->st_deny_bmap &= ~mask;
490 }                                                 487 }
491                                                   488 
492 /* test whether a given stateid is denying spe    489 /* test whether a given stateid is denying specific access */
493 static inline bool                                490 static inline bool
494 test_deny(u32 deny, struct nfs4_ol_stateid *st    491 test_deny(u32 deny, struct nfs4_ol_stateid *stp)
495 {                                                 492 {
496         unsigned char mask = 1 << deny;           493         unsigned char mask = 1 << deny;
497                                                   494 
498         return (bool)(stp->st_deny_bmap & mask    495         return (bool)(stp->st_deny_bmap & mask);
499 }                                                 496 }
500                                                   497 
501 static int nfs4_access_to_omode(u32 access)       498 static int nfs4_access_to_omode(u32 access)
502 {                                                 499 {
503         switch (access & NFS4_SHARE_ACCESS_BOT    500         switch (access & NFS4_SHARE_ACCESS_BOTH) {
504         case NFS4_SHARE_ACCESS_READ:              501         case NFS4_SHARE_ACCESS_READ:
505                 return O_RDONLY;                  502                 return O_RDONLY;
506         case NFS4_SHARE_ACCESS_WRITE:             503         case NFS4_SHARE_ACCESS_WRITE:
507                 return O_WRONLY;                  504                 return O_WRONLY;
508         case NFS4_SHARE_ACCESS_BOTH:              505         case NFS4_SHARE_ACCESS_BOTH:
509                 return O_RDWR;                    506                 return O_RDWR;
510         }                                         507         }
511         WARN_ON_ONCE(1);                          508         WARN_ON_ONCE(1);
512         return O_RDONLY;                          509         return O_RDONLY;
513 }                                                 510 }
514                                                   511 
515 static inline int                                 512 static inline int
516 access_permit_read(struct nfs4_ol_stateid *stp    513 access_permit_read(struct nfs4_ol_stateid *stp)
517 {                                                 514 {
518         return test_access(NFS4_SHARE_ACCESS_R    515         return test_access(NFS4_SHARE_ACCESS_READ, stp) ||
519                 test_access(NFS4_SHARE_ACCESS_    516                 test_access(NFS4_SHARE_ACCESS_BOTH, stp) ||
520                 test_access(NFS4_SHARE_ACCESS_    517                 test_access(NFS4_SHARE_ACCESS_WRITE, stp);
521 }                                                 518 }
522                                                   519 
523 static inline int                                 520 static inline int
524 access_permit_write(struct nfs4_ol_stateid *st    521 access_permit_write(struct nfs4_ol_stateid *stp)
525 {                                                 522 {
526         return test_access(NFS4_SHARE_ACCESS_W    523         return test_access(NFS4_SHARE_ACCESS_WRITE, stp) ||
527                 test_access(NFS4_SHARE_ACCESS_    524                 test_access(NFS4_SHARE_ACCESS_BOTH, stp);
528 }                                                 525 }
529                                                   526 
530 static inline struct nfs4_stateowner *            527 static inline struct nfs4_stateowner *
531 nfs4_get_stateowner(struct nfs4_stateowner *so    528 nfs4_get_stateowner(struct nfs4_stateowner *sop)
532 {                                                 529 {
533         atomic_inc(&sop->so_count);               530         atomic_inc(&sop->so_count);
534         return sop;                               531         return sop;
535 }                                                 532 }
536                                                   533 
537 static int                                        534 static int
538 same_owner_str(struct nfs4_stateowner *sop, st    535 same_owner_str(struct nfs4_stateowner *sop, struct xdr_netobj *owner)
539 {                                                 536 {
540         return (sop->so_owner.len == owner->le    537         return (sop->so_owner.len == owner->len) &&
541                 0 == memcmp(sop->so_owner.data    538                 0 == memcmp(sop->so_owner.data, owner->data, owner->len);
542 }                                                 539 }
543                                                   540 
544 static struct nfs4_openowner *                    541 static struct nfs4_openowner *
545 find_openstateowner_str(unsigned int hashval,  !! 542 find_openstateowner_str_locked(unsigned int hashval, struct nfsd4_open *open,
546                         struct nfs4_client *cl    543                         struct nfs4_client *clp)
547 {                                                 544 {
548         struct nfs4_stateowner *so;               545         struct nfs4_stateowner *so;
549                                                   546 
550         lockdep_assert_held(&clp->cl_lock);       547         lockdep_assert_held(&clp->cl_lock);
551                                                   548 
552         list_for_each_entry(so, &clp->cl_owner    549         list_for_each_entry(so, &clp->cl_ownerstr_hashtbl[hashval],
553                             so_strhash) {         550                             so_strhash) {
554                 if (!so->so_is_open_owner)        551                 if (!so->so_is_open_owner)
555                         continue;                 552                         continue;
556                 if (same_owner_str(so, &open->    553                 if (same_owner_str(so, &open->op_owner))
557                         return openowner(nfs4_    554                         return openowner(nfs4_get_stateowner(so));
558         }                                         555         }
559         return NULL;                              556         return NULL;
560 }                                                 557 }
561                                                   558 
                                                   >> 559 static struct nfs4_openowner *
                                                   >> 560 find_openstateowner_str(unsigned int hashval, struct nfsd4_open *open,
                                                   >> 561                         struct nfs4_client *clp)
                                                   >> 562 {
                                                   >> 563         struct nfs4_openowner *oo;
                                                   >> 564 
                                                   >> 565         spin_lock(&clp->cl_lock);
                                                   >> 566         oo = find_openstateowner_str_locked(hashval, open, clp);
                                                   >> 567         spin_unlock(&clp->cl_lock);
                                                   >> 568         return oo;
                                                   >> 569 }
                                                   >> 570 
562 static inline u32                                 571 static inline u32
563 opaque_hashval(const void *ptr, int nbytes)       572 opaque_hashval(const void *ptr, int nbytes)
564 {                                                 573 {
565         unsigned char *cptr = (unsigned char *    574         unsigned char *cptr = (unsigned char *) ptr;
566                                                   575 
567         u32 x = 0;                                576         u32 x = 0;
568         while (nbytes--) {                        577         while (nbytes--) {
569                 x *= 37;                          578                 x *= 37;
570                 x += *cptr++;                     579                 x += *cptr++;
571         }                                         580         }
572         return x;                                 581         return x;
573 }                                                 582 }
574                                                   583 
575 static void nfsd4_free_file_rcu(struct rcu_hea    584 static void nfsd4_free_file_rcu(struct rcu_head *rcu)
576 {                                                 585 {
577         struct nfs4_file *fp = container_of(rc    586         struct nfs4_file *fp = container_of(rcu, struct nfs4_file, fi_rcu);
578                                                   587 
579         kmem_cache_free(file_slab, fp);           588         kmem_cache_free(file_slab, fp);
580 }                                                 589 }
581                                                   590 
582 void                                              591 void
583 put_nfs4_file(struct nfs4_file *fi)               592 put_nfs4_file(struct nfs4_file *fi)
584 {                                                 593 {
585         if (refcount_dec_and_test(&fi->fi_ref)    594         if (refcount_dec_and_test(&fi->fi_ref)) {
586                 nfsd4_file_hash_remove(fi);       595                 nfsd4_file_hash_remove(fi);
587                 WARN_ON_ONCE(!list_empty(&fi->    596                 WARN_ON_ONCE(!list_empty(&fi->fi_clnt_odstate));
588                 WARN_ON_ONCE(!list_empty(&fi->    597                 WARN_ON_ONCE(!list_empty(&fi->fi_delegations));
589                 call_rcu(&fi->fi_rcu, nfsd4_fr    598                 call_rcu(&fi->fi_rcu, nfsd4_free_file_rcu);
590         }                                         599         }
591 }                                                 600 }
592                                                   601 
593 static struct nfsd_file *                         602 static struct nfsd_file *
594 find_writeable_file_locked(struct nfs4_file *f    603 find_writeable_file_locked(struct nfs4_file *f)
595 {                                                 604 {
596         struct nfsd_file *ret;                    605         struct nfsd_file *ret;
597                                                   606 
598         lockdep_assert_held(&f->fi_lock);         607         lockdep_assert_held(&f->fi_lock);
599                                                   608 
600         ret = nfsd_file_get(f->fi_fds[O_WRONLY    609         ret = nfsd_file_get(f->fi_fds[O_WRONLY]);
601         if (!ret)                                 610         if (!ret)
602                 ret = nfsd_file_get(f->fi_fds[    611                 ret = nfsd_file_get(f->fi_fds[O_RDWR]);
603         return ret;                               612         return ret;
604 }                                                 613 }
605                                                   614 
606 static struct nfsd_file *                         615 static struct nfsd_file *
607 find_writeable_file(struct nfs4_file *f)          616 find_writeable_file(struct nfs4_file *f)
608 {                                                 617 {
609         struct nfsd_file *ret;                    618         struct nfsd_file *ret;
610                                                   619 
611         spin_lock(&f->fi_lock);                   620         spin_lock(&f->fi_lock);
612         ret = find_writeable_file_locked(f);      621         ret = find_writeable_file_locked(f);
613         spin_unlock(&f->fi_lock);                 622         spin_unlock(&f->fi_lock);
614                                                   623 
615         return ret;                               624         return ret;
616 }                                                 625 }
617                                                   626 
618 static struct nfsd_file *                         627 static struct nfsd_file *
619 find_readable_file_locked(struct nfs4_file *f)    628 find_readable_file_locked(struct nfs4_file *f)
620 {                                                 629 {
621         struct nfsd_file *ret;                    630         struct nfsd_file *ret;
622                                                   631 
623         lockdep_assert_held(&f->fi_lock);         632         lockdep_assert_held(&f->fi_lock);
624                                                   633 
625         ret = nfsd_file_get(f->fi_fds[O_RDONLY    634         ret = nfsd_file_get(f->fi_fds[O_RDONLY]);
626         if (!ret)                                 635         if (!ret)
627                 ret = nfsd_file_get(f->fi_fds[    636                 ret = nfsd_file_get(f->fi_fds[O_RDWR]);
628         return ret;                               637         return ret;
629 }                                                 638 }
630                                                   639 
631 static struct nfsd_file *                         640 static struct nfsd_file *
632 find_readable_file(struct nfs4_file *f)           641 find_readable_file(struct nfs4_file *f)
633 {                                                 642 {
634         struct nfsd_file *ret;                    643         struct nfsd_file *ret;
635                                                   644 
636         spin_lock(&f->fi_lock);                   645         spin_lock(&f->fi_lock);
637         ret = find_readable_file_locked(f);       646         ret = find_readable_file_locked(f);
638         spin_unlock(&f->fi_lock);                 647         spin_unlock(&f->fi_lock);
639                                                   648 
640         return ret;                               649         return ret;
641 }                                                 650 }
642                                                   651 
643 static struct nfsd_file *                      << 
644 find_rw_file(struct nfs4_file *f)              << 
645 {                                              << 
646         struct nfsd_file *ret;                 << 
647                                                << 
648         spin_lock(&f->fi_lock);                << 
649         ret = nfsd_file_get(f->fi_fds[O_RDWR]) << 
650         spin_unlock(&f->fi_lock);              << 
651                                                << 
652         return ret;                            << 
653 }                                              << 
654                                                << 
655 struct nfsd_file *                                652 struct nfsd_file *
656 find_any_file(struct nfs4_file *f)                653 find_any_file(struct nfs4_file *f)
657 {                                                 654 {
658         struct nfsd_file *ret;                    655         struct nfsd_file *ret;
659                                                   656 
660         if (!f)                                   657         if (!f)
661                 return NULL;                      658                 return NULL;
662         spin_lock(&f->fi_lock);                   659         spin_lock(&f->fi_lock);
663         ret = nfsd_file_get(f->fi_fds[O_RDWR])    660         ret = nfsd_file_get(f->fi_fds[O_RDWR]);
664         if (!ret) {                               661         if (!ret) {
665                 ret = nfsd_file_get(f->fi_fds[    662                 ret = nfsd_file_get(f->fi_fds[O_WRONLY]);
666                 if (!ret)                         663                 if (!ret)
667                         ret = nfsd_file_get(f-    664                         ret = nfsd_file_get(f->fi_fds[O_RDONLY]);
668         }                                         665         }
669         spin_unlock(&f->fi_lock);                 666         spin_unlock(&f->fi_lock);
670         return ret;                               667         return ret;
671 }                                                 668 }
672                                                   669 
673 static struct nfsd_file *find_any_file_locked(    670 static struct nfsd_file *find_any_file_locked(struct nfs4_file *f)
674 {                                                 671 {
675         lockdep_assert_held(&f->fi_lock);         672         lockdep_assert_held(&f->fi_lock);
676                                                   673 
677         if (f->fi_fds[O_RDWR])                    674         if (f->fi_fds[O_RDWR])
678                 return f->fi_fds[O_RDWR];         675                 return f->fi_fds[O_RDWR];
679         if (f->fi_fds[O_WRONLY])                  676         if (f->fi_fds[O_WRONLY])
680                 return f->fi_fds[O_WRONLY];       677                 return f->fi_fds[O_WRONLY];
681         if (f->fi_fds[O_RDONLY])                  678         if (f->fi_fds[O_RDONLY])
682                 return f->fi_fds[O_RDONLY];       679                 return f->fi_fds[O_RDONLY];
683         return NULL;                              680         return NULL;
684 }                                                 681 }
685                                                   682 
686 static atomic_long_t num_delegations;             683 static atomic_long_t num_delegations;
687 unsigned long max_delegations;                    684 unsigned long max_delegations;
688                                                   685 
689 /*                                                686 /*
690  * Open owner state (share locks)                 687  * Open owner state (share locks)
691  */                                               688  */
692                                                   689 
693 /* hash tables for lock and open owners */        690 /* hash tables for lock and open owners */
694 #define OWNER_HASH_BITS              8            691 #define OWNER_HASH_BITS              8
695 #define OWNER_HASH_SIZE             (1 << OWNE    692 #define OWNER_HASH_SIZE             (1 << OWNER_HASH_BITS)
696 #define OWNER_HASH_MASK             (OWNER_HAS    693 #define OWNER_HASH_MASK             (OWNER_HASH_SIZE - 1)
697                                                   694 
698 static unsigned int ownerstr_hashval(struct xd    695 static unsigned int ownerstr_hashval(struct xdr_netobj *ownername)
699 {                                                 696 {
700         unsigned int ret;                         697         unsigned int ret;
701                                                   698 
702         ret = opaque_hashval(ownername->data,     699         ret = opaque_hashval(ownername->data, ownername->len);
703         return ret & OWNER_HASH_MASK;             700         return ret & OWNER_HASH_MASK;
704 }                                                 701 }
705                                                   702 
706 static struct rhltable nfs4_file_rhltable ____    703 static struct rhltable nfs4_file_rhltable ____cacheline_aligned_in_smp;
707                                                   704 
708 static const struct rhashtable_params nfs4_fil    705 static const struct rhashtable_params nfs4_file_rhash_params = {
709         .key_len                = sizeof_field    706         .key_len                = sizeof_field(struct nfs4_file, fi_inode),
710         .key_offset             = offsetof(str    707         .key_offset             = offsetof(struct nfs4_file, fi_inode),
711         .head_offset            = offsetof(str    708         .head_offset            = offsetof(struct nfs4_file, fi_rlist),
712                                                   709 
713         /*                                        710         /*
714          * Start with a single page hash table    711          * Start with a single page hash table to reduce resizing churn
715          * on light workloads.                    712          * on light workloads.
716          */                                       713          */
717         .min_size               = 256,            714         .min_size               = 256,
718         .automatic_shrinking    = true,           715         .automatic_shrinking    = true,
719 };                                                716 };
720                                                   717 
721 /*                                                718 /*
722  * Check if courtesy clients have conflicting     719  * Check if courtesy clients have conflicting access and resolve it if possible
723  *                                                720  *
724  * access:  is op_share_access if share_access    721  * access:  is op_share_access if share_access is true.
725  *          Check if access mode, op_share_acc    722  *          Check if access mode, op_share_access, would conflict with
726  *          the current deny mode of the file     723  *          the current deny mode of the file 'fp'.
727  * access:  is op_share_deny if share_access i    724  * access:  is op_share_deny if share_access is false.
728  *          Check if the deny mode, op_share_d    725  *          Check if the deny mode, op_share_deny, would conflict with
729  *          current access of the file 'fp'.      726  *          current access of the file 'fp'.
730  * stp:     skip checking this entry.             727  * stp:     skip checking this entry.
731  * new_stp: normal open, not open upgrade.        728  * new_stp: normal open, not open upgrade.
732  *                                                729  *
733  * Function returns:                              730  * Function returns:
734  *      false - access/deny mode conflict with    731  *      false - access/deny mode conflict with normal client.
735  *      true  - no conflict or conflict with c    732  *      true  - no conflict or conflict with courtesy client(s) is resolved.
736  */                                               733  */
737 static bool                                       734 static bool
738 nfs4_resolve_deny_conflicts_locked(struct nfs4    735 nfs4_resolve_deny_conflicts_locked(struct nfs4_file *fp, bool new_stp,
739                 struct nfs4_ol_stateid *stp, u    736                 struct nfs4_ol_stateid *stp, u32 access, bool share_access)
740 {                                                 737 {
741         struct nfs4_ol_stateid *st;               738         struct nfs4_ol_stateid *st;
742         bool resolvable = true;                   739         bool resolvable = true;
743         unsigned char bmap;                       740         unsigned char bmap;
744         struct nfsd_net *nn;                      741         struct nfsd_net *nn;
745         struct nfs4_client *clp;                  742         struct nfs4_client *clp;
746                                                   743 
747         lockdep_assert_held(&fp->fi_lock);        744         lockdep_assert_held(&fp->fi_lock);
748         list_for_each_entry(st, &fp->fi_statei    745         list_for_each_entry(st, &fp->fi_stateids, st_perfile) {
749                 /* ignore lock stateid */         746                 /* ignore lock stateid */
750                 if (st->st_openstp)               747                 if (st->st_openstp)
751                         continue;                 748                         continue;
752                 if (st == stp && new_stp)         749                 if (st == stp && new_stp)
753                         continue;                 750                         continue;
754                 /* check file access against d    751                 /* check file access against deny mode or vice versa */
755                 bmap = share_access ? st->st_d    752                 bmap = share_access ? st->st_deny_bmap : st->st_access_bmap;
756                 if (!(access & bmap_to_share_m    753                 if (!(access & bmap_to_share_mode(bmap)))
757                         continue;                 754                         continue;
758                 clp = st->st_stid.sc_client;      755                 clp = st->st_stid.sc_client;
759                 if (try_to_expire_client(clp))    756                 if (try_to_expire_client(clp))
760                         continue;                 757                         continue;
761                 resolvable = false;               758                 resolvable = false;
762                 break;                            759                 break;
763         }                                         760         }
764         if (resolvable) {                         761         if (resolvable) {
765                 clp = stp->st_stid.sc_client;     762                 clp = stp->st_stid.sc_client;
766                 nn = net_generic(clp->net, nfs    763                 nn = net_generic(clp->net, nfsd_net_id);
767                 mod_delayed_work(laundry_wq, &    764                 mod_delayed_work(laundry_wq, &nn->laundromat_work, 0);
768         }                                         765         }
769         return resolvable;                        766         return resolvable;
770 }                                                 767 }
771                                                   768 
772 static void                                       769 static void
773 __nfs4_file_get_access(struct nfs4_file *fp, u    770 __nfs4_file_get_access(struct nfs4_file *fp, u32 access)
774 {                                                 771 {
775         lockdep_assert_held(&fp->fi_lock);        772         lockdep_assert_held(&fp->fi_lock);
776                                                   773 
777         if (access & NFS4_SHARE_ACCESS_WRITE)     774         if (access & NFS4_SHARE_ACCESS_WRITE)
778                 atomic_inc(&fp->fi_access[O_WR    775                 atomic_inc(&fp->fi_access[O_WRONLY]);
779         if (access & NFS4_SHARE_ACCESS_READ)      776         if (access & NFS4_SHARE_ACCESS_READ)
780                 atomic_inc(&fp->fi_access[O_RD    777                 atomic_inc(&fp->fi_access[O_RDONLY]);
781 }                                                 778 }
782                                                   779 
783 static __be32                                     780 static __be32
784 nfs4_file_get_access(struct nfs4_file *fp, u32    781 nfs4_file_get_access(struct nfs4_file *fp, u32 access)
785 {                                                 782 {
786         lockdep_assert_held(&fp->fi_lock);        783         lockdep_assert_held(&fp->fi_lock);
787                                                   784 
788         /* Does this access mode make sense? *    785         /* Does this access mode make sense? */
789         if (access & ~NFS4_SHARE_ACCESS_BOTH)     786         if (access & ~NFS4_SHARE_ACCESS_BOTH)
790                 return nfserr_inval;              787                 return nfserr_inval;
791                                                   788 
792         /* Does it conflict with a deny mode a    789         /* Does it conflict with a deny mode already set? */
793         if ((access & fp->fi_share_deny) != 0)    790         if ((access & fp->fi_share_deny) != 0)
794                 return nfserr_share_denied;       791                 return nfserr_share_denied;
795                                                   792 
796         __nfs4_file_get_access(fp, access);       793         __nfs4_file_get_access(fp, access);
797         return nfs_ok;                            794         return nfs_ok;
798 }                                                 795 }
799                                                   796 
800 static __be32 nfs4_file_check_deny(struct nfs4    797 static __be32 nfs4_file_check_deny(struct nfs4_file *fp, u32 deny)
801 {                                                 798 {
802         /* Common case is that there is no den    799         /* Common case is that there is no deny mode. */
803         if (deny) {                               800         if (deny) {
804                 /* Does this deny mode make se    801                 /* Does this deny mode make sense? */
805                 if (deny & ~NFS4_SHARE_DENY_BO    802                 if (deny & ~NFS4_SHARE_DENY_BOTH)
806                         return nfserr_inval;      803                         return nfserr_inval;
807                                                   804 
808                 if ((deny & NFS4_SHARE_DENY_RE    805                 if ((deny & NFS4_SHARE_DENY_READ) &&
809                     atomic_read(&fp->fi_access    806                     atomic_read(&fp->fi_access[O_RDONLY]))
810                         return nfserr_share_de    807                         return nfserr_share_denied;
811                                                   808 
812                 if ((deny & NFS4_SHARE_DENY_WR    809                 if ((deny & NFS4_SHARE_DENY_WRITE) &&
813                     atomic_read(&fp->fi_access    810                     atomic_read(&fp->fi_access[O_WRONLY]))
814                         return nfserr_share_de    811                         return nfserr_share_denied;
815         }                                         812         }
816         return nfs_ok;                            813         return nfs_ok;
817 }                                                 814 }
818                                                   815 
819 static void __nfs4_file_put_access(struct nfs4    816 static void __nfs4_file_put_access(struct nfs4_file *fp, int oflag)
820 {                                                 817 {
821         might_lock(&fp->fi_lock);                 818         might_lock(&fp->fi_lock);
822                                                   819 
823         if (atomic_dec_and_lock(&fp->fi_access    820         if (atomic_dec_and_lock(&fp->fi_access[oflag], &fp->fi_lock)) {
824                 struct nfsd_file *f1 = NULL;      821                 struct nfsd_file *f1 = NULL;
825                 struct nfsd_file *f2 = NULL;      822                 struct nfsd_file *f2 = NULL;
826                                                   823 
827                 swap(f1, fp->fi_fds[oflag]);      824                 swap(f1, fp->fi_fds[oflag]);
828                 if (atomic_read(&fp->fi_access    825                 if (atomic_read(&fp->fi_access[1 - oflag]) == 0)
829                         swap(f2, fp->fi_fds[O_    826                         swap(f2, fp->fi_fds[O_RDWR]);
830                 spin_unlock(&fp->fi_lock);        827                 spin_unlock(&fp->fi_lock);
831                 if (f1)                           828                 if (f1)
832                         nfsd_file_put(f1);        829                         nfsd_file_put(f1);
833                 if (f2)                           830                 if (f2)
834                         nfsd_file_put(f2);        831                         nfsd_file_put(f2);
835         }                                         832         }
836 }                                                 833 }
837                                                   834 
838 static void nfs4_file_put_access(struct nfs4_f    835 static void nfs4_file_put_access(struct nfs4_file *fp, u32 access)
839 {                                                 836 {
840         WARN_ON_ONCE(access & ~NFS4_SHARE_ACCE    837         WARN_ON_ONCE(access & ~NFS4_SHARE_ACCESS_BOTH);
841                                                   838 
842         if (access & NFS4_SHARE_ACCESS_WRITE)     839         if (access & NFS4_SHARE_ACCESS_WRITE)
843                 __nfs4_file_put_access(fp, O_W    840                 __nfs4_file_put_access(fp, O_WRONLY);
844         if (access & NFS4_SHARE_ACCESS_READ)      841         if (access & NFS4_SHARE_ACCESS_READ)
845                 __nfs4_file_put_access(fp, O_R    842                 __nfs4_file_put_access(fp, O_RDONLY);
846 }                                                 843 }
847                                                   844 
848 /*                                                845 /*
849  * Allocate a new open/delegation state counte    846  * Allocate a new open/delegation state counter. This is needed for
850  * pNFS for proper return on close semantics.     847  * pNFS for proper return on close semantics.
851  *                                                848  *
852  * Note that we only allocate it for pNFS-enab    849  * Note that we only allocate it for pNFS-enabled exports, otherwise
853  * all pointers to struct nfs4_clnt_odstate ar    850  * all pointers to struct nfs4_clnt_odstate are always NULL.
854  */                                               851  */
855 static struct nfs4_clnt_odstate *                 852 static struct nfs4_clnt_odstate *
856 alloc_clnt_odstate(struct nfs4_client *clp)       853 alloc_clnt_odstate(struct nfs4_client *clp)
857 {                                                 854 {
858         struct nfs4_clnt_odstate *co;             855         struct nfs4_clnt_odstate *co;
859                                                   856 
860         co = kmem_cache_zalloc(odstate_slab, G    857         co = kmem_cache_zalloc(odstate_slab, GFP_KERNEL);
861         if (co) {                                 858         if (co) {
862                 co->co_client = clp;              859                 co->co_client = clp;
863                 refcount_set(&co->co_odcount,     860                 refcount_set(&co->co_odcount, 1);
864         }                                         861         }
865         return co;                                862         return co;
866 }                                                 863 }
867                                                   864 
868 static void                                       865 static void
869 hash_clnt_odstate_locked(struct nfs4_clnt_odst    866 hash_clnt_odstate_locked(struct nfs4_clnt_odstate *co)
870 {                                                 867 {
871         struct nfs4_file *fp = co->co_file;       868         struct nfs4_file *fp = co->co_file;
872                                                   869 
873         lockdep_assert_held(&fp->fi_lock);        870         lockdep_assert_held(&fp->fi_lock);
874         list_add(&co->co_perfile, &fp->fi_clnt    871         list_add(&co->co_perfile, &fp->fi_clnt_odstate);
875 }                                                 872 }
876                                                   873 
877 static inline void                                874 static inline void
878 get_clnt_odstate(struct nfs4_clnt_odstate *co)    875 get_clnt_odstate(struct nfs4_clnt_odstate *co)
879 {                                                 876 {
880         if (co)                                   877         if (co)
881                 refcount_inc(&co->co_odcount);    878                 refcount_inc(&co->co_odcount);
882 }                                                 879 }
883                                                   880 
884 static void                                       881 static void
885 put_clnt_odstate(struct nfs4_clnt_odstate *co)    882 put_clnt_odstate(struct nfs4_clnt_odstate *co)
886 {                                                 883 {
887         struct nfs4_file *fp;                     884         struct nfs4_file *fp;
888                                                   885 
889         if (!co)                                  886         if (!co)
890                 return;                           887                 return;
891                                                   888 
892         fp = co->co_file;                         889         fp = co->co_file;
893         if (refcount_dec_and_lock(&co->co_odco    890         if (refcount_dec_and_lock(&co->co_odcount, &fp->fi_lock)) {
894                 list_del(&co->co_perfile);        891                 list_del(&co->co_perfile);
895                 spin_unlock(&fp->fi_lock);        892                 spin_unlock(&fp->fi_lock);
896                                                   893 
897                 nfsd4_return_all_file_layouts(    894                 nfsd4_return_all_file_layouts(co->co_client, fp);
898                 kmem_cache_free(odstate_slab,     895                 kmem_cache_free(odstate_slab, co);
899         }                                         896         }
900 }                                                 897 }
901                                                   898 
902 static struct nfs4_clnt_odstate *                 899 static struct nfs4_clnt_odstate *
903 find_or_hash_clnt_odstate(struct nfs4_file *fp    900 find_or_hash_clnt_odstate(struct nfs4_file *fp, struct nfs4_clnt_odstate *new)
904 {                                                 901 {
905         struct nfs4_clnt_odstate *co;             902         struct nfs4_clnt_odstate *co;
906         struct nfs4_client *cl;                   903         struct nfs4_client *cl;
907                                                   904 
908         if (!new)                                 905         if (!new)
909                 return NULL;                      906                 return NULL;
910                                                   907 
911         cl = new->co_client;                      908         cl = new->co_client;
912                                                   909 
913         spin_lock(&fp->fi_lock);                  910         spin_lock(&fp->fi_lock);
914         list_for_each_entry(co, &fp->fi_clnt_o    911         list_for_each_entry(co, &fp->fi_clnt_odstate, co_perfile) {
915                 if (co->co_client == cl) {        912                 if (co->co_client == cl) {
916                         get_clnt_odstate(co);     913                         get_clnt_odstate(co);
917                         goto out;                 914                         goto out;
918                 }                                 915                 }
919         }                                         916         }
920         co = new;                                 917         co = new;
921         co->co_file = fp;                         918         co->co_file = fp;
922         hash_clnt_odstate_locked(new);            919         hash_clnt_odstate_locked(new);
923 out:                                              920 out:
924         spin_unlock(&fp->fi_lock);                921         spin_unlock(&fp->fi_lock);
925         return co;                                922         return co;
926 }                                                 923 }
927                                                   924 
928 struct nfs4_stid *nfs4_alloc_stid(struct nfs4_    925 struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, struct kmem_cache *slab,
929                                   void (*sc_fr    926                                   void (*sc_free)(struct nfs4_stid *))
930 {                                                 927 {
931         struct nfs4_stid *stid;                   928         struct nfs4_stid *stid;
932         int new_id;                               929         int new_id;
933                                                   930 
934         stid = kmem_cache_zalloc(slab, GFP_KER    931         stid = kmem_cache_zalloc(slab, GFP_KERNEL);
935         if (!stid)                                932         if (!stid)
936                 return NULL;                      933                 return NULL;
937                                                   934 
938         idr_preload(GFP_KERNEL);                  935         idr_preload(GFP_KERNEL);
939         spin_lock(&cl->cl_lock);                  936         spin_lock(&cl->cl_lock);
940         /* Reserving 0 for start of file in nf    937         /* Reserving 0 for start of file in nfsdfs "states" file: */
941         new_id = idr_alloc_cyclic(&cl->cl_stat    938         new_id = idr_alloc_cyclic(&cl->cl_stateids, stid, 1, 0, GFP_NOWAIT);
942         spin_unlock(&cl->cl_lock);                939         spin_unlock(&cl->cl_lock);
943         idr_preload_end();                        940         idr_preload_end();
944         if (new_id < 0)                           941         if (new_id < 0)
945                 goto out_free;                    942                 goto out_free;
946                                                   943 
947         stid->sc_free = sc_free;                  944         stid->sc_free = sc_free;
948         stid->sc_client = cl;                     945         stid->sc_client = cl;
949         stid->sc_stateid.si_opaque.so_id = new    946         stid->sc_stateid.si_opaque.so_id = new_id;
950         stid->sc_stateid.si_opaque.so_clid = c    947         stid->sc_stateid.si_opaque.so_clid = cl->cl_clientid;
951         /* Will be incremented before return t    948         /* Will be incremented before return to client: */
952         refcount_set(&stid->sc_count, 1);         949         refcount_set(&stid->sc_count, 1);
953         spin_lock_init(&stid->sc_lock);           950         spin_lock_init(&stid->sc_lock);
954         INIT_LIST_HEAD(&stid->sc_cp_list);        951         INIT_LIST_HEAD(&stid->sc_cp_list);
955                                                   952 
956         /*                                        953         /*
957          * It shouldn't be a problem to reuse     954          * It shouldn't be a problem to reuse an opaque stateid value.
958          * I don't think it is for 4.1.  But w    955          * I don't think it is for 4.1.  But with 4.0 I worry that, for
959          * example, a stray write retransmissi    956          * example, a stray write retransmission could be accepted by
960          * the server when it should have been    957          * the server when it should have been rejected.  Therefore,
961          * adopt a trick from the sctp code to    958          * adopt a trick from the sctp code to attempt to maximize the
962          * amount of time until an id is reuse    959          * amount of time until an id is reused, by ensuring they always
963          * "increase" (mod INT_MAX):              960          * "increase" (mod INT_MAX):
964          */                                       961          */
965         return stid;                              962         return stid;
966 out_free:                                         963 out_free:
967         kmem_cache_free(slab, stid);              964         kmem_cache_free(slab, stid);
968         return NULL;                              965         return NULL;
969 }                                                 966 }
970                                                   967 
971 /*                                                968 /*
972  * Create a unique stateid_t to represent each    969  * Create a unique stateid_t to represent each COPY.
973  */                                               970  */
974 static int nfs4_init_cp_state(struct nfsd_net     971 static int nfs4_init_cp_state(struct nfsd_net *nn, copy_stateid_t *stid,
975                               unsigned char cs    972                               unsigned char cs_type)
976 {                                                 973 {
977         int new_id;                               974         int new_id;
978                                                   975 
979         stid->cs_stid.si_opaque.so_clid.cl_boo    976         stid->cs_stid.si_opaque.so_clid.cl_boot = (u32)nn->boot_time;
980         stid->cs_stid.si_opaque.so_clid.cl_id     977         stid->cs_stid.si_opaque.so_clid.cl_id = nn->s2s_cp_cl_id;
981                                                   978 
982         idr_preload(GFP_KERNEL);                  979         idr_preload(GFP_KERNEL);
983         spin_lock(&nn->s2s_cp_lock);              980         spin_lock(&nn->s2s_cp_lock);
984         new_id = idr_alloc_cyclic(&nn->s2s_cp_    981         new_id = idr_alloc_cyclic(&nn->s2s_cp_stateids, stid, 0, 0, GFP_NOWAIT);
985         stid->cs_stid.si_opaque.so_id = new_id    982         stid->cs_stid.si_opaque.so_id = new_id;
986         stid->cs_stid.si_generation = 1;          983         stid->cs_stid.si_generation = 1;
987         spin_unlock(&nn->s2s_cp_lock);            984         spin_unlock(&nn->s2s_cp_lock);
988         idr_preload_end();                        985         idr_preload_end();
989         if (new_id < 0)                           986         if (new_id < 0)
990                 return 0;                         987                 return 0;
991         stid->cs_type = cs_type;                  988         stid->cs_type = cs_type;
992         return 1;                                 989         return 1;
993 }                                                 990 }
994                                                   991 
995 int nfs4_init_copy_state(struct nfsd_net *nn,     992 int nfs4_init_copy_state(struct nfsd_net *nn, struct nfsd4_copy *copy)
996 {                                                 993 {
997         return nfs4_init_cp_state(nn, &copy->c    994         return nfs4_init_cp_state(nn, &copy->cp_stateid, NFS4_COPY_STID);
998 }                                                 995 }
999                                                   996 
1000 struct nfs4_cpntf_state *nfs4_alloc_init_cpnt    997 struct nfs4_cpntf_state *nfs4_alloc_init_cpntf_state(struct nfsd_net *nn,
1001                                                  998                                                      struct nfs4_stid *p_stid)
1002 {                                                999 {
1003         struct nfs4_cpntf_state *cps;            1000         struct nfs4_cpntf_state *cps;
1004                                                  1001 
1005         cps = kzalloc(sizeof(struct nfs4_cpnt    1002         cps = kzalloc(sizeof(struct nfs4_cpntf_state), GFP_KERNEL);
1006         if (!cps)                                1003         if (!cps)
1007                 return NULL;                     1004                 return NULL;
1008         cps->cpntf_time = ktime_get_boottime_    1005         cps->cpntf_time = ktime_get_boottime_seconds();
1009         refcount_set(&cps->cp_stateid.cs_coun    1006         refcount_set(&cps->cp_stateid.cs_count, 1);
1010         if (!nfs4_init_cp_state(nn, &cps->cp_    1007         if (!nfs4_init_cp_state(nn, &cps->cp_stateid, NFS4_COPYNOTIFY_STID))
1011                 goto out_free;                   1008                 goto out_free;
1012         spin_lock(&nn->s2s_cp_lock);             1009         spin_lock(&nn->s2s_cp_lock);
1013         list_add(&cps->cp_list, &p_stid->sc_c    1010         list_add(&cps->cp_list, &p_stid->sc_cp_list);
1014         spin_unlock(&nn->s2s_cp_lock);           1011         spin_unlock(&nn->s2s_cp_lock);
1015         return cps;                              1012         return cps;
1016 out_free:                                        1013 out_free:
1017         kfree(cps);                              1014         kfree(cps);
1018         return NULL;                             1015         return NULL;
1019 }                                                1016 }
1020                                                  1017 
1021 void nfs4_free_copy_state(struct nfsd4_copy *    1018 void nfs4_free_copy_state(struct nfsd4_copy *copy)
1022 {                                                1019 {
1023         struct nfsd_net *nn;                     1020         struct nfsd_net *nn;
1024                                                  1021 
1025         if (copy->cp_stateid.cs_type != NFS4_    1022         if (copy->cp_stateid.cs_type != NFS4_COPY_STID)
1026                 return;                          1023                 return;
1027         nn = net_generic(copy->cp_clp->net, n    1024         nn = net_generic(copy->cp_clp->net, nfsd_net_id);
1028         spin_lock(&nn->s2s_cp_lock);             1025         spin_lock(&nn->s2s_cp_lock);
1029         idr_remove(&nn->s2s_cp_stateids,         1026         idr_remove(&nn->s2s_cp_stateids,
1030                    copy->cp_stateid.cs_stid.s    1027                    copy->cp_stateid.cs_stid.si_opaque.so_id);
1031         spin_unlock(&nn->s2s_cp_lock);           1028         spin_unlock(&nn->s2s_cp_lock);
1032 }                                                1029 }
1033                                                  1030 
1034 static void nfs4_free_cpntf_statelist(struct     1031 static void nfs4_free_cpntf_statelist(struct net *net, struct nfs4_stid *stid)
1035 {                                                1032 {
1036         struct nfs4_cpntf_state *cps;            1033         struct nfs4_cpntf_state *cps;
1037         struct nfsd_net *nn;                     1034         struct nfsd_net *nn;
1038                                                  1035 
1039         nn = net_generic(net, nfsd_net_id);      1036         nn = net_generic(net, nfsd_net_id);
1040         spin_lock(&nn->s2s_cp_lock);             1037         spin_lock(&nn->s2s_cp_lock);
1041         while (!list_empty(&stid->sc_cp_list)    1038         while (!list_empty(&stid->sc_cp_list)) {
1042                 cps = list_first_entry(&stid-    1039                 cps = list_first_entry(&stid->sc_cp_list,
1043                                        struct    1040                                        struct nfs4_cpntf_state, cp_list);
1044                 _free_cpntf_state_locked(nn,     1041                 _free_cpntf_state_locked(nn, cps);
1045         }                                        1042         }
1046         spin_unlock(&nn->s2s_cp_lock);           1043         spin_unlock(&nn->s2s_cp_lock);
1047 }                                                1044 }
1048                                                  1045 
1049 static struct nfs4_ol_stateid * nfs4_alloc_op    1046 static struct nfs4_ol_stateid * nfs4_alloc_open_stateid(struct nfs4_client *clp)
1050 {                                                1047 {
1051         struct nfs4_stid *stid;                  1048         struct nfs4_stid *stid;
1052                                                  1049 
1053         stid = nfs4_alloc_stid(clp, stateid_s    1050         stid = nfs4_alloc_stid(clp, stateid_slab, nfs4_free_ol_stateid);
1054         if (!stid)                               1051         if (!stid)
1055                 return NULL;                     1052                 return NULL;
1056                                                  1053 
1057         return openlockstateid(stid);            1054         return openlockstateid(stid);
1058 }                                                1055 }
1059                                                  1056 
1060 static void nfs4_free_deleg(struct nfs4_stid     1057 static void nfs4_free_deleg(struct nfs4_stid *stid)
1061 {                                                1058 {
1062         struct nfs4_delegation *dp = delegsta    1059         struct nfs4_delegation *dp = delegstateid(stid);
1063                                                  1060 
1064         WARN_ON_ONCE(!list_empty(&stid->sc_cp    1061         WARN_ON_ONCE(!list_empty(&stid->sc_cp_list));
1065         WARN_ON_ONCE(!list_empty(&dp->dl_perf    1062         WARN_ON_ONCE(!list_empty(&dp->dl_perfile));
1066         WARN_ON_ONCE(!list_empty(&dp->dl_perc    1063         WARN_ON_ONCE(!list_empty(&dp->dl_perclnt));
1067         WARN_ON_ONCE(!list_empty(&dp->dl_reca    1064         WARN_ON_ONCE(!list_empty(&dp->dl_recall_lru));
1068         kmem_cache_free(deleg_slab, stid);       1065         kmem_cache_free(deleg_slab, stid);
1069         atomic_long_dec(&num_delegations);       1066         atomic_long_dec(&num_delegations);
1070 }                                                1067 }
1071                                                  1068 
1072 /*                                               1069 /*
1073  * When we recall a delegation, we should be     1070  * When we recall a delegation, we should be careful not to hand it
1074  * out again straight away.                      1071  * out again straight away.
1075  * To ensure this we keep a pair of bloom fil    1072  * To ensure this we keep a pair of bloom filters ('new' and 'old')
1076  * in which the filehandles of recalled deleg    1073  * in which the filehandles of recalled delegations are "stored".
1077  * If a filehandle appear in either filter, a    1074  * If a filehandle appear in either filter, a delegation is blocked.
1078  * When a delegation is recalled, the filehan    1075  * When a delegation is recalled, the filehandle is stored in the "new"
1079  * filter.                                       1076  * filter.
1080  * Every 30 seconds we swap the filters and c    1077  * Every 30 seconds we swap the filters and clear the "new" one,
1081  * unless both are empty of course.  This res !! 1078  * unless both are empty of course.
1082  * given filehandle being blocked for between << 
1083  *                                               1079  *
1084  * Each filter is 256 bits.  We hash the file    1080  * Each filter is 256 bits.  We hash the filehandle to 32bit and use the
1085  * low 3 bytes as hash-table indices.            1081  * low 3 bytes as hash-table indices.
1086  *                                               1082  *
1087  * 'blocked_delegations_lock', which is alway    1083  * 'blocked_delegations_lock', which is always taken in block_delegations(),
1088  * is used to manage concurrent access.  Test    1084  * is used to manage concurrent access.  Testing does not need the lock
1089  * except when swapping the two filters.         1085  * except when swapping the two filters.
1090  */                                              1086  */
1091 static DEFINE_SPINLOCK(blocked_delegations_lo    1087 static DEFINE_SPINLOCK(blocked_delegations_lock);
1092 static struct bloom_pair {                       1088 static struct bloom_pair {
1093         int     entries, old_entries;            1089         int     entries, old_entries;
1094         time64_t swap_time;                      1090         time64_t swap_time;
1095         int     new; /* index into 'set' */      1091         int     new; /* index into 'set' */
1096         DECLARE_BITMAP(set[2], 256);             1092         DECLARE_BITMAP(set[2], 256);
1097 } blocked_delegations;                           1093 } blocked_delegations;
1098                                                  1094 
1099 static int delegation_blocked(struct knfsd_fh    1095 static int delegation_blocked(struct knfsd_fh *fh)
1100 {                                                1096 {
1101         u32 hash;                                1097         u32 hash;
1102         struct bloom_pair *bd = &blocked_dele    1098         struct bloom_pair *bd = &blocked_delegations;
1103                                                  1099 
1104         if (bd->entries == 0)                    1100         if (bd->entries == 0)
1105                 return 0;                        1101                 return 0;
1106         if (ktime_get_seconds() - bd->swap_ti    1102         if (ktime_get_seconds() - bd->swap_time > 30) {
1107                 spin_lock(&blocked_delegation    1103                 spin_lock(&blocked_delegations_lock);
1108                 if (ktime_get_seconds() - bd-    1104                 if (ktime_get_seconds() - bd->swap_time > 30) {
1109                         bd->entries -= bd->ol    1105                         bd->entries -= bd->old_entries;
1110                         bd->old_entries = bd-    1106                         bd->old_entries = bd->entries;
1111                         bd->new = 1-bd->new;  << 
1112                         memset(bd->set[bd->ne    1107                         memset(bd->set[bd->new], 0,
1113                                sizeof(bd->set    1108                                sizeof(bd->set[0]));
                                                   >> 1109                         bd->new = 1-bd->new;
1114                         bd->swap_time = ktime    1110                         bd->swap_time = ktime_get_seconds();
1115                 }                                1111                 }
1116                 spin_unlock(&blocked_delegati    1112                 spin_unlock(&blocked_delegations_lock);
1117         }                                        1113         }
1118         hash = jhash(&fh->fh_raw, fh->fh_size    1114         hash = jhash(&fh->fh_raw, fh->fh_size, 0);
1119         if (test_bit(hash&255, bd->set[0]) &&    1115         if (test_bit(hash&255, bd->set[0]) &&
1120             test_bit((hash>>8)&255, bd->set[0    1116             test_bit((hash>>8)&255, bd->set[0]) &&
1121             test_bit((hash>>16)&255, bd->set[    1117             test_bit((hash>>16)&255, bd->set[0]))
1122                 return 1;                        1118                 return 1;
1123                                                  1119 
1124         if (test_bit(hash&255, bd->set[1]) &&    1120         if (test_bit(hash&255, bd->set[1]) &&
1125             test_bit((hash>>8)&255, bd->set[1    1121             test_bit((hash>>8)&255, bd->set[1]) &&
1126             test_bit((hash>>16)&255, bd->set[    1122             test_bit((hash>>16)&255, bd->set[1]))
1127                 return 1;                        1123                 return 1;
1128                                                  1124 
1129         return 0;                                1125         return 0;
1130 }                                                1126 }
1131                                                  1127 
1132 static void block_delegations(struct knfsd_fh    1128 static void block_delegations(struct knfsd_fh *fh)
1133 {                                                1129 {
1134         u32 hash;                                1130         u32 hash;
1135         struct bloom_pair *bd = &blocked_dele    1131         struct bloom_pair *bd = &blocked_delegations;
1136                                                  1132 
1137         hash = jhash(&fh->fh_raw, fh->fh_size    1133         hash = jhash(&fh->fh_raw, fh->fh_size, 0);
1138                                                  1134 
1139         spin_lock(&blocked_delegations_lock);    1135         spin_lock(&blocked_delegations_lock);
1140         __set_bit(hash&255, bd->set[bd->new])    1136         __set_bit(hash&255, bd->set[bd->new]);
1141         __set_bit((hash>>8)&255, bd->set[bd->    1137         __set_bit((hash>>8)&255, bd->set[bd->new]);
1142         __set_bit((hash>>16)&255, bd->set[bd-    1138         __set_bit((hash>>16)&255, bd->set[bd->new]);
1143         if (bd->entries == 0)                    1139         if (bd->entries == 0)
1144                 bd->swap_time = ktime_get_sec    1140                 bd->swap_time = ktime_get_seconds();
1145         bd->entries += 1;                        1141         bd->entries += 1;
1146         spin_unlock(&blocked_delegations_lock    1142         spin_unlock(&blocked_delegations_lock);
1147 }                                                1143 }
1148                                                  1144 
1149 static struct nfs4_delegation *                  1145 static struct nfs4_delegation *
1150 alloc_init_deleg(struct nfs4_client *clp, str    1146 alloc_init_deleg(struct nfs4_client *clp, struct nfs4_file *fp,
1151                  struct nfs4_clnt_odstate *od !! 1147                  struct nfs4_clnt_odstate *odstate)
1152 {                                                1148 {
1153         struct nfs4_delegation *dp;              1149         struct nfs4_delegation *dp;
1154         struct nfs4_stid *stid;               << 
1155         long n;                                  1150         long n;
1156                                                  1151 
1157         dprintk("NFSD alloc_init_deleg\n");      1152         dprintk("NFSD alloc_init_deleg\n");
1158         n = atomic_long_inc_return(&num_deleg    1153         n = atomic_long_inc_return(&num_delegations);
1159         if (n < 0 || n > max_delegations)        1154         if (n < 0 || n > max_delegations)
1160                 goto out_dec;                    1155                 goto out_dec;
1161         if (delegation_blocked(&fp->fi_fhandl    1156         if (delegation_blocked(&fp->fi_fhandle))
1162                 goto out_dec;                    1157                 goto out_dec;
1163         stid = nfs4_alloc_stid(clp, deleg_sla !! 1158         dp = delegstateid(nfs4_alloc_stid(clp, deleg_slab, nfs4_free_deleg));
1164         if (stid == NULL)                     !! 1159         if (dp == NULL)
1165                 goto out_dec;                    1160                 goto out_dec;
1166         dp = delegstateid(stid);              << 
1167                                                  1161 
1168         /*                                       1162         /*
1169          * delegation seqid's are never incre    1163          * delegation seqid's are never incremented.  The 4.1 special
1170          * meaning of seqid 0 isn't meaningfu    1164          * meaning of seqid 0 isn't meaningful, really, but let's avoid
1171          * 0 anyway just for consistency and     1165          * 0 anyway just for consistency and use 1:
1172          */                                      1166          */
1173         dp->dl_stid.sc_stateid.si_generation     1167         dp->dl_stid.sc_stateid.si_generation = 1;
1174         INIT_LIST_HEAD(&dp->dl_perfile);         1168         INIT_LIST_HEAD(&dp->dl_perfile);
1175         INIT_LIST_HEAD(&dp->dl_perclnt);         1169         INIT_LIST_HEAD(&dp->dl_perclnt);
1176         INIT_LIST_HEAD(&dp->dl_recall_lru);      1170         INIT_LIST_HEAD(&dp->dl_recall_lru);
1177         dp->dl_clnt_odstate = odstate;           1171         dp->dl_clnt_odstate = odstate;
1178         get_clnt_odstate(odstate);               1172         get_clnt_odstate(odstate);
1179         dp->dl_type = dl_type;                !! 1173         dp->dl_type = NFS4_OPEN_DELEGATE_READ;
1180         dp->dl_retries = 1;                      1174         dp->dl_retries = 1;
1181         dp->dl_recalled = false;                 1175         dp->dl_recalled = false;
1182         nfsd4_init_cb(&dp->dl_recall, dp->dl_    1176         nfsd4_init_cb(&dp->dl_recall, dp->dl_stid.sc_client,
1183                       &nfsd4_cb_recall_ops, N    1177                       &nfsd4_cb_recall_ops, NFSPROC4_CLNT_CB_RECALL);
1184         nfsd4_init_cb(&dp->dl_cb_fattr.ncf_ge << 
1185                         &nfsd4_cb_getattr_ops << 
1186         dp->dl_cb_fattr.ncf_file_modified = f << 
1187         dp->dl_cb_fattr.ncf_cb_bmap[0] = FATT << 
1188         get_nfs4_file(fp);                       1178         get_nfs4_file(fp);
1189         dp->dl_stid.sc_file = fp;                1179         dp->dl_stid.sc_file = fp;
1190         return dp;                               1180         return dp;
1191 out_dec:                                         1181 out_dec:
1192         atomic_long_dec(&num_delegations);       1182         atomic_long_dec(&num_delegations);
1193         return NULL;                             1183         return NULL;
1194 }                                                1184 }
1195                                                  1185 
1196 void                                             1186 void
1197 nfs4_put_stid(struct nfs4_stid *s)               1187 nfs4_put_stid(struct nfs4_stid *s)
1198 {                                                1188 {
1199         struct nfs4_file *fp = s->sc_file;       1189         struct nfs4_file *fp = s->sc_file;
1200         struct nfs4_client *clp = s->sc_clien    1190         struct nfs4_client *clp = s->sc_client;
1201                                                  1191 
1202         might_lock(&clp->cl_lock);               1192         might_lock(&clp->cl_lock);
1203                                                  1193 
1204         if (!refcount_dec_and_lock(&s->sc_cou    1194         if (!refcount_dec_and_lock(&s->sc_count, &clp->cl_lock)) {
1205                 wake_up_all(&close_wq);          1195                 wake_up_all(&close_wq);
1206                 return;                          1196                 return;
1207         }                                        1197         }
1208         idr_remove(&clp->cl_stateids, s->sc_s    1198         idr_remove(&clp->cl_stateids, s->sc_stateid.si_opaque.so_id);
1209         if (s->sc_status & SC_STATUS_ADMIN_RE << 
1210                 atomic_dec(&s->sc_client->cl_ << 
1211         nfs4_free_cpntf_statelist(clp->net, s    1199         nfs4_free_cpntf_statelist(clp->net, s);
1212         spin_unlock(&clp->cl_lock);              1200         spin_unlock(&clp->cl_lock);
1213         s->sc_free(s);                           1201         s->sc_free(s);
1214         if (fp)                                  1202         if (fp)
1215                 put_nfs4_file(fp);               1203                 put_nfs4_file(fp);
1216 }                                                1204 }
1217                                                  1205 
1218 void                                             1206 void
1219 nfs4_inc_and_copy_stateid(stateid_t *dst, str    1207 nfs4_inc_and_copy_stateid(stateid_t *dst, struct nfs4_stid *stid)
1220 {                                                1208 {
1221         stateid_t *src = &stid->sc_stateid;      1209         stateid_t *src = &stid->sc_stateid;
1222                                                  1210 
1223         spin_lock(&stid->sc_lock);               1211         spin_lock(&stid->sc_lock);
1224         if (unlikely(++src->si_generation ==     1212         if (unlikely(++src->si_generation == 0))
1225                 src->si_generation = 1;          1213                 src->si_generation = 1;
1226         memcpy(dst, src, sizeof(*dst));          1214         memcpy(dst, src, sizeof(*dst));
1227         spin_unlock(&stid->sc_lock);             1215         spin_unlock(&stid->sc_lock);
1228 }                                                1216 }
1229                                                  1217 
1230 static void put_deleg_file(struct nfs4_file *    1218 static void put_deleg_file(struct nfs4_file *fp)
1231 {                                                1219 {
1232         struct nfsd_file *nf = NULL;             1220         struct nfsd_file *nf = NULL;
1233                                                  1221 
1234         spin_lock(&fp->fi_lock);                 1222         spin_lock(&fp->fi_lock);
1235         if (--fp->fi_delegees == 0)              1223         if (--fp->fi_delegees == 0)
1236                 swap(nf, fp->fi_deleg_file);     1224                 swap(nf, fp->fi_deleg_file);
1237         spin_unlock(&fp->fi_lock);               1225         spin_unlock(&fp->fi_lock);
1238                                                  1226 
1239         if (nf)                                  1227         if (nf)
1240                 nfsd_file_put(nf);               1228                 nfsd_file_put(nf);
1241 }                                                1229 }
1242                                                  1230 
1243 static void nfs4_unlock_deleg_lease(struct nf    1231 static void nfs4_unlock_deleg_lease(struct nfs4_delegation *dp)
1244 {                                                1232 {
1245         struct nfs4_file *fp = dp->dl_stid.sc    1233         struct nfs4_file *fp = dp->dl_stid.sc_file;
1246         struct nfsd_file *nf = fp->fi_deleg_f    1234         struct nfsd_file *nf = fp->fi_deleg_file;
1247                                                  1235 
1248         WARN_ON_ONCE(!fp->fi_delegees);          1236         WARN_ON_ONCE(!fp->fi_delegees);
1249                                                  1237 
1250         kernel_setlease(nf->nf_file, F_UNLCK, !! 1238         vfs_setlease(nf->nf_file, F_UNLCK, NULL, (void **)&dp);
1251         put_deleg_file(fp);                      1239         put_deleg_file(fp);
1252 }                                                1240 }
1253                                                  1241 
1254 static void destroy_unhashed_deleg(struct nfs    1242 static void destroy_unhashed_deleg(struct nfs4_delegation *dp)
1255 {                                                1243 {
1256         put_clnt_odstate(dp->dl_clnt_odstate)    1244         put_clnt_odstate(dp->dl_clnt_odstate);
1257         nfs4_unlock_deleg_lease(dp);             1245         nfs4_unlock_deleg_lease(dp);
1258         nfs4_put_stid(&dp->dl_stid);             1246         nfs4_put_stid(&dp->dl_stid);
1259 }                                                1247 }
1260                                                  1248 
                                                   >> 1249 void nfs4_unhash_stid(struct nfs4_stid *s)
                                                   >> 1250 {
                                                   >> 1251         s->sc_type = 0;
                                                   >> 1252 }
                                                   >> 1253 
1261 /**                                              1254 /**
1262  * nfs4_delegation_exists - Discover if this     1255  * nfs4_delegation_exists - Discover if this delegation already exists
1263  * @clp:     a pointer to the nfs4_client we'    1256  * @clp:     a pointer to the nfs4_client we're granting a delegation to
1264  * @fp:      a pointer to the nfs4_file we're    1257  * @fp:      a pointer to the nfs4_file we're granting a delegation on
1265  *                                               1258  *
1266  * Return:                                       1259  * Return:
1267  *      On success: true iff an existing dele    1260  *      On success: true iff an existing delegation is found
1268  */                                              1261  */
1269                                                  1262 
1270 static bool                                      1263 static bool
1271 nfs4_delegation_exists(struct nfs4_client *cl    1264 nfs4_delegation_exists(struct nfs4_client *clp, struct nfs4_file *fp)
1272 {                                                1265 {
1273         struct nfs4_delegation *searchdp = NU    1266         struct nfs4_delegation *searchdp = NULL;
1274         struct nfs4_client *searchclp = NULL;    1267         struct nfs4_client *searchclp = NULL;
1275                                                  1268 
1276         lockdep_assert_held(&state_lock);        1269         lockdep_assert_held(&state_lock);
1277         lockdep_assert_held(&fp->fi_lock);       1270         lockdep_assert_held(&fp->fi_lock);
1278                                                  1271 
1279         list_for_each_entry(searchdp, &fp->fi    1272         list_for_each_entry(searchdp, &fp->fi_delegations, dl_perfile) {
1280                 searchclp = searchdp->dl_stid    1273                 searchclp = searchdp->dl_stid.sc_client;
1281                 if (clp == searchclp) {          1274                 if (clp == searchclp) {
1282                         return true;             1275                         return true;
1283                 }                                1276                 }
1284         }                                        1277         }
1285         return false;                            1278         return false;
1286 }                                                1279 }
1287                                                  1280 
1288 /**                                              1281 /**
1289  * hash_delegation_locked - Add a delegation     1282  * hash_delegation_locked - Add a delegation to the appropriate lists
1290  * @dp:     a pointer to the nfs4_delegation     1283  * @dp:     a pointer to the nfs4_delegation we are adding.
1291  * @fp:     a pointer to the nfs4_file we're     1284  * @fp:     a pointer to the nfs4_file we're granting a delegation on
1292  *                                               1285  *
1293  * Return:                                       1286  * Return:
1294  *      On success: NULL if the delegation wa    1287  *      On success: NULL if the delegation was successfully hashed.
1295  *                                               1288  *
1296  *      On error: -EAGAIN if one was previous    1289  *      On error: -EAGAIN if one was previously granted to this
1297  *                 nfs4_client for this nfs4_    1290  *                 nfs4_client for this nfs4_file. Delegation is not hashed.
1298  *                                               1291  *
1299  */                                              1292  */
1300                                                  1293 
1301 static int                                       1294 static int
1302 hash_delegation_locked(struct nfs4_delegation    1295 hash_delegation_locked(struct nfs4_delegation *dp, struct nfs4_file *fp)
1303 {                                                1296 {
1304         struct nfs4_client *clp = dp->dl_stid    1297         struct nfs4_client *clp = dp->dl_stid.sc_client;
1305                                                  1298 
1306         lockdep_assert_held(&state_lock);        1299         lockdep_assert_held(&state_lock);
1307         lockdep_assert_held(&fp->fi_lock);       1300         lockdep_assert_held(&fp->fi_lock);
1308         lockdep_assert_held(&clp->cl_lock);   << 
1309                                                  1301 
1310         if (nfs4_delegation_exists(clp, fp))     1302         if (nfs4_delegation_exists(clp, fp))
1311                 return -EAGAIN;                  1303                 return -EAGAIN;
1312         refcount_inc(&dp->dl_stid.sc_count);     1304         refcount_inc(&dp->dl_stid.sc_count);
1313         dp->dl_stid.sc_type = SC_TYPE_DELEG;  !! 1305         dp->dl_stid.sc_type = NFS4_DELEG_STID;
1314         list_add(&dp->dl_perfile, &fp->fi_del    1306         list_add(&dp->dl_perfile, &fp->fi_delegations);
1315         list_add(&dp->dl_perclnt, &clp->cl_de    1307         list_add(&dp->dl_perclnt, &clp->cl_delegations);
1316         return 0;                                1308         return 0;
1317 }                                                1309 }
1318                                                  1310 
1319 static bool delegation_hashed(struct nfs4_del    1311 static bool delegation_hashed(struct nfs4_delegation *dp)
1320 {                                                1312 {
1321         return !(list_empty(&dp->dl_perfile))    1313         return !(list_empty(&dp->dl_perfile));
1322 }                                                1314 }
1323                                                  1315 
1324 static bool                                      1316 static bool
1325 unhash_delegation_locked(struct nfs4_delegati !! 1317 unhash_delegation_locked(struct nfs4_delegation *dp)
1326 {                                                1318 {
1327         struct nfs4_file *fp = dp->dl_stid.sc    1319         struct nfs4_file *fp = dp->dl_stid.sc_file;
1328                                                  1320 
1329         lockdep_assert_held(&state_lock);        1321         lockdep_assert_held(&state_lock);
1330                                                  1322 
1331         if (!delegation_hashed(dp))              1323         if (!delegation_hashed(dp))
1332                 return false;                    1324                 return false;
1333                                                  1325 
1334         if (statusmask == SC_STATUS_REVOKED & !! 1326         dp->dl_stid.sc_type = NFS4_CLOSED_DELEG_STID;
1335             dp->dl_stid.sc_client->cl_minorve << 
1336                 statusmask = SC_STATUS_CLOSED << 
1337         dp->dl_stid.sc_status |= statusmask;  << 
1338         if (statusmask & SC_STATUS_ADMIN_REVO << 
1339                 atomic_inc(&dp->dl_stid.sc_cl << 
1340                                               << 
1341         /* Ensure that deleg break won't try     1327         /* Ensure that deleg break won't try to requeue it */
1342         ++dp->dl_time;                           1328         ++dp->dl_time;
1343         spin_lock(&fp->fi_lock);                 1329         spin_lock(&fp->fi_lock);
1344         list_del_init(&dp->dl_perclnt);          1330         list_del_init(&dp->dl_perclnt);
1345         list_del_init(&dp->dl_recall_lru);       1331         list_del_init(&dp->dl_recall_lru);
1346         list_del_init(&dp->dl_perfile);          1332         list_del_init(&dp->dl_perfile);
1347         spin_unlock(&fp->fi_lock);               1333         spin_unlock(&fp->fi_lock);
1348         return true;                             1334         return true;
1349 }                                                1335 }
1350                                                  1336 
1351 static void destroy_delegation(struct nfs4_de    1337 static void destroy_delegation(struct nfs4_delegation *dp)
1352 {                                                1338 {
1353         bool unhashed;                           1339         bool unhashed;
1354                                                  1340 
1355         spin_lock(&state_lock);                  1341         spin_lock(&state_lock);
1356         unhashed = unhash_delegation_locked(d !! 1342         unhashed = unhash_delegation_locked(dp);
1357         spin_unlock(&state_lock);                1343         spin_unlock(&state_lock);
1358         if (unhashed)                            1344         if (unhashed)
1359                 destroy_unhashed_deleg(dp);      1345                 destroy_unhashed_deleg(dp);
1360 }                                                1346 }
1361                                                  1347 
1362 /**                                           << 
1363  * revoke_delegation - perform nfs4 delegatio << 
1364  * @dp: pointer to the delegation             << 
1365  *                                            << 
1366  * This function assumes that it's called eit << 
1367  * interface (nfsd4_revoke_states()) that's r << 
1368  * stateid or it's called from a laundromat t << 
1369  * determined that this specific state has ex << 
1370  * (both mark state with the appropriate stid << 
1371  * assumed that a reference was taken on the  << 
1372  *                                            << 
1373  * If this function finds that the @dp state  << 
1374  * that a FREE_STATEID operation for this sta << 
1375  * we can proceed to removing it from recalle << 
1376  * isn't marked SC_STATUS_FREED, it means we  << 
1377  * list and wait for the FREE_STATEID to arri << 
1378  * time, we need to mark it as SC_STATUS_FREE << 
1379  * nfsd4_free_stateid() function that this st << 
1380  * to the cl_revoked list and that nfsd4_free << 
1381  * for removing it from the list. Inspection  << 
1382  * in the revocation process is protected by  << 
1383  */                                           << 
1384 static void revoke_delegation(struct nfs4_del    1348 static void revoke_delegation(struct nfs4_delegation *dp)
1385 {                                                1349 {
1386         struct nfs4_client *clp = dp->dl_stid    1350         struct nfs4_client *clp = dp->dl_stid.sc_client;
1387                                                  1351 
1388         WARN_ON(!list_empty(&dp->dl_recall_lr    1352         WARN_ON(!list_empty(&dp->dl_recall_lru));
1389         WARN_ON_ONCE(!(dp->dl_stid.sc_status  << 
1390                      (SC_STATUS_REVOKED | SC_ << 
1391                                                  1353 
1392         trace_nfsd_stid_revoke(&dp->dl_stid);    1354         trace_nfsd_stid_revoke(&dp->dl_stid);
1393                                                  1355 
1394         spin_lock(&clp->cl_lock);             !! 1356         if (clp->cl_minorversion) {
1395         if (dp->dl_stid.sc_status & SC_STATUS !! 1357                 spin_lock(&clp->cl_lock);
1396                 list_del_init(&dp->dl_recall_ !! 1358                 dp->dl_stid.sc_type = NFS4_REVOKED_DELEG_STID;
1397                 goto out;                     !! 1359                 refcount_inc(&dp->dl_stid.sc_count);
                                                   >> 1360                 list_add(&dp->dl_recall_lru, &clp->cl_revoked);
                                                   >> 1361                 spin_unlock(&clp->cl_lock);
1398         }                                        1362         }
1399         list_add(&dp->dl_recall_lru, &clp->cl << 
1400         dp->dl_stid.sc_status |= SC_STATUS_FR << 
1401 out:                                          << 
1402         spin_unlock(&clp->cl_lock);           << 
1403         destroy_unhashed_deleg(dp);              1363         destroy_unhashed_deleg(dp);
1404 }                                                1364 }
1405                                                  1365 
1406 /*                                            !! 1366 /* 
1407  * SETCLIENTID state                          !! 1367  * SETCLIENTID state 
1408  */                                              1368  */
1409                                                  1369 
1410 static unsigned int clientid_hashval(u32 id)     1370 static unsigned int clientid_hashval(u32 id)
1411 {                                                1371 {
1412         return id & CLIENT_HASH_MASK;            1372         return id & CLIENT_HASH_MASK;
1413 }                                                1373 }
1414                                                  1374 
1415 static unsigned int clientstr_hashval(struct     1375 static unsigned int clientstr_hashval(struct xdr_netobj name)
1416 {                                                1376 {
1417         return opaque_hashval(name.data, 8) &    1377         return opaque_hashval(name.data, 8) & CLIENT_HASH_MASK;
1418 }                                                1378 }
1419                                                  1379 
1420 /*                                               1380 /*
1421  * A stateid that had a deny mode associated     1381  * A stateid that had a deny mode associated with it is being released
1422  * or downgraded. Recalculate the deny mode o    1382  * or downgraded. Recalculate the deny mode on the file.
1423  */                                              1383  */
1424 static void                                      1384 static void
1425 recalculate_deny_mode(struct nfs4_file *fp)      1385 recalculate_deny_mode(struct nfs4_file *fp)
1426 {                                                1386 {
1427         struct nfs4_ol_stateid *stp;             1387         struct nfs4_ol_stateid *stp;
1428         u32 old_deny;                         << 
1429                                                  1388 
1430         spin_lock(&fp->fi_lock);                 1389         spin_lock(&fp->fi_lock);
1431         old_deny = fp->fi_share_deny;         << 
1432         fp->fi_share_deny = 0;                   1390         fp->fi_share_deny = 0;
1433         list_for_each_entry(stp, &fp->fi_stat !! 1391         list_for_each_entry(stp, &fp->fi_stateids, st_perfile)
1434                 fp->fi_share_deny |= bmap_to_    1392                 fp->fi_share_deny |= bmap_to_share_mode(stp->st_deny_bmap);
1435                 if (fp->fi_share_deny == old_ << 
1436                         break;                << 
1437         }                                     << 
1438         spin_unlock(&fp->fi_lock);               1393         spin_unlock(&fp->fi_lock);
1439 }                                                1394 }
1440                                                  1395 
1441 static void                                      1396 static void
1442 reset_union_bmap_deny(u32 deny, struct nfs4_o    1397 reset_union_bmap_deny(u32 deny, struct nfs4_ol_stateid *stp)
1443 {                                                1398 {
1444         int i;                                   1399         int i;
1445         bool change = false;                     1400         bool change = false;
1446                                                  1401 
1447         for (i = 1; i < 4; i++) {                1402         for (i = 1; i < 4; i++) {
1448                 if ((i & deny) != i) {           1403                 if ((i & deny) != i) {
1449                         change = true;           1404                         change = true;
1450                         clear_deny(i, stp);      1405                         clear_deny(i, stp);
1451                 }                                1406                 }
1452         }                                        1407         }
1453                                                  1408 
1454         /* Recalculate per-file deny mode if     1409         /* Recalculate per-file deny mode if there was a change */
1455         if (change)                              1410         if (change)
1456                 recalculate_deny_mode(stp->st    1411                 recalculate_deny_mode(stp->st_stid.sc_file);
1457 }                                                1412 }
1458                                                  1413 
1459 /* release all access and file references for    1414 /* release all access and file references for a given stateid */
1460 static void                                      1415 static void
1461 release_all_access(struct nfs4_ol_stateid *st    1416 release_all_access(struct nfs4_ol_stateid *stp)
1462 {                                                1417 {
1463         int i;                                   1418         int i;
1464         struct nfs4_file *fp = stp->st_stid.s    1419         struct nfs4_file *fp = stp->st_stid.sc_file;
1465                                                  1420 
1466         if (fp && stp->st_deny_bmap != 0)        1421         if (fp && stp->st_deny_bmap != 0)
1467                 recalculate_deny_mode(fp);       1422                 recalculate_deny_mode(fp);
1468                                                  1423 
1469         for (i = 1; i < 4; i++) {                1424         for (i = 1; i < 4; i++) {
1470                 if (test_access(i, stp))         1425                 if (test_access(i, stp))
1471                         nfs4_file_put_access(    1426                         nfs4_file_put_access(stp->st_stid.sc_file, i);
1472                 clear_access(i, stp);            1427                 clear_access(i, stp);
1473         }                                        1428         }
1474 }                                                1429 }
1475                                                  1430 
1476 static inline void nfs4_free_stateowner(struc    1431 static inline void nfs4_free_stateowner(struct nfs4_stateowner *sop)
1477 {                                                1432 {
1478         kfree(sop->so_owner.data);               1433         kfree(sop->so_owner.data);
1479         sop->so_ops->so_free(sop);               1434         sop->so_ops->so_free(sop);
1480 }                                                1435 }
1481                                                  1436 
1482 static void nfs4_put_stateowner(struct nfs4_s    1437 static void nfs4_put_stateowner(struct nfs4_stateowner *sop)
1483 {                                                1438 {
1484         struct nfs4_client *clp = sop->so_cli    1439         struct nfs4_client *clp = sop->so_client;
1485                                                  1440 
1486         might_lock(&clp->cl_lock);               1441         might_lock(&clp->cl_lock);
1487                                                  1442 
1488         if (!atomic_dec_and_lock(&sop->so_cou    1443         if (!atomic_dec_and_lock(&sop->so_count, &clp->cl_lock))
1489                 return;                          1444                 return;
1490         sop->so_ops->so_unhash(sop);             1445         sop->so_ops->so_unhash(sop);
1491         spin_unlock(&clp->cl_lock);              1446         spin_unlock(&clp->cl_lock);
1492         nfs4_free_stateowner(sop);               1447         nfs4_free_stateowner(sop);
1493 }                                                1448 }
1494                                                  1449 
1495 static bool                                      1450 static bool
1496 nfs4_ol_stateid_unhashed(const struct nfs4_ol    1451 nfs4_ol_stateid_unhashed(const struct nfs4_ol_stateid *stp)
1497 {                                                1452 {
1498         return list_empty(&stp->st_perfile);     1453         return list_empty(&stp->st_perfile);
1499 }                                                1454 }
1500                                                  1455 
1501 static bool unhash_ol_stateid(struct nfs4_ol_    1456 static bool unhash_ol_stateid(struct nfs4_ol_stateid *stp)
1502 {                                                1457 {
1503         struct nfs4_file *fp = stp->st_stid.s    1458         struct nfs4_file *fp = stp->st_stid.sc_file;
1504                                                  1459 
1505         lockdep_assert_held(&stp->st_stateown    1460         lockdep_assert_held(&stp->st_stateowner->so_client->cl_lock);
1506                                                  1461 
1507         if (list_empty(&stp->st_perfile))        1462         if (list_empty(&stp->st_perfile))
1508                 return false;                    1463                 return false;
1509                                                  1464 
1510         spin_lock(&fp->fi_lock);                 1465         spin_lock(&fp->fi_lock);
1511         list_del_init(&stp->st_perfile);         1466         list_del_init(&stp->st_perfile);
1512         spin_unlock(&fp->fi_lock);               1467         spin_unlock(&fp->fi_lock);
1513         list_del(&stp->st_perstateowner);        1468         list_del(&stp->st_perstateowner);
1514         return true;                             1469         return true;
1515 }                                                1470 }
1516                                                  1471 
1517 static void nfs4_free_ol_stateid(struct nfs4_    1472 static void nfs4_free_ol_stateid(struct nfs4_stid *stid)
1518 {                                                1473 {
1519         struct nfs4_ol_stateid *stp = openloc    1474         struct nfs4_ol_stateid *stp = openlockstateid(stid);
1520                                                  1475 
1521         put_clnt_odstate(stp->st_clnt_odstate    1476         put_clnt_odstate(stp->st_clnt_odstate);
1522         release_all_access(stp);                 1477         release_all_access(stp);
1523         if (stp->st_stateowner)                  1478         if (stp->st_stateowner)
1524                 nfs4_put_stateowner(stp->st_s    1479                 nfs4_put_stateowner(stp->st_stateowner);
1525         WARN_ON(!list_empty(&stid->sc_cp_list    1480         WARN_ON(!list_empty(&stid->sc_cp_list));
1526         kmem_cache_free(stateid_slab, stid);     1481         kmem_cache_free(stateid_slab, stid);
1527 }                                                1482 }
1528                                                  1483 
1529 static void nfs4_free_lock_stateid(struct nfs    1484 static void nfs4_free_lock_stateid(struct nfs4_stid *stid)
1530 {                                                1485 {
1531         struct nfs4_ol_stateid *stp = openloc    1486         struct nfs4_ol_stateid *stp = openlockstateid(stid);
1532         struct nfs4_lockowner *lo = lockowner    1487         struct nfs4_lockowner *lo = lockowner(stp->st_stateowner);
1533         struct nfsd_file *nf;                    1488         struct nfsd_file *nf;
1534                                                  1489 
1535         nf = find_any_file(stp->st_stid.sc_fi    1490         nf = find_any_file(stp->st_stid.sc_file);
1536         if (nf) {                                1491         if (nf) {
1537                 get_file(nf->nf_file);           1492                 get_file(nf->nf_file);
1538                 filp_close(nf->nf_file, (fl_o    1493                 filp_close(nf->nf_file, (fl_owner_t)lo);
1539                 nfsd_file_put(nf);               1494                 nfsd_file_put(nf);
1540         }                                        1495         }
1541         nfs4_free_ol_stateid(stid);              1496         nfs4_free_ol_stateid(stid);
1542 }                                                1497 }
1543                                                  1498 
1544 /*                                               1499 /*
1545  * Put the persistent reference to an already    1500  * Put the persistent reference to an already unhashed generic stateid, while
1546  * holding the cl_lock. If it's the last refe    1501  * holding the cl_lock. If it's the last reference, then put it onto the
1547  * reaplist for later destruction.               1502  * reaplist for later destruction.
1548  */                                              1503  */
1549 static void put_ol_stateid_locked(struct nfs4    1504 static void put_ol_stateid_locked(struct nfs4_ol_stateid *stp,
1550                                        struct    1505                                        struct list_head *reaplist)
1551 {                                                1506 {
1552         struct nfs4_stid *s = &stp->st_stid;     1507         struct nfs4_stid *s = &stp->st_stid;
1553         struct nfs4_client *clp = s->sc_clien    1508         struct nfs4_client *clp = s->sc_client;
1554                                                  1509 
1555         lockdep_assert_held(&clp->cl_lock);      1510         lockdep_assert_held(&clp->cl_lock);
1556                                                  1511 
1557         WARN_ON_ONCE(!list_empty(&stp->st_loc    1512         WARN_ON_ONCE(!list_empty(&stp->st_locks));
1558                                                  1513 
1559         if (!refcount_dec_and_test(&s->sc_cou    1514         if (!refcount_dec_and_test(&s->sc_count)) {
1560                 wake_up_all(&close_wq);          1515                 wake_up_all(&close_wq);
1561                 return;                          1516                 return;
1562         }                                        1517         }
1563                                                  1518 
1564         idr_remove(&clp->cl_stateids, s->sc_s    1519         idr_remove(&clp->cl_stateids, s->sc_stateid.si_opaque.so_id);
1565         if (s->sc_status & SC_STATUS_ADMIN_RE << 
1566                 atomic_dec(&s->sc_client->cl_ << 
1567         list_add(&stp->st_locks, reaplist);      1520         list_add(&stp->st_locks, reaplist);
1568 }                                                1521 }
1569                                                  1522 
1570 static bool unhash_lock_stateid(struct nfs4_o    1523 static bool unhash_lock_stateid(struct nfs4_ol_stateid *stp)
1571 {                                                1524 {
1572         lockdep_assert_held(&stp->st_stid.sc_    1525         lockdep_assert_held(&stp->st_stid.sc_client->cl_lock);
1573                                                  1526 
1574         if (!unhash_ol_stateid(stp))             1527         if (!unhash_ol_stateid(stp))
1575                 return false;                    1528                 return false;
1576         list_del_init(&stp->st_locks);           1529         list_del_init(&stp->st_locks);
1577         stp->st_stid.sc_status |= SC_STATUS_C !! 1530         nfs4_unhash_stid(&stp->st_stid);
1578         return true;                             1531         return true;
1579 }                                                1532 }
1580                                                  1533 
1581 static void release_lock_stateid(struct nfs4_    1534 static void release_lock_stateid(struct nfs4_ol_stateid *stp)
1582 {                                                1535 {
1583         struct nfs4_client *clp = stp->st_sti    1536         struct nfs4_client *clp = stp->st_stid.sc_client;
1584         bool unhashed;                           1537         bool unhashed;
1585                                                  1538 
1586         spin_lock(&clp->cl_lock);                1539         spin_lock(&clp->cl_lock);
1587         unhashed = unhash_lock_stateid(stp);     1540         unhashed = unhash_lock_stateid(stp);
1588         spin_unlock(&clp->cl_lock);              1541         spin_unlock(&clp->cl_lock);
1589         if (unhashed)                            1542         if (unhashed)
1590                 nfs4_put_stid(&stp->st_stid);    1543                 nfs4_put_stid(&stp->st_stid);
1591 }                                                1544 }
1592                                                  1545 
1593 static void unhash_lockowner_locked(struct nf    1546 static void unhash_lockowner_locked(struct nfs4_lockowner *lo)
1594 {                                                1547 {
1595         struct nfs4_client *clp = lo->lo_owne    1548         struct nfs4_client *clp = lo->lo_owner.so_client;
1596                                                  1549 
1597         lockdep_assert_held(&clp->cl_lock);      1550         lockdep_assert_held(&clp->cl_lock);
1598                                                  1551 
1599         list_del_init(&lo->lo_owner.so_strhas    1552         list_del_init(&lo->lo_owner.so_strhash);
1600 }                                                1553 }
1601                                                  1554 
1602 /*                                               1555 /*
1603  * Free a list of generic stateids that were     1556  * Free a list of generic stateids that were collected earlier after being
1604  * fully unhashed.                               1557  * fully unhashed.
1605  */                                              1558  */
1606 static void                                      1559 static void
1607 free_ol_stateid_reaplist(struct list_head *re    1560 free_ol_stateid_reaplist(struct list_head *reaplist)
1608 {                                                1561 {
1609         struct nfs4_ol_stateid *stp;             1562         struct nfs4_ol_stateid *stp;
1610         struct nfs4_file *fp;                    1563         struct nfs4_file *fp;
1611                                                  1564 
1612         might_sleep();                           1565         might_sleep();
1613                                                  1566 
1614         while (!list_empty(reaplist)) {          1567         while (!list_empty(reaplist)) {
1615                 stp = list_first_entry(reapli    1568                 stp = list_first_entry(reaplist, struct nfs4_ol_stateid,
1616                                        st_loc    1569                                        st_locks);
1617                 list_del(&stp->st_locks);        1570                 list_del(&stp->st_locks);
1618                 fp = stp->st_stid.sc_file;       1571                 fp = stp->st_stid.sc_file;
1619                 stp->st_stid.sc_free(&stp->st    1572                 stp->st_stid.sc_free(&stp->st_stid);
1620                 if (fp)                          1573                 if (fp)
1621                         put_nfs4_file(fp);       1574                         put_nfs4_file(fp);
1622         }                                        1575         }
1623 }                                                1576 }
1624                                                  1577 
1625 static void release_open_stateid_locks(struct    1578 static void release_open_stateid_locks(struct nfs4_ol_stateid *open_stp,
1626                                        struct    1579                                        struct list_head *reaplist)
1627 {                                                1580 {
1628         struct nfs4_ol_stateid *stp;             1581         struct nfs4_ol_stateid *stp;
1629                                                  1582 
1630         lockdep_assert_held(&open_stp->st_sti    1583         lockdep_assert_held(&open_stp->st_stid.sc_client->cl_lock);
1631                                                  1584 
1632         while (!list_empty(&open_stp->st_lock    1585         while (!list_empty(&open_stp->st_locks)) {
1633                 stp = list_entry(open_stp->st    1586                 stp = list_entry(open_stp->st_locks.next,
1634                                 struct nfs4_o    1587                                 struct nfs4_ol_stateid, st_locks);
1635                 unhash_lock_stateid(stp);     !! 1588                 WARN_ON(!unhash_lock_stateid(stp));
1636                 put_ol_stateid_locked(stp, re    1589                 put_ol_stateid_locked(stp, reaplist);
1637         }                                        1590         }
1638 }                                                1591 }
1639                                                  1592 
1640 static bool unhash_open_stateid(struct nfs4_o    1593 static bool unhash_open_stateid(struct nfs4_ol_stateid *stp,
1641                                 struct list_h    1594                                 struct list_head *reaplist)
1642 {                                                1595 {
1643         lockdep_assert_held(&stp->st_stid.sc_    1596         lockdep_assert_held(&stp->st_stid.sc_client->cl_lock);
1644                                                  1597 
1645         if (!unhash_ol_stateid(stp))             1598         if (!unhash_ol_stateid(stp))
1646                 return false;                    1599                 return false;
1647         release_open_stateid_locks(stp, reapl    1600         release_open_stateid_locks(stp, reaplist);
1648         return true;                             1601         return true;
1649 }                                                1602 }
1650                                                  1603 
1651 static void release_open_stateid(struct nfs4_    1604 static void release_open_stateid(struct nfs4_ol_stateid *stp)
1652 {                                                1605 {
1653         LIST_HEAD(reaplist);                     1606         LIST_HEAD(reaplist);
1654                                                  1607 
1655         spin_lock(&stp->st_stid.sc_client->cl    1608         spin_lock(&stp->st_stid.sc_client->cl_lock);
1656         stp->st_stid.sc_status |= SC_STATUS_C << 
1657         if (unhash_open_stateid(stp, &reaplis    1609         if (unhash_open_stateid(stp, &reaplist))
1658                 put_ol_stateid_locked(stp, &r    1610                 put_ol_stateid_locked(stp, &reaplist);
1659         spin_unlock(&stp->st_stid.sc_client->    1611         spin_unlock(&stp->st_stid.sc_client->cl_lock);
1660         free_ol_stateid_reaplist(&reaplist);     1612         free_ol_stateid_reaplist(&reaplist);
1661 }                                                1613 }
1662                                                  1614 
1663 static void unhash_openowner_locked(struct nf    1615 static void unhash_openowner_locked(struct nfs4_openowner *oo)
1664 {                                                1616 {
1665         struct nfs4_client *clp = oo->oo_owne    1617         struct nfs4_client *clp = oo->oo_owner.so_client;
1666                                                  1618 
1667         lockdep_assert_held(&clp->cl_lock);      1619         lockdep_assert_held(&clp->cl_lock);
1668                                                  1620 
1669         list_del_init(&oo->oo_owner.so_strhas    1621         list_del_init(&oo->oo_owner.so_strhash);
1670         list_del_init(&oo->oo_perclient);        1622         list_del_init(&oo->oo_perclient);
1671 }                                                1623 }
1672                                                  1624 
1673 static void release_last_closed_stateid(struc    1625 static void release_last_closed_stateid(struct nfs4_openowner *oo)
1674 {                                                1626 {
1675         struct nfsd_net *nn = net_generic(oo-    1627         struct nfsd_net *nn = net_generic(oo->oo_owner.so_client->net,
1676                                           nfs    1628                                           nfsd_net_id);
1677         struct nfs4_ol_stateid *s;               1629         struct nfs4_ol_stateid *s;
1678                                                  1630 
1679         spin_lock(&nn->client_lock);             1631         spin_lock(&nn->client_lock);
1680         s = oo->oo_last_closed_stid;             1632         s = oo->oo_last_closed_stid;
1681         if (s) {                                 1633         if (s) {
1682                 list_del_init(&oo->oo_close_l    1634                 list_del_init(&oo->oo_close_lru);
1683                 oo->oo_last_closed_stid = NUL    1635                 oo->oo_last_closed_stid = NULL;
1684         }                                        1636         }
1685         spin_unlock(&nn->client_lock);           1637         spin_unlock(&nn->client_lock);
1686         if (s)                                   1638         if (s)
1687                 nfs4_put_stid(&s->st_stid);      1639                 nfs4_put_stid(&s->st_stid);
1688 }                                                1640 }
1689                                                  1641 
1690 static void release_openowner(struct nfs4_ope    1642 static void release_openowner(struct nfs4_openowner *oo)
1691 {                                                1643 {
1692         struct nfs4_ol_stateid *stp;             1644         struct nfs4_ol_stateid *stp;
1693         struct nfs4_client *clp = oo->oo_owne    1645         struct nfs4_client *clp = oo->oo_owner.so_client;
1694         LIST_HEAD(reaplist);                  !! 1646         struct list_head reaplist;
                                                   >> 1647 
                                                   >> 1648         INIT_LIST_HEAD(&reaplist);
1695                                                  1649 
1696         spin_lock(&clp->cl_lock);                1650         spin_lock(&clp->cl_lock);
1697         unhash_openowner_locked(oo);             1651         unhash_openowner_locked(oo);
1698         while (!list_empty(&oo->oo_owner.so_s    1652         while (!list_empty(&oo->oo_owner.so_stateids)) {
1699                 stp = list_first_entry(&oo->o    1653                 stp = list_first_entry(&oo->oo_owner.so_stateids,
1700                                 struct nfs4_o    1654                                 struct nfs4_ol_stateid, st_perstateowner);
1701                 if (unhash_open_stateid(stp,     1655                 if (unhash_open_stateid(stp, &reaplist))
1702                         put_ol_stateid_locked    1656                         put_ol_stateid_locked(stp, &reaplist);
1703         }                                        1657         }
1704         spin_unlock(&clp->cl_lock);              1658         spin_unlock(&clp->cl_lock);
1705         free_ol_stateid_reaplist(&reaplist);     1659         free_ol_stateid_reaplist(&reaplist);
1706         release_last_closed_stateid(oo);         1660         release_last_closed_stateid(oo);
1707         nfs4_put_stateowner(&oo->oo_owner);      1661         nfs4_put_stateowner(&oo->oo_owner);
1708 }                                                1662 }
1709                                                  1663 
1710 static struct nfs4_stid *find_one_sb_stid(str << 
1711                                           str << 
1712                                           uns << 
1713 {                                             << 
1714         unsigned long id, tmp;                << 
1715         struct nfs4_stid *stid;               << 
1716                                               << 
1717         spin_lock(&clp->cl_lock);             << 
1718         idr_for_each_entry_ul(&clp->cl_statei << 
1719                 if ((stid->sc_type & sc_types << 
1720                     stid->sc_status == 0 &&   << 
1721                     stid->sc_file->fi_inode-> << 
1722                         refcount_inc(&stid->s << 
1723                         break;                << 
1724                 }                             << 
1725         spin_unlock(&clp->cl_lock);           << 
1726         return stid;                          << 
1727 }                                             << 
1728                                               << 
1729 /**                                           << 
1730  * nfsd4_revoke_states - revoke all nfsv4 sta << 
1731  * @net:  used to identify instance of nfsd ( << 
1732  * @sb:   super_block used to identify target << 
1733  *                                            << 
1734  * All nfs4 states (open, lock, delegation, l << 
1735  * and associated with a file on the given fi << 
1736  * in any files being closed and so all refer << 
1737  * being released.  Thus nfsd will no longer  << 
1738  * unmounted.                                 << 
1739  *                                            << 
1740  * The clients which own the states will subs << 
1741  * states have been "admin-revoked".          << 
1742  */                                           << 
1743 void nfsd4_revoke_states(struct net *net, str << 
1744 {                                             << 
1745         struct nfsd_net *nn = net_generic(net << 
1746         unsigned int idhashval;               << 
1747         unsigned int sc_types;                << 
1748                                               << 
1749         sc_types = SC_TYPE_OPEN | SC_TYPE_LOC << 
1750                                               << 
1751         spin_lock(&nn->client_lock);          << 
1752         for (idhashval = 0; idhashval < CLIEN << 
1753                 struct list_head *head = &nn- << 
1754                 struct nfs4_client *clp;      << 
1755         retry:                                << 
1756                 list_for_each_entry(clp, head << 
1757                         struct nfs4_stid *sti << 
1758                                               << 
1759                         if (stid) {           << 
1760                                 struct nfs4_o << 
1761                                 struct nfs4_d << 
1762                                 struct nfs4_l << 
1763                                               << 
1764                                 spin_unlock(& << 
1765                                 switch (stid- << 
1766                                 case SC_TYPE_ << 
1767                                         stp = << 
1768                                         mutex << 
1769                                               << 
1770                                               << 
1771                                         spin_ << 
1772                                         if (s << 
1773                                               << 
1774                                               << 
1775                                               << 
1776                                               << 
1777                                               << 
1778                                         } els << 
1779                                               << 
1780                                         mutex << 
1781                                         break << 
1782                                 case SC_TYPE_ << 
1783                                         stp = << 
1784                                         mutex << 
1785                                               << 
1786                                         spin_ << 
1787                                         if (s << 
1788                                               << 
1789                                               << 
1790                                               << 
1791                                               << 
1792                                               << 
1793                                               << 
1794                                               << 
1795                                               << 
1796                                               << 
1797                                               << 
1798                                               << 
1799                                               << 
1800                                               << 
1801                                               << 
1802                                               << 
1803                                               << 
1804                                         } els << 
1805                                               << 
1806                                         mutex << 
1807                                         break << 
1808                                 case SC_TYPE_ << 
1809                                         refco << 
1810                                         dp =  << 
1811                                         spin_ << 
1812                                         if (! << 
1813                                               << 
1814                                               << 
1815                                         spin_ << 
1816                                         if (d << 
1817                                               << 
1818                                         break << 
1819                                 case SC_TYPE_ << 
1820                                         ls =  << 
1821                                         nfsd4 << 
1822                                         break << 
1823                                 }             << 
1824                                 nfs4_put_stid << 
1825                                 spin_lock(&nn << 
1826                                 if (clp->cl_m << 
1827                                         /* Al << 
1828                                          * st << 
1829                                          * se << 
1830                                          * se << 
1831                                          */   << 
1832                                         nn->n << 
1833                                               << 
1834                                 goto retry;   << 
1835                         }                     << 
1836                 }                             << 
1837         }                                     << 
1838         spin_unlock(&nn->client_lock);        << 
1839 }                                             << 
1840                                               << 
1841 static inline int                                1664 static inline int
1842 hash_sessionid(struct nfs4_sessionid *session    1665 hash_sessionid(struct nfs4_sessionid *sessionid)
1843 {                                                1666 {
1844         struct nfsd4_sessionid *sid = (struct    1667         struct nfsd4_sessionid *sid = (struct nfsd4_sessionid *)sessionid;
1845                                                  1668 
1846         return sid->sequence % SESSION_HASH_S    1669         return sid->sequence % SESSION_HASH_SIZE;
1847 }                                                1670 }
1848                                                  1671 
1849 #ifdef CONFIG_SUNRPC_DEBUG                       1672 #ifdef CONFIG_SUNRPC_DEBUG
1850 static inline void                               1673 static inline void
1851 dump_sessionid(const char *fn, struct nfs4_se    1674 dump_sessionid(const char *fn, struct nfs4_sessionid *sessionid)
1852 {                                                1675 {
1853         u32 *ptr = (u32 *)(&sessionid->data[0    1676         u32 *ptr = (u32 *)(&sessionid->data[0]);
1854         dprintk("%s: %u:%u:%u:%u\n", fn, ptr[    1677         dprintk("%s: %u:%u:%u:%u\n", fn, ptr[0], ptr[1], ptr[2], ptr[3]);
1855 }                                                1678 }
1856 #else                                            1679 #else
1857 static inline void                               1680 static inline void
1858 dump_sessionid(const char *fn, struct nfs4_se    1681 dump_sessionid(const char *fn, struct nfs4_sessionid *sessionid)
1859 {                                                1682 {
1860 }                                                1683 }
1861 #endif                                           1684 #endif
1862                                                  1685 
1863 /*                                               1686 /*
1864  * Bump the seqid on cstate->replay_owner, an    1687  * Bump the seqid on cstate->replay_owner, and clear replay_owner if it
1865  * won't be used for replay.                     1688  * won't be used for replay.
1866  */                                              1689  */
1867 void nfsd4_bump_seqid(struct nfsd4_compound_s    1690 void nfsd4_bump_seqid(struct nfsd4_compound_state *cstate, __be32 nfserr)
1868 {                                                1691 {
1869         struct nfs4_stateowner *so = cstate->    1692         struct nfs4_stateowner *so = cstate->replay_owner;
1870                                                  1693 
1871         if (nfserr == nfserr_replay_me)          1694         if (nfserr == nfserr_replay_me)
1872                 return;                          1695                 return;
1873                                                  1696 
1874         if (!seqid_mutating_err(ntohl(nfserr)    1697         if (!seqid_mutating_err(ntohl(nfserr))) {
1875                 nfsd4_cstate_clear_replay(cst    1698                 nfsd4_cstate_clear_replay(cstate);
1876                 return;                          1699                 return;
1877         }                                        1700         }
1878         if (!so)                                 1701         if (!so)
1879                 return;                          1702                 return;
1880         if (so->so_is_open_owner)                1703         if (so->so_is_open_owner)
1881                 release_last_closed_stateid(o    1704                 release_last_closed_stateid(openowner(so));
1882         so->so_seqid++;                          1705         so->so_seqid++;
1883         return;                                  1706         return;
1884 }                                                1707 }
1885                                                  1708 
1886 static void                                      1709 static void
1887 gen_sessionid(struct nfsd4_session *ses)         1710 gen_sessionid(struct nfsd4_session *ses)
1888 {                                                1711 {
1889         struct nfs4_client *clp = ses->se_cli    1712         struct nfs4_client *clp = ses->se_client;
1890         struct nfsd4_sessionid *sid;             1713         struct nfsd4_sessionid *sid;
1891                                                  1714 
1892         sid = (struct nfsd4_sessionid *)ses->    1715         sid = (struct nfsd4_sessionid *)ses->se_sessionid.data;
1893         sid->clientid = clp->cl_clientid;        1716         sid->clientid = clp->cl_clientid;
1894         sid->sequence = current_sessionid++;     1717         sid->sequence = current_sessionid++;
1895         sid->reserved = 0;                       1718         sid->reserved = 0;
1896 }                                                1719 }
1897                                                  1720 
1898 /*                                               1721 /*
1899  * The protocol defines ca_maxresponssize_cac    1722  * The protocol defines ca_maxresponssize_cached to include the size of
1900  * the rpc header, but all we need to cache i    1723  * the rpc header, but all we need to cache is the data starting after
1901  * the end of the initial SEQUENCE operation-    1724  * the end of the initial SEQUENCE operation--the rest we regenerate
1902  * each time.  Therefore we can advertise a c    1725  * each time.  Therefore we can advertise a ca_maxresponssize_cached
1903  * value that is the number of bytes in our c    1726  * value that is the number of bytes in our cache plus a few additional
1904  * bytes.  In order to stay on the safe side,    1727  * bytes.  In order to stay on the safe side, and not promise more than
1905  * we can cache, those additional bytes must     1728  * we can cache, those additional bytes must be the minimum possible: 24
1906  * bytes of rpc header (xid through accept st    1729  * bytes of rpc header (xid through accept state, with AUTH_NULL
1907  * verifier), 12 for the compound header (wit    1730  * verifier), 12 for the compound header (with zero-length tag), and 44
1908  * for the SEQUENCE op response:                 1731  * for the SEQUENCE op response:
1909  */                                              1732  */
1910 #define NFSD_MIN_HDR_SEQ_SZ  (24 + 12 + 44)      1733 #define NFSD_MIN_HDR_SEQ_SZ  (24 + 12 + 44)
1911                                                  1734 
1912 static void                                      1735 static void
1913 free_session_slots(struct nfsd4_session *ses)    1736 free_session_slots(struct nfsd4_session *ses)
1914 {                                                1737 {
1915         int i;                                   1738         int i;
1916                                                  1739 
1917         for (i = 0; i < ses->se_fchannel.maxr    1740         for (i = 0; i < ses->se_fchannel.maxreqs; i++) {
1918                 free_svc_cred(&ses->se_slots[    1741                 free_svc_cred(&ses->se_slots[i]->sl_cred);
1919                 kfree(ses->se_slots[i]);         1742                 kfree(ses->se_slots[i]);
1920         }                                        1743         }
1921 }                                                1744 }
1922                                                  1745 
1923 /*                                               1746 /*
1924  * We don't actually need to cache the rpc an    1747  * We don't actually need to cache the rpc and session headers, so we
1925  * can allocate a little less for each slot:     1748  * can allocate a little less for each slot:
1926  */                                              1749  */
1927 static inline u32 slot_bytes(struct nfsd4_cha    1750 static inline u32 slot_bytes(struct nfsd4_channel_attrs *ca)
1928 {                                                1751 {
1929         u32 size;                                1752         u32 size;
1930                                                  1753 
1931         if (ca->maxresp_cached < NFSD_MIN_HDR    1754         if (ca->maxresp_cached < NFSD_MIN_HDR_SEQ_SZ)
1932                 size = 0;                        1755                 size = 0;
1933         else                                     1756         else
1934                 size = ca->maxresp_cached - N    1757                 size = ca->maxresp_cached - NFSD_MIN_HDR_SEQ_SZ;
1935         return size + sizeof(struct nfsd4_slo    1758         return size + sizeof(struct nfsd4_slot);
1936 }                                                1759 }
1937                                                  1760 
1938 /*                                               1761 /*
1939  * XXX: If we run out of reserved DRC memory     1762  * XXX: If we run out of reserved DRC memory we could (up to a point)
1940  * re-negotiate active sessions and reduce th    1763  * re-negotiate active sessions and reduce their slot usage to make
1941  * room for new connections. For now we just     1764  * room for new connections. For now we just fail the create session.
1942  */                                              1765  */
1943 static u32 nfsd4_get_drc_mem(struct nfsd4_cha    1766 static u32 nfsd4_get_drc_mem(struct nfsd4_channel_attrs *ca, struct nfsd_net *nn)
1944 {                                                1767 {
1945         u32 slotsize = slot_bytes(ca);           1768         u32 slotsize = slot_bytes(ca);
1946         u32 num = ca->maxreqs;                   1769         u32 num = ca->maxreqs;
1947         unsigned long avail, total_avail;        1770         unsigned long avail, total_avail;
1948         unsigned int scale_factor;               1771         unsigned int scale_factor;
1949                                                  1772 
1950         spin_lock(&nfsd_drc_lock);               1773         spin_lock(&nfsd_drc_lock);
1951         if (nfsd_drc_max_mem > nfsd_drc_mem_u    1774         if (nfsd_drc_max_mem > nfsd_drc_mem_used)
1952                 total_avail = nfsd_drc_max_me    1775                 total_avail = nfsd_drc_max_mem - nfsd_drc_mem_used;
1953         else                                     1776         else
1954                 /* We have handed out more sp    1777                 /* We have handed out more space than we chose in
1955                  * set_max_drc() to allow.  T    1778                  * set_max_drc() to allow.  That isn't really a
1956                  * problem as long as that do    1779                  * problem as long as that doesn't make us think we
1957                  * have lots more due to inte    1780                  * have lots more due to integer overflow.
1958                  */                              1781                  */
1959                 total_avail = 0;                 1782                 total_avail = 0;
1960         avail = min((unsigned long)NFSD_MAX_M    1783         avail = min((unsigned long)NFSD_MAX_MEM_PER_SESSION, total_avail);
1961         /*                                       1784         /*
1962          * Never use more than a fraction of     1785          * Never use more than a fraction of the remaining memory,
1963          * unless it's the only way to give t    1786          * unless it's the only way to give this client a slot.
1964          * The chosen fraction is either 1/8     1787          * The chosen fraction is either 1/8 or 1/number of threads,
1965          * whichever is smaller.  This ensure    1788          * whichever is smaller.  This ensures there are adequate
1966          * slots to support multiple clients     1789          * slots to support multiple clients per thread.
1967          * Give the client one slot even if t    1790          * Give the client one slot even if that would require
1968          * over-allocation--it is better than    1791          * over-allocation--it is better than failure.
1969          */                                      1792          */
1970         scale_factor = max_t(unsigned int, 8,    1793         scale_factor = max_t(unsigned int, 8, nn->nfsd_serv->sv_nrthreads);
1971                                                  1794 
1972         avail = clamp_t(unsigned long, avail,    1795         avail = clamp_t(unsigned long, avail, slotsize,
1973                         total_avail/scale_fac    1796                         total_avail/scale_factor);
1974         num = min_t(int, num, avail / slotsiz    1797         num = min_t(int, num, avail / slotsize);
1975         num = max_t(int, num, 1);                1798         num = max_t(int, num, 1);
1976         nfsd_drc_mem_used += num * slotsize;     1799         nfsd_drc_mem_used += num * slotsize;
1977         spin_unlock(&nfsd_drc_lock);             1800         spin_unlock(&nfsd_drc_lock);
1978                                                  1801 
1979         return num;                              1802         return num;
1980 }                                                1803 }
1981                                                  1804 
1982 static void nfsd4_put_drc_mem(struct nfsd4_ch    1805 static void nfsd4_put_drc_mem(struct nfsd4_channel_attrs *ca)
1983 {                                                1806 {
1984         int slotsize = slot_bytes(ca);           1807         int slotsize = slot_bytes(ca);
1985                                                  1808 
1986         spin_lock(&nfsd_drc_lock);               1809         spin_lock(&nfsd_drc_lock);
1987         nfsd_drc_mem_used -= slotsize * ca->m    1810         nfsd_drc_mem_used -= slotsize * ca->maxreqs;
1988         spin_unlock(&nfsd_drc_lock);             1811         spin_unlock(&nfsd_drc_lock);
1989 }                                                1812 }
1990                                                  1813 
1991 static struct nfsd4_session *alloc_session(st    1814 static struct nfsd4_session *alloc_session(struct nfsd4_channel_attrs *fattrs,
1992                                            st    1815                                            struct nfsd4_channel_attrs *battrs)
1993 {                                                1816 {
1994         int numslots = fattrs->maxreqs;          1817         int numslots = fattrs->maxreqs;
1995         int slotsize = slot_bytes(fattrs);       1818         int slotsize = slot_bytes(fattrs);
1996         struct nfsd4_session *new;               1819         struct nfsd4_session *new;
1997         int i;                                   1820         int i;
1998                                                  1821 
1999         BUILD_BUG_ON(struct_size(new, se_slot    1822         BUILD_BUG_ON(struct_size(new, se_slots, NFSD_MAX_SLOTS_PER_SESSION)
2000                      > PAGE_SIZE);               1823                      > PAGE_SIZE);
2001                                                  1824 
2002         new = kzalloc(struct_size(new, se_slo    1825         new = kzalloc(struct_size(new, se_slots, numslots), GFP_KERNEL);
2003         if (!new)                                1826         if (!new)
2004                 return NULL;                     1827                 return NULL;
2005         /* allocate each struct nfsd4_slot an    1828         /* allocate each struct nfsd4_slot and data cache in one piece */
2006         for (i = 0; i < numslots; i++) {         1829         for (i = 0; i < numslots; i++) {
2007                 new->se_slots[i] = kzalloc(sl    1830                 new->se_slots[i] = kzalloc(slotsize, GFP_KERNEL);
2008                 if (!new->se_slots[i])           1831                 if (!new->se_slots[i])
2009                         goto out_free;           1832                         goto out_free;
2010         }                                        1833         }
2011                                                  1834 
2012         memcpy(&new->se_fchannel, fattrs, siz    1835         memcpy(&new->se_fchannel, fattrs, sizeof(struct nfsd4_channel_attrs));
2013         memcpy(&new->se_bchannel, battrs, siz    1836         memcpy(&new->se_bchannel, battrs, sizeof(struct nfsd4_channel_attrs));
2014                                                  1837 
2015         return new;                              1838         return new;
2016 out_free:                                        1839 out_free:
2017         while (i--)                              1840         while (i--)
2018                 kfree(new->se_slots[i]);         1841                 kfree(new->se_slots[i]);
2019         kfree(new);                              1842         kfree(new);
2020         return NULL;                             1843         return NULL;
2021 }                                                1844 }
2022                                                  1845 
2023 static void free_conn(struct nfsd4_conn *c)      1846 static void free_conn(struct nfsd4_conn *c)
2024 {                                                1847 {
2025         svc_xprt_put(c->cn_xprt);                1848         svc_xprt_put(c->cn_xprt);
2026         kfree(c);                                1849         kfree(c);
2027 }                                                1850 }
2028                                                  1851 
2029 static void nfsd4_conn_lost(struct svc_xpt_us    1852 static void nfsd4_conn_lost(struct svc_xpt_user *u)
2030 {                                                1853 {
2031         struct nfsd4_conn *c = container_of(u    1854         struct nfsd4_conn *c = container_of(u, struct nfsd4_conn, cn_xpt_user);
2032         struct nfs4_client *clp = c->cn_sessi    1855         struct nfs4_client *clp = c->cn_session->se_client;
2033                                                  1856 
2034         trace_nfsd_cb_lost(clp);                 1857         trace_nfsd_cb_lost(clp);
2035                                                  1858 
2036         spin_lock(&clp->cl_lock);                1859         spin_lock(&clp->cl_lock);
2037         if (!list_empty(&c->cn_persession)) {    1860         if (!list_empty(&c->cn_persession)) {
2038                 list_del(&c->cn_persession);     1861                 list_del(&c->cn_persession);
2039                 free_conn(c);                    1862                 free_conn(c);
2040         }                                        1863         }
2041         nfsd4_probe_callback(clp);               1864         nfsd4_probe_callback(clp);
2042         spin_unlock(&clp->cl_lock);              1865         spin_unlock(&clp->cl_lock);
2043 }                                                1866 }
2044                                                  1867 
2045 static struct nfsd4_conn *alloc_conn(struct s    1868 static struct nfsd4_conn *alloc_conn(struct svc_rqst *rqstp, u32 flags)
2046 {                                                1869 {
2047         struct nfsd4_conn *conn;                 1870         struct nfsd4_conn *conn;
2048                                                  1871 
2049         conn = kmalloc(sizeof(struct nfsd4_co    1872         conn = kmalloc(sizeof(struct nfsd4_conn), GFP_KERNEL);
2050         if (!conn)                               1873         if (!conn)
2051                 return NULL;                     1874                 return NULL;
2052         svc_xprt_get(rqstp->rq_xprt);            1875         svc_xprt_get(rqstp->rq_xprt);
2053         conn->cn_xprt = rqstp->rq_xprt;          1876         conn->cn_xprt = rqstp->rq_xprt;
2054         conn->cn_flags = flags;                  1877         conn->cn_flags = flags;
2055         INIT_LIST_HEAD(&conn->cn_xpt_user.lis    1878         INIT_LIST_HEAD(&conn->cn_xpt_user.list);
2056         return conn;                             1879         return conn;
2057 }                                                1880 }
2058                                                  1881 
2059 static void __nfsd4_hash_conn(struct nfsd4_co    1882 static void __nfsd4_hash_conn(struct nfsd4_conn *conn, struct nfsd4_session *ses)
2060 {                                                1883 {
2061         conn->cn_session = ses;                  1884         conn->cn_session = ses;
2062         list_add(&conn->cn_persession, &ses->    1885         list_add(&conn->cn_persession, &ses->se_conns);
2063 }                                                1886 }
2064                                                  1887 
2065 static void nfsd4_hash_conn(struct nfsd4_conn    1888 static void nfsd4_hash_conn(struct nfsd4_conn *conn, struct nfsd4_session *ses)
2066 {                                                1889 {
2067         struct nfs4_client *clp = ses->se_cli    1890         struct nfs4_client *clp = ses->se_client;
2068                                                  1891 
2069         spin_lock(&clp->cl_lock);                1892         spin_lock(&clp->cl_lock);
2070         __nfsd4_hash_conn(conn, ses);            1893         __nfsd4_hash_conn(conn, ses);
2071         spin_unlock(&clp->cl_lock);              1894         spin_unlock(&clp->cl_lock);
2072 }                                                1895 }
2073                                                  1896 
2074 static int nfsd4_register_conn(struct nfsd4_c    1897 static int nfsd4_register_conn(struct nfsd4_conn *conn)
2075 {                                                1898 {
2076         conn->cn_xpt_user.callback = nfsd4_co    1899         conn->cn_xpt_user.callback = nfsd4_conn_lost;
2077         return register_xpt_user(conn->cn_xpr    1900         return register_xpt_user(conn->cn_xprt, &conn->cn_xpt_user);
2078 }                                                1901 }
2079                                                  1902 
2080 static void nfsd4_init_conn(struct svc_rqst *    1903 static void nfsd4_init_conn(struct svc_rqst *rqstp, struct nfsd4_conn *conn, struct nfsd4_session *ses)
2081 {                                                1904 {
2082         int ret;                                 1905         int ret;
2083                                                  1906 
2084         nfsd4_hash_conn(conn, ses);              1907         nfsd4_hash_conn(conn, ses);
2085         ret = nfsd4_register_conn(conn);         1908         ret = nfsd4_register_conn(conn);
2086         if (ret)                                 1909         if (ret)
2087                 /* oops; xprt is already down    1910                 /* oops; xprt is already down: */
2088                 nfsd4_conn_lost(&conn->cn_xpt    1911                 nfsd4_conn_lost(&conn->cn_xpt_user);
2089         /* We may have gained or lost a callb    1912         /* We may have gained or lost a callback channel: */
2090         nfsd4_probe_callback_sync(ses->se_cli    1913         nfsd4_probe_callback_sync(ses->se_client);
2091 }                                                1914 }
2092                                                  1915 
2093 static struct nfsd4_conn *alloc_conn_from_crs    1916 static struct nfsd4_conn *alloc_conn_from_crses(struct svc_rqst *rqstp, struct nfsd4_create_session *cses)
2094 {                                                1917 {
2095         u32 dir = NFS4_CDFC4_FORE;               1918         u32 dir = NFS4_CDFC4_FORE;
2096                                                  1919 
2097         if (cses->flags & SESSION4_BACK_CHAN)    1920         if (cses->flags & SESSION4_BACK_CHAN)
2098                 dir |= NFS4_CDFC4_BACK;          1921                 dir |= NFS4_CDFC4_BACK;
2099         return alloc_conn(rqstp, dir);           1922         return alloc_conn(rqstp, dir);
2100 }                                                1923 }
2101                                                  1924 
2102 /* must be called under client_lock */           1925 /* must be called under client_lock */
2103 static void nfsd4_del_conns(struct nfsd4_sess    1926 static void nfsd4_del_conns(struct nfsd4_session *s)
2104 {                                                1927 {
2105         struct nfs4_client *clp = s->se_clien    1928         struct nfs4_client *clp = s->se_client;
2106         struct nfsd4_conn *c;                    1929         struct nfsd4_conn *c;
2107                                                  1930 
2108         spin_lock(&clp->cl_lock);                1931         spin_lock(&clp->cl_lock);
2109         while (!list_empty(&s->se_conns)) {      1932         while (!list_empty(&s->se_conns)) {
2110                 c = list_first_entry(&s->se_c    1933                 c = list_first_entry(&s->se_conns, struct nfsd4_conn, cn_persession);
2111                 list_del_init(&c->cn_persessi    1934                 list_del_init(&c->cn_persession);
2112                 spin_unlock(&clp->cl_lock);      1935                 spin_unlock(&clp->cl_lock);
2113                                                  1936 
2114                 unregister_xpt_user(c->cn_xpr    1937                 unregister_xpt_user(c->cn_xprt, &c->cn_xpt_user);
2115                 free_conn(c);                    1938                 free_conn(c);
2116                                                  1939 
2117                 spin_lock(&clp->cl_lock);        1940                 spin_lock(&clp->cl_lock);
2118         }                                        1941         }
2119         spin_unlock(&clp->cl_lock);              1942         spin_unlock(&clp->cl_lock);
2120 }                                                1943 }
2121                                                  1944 
2122 static void __free_session(struct nfsd4_sessi    1945 static void __free_session(struct nfsd4_session *ses)
2123 {                                                1946 {
2124         free_session_slots(ses);                 1947         free_session_slots(ses);
2125         kfree(ses);                              1948         kfree(ses);
2126 }                                                1949 }
2127                                                  1950 
2128 static void free_session(struct nfsd4_session    1951 static void free_session(struct nfsd4_session *ses)
2129 {                                                1952 {
2130         nfsd4_del_conns(ses);                    1953         nfsd4_del_conns(ses);
2131         nfsd4_put_drc_mem(&ses->se_fchannel);    1954         nfsd4_put_drc_mem(&ses->se_fchannel);
2132         __free_session(ses);                     1955         __free_session(ses);
2133 }                                                1956 }
2134                                                  1957 
2135 static void init_session(struct svc_rqst *rqs    1958 static void init_session(struct svc_rqst *rqstp, struct nfsd4_session *new, struct nfs4_client *clp, struct nfsd4_create_session *cses)
2136 {                                                1959 {
2137         int idx;                                 1960         int idx;
2138         struct nfsd_net *nn = net_generic(SVC    1961         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
2139                                                  1962 
2140         new->se_client = clp;                    1963         new->se_client = clp;
2141         gen_sessionid(new);                      1964         gen_sessionid(new);
2142                                                  1965 
2143         INIT_LIST_HEAD(&new->se_conns);          1966         INIT_LIST_HEAD(&new->se_conns);
2144                                                  1967 
2145         new->se_cb_seq_nr = 1;                   1968         new->se_cb_seq_nr = 1;
2146         new->se_flags = cses->flags;             1969         new->se_flags = cses->flags;
2147         new->se_cb_prog = cses->callback_prog    1970         new->se_cb_prog = cses->callback_prog;
2148         new->se_cb_sec = cses->cb_sec;           1971         new->se_cb_sec = cses->cb_sec;
2149         atomic_set(&new->se_ref, 0);             1972         atomic_set(&new->se_ref, 0);
2150         idx = hash_sessionid(&new->se_session    1973         idx = hash_sessionid(&new->se_sessionid);
2151         list_add(&new->se_hash, &nn->sessioni    1974         list_add(&new->se_hash, &nn->sessionid_hashtbl[idx]);
2152         spin_lock(&clp->cl_lock);                1975         spin_lock(&clp->cl_lock);
2153         list_add(&new->se_perclnt, &clp->cl_s    1976         list_add(&new->se_perclnt, &clp->cl_sessions);
2154         spin_unlock(&clp->cl_lock);              1977         spin_unlock(&clp->cl_lock);
2155                                                  1978 
2156         {                                        1979         {
2157                 struct sockaddr *sa = svc_add    1980                 struct sockaddr *sa = svc_addr(rqstp);
2158                 /*                               1981                 /*
2159                  * This is a little silly; wi    1982                  * This is a little silly; with sessions there's no real
2160                  * use for the callback addre    1983                  * use for the callback address.  Use the peer address
2161                  * as a reasonable default fo    1984                  * as a reasonable default for now, but consider fixing
2162                  * the rpc client not to requ    1985                  * the rpc client not to require an address in the
2163                  * future:                       1986                  * future:
2164                  */                              1987                  */
2165                 rpc_copy_addr((struct sockadd    1988                 rpc_copy_addr((struct sockaddr *)&clp->cl_cb_conn.cb_addr, sa);
2166                 clp->cl_cb_conn.cb_addrlen =     1989                 clp->cl_cb_conn.cb_addrlen = svc_addr_len(sa);
2167         }                                        1990         }
2168 }                                                1991 }
2169                                                  1992 
2170 /* caller must hold client_lock */               1993 /* caller must hold client_lock */
2171 static struct nfsd4_session *                    1994 static struct nfsd4_session *
2172 __find_in_sessionid_hashtbl(struct nfs4_sessi    1995 __find_in_sessionid_hashtbl(struct nfs4_sessionid *sessionid, struct net *net)
2173 {                                                1996 {
2174         struct nfsd4_session *elem;              1997         struct nfsd4_session *elem;
2175         int idx;                                 1998         int idx;
2176         struct nfsd_net *nn = net_generic(net    1999         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
2177                                                  2000 
2178         lockdep_assert_held(&nn->client_lock)    2001         lockdep_assert_held(&nn->client_lock);
2179                                                  2002 
2180         dump_sessionid(__func__, sessionid);     2003         dump_sessionid(__func__, sessionid);
2181         idx = hash_sessionid(sessionid);         2004         idx = hash_sessionid(sessionid);
2182         /* Search in the appropriate list */     2005         /* Search in the appropriate list */
2183         list_for_each_entry(elem, &nn->sessio    2006         list_for_each_entry(elem, &nn->sessionid_hashtbl[idx], se_hash) {
2184                 if (!memcmp(elem->se_sessioni    2007                 if (!memcmp(elem->se_sessionid.data, sessionid->data,
2185                             NFS4_MAX_SESSIONI    2008                             NFS4_MAX_SESSIONID_LEN)) {
2186                         return elem;             2009                         return elem;
2187                 }                                2010                 }
2188         }                                        2011         }
2189                                                  2012 
2190         dprintk("%s: session not found\n", __    2013         dprintk("%s: session not found\n", __func__);
2191         return NULL;                             2014         return NULL;
2192 }                                                2015 }
2193                                                  2016 
2194 static struct nfsd4_session *                    2017 static struct nfsd4_session *
2195 find_in_sessionid_hashtbl(struct nfs4_session    2018 find_in_sessionid_hashtbl(struct nfs4_sessionid *sessionid, struct net *net,
2196                 __be32 *ret)                     2019                 __be32 *ret)
2197 {                                                2020 {
2198         struct nfsd4_session *session;           2021         struct nfsd4_session *session;
2199         __be32 status = nfserr_badsession;       2022         __be32 status = nfserr_badsession;
2200                                                  2023 
2201         session = __find_in_sessionid_hashtbl    2024         session = __find_in_sessionid_hashtbl(sessionid, net);
2202         if (!session)                            2025         if (!session)
2203                 goto out;                        2026                 goto out;
2204         status = nfsd4_get_session_locked(ses    2027         status = nfsd4_get_session_locked(session);
2205         if (status)                              2028         if (status)
2206                 session = NULL;                  2029                 session = NULL;
2207 out:                                             2030 out:
2208         *ret = status;                           2031         *ret = status;
2209         return session;                          2032         return session;
2210 }                                                2033 }
2211                                                  2034 
2212 /* caller must hold client_lock */               2035 /* caller must hold client_lock */
2213 static void                                      2036 static void
2214 unhash_session(struct nfsd4_session *ses)        2037 unhash_session(struct nfsd4_session *ses)
2215 {                                                2038 {
2216         struct nfs4_client *clp = ses->se_cli    2039         struct nfs4_client *clp = ses->se_client;
2217         struct nfsd_net *nn = net_generic(clp    2040         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
2218                                                  2041 
2219         lockdep_assert_held(&nn->client_lock)    2042         lockdep_assert_held(&nn->client_lock);
2220                                                  2043 
2221         list_del(&ses->se_hash);                 2044         list_del(&ses->se_hash);
2222         spin_lock(&ses->se_client->cl_lock);     2045         spin_lock(&ses->se_client->cl_lock);
2223         list_del(&ses->se_perclnt);              2046         list_del(&ses->se_perclnt);
2224         spin_unlock(&ses->se_client->cl_lock)    2047         spin_unlock(&ses->se_client->cl_lock);
2225 }                                                2048 }
2226                                                  2049 
2227 /* SETCLIENTID and SETCLIENTID_CONFIRM Helper    2050 /* SETCLIENTID and SETCLIENTID_CONFIRM Helper functions */
2228 static int                                       2051 static int
2229 STALE_CLIENTID(clientid_t *clid, struct nfsd_    2052 STALE_CLIENTID(clientid_t *clid, struct nfsd_net *nn)
2230 {                                                2053 {
2231         /*                                       2054         /*
2232          * We're assuming the clid was not gi    2055          * We're assuming the clid was not given out from a boot
2233          * precisely 2^32 (about 136 years) b    2056          * precisely 2^32 (about 136 years) before this one.  That seems
2234          * a safe assumption:                    2057          * a safe assumption:
2235          */                                      2058          */
2236         if (clid->cl_boot == (u32)nn->boot_ti    2059         if (clid->cl_boot == (u32)nn->boot_time)
2237                 return 0;                        2060                 return 0;
2238         trace_nfsd_clid_stale(clid);             2061         trace_nfsd_clid_stale(clid);
2239         return 1;                                2062         return 1;
2240 }                                                2063 }
2241                                                  2064 
2242 /*                                               2065 /* 
2243  * XXX Should we use a slab cache ?              2066  * XXX Should we use a slab cache ?
2244  * This type of memory management is somewhat    2067  * This type of memory management is somewhat inefficient, but we use it
2245  * anyway since SETCLIENTID is not a common o    2068  * anyway since SETCLIENTID is not a common operation.
2246  */                                              2069  */
2247 static struct nfs4_client *alloc_client(struc    2070 static struct nfs4_client *alloc_client(struct xdr_netobj name,
2248                                 struct nfsd_n    2071                                 struct nfsd_net *nn)
2249 {                                                2072 {
2250         struct nfs4_client *clp;                 2073         struct nfs4_client *clp;
2251         int i;                                   2074         int i;
2252                                                  2075 
2253         if (atomic_read(&nn->nfs4_client_coun    2076         if (atomic_read(&nn->nfs4_client_count) >= nn->nfs4_max_clients) {
2254                 mod_delayed_work(laundry_wq,     2077                 mod_delayed_work(laundry_wq, &nn->laundromat_work, 0);
2255                 return NULL;                     2078                 return NULL;
2256         }                                        2079         }
2257         clp = kmem_cache_zalloc(client_slab,     2080         clp = kmem_cache_zalloc(client_slab, GFP_KERNEL);
2258         if (clp == NULL)                         2081         if (clp == NULL)
2259                 return NULL;                     2082                 return NULL;
2260         xdr_netobj_dup(&clp->cl_name, &name,     2083         xdr_netobj_dup(&clp->cl_name, &name, GFP_KERNEL);
2261         if (clp->cl_name.data == NULL)           2084         if (clp->cl_name.data == NULL)
2262                 goto err_no_name;                2085                 goto err_no_name;
2263         clp->cl_ownerstr_hashtbl = kmalloc_ar    2086         clp->cl_ownerstr_hashtbl = kmalloc_array(OWNER_HASH_SIZE,
2264                                                  2087                                                  sizeof(struct list_head),
2265                                                  2088                                                  GFP_KERNEL);
2266         if (!clp->cl_ownerstr_hashtbl)           2089         if (!clp->cl_ownerstr_hashtbl)
2267                 goto err_no_hashtbl;             2090                 goto err_no_hashtbl;
2268         clp->cl_callback_wq = alloc_ordered_w << 
2269         if (!clp->cl_callback_wq)             << 
2270                 goto err_no_callback_wq;      << 
2271                                               << 
2272         for (i = 0; i < OWNER_HASH_SIZE; i++)    2091         for (i = 0; i < OWNER_HASH_SIZE; i++)
2273                 INIT_LIST_HEAD(&clp->cl_owner    2092                 INIT_LIST_HEAD(&clp->cl_ownerstr_hashtbl[i]);
2274         INIT_LIST_HEAD(&clp->cl_sessions);       2093         INIT_LIST_HEAD(&clp->cl_sessions);
2275         idr_init(&clp->cl_stateids);             2094         idr_init(&clp->cl_stateids);
2276         atomic_set(&clp->cl_rpc_users, 0);       2095         atomic_set(&clp->cl_rpc_users, 0);
2277         clp->cl_cb_state = NFSD4_CB_UNKNOWN;     2096         clp->cl_cb_state = NFSD4_CB_UNKNOWN;
2278         clp->cl_state = NFSD4_ACTIVE;            2097         clp->cl_state = NFSD4_ACTIVE;
2279         atomic_inc(&nn->nfs4_client_count);      2098         atomic_inc(&nn->nfs4_client_count);
2280         atomic_set(&clp->cl_delegs_in_recall,    2099         atomic_set(&clp->cl_delegs_in_recall, 0);
2281         INIT_LIST_HEAD(&clp->cl_idhash);         2100         INIT_LIST_HEAD(&clp->cl_idhash);
2282         INIT_LIST_HEAD(&clp->cl_openowners);     2101         INIT_LIST_HEAD(&clp->cl_openowners);
2283         INIT_LIST_HEAD(&clp->cl_delegations);    2102         INIT_LIST_HEAD(&clp->cl_delegations);
2284         INIT_LIST_HEAD(&clp->cl_lru);            2103         INIT_LIST_HEAD(&clp->cl_lru);
2285         INIT_LIST_HEAD(&clp->cl_revoked);        2104         INIT_LIST_HEAD(&clp->cl_revoked);
2286 #ifdef CONFIG_NFSD_PNFS                          2105 #ifdef CONFIG_NFSD_PNFS
2287         INIT_LIST_HEAD(&clp->cl_lo_states);      2106         INIT_LIST_HEAD(&clp->cl_lo_states);
2288 #endif                                           2107 #endif
2289         INIT_LIST_HEAD(&clp->async_copies);      2108         INIT_LIST_HEAD(&clp->async_copies);
2290         spin_lock_init(&clp->async_lock);        2109         spin_lock_init(&clp->async_lock);
2291         spin_lock_init(&clp->cl_lock);           2110         spin_lock_init(&clp->cl_lock);
2292         rpc_init_wait_queue(&clp->cl_cb_waitq    2111         rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table");
2293         return clp;                              2112         return clp;
2294 err_no_callback_wq:                           << 
2295         kfree(clp->cl_ownerstr_hashtbl);      << 
2296 err_no_hashtbl:                                  2113 err_no_hashtbl:
2297         kfree(clp->cl_name.data);                2114         kfree(clp->cl_name.data);
2298 err_no_name:                                     2115 err_no_name:
2299         kmem_cache_free(client_slab, clp);       2116         kmem_cache_free(client_slab, clp);
2300         return NULL;                             2117         return NULL;
2301 }                                                2118 }
2302                                                  2119 
2303 static void __free_client(struct kref *k)        2120 static void __free_client(struct kref *k)
2304 {                                                2121 {
2305         struct nfsdfs_client *c = container_o    2122         struct nfsdfs_client *c = container_of(k, struct nfsdfs_client, cl_ref);
2306         struct nfs4_client *clp = container_o    2123         struct nfs4_client *clp = container_of(c, struct nfs4_client, cl_nfsdfs);
2307                                                  2124 
2308         free_svc_cred(&clp->cl_cred);            2125         free_svc_cred(&clp->cl_cred);
2309         destroy_workqueue(clp->cl_callback_wq << 
2310         kfree(clp->cl_ownerstr_hashtbl);         2126         kfree(clp->cl_ownerstr_hashtbl);
2311         kfree(clp->cl_name.data);                2127         kfree(clp->cl_name.data);
2312         kfree(clp->cl_nii_domain.data);          2128         kfree(clp->cl_nii_domain.data);
2313         kfree(clp->cl_nii_name.data);            2129         kfree(clp->cl_nii_name.data);
2314         idr_destroy(&clp->cl_stateids);          2130         idr_destroy(&clp->cl_stateids);
2315         kfree(clp->cl_ra);                       2131         kfree(clp->cl_ra);
2316         kmem_cache_free(client_slab, clp);       2132         kmem_cache_free(client_slab, clp);
2317 }                                                2133 }
2318                                                  2134 
2319 static void drop_client(struct nfs4_client *c    2135 static void drop_client(struct nfs4_client *clp)
2320 {                                                2136 {
2321         kref_put(&clp->cl_nfsdfs.cl_ref, __fr    2137         kref_put(&clp->cl_nfsdfs.cl_ref, __free_client);
2322 }                                                2138 }
2323                                                  2139 
2324 static void                                      2140 static void
2325 free_client(struct nfs4_client *clp)             2141 free_client(struct nfs4_client *clp)
2326 {                                                2142 {
2327         while (!list_empty(&clp->cl_sessions)    2143         while (!list_empty(&clp->cl_sessions)) {
2328                 struct nfsd4_session *ses;       2144                 struct nfsd4_session *ses;
2329                 ses = list_entry(clp->cl_sess    2145                 ses = list_entry(clp->cl_sessions.next, struct nfsd4_session,
2330                                 se_perclnt);     2146                                 se_perclnt);
2331                 list_del(&ses->se_perclnt);      2147                 list_del(&ses->se_perclnt);
2332                 WARN_ON_ONCE(atomic_read(&ses    2148                 WARN_ON_ONCE(atomic_read(&ses->se_ref));
2333                 free_session(ses);               2149                 free_session(ses);
2334         }                                        2150         }
2335         rpc_destroy_wait_queue(&clp->cl_cb_wa    2151         rpc_destroy_wait_queue(&clp->cl_cb_waitq);
2336         if (clp->cl_nfsd_dentry) {               2152         if (clp->cl_nfsd_dentry) {
2337                 nfsd_client_rmdir(clp->cl_nfs    2153                 nfsd_client_rmdir(clp->cl_nfsd_dentry);
2338                 clp->cl_nfsd_dentry = NULL;      2154                 clp->cl_nfsd_dentry = NULL;
2339                 wake_up_all(&expiry_wq);         2155                 wake_up_all(&expiry_wq);
2340         }                                        2156         }
2341         drop_client(clp);                        2157         drop_client(clp);
2342 }                                                2158 }
2343                                                  2159 
2344 /* must be called under the client_lock */       2160 /* must be called under the client_lock */
2345 static void                                      2161 static void
2346 unhash_client_locked(struct nfs4_client *clp)    2162 unhash_client_locked(struct nfs4_client *clp)
2347 {                                                2163 {
2348         struct nfsd_net *nn = net_generic(clp    2164         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
2349         struct nfsd4_session *ses;               2165         struct nfsd4_session *ses;
2350                                                  2166 
2351         lockdep_assert_held(&nn->client_lock)    2167         lockdep_assert_held(&nn->client_lock);
2352                                                  2168 
2353         /* Mark the client as expired! */        2169         /* Mark the client as expired! */
2354         clp->cl_time = 0;                        2170         clp->cl_time = 0;
2355         /* Make it invisible */                  2171         /* Make it invisible */
2356         if (!list_empty(&clp->cl_idhash)) {      2172         if (!list_empty(&clp->cl_idhash)) {
2357                 list_del_init(&clp->cl_idhash    2173                 list_del_init(&clp->cl_idhash);
2358                 if (test_bit(NFSD4_CLIENT_CON    2174                 if (test_bit(NFSD4_CLIENT_CONFIRMED, &clp->cl_flags))
2359                         rb_erase(&clp->cl_nam    2175                         rb_erase(&clp->cl_namenode, &nn->conf_name_tree);
2360                 else                             2176                 else
2361                         rb_erase(&clp->cl_nam    2177                         rb_erase(&clp->cl_namenode, &nn->unconf_name_tree);
2362         }                                        2178         }
2363         list_del_init(&clp->cl_lru);             2179         list_del_init(&clp->cl_lru);
2364         spin_lock(&clp->cl_lock);                2180         spin_lock(&clp->cl_lock);
2365         list_for_each_entry(ses, &clp->cl_ses    2181         list_for_each_entry(ses, &clp->cl_sessions, se_perclnt)
2366                 list_del_init(&ses->se_hash);    2182                 list_del_init(&ses->se_hash);
2367         spin_unlock(&clp->cl_lock);              2183         spin_unlock(&clp->cl_lock);
2368 }                                                2184 }
2369                                                  2185 
2370 static void                                      2186 static void
2371 unhash_client(struct nfs4_client *clp)           2187 unhash_client(struct nfs4_client *clp)
2372 {                                                2188 {
2373         struct nfsd_net *nn = net_generic(clp    2189         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
2374                                                  2190 
2375         spin_lock(&nn->client_lock);             2191         spin_lock(&nn->client_lock);
2376         unhash_client_locked(clp);               2192         unhash_client_locked(clp);
2377         spin_unlock(&nn->client_lock);           2193         spin_unlock(&nn->client_lock);
2378 }                                                2194 }
2379                                                  2195 
2380 static __be32 mark_client_expired_locked(stru    2196 static __be32 mark_client_expired_locked(struct nfs4_client *clp)
2381 {                                                2197 {
2382         int users = atomic_read(&clp->cl_rpc_ !! 2198         if (atomic_read(&clp->cl_rpc_users))
2383                                               << 
2384         trace_nfsd_mark_client_expired(clp, u << 
2385                                               << 
2386         if (users)                            << 
2387                 return nfserr_jukebox;           2199                 return nfserr_jukebox;
2388         unhash_client_locked(clp);               2200         unhash_client_locked(clp);
2389         return nfs_ok;                           2201         return nfs_ok;
2390 }                                                2202 }
2391                                                  2203 
2392 static void                                      2204 static void
2393 __destroy_client(struct nfs4_client *clp)        2205 __destroy_client(struct nfs4_client *clp)
2394 {                                                2206 {
2395         struct nfsd_net *nn = net_generic(clp    2207         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
2396         int i;                                   2208         int i;
2397         struct nfs4_openowner *oo;               2209         struct nfs4_openowner *oo;
2398         struct nfs4_delegation *dp;              2210         struct nfs4_delegation *dp;
2399         LIST_HEAD(reaplist);                  !! 2211         struct list_head reaplist;
2400                                                  2212 
                                                   >> 2213         INIT_LIST_HEAD(&reaplist);
2401         spin_lock(&state_lock);                  2214         spin_lock(&state_lock);
2402         while (!list_empty(&clp->cl_delegatio    2215         while (!list_empty(&clp->cl_delegations)) {
2403                 dp = list_entry(clp->cl_deleg    2216                 dp = list_entry(clp->cl_delegations.next, struct nfs4_delegation, dl_perclnt);
2404                 unhash_delegation_locked(dp,  !! 2217                 WARN_ON(!unhash_delegation_locked(dp));
2405                 list_add(&dp->dl_recall_lru,     2218                 list_add(&dp->dl_recall_lru, &reaplist);
2406         }                                        2219         }
2407         spin_unlock(&state_lock);                2220         spin_unlock(&state_lock);
2408         while (!list_empty(&reaplist)) {         2221         while (!list_empty(&reaplist)) {
2409                 dp = list_entry(reaplist.next    2222                 dp = list_entry(reaplist.next, struct nfs4_delegation, dl_recall_lru);
2410                 list_del_init(&dp->dl_recall_    2223                 list_del_init(&dp->dl_recall_lru);
2411                 destroy_unhashed_deleg(dp);      2224                 destroy_unhashed_deleg(dp);
2412         }                                        2225         }
2413         while (!list_empty(&clp->cl_revoked))    2226         while (!list_empty(&clp->cl_revoked)) {
2414                 dp = list_entry(clp->cl_revok    2227                 dp = list_entry(clp->cl_revoked.next, struct nfs4_delegation, dl_recall_lru);
2415                 list_del_init(&dp->dl_recall_    2228                 list_del_init(&dp->dl_recall_lru);
2416                 nfs4_put_stid(&dp->dl_stid);     2229                 nfs4_put_stid(&dp->dl_stid);
2417         }                                        2230         }
2418         while (!list_empty(&clp->cl_openowner    2231         while (!list_empty(&clp->cl_openowners)) {
2419                 oo = list_entry(clp->cl_openo    2232                 oo = list_entry(clp->cl_openowners.next, struct nfs4_openowner, oo_perclient);
2420                 nfs4_get_stateowner(&oo->oo_o    2233                 nfs4_get_stateowner(&oo->oo_owner);
2421                 release_openowner(oo);           2234                 release_openowner(oo);
2422         }                                        2235         }
2423         for (i = 0; i < OWNER_HASH_SIZE; i++)    2236         for (i = 0; i < OWNER_HASH_SIZE; i++) {
2424                 struct nfs4_stateowner *so, *    2237                 struct nfs4_stateowner *so, *tmp;
2425                                                  2238 
2426                 list_for_each_entry_safe(so,     2239                 list_for_each_entry_safe(so, tmp, &clp->cl_ownerstr_hashtbl[i],
2427                                          so_s    2240                                          so_strhash) {
2428                         /* Should be no openo    2241                         /* Should be no openowners at this point */
2429                         WARN_ON_ONCE(so->so_i    2242                         WARN_ON_ONCE(so->so_is_open_owner);
2430                         remove_blocked_locks(    2243                         remove_blocked_locks(lockowner(so));
2431                 }                                2244                 }
2432         }                                        2245         }
2433         nfsd4_return_all_client_layouts(clp);    2246         nfsd4_return_all_client_layouts(clp);
2434         nfsd4_shutdown_copy(clp);                2247         nfsd4_shutdown_copy(clp);
2435         nfsd4_shutdown_callback(clp);            2248         nfsd4_shutdown_callback(clp);
2436         if (clp->cl_cb_conn.cb_xprt)             2249         if (clp->cl_cb_conn.cb_xprt)
2437                 svc_xprt_put(clp->cl_cb_conn.    2250                 svc_xprt_put(clp->cl_cb_conn.cb_xprt);
2438         atomic_add_unless(&nn->nfs4_client_co    2251         atomic_add_unless(&nn->nfs4_client_count, -1, 0);
2439         nfsd4_dec_courtesy_client_count(nn, c    2252         nfsd4_dec_courtesy_client_count(nn, clp);
2440         free_client(clp);                        2253         free_client(clp);
2441         wake_up_all(&expiry_wq);                 2254         wake_up_all(&expiry_wq);
2442 }                                                2255 }
2443                                                  2256 
2444 static void                                      2257 static void
2445 destroy_client(struct nfs4_client *clp)          2258 destroy_client(struct nfs4_client *clp)
2446 {                                                2259 {
2447         unhash_client(clp);                      2260         unhash_client(clp);
2448         __destroy_client(clp);                   2261         __destroy_client(clp);
2449 }                                                2262 }
2450                                                  2263 
2451 static void inc_reclaim_complete(struct nfs4_    2264 static void inc_reclaim_complete(struct nfs4_client *clp)
2452 {                                                2265 {
2453         struct nfsd_net *nn = net_generic(clp    2266         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
2454                                                  2267 
2455         if (!nn->track_reclaim_completes)        2268         if (!nn->track_reclaim_completes)
2456                 return;                          2269                 return;
2457         if (!nfsd4_find_reclaim_client(clp->c    2270         if (!nfsd4_find_reclaim_client(clp->cl_name, nn))
2458                 return;                          2271                 return;
2459         if (atomic_inc_return(&nn->nr_reclaim    2272         if (atomic_inc_return(&nn->nr_reclaim_complete) ==
2460                         nn->reclaim_str_hasht    2273                         nn->reclaim_str_hashtbl_size) {
2461                 printk(KERN_INFO "NFSD: all c    2274                 printk(KERN_INFO "NFSD: all clients done reclaiming, ending NFSv4 grace period (net %x)\n",
2462                                 clp->net->ns.    2275                                 clp->net->ns.inum);
2463                 nfsd4_end_grace(nn);             2276                 nfsd4_end_grace(nn);
2464         }                                        2277         }
2465 }                                                2278 }
2466                                                  2279 
2467 static void expire_client(struct nfs4_client     2280 static void expire_client(struct nfs4_client *clp)
2468 {                                                2281 {
2469         unhash_client(clp);                      2282         unhash_client(clp);
2470         nfsd4_client_record_remove(clp);         2283         nfsd4_client_record_remove(clp);
2471         __destroy_client(clp);                   2284         __destroy_client(clp);
2472 }                                                2285 }
2473                                                  2286 
2474 static void copy_verf(struct nfs4_client *tar    2287 static void copy_verf(struct nfs4_client *target, nfs4_verifier *source)
2475 {                                                2288 {
2476         memcpy(target->cl_verifier.data, sour    2289         memcpy(target->cl_verifier.data, source->data,
2477                         sizeof(target->cl_ver    2290                         sizeof(target->cl_verifier.data));
2478 }                                                2291 }
2479                                                  2292 
2480 static void copy_clid(struct nfs4_client *tar    2293 static void copy_clid(struct nfs4_client *target, struct nfs4_client *source)
2481 {                                                2294 {
2482         target->cl_clientid.cl_boot = source-    2295         target->cl_clientid.cl_boot = source->cl_clientid.cl_boot; 
2483         target->cl_clientid.cl_id = source->c    2296         target->cl_clientid.cl_id = source->cl_clientid.cl_id; 
2484 }                                                2297 }
2485                                                  2298 
2486 static int copy_cred(struct svc_cred *target,    2299 static int copy_cred(struct svc_cred *target, struct svc_cred *source)
2487 {                                                2300 {
2488         target->cr_principal = kstrdup(source    2301         target->cr_principal = kstrdup(source->cr_principal, GFP_KERNEL);
2489         target->cr_raw_principal = kstrdup(so    2302         target->cr_raw_principal = kstrdup(source->cr_raw_principal,
2490                                                  2303                                                                 GFP_KERNEL);
2491         target->cr_targ_princ = kstrdup(sourc    2304         target->cr_targ_princ = kstrdup(source->cr_targ_princ, GFP_KERNEL);
2492         if ((source->cr_principal && !target-    2305         if ((source->cr_principal && !target->cr_principal) ||
2493             (source->cr_raw_principal && !tar    2306             (source->cr_raw_principal && !target->cr_raw_principal) ||
2494             (source->cr_targ_princ && !target    2307             (source->cr_targ_princ && !target->cr_targ_princ))
2495                 return -ENOMEM;                  2308                 return -ENOMEM;
2496                                                  2309 
2497         target->cr_flavor = source->cr_flavor    2310         target->cr_flavor = source->cr_flavor;
2498         target->cr_uid = source->cr_uid;         2311         target->cr_uid = source->cr_uid;
2499         target->cr_gid = source->cr_gid;         2312         target->cr_gid = source->cr_gid;
2500         target->cr_group_info = source->cr_gr    2313         target->cr_group_info = source->cr_group_info;
2501         get_group_info(target->cr_group_info)    2314         get_group_info(target->cr_group_info);
2502         target->cr_gss_mech = source->cr_gss_    2315         target->cr_gss_mech = source->cr_gss_mech;
2503         if (source->cr_gss_mech)                 2316         if (source->cr_gss_mech)
2504                 gss_mech_get(source->cr_gss_m    2317                 gss_mech_get(source->cr_gss_mech);
2505         return 0;                                2318         return 0;
2506 }                                                2319 }
2507                                                  2320 
2508 static int                                       2321 static int
2509 compare_blob(const struct xdr_netobj *o1, con    2322 compare_blob(const struct xdr_netobj *o1, const struct xdr_netobj *o2)
2510 {                                                2323 {
2511         if (o1->len < o2->len)                   2324         if (o1->len < o2->len)
2512                 return -1;                       2325                 return -1;
2513         if (o1->len > o2->len)                   2326         if (o1->len > o2->len)
2514                 return 1;                        2327                 return 1;
2515         return memcmp(o1->data, o2->data, o1-    2328         return memcmp(o1->data, o2->data, o1->len);
2516 }                                                2329 }
2517                                                  2330 
2518 static int                                       2331 static int
2519 same_verf(nfs4_verifier *v1, nfs4_verifier *v    2332 same_verf(nfs4_verifier *v1, nfs4_verifier *v2)
2520 {                                                2333 {
2521         return 0 == memcmp(v1->data, v2->data    2334         return 0 == memcmp(v1->data, v2->data, sizeof(v1->data));
2522 }                                                2335 }
2523                                                  2336 
2524 static int                                       2337 static int
2525 same_clid(clientid_t *cl1, clientid_t *cl2)      2338 same_clid(clientid_t *cl1, clientid_t *cl2)
2526 {                                                2339 {
2527         return (cl1->cl_boot == cl2->cl_boot)    2340         return (cl1->cl_boot == cl2->cl_boot) && (cl1->cl_id == cl2->cl_id);
2528 }                                                2341 }
2529                                                  2342 
2530 static bool groups_equal(struct group_info *g    2343 static bool groups_equal(struct group_info *g1, struct group_info *g2)
2531 {                                                2344 {
2532         int i;                                   2345         int i;
2533                                                  2346 
2534         if (g1->ngroups != g2->ngroups)          2347         if (g1->ngroups != g2->ngroups)
2535                 return false;                    2348                 return false;
2536         for (i=0; i<g1->ngroups; i++)            2349         for (i=0; i<g1->ngroups; i++)
2537                 if (!gid_eq(g1->gid[i], g2->g    2350                 if (!gid_eq(g1->gid[i], g2->gid[i]))
2538                         return false;            2351                         return false;
2539         return true;                             2352         return true;
2540 }                                                2353 }
2541                                                  2354 
2542 /*                                               2355 /*
2543  * RFC 3530 language requires clid_inuse be r    2356  * RFC 3530 language requires clid_inuse be returned when the
2544  * "principal" associated with a requests dif    2357  * "principal" associated with a requests differs from that previously
2545  * used.  We use uid, gid's, and gss principa    2358  * used.  We use uid, gid's, and gss principal string as our best
2546  * approximation.  We also don't want to allo    2359  * approximation.  We also don't want to allow non-gss use of a client
2547  * established using gss: in theory cr_princi    2360  * established using gss: in theory cr_principal should catch that
2548  * change, but in practice cr_principal can b    2361  * change, but in practice cr_principal can be null even in the gss case
2549  * since gssd doesn't always pass down a prin    2362  * since gssd doesn't always pass down a principal string.
2550  */                                              2363  */
2551 static bool is_gss_cred(struct svc_cred *cr)     2364 static bool is_gss_cred(struct svc_cred *cr)
2552 {                                                2365 {
2553         /* Is cr_flavor one of the gss "pseud    2366         /* Is cr_flavor one of the gss "pseudoflavors"?: */
2554         return (cr->cr_flavor > RPC_AUTH_MAXF    2367         return (cr->cr_flavor > RPC_AUTH_MAXFLAVOR);
2555 }                                                2368 }
2556                                                  2369 
2557                                                  2370 
2558 static bool                                      2371 static bool
2559 same_creds(struct svc_cred *cr1, struct svc_c    2372 same_creds(struct svc_cred *cr1, struct svc_cred *cr2)
2560 {                                                2373 {
2561         if ((is_gss_cred(cr1) != is_gss_cred(    2374         if ((is_gss_cred(cr1) != is_gss_cred(cr2))
2562                 || (!uid_eq(cr1->cr_uid, cr2-    2375                 || (!uid_eq(cr1->cr_uid, cr2->cr_uid))
2563                 || (!gid_eq(cr1->cr_gid, cr2-    2376                 || (!gid_eq(cr1->cr_gid, cr2->cr_gid))
2564                 || !groups_equal(cr1->cr_grou    2377                 || !groups_equal(cr1->cr_group_info, cr2->cr_group_info))
2565                 return false;                    2378                 return false;
2566         /* XXX: check that cr_targ_princ fiel    2379         /* XXX: check that cr_targ_princ fields match ? */
2567         if (cr1->cr_principal == cr2->cr_prin    2380         if (cr1->cr_principal == cr2->cr_principal)
2568                 return true;                     2381                 return true;
2569         if (!cr1->cr_principal || !cr2->cr_pr    2382         if (!cr1->cr_principal || !cr2->cr_principal)
2570                 return false;                    2383                 return false;
2571         return 0 == strcmp(cr1->cr_principal,    2384         return 0 == strcmp(cr1->cr_principal, cr2->cr_principal);
2572 }                                                2385 }
2573                                                  2386 
2574 static bool svc_rqst_integrity_protected(stru    2387 static bool svc_rqst_integrity_protected(struct svc_rqst *rqstp)
2575 {                                                2388 {
2576         struct svc_cred *cr = &rqstp->rq_cred    2389         struct svc_cred *cr = &rqstp->rq_cred;
2577         u32 service;                             2390         u32 service;
2578                                                  2391 
2579         if (!cr->cr_gss_mech)                    2392         if (!cr->cr_gss_mech)
2580                 return false;                    2393                 return false;
2581         service = gss_pseudoflavor_to_service    2394         service = gss_pseudoflavor_to_service(cr->cr_gss_mech, cr->cr_flavor);
2582         return service == RPC_GSS_SVC_INTEGRI    2395         return service == RPC_GSS_SVC_INTEGRITY ||
2583                service == RPC_GSS_SVC_PRIVACY    2396                service == RPC_GSS_SVC_PRIVACY;
2584 }                                                2397 }
2585                                                  2398 
2586 bool nfsd4_mach_creds_match(struct nfs4_clien    2399 bool nfsd4_mach_creds_match(struct nfs4_client *cl, struct svc_rqst *rqstp)
2587 {                                                2400 {
2588         struct svc_cred *cr = &rqstp->rq_cred    2401         struct svc_cred *cr = &rqstp->rq_cred;
2589                                                  2402 
2590         if (!cl->cl_mach_cred)                   2403         if (!cl->cl_mach_cred)
2591                 return true;                     2404                 return true;
2592         if (cl->cl_cred.cr_gss_mech != cr->cr    2405         if (cl->cl_cred.cr_gss_mech != cr->cr_gss_mech)
2593                 return false;                    2406                 return false;
2594         if (!svc_rqst_integrity_protected(rqs    2407         if (!svc_rqst_integrity_protected(rqstp))
2595                 return false;                    2408                 return false;
2596         if (cl->cl_cred.cr_raw_principal)        2409         if (cl->cl_cred.cr_raw_principal)
2597                 return 0 == strcmp(cl->cl_cre    2410                 return 0 == strcmp(cl->cl_cred.cr_raw_principal,
2598                                                  2411                                                 cr->cr_raw_principal);
2599         if (!cr->cr_principal)                   2412         if (!cr->cr_principal)
2600                 return false;                    2413                 return false;
2601         return 0 == strcmp(cl->cl_cred.cr_pri    2414         return 0 == strcmp(cl->cl_cred.cr_principal, cr->cr_principal);
2602 }                                                2415 }
2603                                                  2416 
2604 static void gen_confirm(struct nfs4_client *c    2417 static void gen_confirm(struct nfs4_client *clp, struct nfsd_net *nn)
2605 {                                                2418 {
2606         __be32 verf[2];                          2419         __be32 verf[2];
2607                                                  2420 
2608         /*                                       2421         /*
2609          * This is opaque to client, so no ne    2422          * This is opaque to client, so no need to byte-swap. Use
2610          * __force to keep sparse happy          2423          * __force to keep sparse happy
2611          */                                      2424          */
2612         verf[0] = (__force __be32)(u32)ktime_    2425         verf[0] = (__force __be32)(u32)ktime_get_real_seconds();
2613         verf[1] = (__force __be32)nn->clverif    2426         verf[1] = (__force __be32)nn->clverifier_counter++;
2614         memcpy(clp->cl_confirm.data, verf, si    2427         memcpy(clp->cl_confirm.data, verf, sizeof(clp->cl_confirm.data));
2615 }                                                2428 }
2616                                                  2429 
2617 static void gen_clid(struct nfs4_client *clp,    2430 static void gen_clid(struct nfs4_client *clp, struct nfsd_net *nn)
2618 {                                                2431 {
2619         clp->cl_clientid.cl_boot = (u32)nn->b    2432         clp->cl_clientid.cl_boot = (u32)nn->boot_time;
2620         clp->cl_clientid.cl_id = nn->clientid    2433         clp->cl_clientid.cl_id = nn->clientid_counter++;
2621         gen_confirm(clp, nn);                    2434         gen_confirm(clp, nn);
2622 }                                                2435 }
2623                                                  2436 
2624 static struct nfs4_stid *                        2437 static struct nfs4_stid *
2625 find_stateid_locked(struct nfs4_client *cl, s    2438 find_stateid_locked(struct nfs4_client *cl, stateid_t *t)
2626 {                                                2439 {
2627         struct nfs4_stid *ret;                   2440         struct nfs4_stid *ret;
2628                                                  2441 
2629         ret = idr_find(&cl->cl_stateids, t->s    2442         ret = idr_find(&cl->cl_stateids, t->si_opaque.so_id);
2630         if (!ret || !ret->sc_type)               2443         if (!ret || !ret->sc_type)
2631                 return NULL;                     2444                 return NULL;
2632         return ret;                              2445         return ret;
2633 }                                                2446 }
2634                                                  2447 
2635 static struct nfs4_stid *                        2448 static struct nfs4_stid *
2636 find_stateid_by_type(struct nfs4_client *cl,  !! 2449 find_stateid_by_type(struct nfs4_client *cl, stateid_t *t, char typemask)
2637                      unsigned short typemask, << 
2638 {                                                2450 {
2639         struct nfs4_stid *s;                     2451         struct nfs4_stid *s;
2640                                                  2452 
2641         spin_lock(&cl->cl_lock);                 2453         spin_lock(&cl->cl_lock);
2642         s = find_stateid_locked(cl, t);          2454         s = find_stateid_locked(cl, t);
2643         if (s != NULL) {                         2455         if (s != NULL) {
2644                 if ((s->sc_status & ~ok_state !! 2456                 if (typemask & s->sc_type)
2645                     (typemask & s->sc_type))  << 
2646                         refcount_inc(&s->sc_c    2457                         refcount_inc(&s->sc_count);
2647                 else                             2458                 else
2648                         s = NULL;                2459                         s = NULL;
2649         }                                        2460         }
2650         spin_unlock(&cl->cl_lock);               2461         spin_unlock(&cl->cl_lock);
2651         return s;                                2462         return s;
2652 }                                                2463 }
2653                                                  2464 
2654 static struct nfs4_client *get_nfsdfs_clp(str    2465 static struct nfs4_client *get_nfsdfs_clp(struct inode *inode)
2655 {                                                2466 {
2656         struct nfsdfs_client *nc;                2467         struct nfsdfs_client *nc;
2657         nc = get_nfsdfs_client(inode);           2468         nc = get_nfsdfs_client(inode);
2658         if (!nc)                                 2469         if (!nc)
2659                 return NULL;                     2470                 return NULL;
2660         return container_of(nc, struct nfs4_c    2471         return container_of(nc, struct nfs4_client, cl_nfsdfs);
2661 }                                                2472 }
2662                                                  2473 
2663 static void seq_quote_mem(struct seq_file *m,    2474 static void seq_quote_mem(struct seq_file *m, char *data, int len)
2664 {                                                2475 {
2665         seq_puts(m, "\"");                    !! 2476         seq_printf(m, "\"");
2666         seq_escape_mem(m, data, len, ESCAPE_H    2477         seq_escape_mem(m, data, len, ESCAPE_HEX | ESCAPE_NAP | ESCAPE_APPEND, "\"\\");
2667         seq_puts(m, "\"");                    !! 2478         seq_printf(m, "\"");
2668 }                                                2479 }
2669                                                  2480 
2670 static const char *cb_state2str(int state)       2481 static const char *cb_state2str(int state)
2671 {                                                2482 {
2672         switch (state) {                         2483         switch (state) {
2673         case NFSD4_CB_UP:                        2484         case NFSD4_CB_UP:
2674                 return "UP";                     2485                 return "UP";
2675         case NFSD4_CB_UNKNOWN:                   2486         case NFSD4_CB_UNKNOWN:
2676                 return "UNKNOWN";                2487                 return "UNKNOWN";
2677         case NFSD4_CB_DOWN:                      2488         case NFSD4_CB_DOWN:
2678                 return "DOWN";                   2489                 return "DOWN";
2679         case NFSD4_CB_FAULT:                     2490         case NFSD4_CB_FAULT:
2680                 return "FAULT";                  2491                 return "FAULT";
2681         }                                        2492         }
2682         return "UNDEFINED";                      2493         return "UNDEFINED";
2683 }                                                2494 }
2684                                                  2495 
2685 static int client_info_show(struct seq_file *    2496 static int client_info_show(struct seq_file *m, void *v)
2686 {                                                2497 {
2687         struct inode *inode = file_inode(m->f    2498         struct inode *inode = file_inode(m->file);
2688         struct nfs4_client *clp;                 2499         struct nfs4_client *clp;
2689         u64 clid;                                2500         u64 clid;
2690                                                  2501 
2691         clp = get_nfsdfs_clp(inode);             2502         clp = get_nfsdfs_clp(inode);
2692         if (!clp)                                2503         if (!clp)
2693                 return -ENXIO;                   2504                 return -ENXIO;
2694         memcpy(&clid, &clp->cl_clientid, size    2505         memcpy(&clid, &clp->cl_clientid, sizeof(clid));
2695         seq_printf(m, "clientid: 0x%llx\n", c    2506         seq_printf(m, "clientid: 0x%llx\n", clid);
2696         seq_printf(m, "address: \"%pISpc\"\n"    2507         seq_printf(m, "address: \"%pISpc\"\n", (struct sockaddr *)&clp->cl_addr);
2697                                                  2508 
2698         if (clp->cl_state == NFSD4_COURTESY)     2509         if (clp->cl_state == NFSD4_COURTESY)
2699                 seq_puts(m, "status: courtesy    2510                 seq_puts(m, "status: courtesy\n");
2700         else if (clp->cl_state == NFSD4_EXPIR    2511         else if (clp->cl_state == NFSD4_EXPIRABLE)
2701                 seq_puts(m, "status: expirabl    2512                 seq_puts(m, "status: expirable\n");
2702         else if (test_bit(NFSD4_CLIENT_CONFIR    2513         else if (test_bit(NFSD4_CLIENT_CONFIRMED, &clp->cl_flags))
2703                 seq_puts(m, "status: confirme    2514                 seq_puts(m, "status: confirmed\n");
2704         else                                     2515         else
2705                 seq_puts(m, "status: unconfir    2516                 seq_puts(m, "status: unconfirmed\n");
2706         seq_printf(m, "seconds from last rene    2517         seq_printf(m, "seconds from last renew: %lld\n",
2707                 ktime_get_boottime_seconds()     2518                 ktime_get_boottime_seconds() - clp->cl_time);
2708         seq_puts(m, "name: ");                !! 2519         seq_printf(m, "name: ");
2709         seq_quote_mem(m, clp->cl_name.data, c    2520         seq_quote_mem(m, clp->cl_name.data, clp->cl_name.len);
2710         seq_printf(m, "\nminor version: %d\n"    2521         seq_printf(m, "\nminor version: %d\n", clp->cl_minorversion);
2711         if (clp->cl_nii_domain.data) {           2522         if (clp->cl_nii_domain.data) {
2712                 seq_puts(m, "Implementation d !! 2523                 seq_printf(m, "Implementation domain: ");
2713                 seq_quote_mem(m, clp->cl_nii_    2524                 seq_quote_mem(m, clp->cl_nii_domain.data,
2714                                         clp->    2525                                         clp->cl_nii_domain.len);
2715                 seq_puts(m, "\nImplementation !! 2526                 seq_printf(m, "\nImplementation name: ");
2716                 seq_quote_mem(m, clp->cl_nii_    2527                 seq_quote_mem(m, clp->cl_nii_name.data, clp->cl_nii_name.len);
2717                 seq_printf(m, "\nImplementati    2528                 seq_printf(m, "\nImplementation time: [%lld, %ld]\n",
2718                         clp->cl_nii_time.tv_s    2529                         clp->cl_nii_time.tv_sec, clp->cl_nii_time.tv_nsec);
2719         }                                        2530         }
2720         seq_printf(m, "callback state: %s\n",    2531         seq_printf(m, "callback state: %s\n", cb_state2str(clp->cl_cb_state));
2721         seq_printf(m, "callback address: \"%p !! 2532         seq_printf(m, "callback address: %pISpc\n", &clp->cl_cb_conn.cb_addr);
2722         seq_printf(m, "admin-revoked states:  << 
2723                    atomic_read(&clp->cl_admin << 
2724         drop_client(clp);                        2533         drop_client(clp);
2725                                                  2534 
2726         return 0;                                2535         return 0;
2727 }                                                2536 }
2728                                                  2537 
2729 DEFINE_SHOW_ATTRIBUTE(client_info);              2538 DEFINE_SHOW_ATTRIBUTE(client_info);
2730                                                  2539 
2731 static void *states_start(struct seq_file *s,    2540 static void *states_start(struct seq_file *s, loff_t *pos)
2732         __acquires(&clp->cl_lock)                2541         __acquires(&clp->cl_lock)
2733 {                                                2542 {
2734         struct nfs4_client *clp = s->private;    2543         struct nfs4_client *clp = s->private;
2735         unsigned long id = *pos;                 2544         unsigned long id = *pos;
2736         void *ret;                               2545         void *ret;
2737                                                  2546 
2738         spin_lock(&clp->cl_lock);                2547         spin_lock(&clp->cl_lock);
2739         ret = idr_get_next_ul(&clp->cl_statei    2548         ret = idr_get_next_ul(&clp->cl_stateids, &id);
2740         *pos = id;                               2549         *pos = id;
2741         return ret;                              2550         return ret;
2742 }                                                2551 }
2743                                                  2552 
2744 static void *states_next(struct seq_file *s,     2553 static void *states_next(struct seq_file *s, void *v, loff_t *pos)
2745 {                                                2554 {
2746         struct nfs4_client *clp = s->private;    2555         struct nfs4_client *clp = s->private;
2747         unsigned long id = *pos;                 2556         unsigned long id = *pos;
2748         void *ret;                               2557         void *ret;
2749                                                  2558 
2750         id = *pos;                               2559         id = *pos;
2751         id++;                                    2560         id++;
2752         ret = idr_get_next_ul(&clp->cl_statei    2561         ret = idr_get_next_ul(&clp->cl_stateids, &id);
2753         *pos = id;                               2562         *pos = id;
2754         return ret;                              2563         return ret;
2755 }                                                2564 }
2756                                                  2565 
2757 static void states_stop(struct seq_file *s, v    2566 static void states_stop(struct seq_file *s, void *v)
2758         __releases(&clp->cl_lock)                2567         __releases(&clp->cl_lock)
2759 {                                                2568 {
2760         struct nfs4_client *clp = s->private;    2569         struct nfs4_client *clp = s->private;
2761                                                  2570 
2762         spin_unlock(&clp->cl_lock);              2571         spin_unlock(&clp->cl_lock);
2763 }                                                2572 }
2764                                                  2573 
2765 static void nfs4_show_fname(struct seq_file *    2574 static void nfs4_show_fname(struct seq_file *s, struct nfsd_file *f)
2766 {                                                2575 {
2767          seq_printf(s, "filename: \"%pD2\"",     2576          seq_printf(s, "filename: \"%pD2\"", f->nf_file);
2768 }                                                2577 }
2769                                                  2578 
2770 static void nfs4_show_superblock(struct seq_f    2579 static void nfs4_show_superblock(struct seq_file *s, struct nfsd_file *f)
2771 {                                                2580 {
2772         struct inode *inode = file_inode(f->n    2581         struct inode *inode = file_inode(f->nf_file);
2773                                                  2582 
2774         seq_printf(s, "superblock: \"%02x:%02    2583         seq_printf(s, "superblock: \"%02x:%02x:%ld\"",
2775                                         MAJOR    2584                                         MAJOR(inode->i_sb->s_dev),
2776                                          MINO    2585                                          MINOR(inode->i_sb->s_dev),
2777                                          inod    2586                                          inode->i_ino);
2778 }                                                2587 }
2779                                                  2588 
2780 static void nfs4_show_owner(struct seq_file *    2589 static void nfs4_show_owner(struct seq_file *s, struct nfs4_stateowner *oo)
2781 {                                                2590 {
2782         seq_puts(s, "owner: ");               !! 2591         seq_printf(s, "owner: ");
2783         seq_quote_mem(s, oo->so_owner.data, o    2592         seq_quote_mem(s, oo->so_owner.data, oo->so_owner.len);
2784 }                                                2593 }
2785                                                  2594 
2786 static void nfs4_show_stateid(struct seq_file    2595 static void nfs4_show_stateid(struct seq_file *s, stateid_t *stid)
2787 {                                                2596 {
2788         seq_printf(s, "0x%.8x", stid->si_gene    2597         seq_printf(s, "0x%.8x", stid->si_generation);
2789         seq_printf(s, "%12phN", &stid->si_opa    2598         seq_printf(s, "%12phN", &stid->si_opaque);
2790 }                                                2599 }
2791                                                  2600 
2792 static int nfs4_show_open(struct seq_file *s,    2601 static int nfs4_show_open(struct seq_file *s, struct nfs4_stid *st)
2793 {                                                2602 {
2794         struct nfs4_ol_stateid *ols;             2603         struct nfs4_ol_stateid *ols;
2795         struct nfs4_file *nf;                    2604         struct nfs4_file *nf;
2796         struct nfsd_file *file;                  2605         struct nfsd_file *file;
2797         struct nfs4_stateowner *oo;              2606         struct nfs4_stateowner *oo;
2798         unsigned int access, deny;               2607         unsigned int access, deny;
2799                                                  2608 
                                                   >> 2609         if (st->sc_type != NFS4_OPEN_STID && st->sc_type != NFS4_LOCK_STID)
                                                   >> 2610                 return 0; /* XXX: or SEQ_SKIP? */
2800         ols = openlockstateid(st);               2611         ols = openlockstateid(st);
2801         oo = ols->st_stateowner;                 2612         oo = ols->st_stateowner;
2802         nf = st->sc_file;                        2613         nf = st->sc_file;
2803                                                  2614 
2804         seq_puts(s, "- ");                    !! 2615         spin_lock(&nf->fi_lock);
                                                   >> 2616         file = find_any_file_locked(nf);
                                                   >> 2617         if (!file)
                                                   >> 2618                 goto out;
                                                   >> 2619 
                                                   >> 2620         seq_printf(s, "- ");
2805         nfs4_show_stateid(s, &st->sc_stateid)    2621         nfs4_show_stateid(s, &st->sc_stateid);
2806         seq_puts(s, ": { type: open, ");      !! 2622         seq_printf(s, ": { type: open, ");
2807                                                  2623 
2808         access = bmap_to_share_mode(ols->st_a    2624         access = bmap_to_share_mode(ols->st_access_bmap);
2809         deny   = bmap_to_share_mode(ols->st_d    2625         deny   = bmap_to_share_mode(ols->st_deny_bmap);
2810                                                  2626 
2811         seq_printf(s, "access: %s%s, ",          2627         seq_printf(s, "access: %s%s, ",
2812                 access & NFS4_SHARE_ACCESS_RE    2628                 access & NFS4_SHARE_ACCESS_READ ? "r" : "-",
2813                 access & NFS4_SHARE_ACCESS_WR    2629                 access & NFS4_SHARE_ACCESS_WRITE ? "w" : "-");
2814         seq_printf(s, "deny: %s%s, ",            2630         seq_printf(s, "deny: %s%s, ",
2815                 deny & NFS4_SHARE_ACCESS_READ    2631                 deny & NFS4_SHARE_ACCESS_READ ? "r" : "-",
2816                 deny & NFS4_SHARE_ACCESS_WRIT    2632                 deny & NFS4_SHARE_ACCESS_WRITE ? "w" : "-");
2817                                                  2633 
2818         if (nf) {                             !! 2634         nfs4_show_superblock(s, file);
2819                 spin_lock(&nf->fi_lock);      !! 2635         seq_printf(s, ", ");
2820                 file = find_any_file_locked(n !! 2636         nfs4_show_fname(s, file);
2821                 if (file) {                   !! 2637         seq_printf(s, ", ");
2822                         nfs4_show_superblock( << 
2823                         seq_puts(s, ", ");    << 
2824                         nfs4_show_fname(s, fi << 
2825                         seq_puts(s, ", ");    << 
2826                 }                             << 
2827                 spin_unlock(&nf->fi_lock);    << 
2828         } else                                << 
2829                 seq_puts(s, "closed, ");      << 
2830         nfs4_show_owner(s, oo);                  2638         nfs4_show_owner(s, oo);
2831         if (st->sc_status & SC_STATUS_ADMIN_R !! 2639         seq_printf(s, " }\n");
2832                 seq_puts(s, ", admin-revoked" !! 2640 out:
2833         seq_puts(s, " }\n");                  !! 2641         spin_unlock(&nf->fi_lock);
2834         return 0;                                2642         return 0;
2835 }                                                2643 }
2836                                                  2644 
2837 static int nfs4_show_lock(struct seq_file *s,    2645 static int nfs4_show_lock(struct seq_file *s, struct nfs4_stid *st)
2838 {                                                2646 {
2839         struct nfs4_ol_stateid *ols;             2647         struct nfs4_ol_stateid *ols;
2840         struct nfs4_file *nf;                    2648         struct nfs4_file *nf;
2841         struct nfsd_file *file;                  2649         struct nfsd_file *file;
2842         struct nfs4_stateowner *oo;              2650         struct nfs4_stateowner *oo;
2843                                                  2651 
2844         ols = openlockstateid(st);               2652         ols = openlockstateid(st);
2845         oo = ols->st_stateowner;                 2653         oo = ols->st_stateowner;
2846         nf = st->sc_file;                        2654         nf = st->sc_file;
                                                   >> 2655         spin_lock(&nf->fi_lock);
                                                   >> 2656         file = find_any_file_locked(nf);
                                                   >> 2657         if (!file)
                                                   >> 2658                 goto out;
2847                                                  2659 
2848         seq_puts(s, "- ");                    !! 2660         seq_printf(s, "- ");
2849         nfs4_show_stateid(s, &st->sc_stateid)    2661         nfs4_show_stateid(s, &st->sc_stateid);
2850         seq_puts(s, ": { type: lock, ");      !! 2662         seq_printf(s, ": { type: lock, ");
2851                                                  2663 
2852         spin_lock(&nf->fi_lock);              !! 2664         /*
2853         file = find_any_file_locked(nf);      !! 2665          * Note: a lock stateid isn't really the same thing as a lock,
2854         if (file) {                           !! 2666          * it's the locking state held by one owner on a file, and there
2855                 /*                            !! 2667          * may be multiple (or no) lock ranges associated with it.
2856                  * Note: a lock stateid isn't !! 2668          * (Same for the matter is true of open stateids.)
2857                  * it's the locking state hel !! 2669          */
2858                  * may be multiple (or no) lo << 
2859                  * (Same for the matter is tr << 
2860                  */                           << 
2861                                                  2670 
2862                 nfs4_show_superblock(s, file) !! 2671         nfs4_show_superblock(s, file);
2863                 /* XXX: open stateid? */      !! 2672         /* XXX: open stateid? */
2864                 seq_puts(s, ", ");            !! 2673         seq_printf(s, ", ");
2865                 nfs4_show_fname(s, file);     !! 2674         nfs4_show_fname(s, file);
2866                 seq_puts(s, ", ");            !! 2675         seq_printf(s, ", ");
2867         }                                     << 
2868         nfs4_show_owner(s, oo);                  2676         nfs4_show_owner(s, oo);
2869         if (st->sc_status & SC_STATUS_ADMIN_R !! 2677         seq_printf(s, " }\n");
2870                 seq_puts(s, ", admin-revoked" !! 2678 out:
2871         seq_puts(s, " }\n");                  << 
2872         spin_unlock(&nf->fi_lock);               2679         spin_unlock(&nf->fi_lock);
2873         return 0;                                2680         return 0;
2874 }                                                2681 }
2875                                                  2682 
2876 static int nfs4_show_deleg(struct seq_file *s    2683 static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st)
2877 {                                                2684 {
2878         struct nfs4_delegation *ds;              2685         struct nfs4_delegation *ds;
2879         struct nfs4_file *nf;                    2686         struct nfs4_file *nf;
2880         struct nfsd_file *file;                  2687         struct nfsd_file *file;
2881                                                  2688 
2882         ds = delegstateid(st);                   2689         ds = delegstateid(st);
2883         nf = st->sc_file;                        2690         nf = st->sc_file;
                                                   >> 2691         spin_lock(&nf->fi_lock);
                                                   >> 2692         file = nf->fi_deleg_file;
                                                   >> 2693         if (!file)
                                                   >> 2694                 goto out;
2884                                                  2695 
2885         seq_puts(s, "- ");                    !! 2696         seq_printf(s, "- ");
2886         nfs4_show_stateid(s, &st->sc_stateid)    2697         nfs4_show_stateid(s, &st->sc_stateid);
2887         seq_puts(s, ": { type: deleg, ");     !! 2698         seq_printf(s, ": { type: deleg, ");
2888                                                  2699 
2889         seq_printf(s, "access: %s",           !! 2700         /* Kinda dead code as long as we only support read delegs: */
2890                    ds->dl_type == NFS4_OPEN_D !! 2701         seq_printf(s, "access: %s, ",
                                                   >> 2702                 ds->dl_type == NFS4_OPEN_DELEGATE_READ ? "r" : "w");
2891                                                  2703 
2892         /* XXX: lease time, whether it's bein    2704         /* XXX: lease time, whether it's being recalled. */
2893                                                  2705 
2894         spin_lock(&nf->fi_lock);              !! 2706         nfs4_show_superblock(s, file);
2895         file = nf->fi_deleg_file;             !! 2707         seq_printf(s, ", ");
2896         if (file) {                           !! 2708         nfs4_show_fname(s, file);
2897                 seq_puts(s, ", ");            !! 2709         seq_printf(s, " }\n");
2898                 nfs4_show_superblock(s, file) !! 2710 out:
2899                 seq_puts(s, ", ");            << 
2900                 nfs4_show_fname(s, file);     << 
2901         }                                     << 
2902         spin_unlock(&nf->fi_lock);               2711         spin_unlock(&nf->fi_lock);
2903         if (st->sc_status & SC_STATUS_ADMIN_R << 
2904                 seq_puts(s, ", admin-revoked" << 
2905         seq_puts(s, " }\n");                  << 
2906         return 0;                                2712         return 0;
2907 }                                                2713 }
2908                                                  2714 
2909 static int nfs4_show_layout(struct seq_file *    2715 static int nfs4_show_layout(struct seq_file *s, struct nfs4_stid *st)
2910 {                                                2716 {
2911         struct nfs4_layout_stateid *ls;          2717         struct nfs4_layout_stateid *ls;
2912         struct nfsd_file *file;                  2718         struct nfsd_file *file;
2913                                                  2719 
2914         ls = container_of(st, struct nfs4_lay    2720         ls = container_of(st, struct nfs4_layout_stateid, ls_stid);
                                                   >> 2721         file = ls->ls_file;
2915                                                  2722 
2916         seq_puts(s, "- ");                    !! 2723         seq_printf(s, "- ");
2917         nfs4_show_stateid(s, &st->sc_stateid)    2724         nfs4_show_stateid(s, &st->sc_stateid);
2918         seq_puts(s, ": { type: layout");      !! 2725         seq_printf(s, ": { type: layout, ");
2919                                                  2726 
2920         /* XXX: What else would be useful? */    2727         /* XXX: What else would be useful? */
2921                                                  2728 
2922         spin_lock(&ls->ls_stid.sc_file->fi_lo !! 2729         nfs4_show_superblock(s, file);
2923         file = ls->ls_file;                   !! 2730         seq_printf(s, ", ");
2924         if (file) {                           !! 2731         nfs4_show_fname(s, file);
2925                 seq_puts(s, ", ");            !! 2732         seq_printf(s, " }\n");
2926                 nfs4_show_superblock(s, file) << 
2927                 seq_puts(s, ", ");            << 
2928                 nfs4_show_fname(s, file);     << 
2929         }                                     << 
2930         spin_unlock(&ls->ls_stid.sc_file->fi_ << 
2931         if (st->sc_status & SC_STATUS_ADMIN_R << 
2932                 seq_puts(s, ", admin-revoked" << 
2933         seq_puts(s, " }\n");                  << 
2934                                                  2733 
2935         return 0;                                2734         return 0;
2936 }                                                2735 }
2937                                                  2736 
2938 static int states_show(struct seq_file *s, vo    2737 static int states_show(struct seq_file *s, void *v)
2939 {                                                2738 {
2940         struct nfs4_stid *st = v;                2739         struct nfs4_stid *st = v;
2941                                                  2740 
2942         switch (st->sc_type) {                   2741         switch (st->sc_type) {
2943         case SC_TYPE_OPEN:                    !! 2742         case NFS4_OPEN_STID:
2944                 return nfs4_show_open(s, st);    2743                 return nfs4_show_open(s, st);
2945         case SC_TYPE_LOCK:                    !! 2744         case NFS4_LOCK_STID:
2946                 return nfs4_show_lock(s, st);    2745                 return nfs4_show_lock(s, st);
2947         case SC_TYPE_DELEG:                   !! 2746         case NFS4_DELEG_STID:
2948                 return nfs4_show_deleg(s, st)    2747                 return nfs4_show_deleg(s, st);
2949         case SC_TYPE_LAYOUT:                  !! 2748         case NFS4_LAYOUT_STID:
2950                 return nfs4_show_layout(s, st    2749                 return nfs4_show_layout(s, st);
2951         default:                                 2750         default:
2952                 return 0; /* XXX: or SEQ_SKIP    2751                 return 0; /* XXX: or SEQ_SKIP? */
2953         }                                        2752         }
2954         /* XXX: copy stateids? */                2753         /* XXX: copy stateids? */
2955 }                                                2754 }
2956                                                  2755 
2957 static struct seq_operations states_seq_ops =    2756 static struct seq_operations states_seq_ops = {
2958         .start = states_start,                   2757         .start = states_start,
2959         .next = states_next,                     2758         .next = states_next,
2960         .stop = states_stop,                     2759         .stop = states_stop,
2961         .show = states_show                      2760         .show = states_show
2962 };                                               2761 };
2963                                                  2762 
2964 static int client_states_open(struct inode *i    2763 static int client_states_open(struct inode *inode, struct file *file)
2965 {                                                2764 {
2966         struct seq_file *s;                      2765         struct seq_file *s;
2967         struct nfs4_client *clp;                 2766         struct nfs4_client *clp;
2968         int ret;                                 2767         int ret;
2969                                                  2768 
2970         clp = get_nfsdfs_clp(inode);             2769         clp = get_nfsdfs_clp(inode);
2971         if (!clp)                                2770         if (!clp)
2972                 return -ENXIO;                   2771                 return -ENXIO;
2973                                                  2772 
2974         ret = seq_open(file, &states_seq_ops)    2773         ret = seq_open(file, &states_seq_ops);
2975         if (ret)                                 2774         if (ret)
2976                 return ret;                      2775                 return ret;
2977         s = file->private_data;                  2776         s = file->private_data;
2978         s->private = clp;                        2777         s->private = clp;
2979         return 0;                                2778         return 0;
2980 }                                                2779 }
2981                                                  2780 
2982 static int client_opens_release(struct inode     2781 static int client_opens_release(struct inode *inode, struct file *file)
2983 {                                                2782 {
2984         struct seq_file *m = file->private_da    2783         struct seq_file *m = file->private_data;
2985         struct nfs4_client *clp = m->private;    2784         struct nfs4_client *clp = m->private;
2986                                                  2785 
2987         /* XXX: alternatively, we could get/d    2786         /* XXX: alternatively, we could get/drop in seq start/stop */
2988         drop_client(clp);                        2787         drop_client(clp);
2989         return seq_release(inode, file);         2788         return seq_release(inode, file);
2990 }                                                2789 }
2991                                                  2790 
2992 static const struct file_operations client_st    2791 static const struct file_operations client_states_fops = {
2993         .open           = client_states_open,    2792         .open           = client_states_open,
2994         .read           = seq_read,              2793         .read           = seq_read,
2995         .llseek         = seq_lseek,             2794         .llseek         = seq_lseek,
2996         .release        = client_opens_releas    2795         .release        = client_opens_release,
2997 };                                               2796 };
2998                                                  2797 
2999 /*                                               2798 /*
3000  * Normally we refuse to destroy clients that    2799  * Normally we refuse to destroy clients that are in use, but here the
3001  * administrator is telling us to just do it.    2800  * administrator is telling us to just do it.  We also want to wait
3002  * so the caller has a guarantee that the cli    2801  * so the caller has a guarantee that the client's locks are gone by
3003  * the time the write returns:                   2802  * the time the write returns:
3004  */                                              2803  */
3005 static void force_expire_client(struct nfs4_c    2804 static void force_expire_client(struct nfs4_client *clp)
3006 {                                                2805 {
3007         struct nfsd_net *nn = net_generic(clp    2806         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
3008         bool already_expired;                    2807         bool already_expired;
3009                                                  2808 
3010         trace_nfsd_clid_admin_expired(&clp->c    2809         trace_nfsd_clid_admin_expired(&clp->cl_clientid);
3011                                                  2810 
3012         spin_lock(&nn->client_lock);             2811         spin_lock(&nn->client_lock);
3013         clp->cl_time = 0;                        2812         clp->cl_time = 0;
3014         spin_unlock(&nn->client_lock);           2813         spin_unlock(&nn->client_lock);
3015                                                  2814 
3016         wait_event(expiry_wq, atomic_read(&cl    2815         wait_event(expiry_wq, atomic_read(&clp->cl_rpc_users) == 0);
3017         spin_lock(&nn->client_lock);             2816         spin_lock(&nn->client_lock);
3018         already_expired = list_empty(&clp->cl    2817         already_expired = list_empty(&clp->cl_lru);
3019         if (!already_expired)                    2818         if (!already_expired)
3020                 unhash_client_locked(clp);       2819                 unhash_client_locked(clp);
3021         spin_unlock(&nn->client_lock);           2820         spin_unlock(&nn->client_lock);
3022                                                  2821 
3023         if (!already_expired)                    2822         if (!already_expired)
3024                 expire_client(clp);              2823                 expire_client(clp);
3025         else                                     2824         else
3026                 wait_event(expiry_wq, clp->cl    2825                 wait_event(expiry_wq, clp->cl_nfsd_dentry == NULL);
3027 }                                                2826 }
3028                                                  2827 
3029 static ssize_t client_ctl_write(struct file *    2828 static ssize_t client_ctl_write(struct file *file, const char __user *buf,
3030                                    size_t siz    2829                                    size_t size, loff_t *pos)
3031 {                                                2830 {
3032         char *data;                              2831         char *data;
3033         struct nfs4_client *clp;                 2832         struct nfs4_client *clp;
3034                                                  2833 
3035         data = simple_transaction_get(file, b    2834         data = simple_transaction_get(file, buf, size);
3036         if (IS_ERR(data))                        2835         if (IS_ERR(data))
3037                 return PTR_ERR(data);            2836                 return PTR_ERR(data);
3038         if (size != 7 || 0 != memcmp(data, "e    2837         if (size != 7 || 0 != memcmp(data, "expire\n", 7))
3039                 return -EINVAL;                  2838                 return -EINVAL;
3040         clp = get_nfsdfs_clp(file_inode(file)    2839         clp = get_nfsdfs_clp(file_inode(file));
3041         if (!clp)                                2840         if (!clp)
3042                 return -ENXIO;                   2841                 return -ENXIO;
3043         force_expire_client(clp);                2842         force_expire_client(clp);
3044         drop_client(clp);                        2843         drop_client(clp);
3045         return 7;                                2844         return 7;
3046 }                                                2845 }
3047                                                  2846 
3048 static const struct file_operations client_ct    2847 static const struct file_operations client_ctl_fops = {
3049         .write          = client_ctl_write,      2848         .write          = client_ctl_write,
3050         .release        = simple_transaction_    2849         .release        = simple_transaction_release,
3051 };                                               2850 };
3052                                                  2851 
3053 static const struct tree_descr client_files[]    2852 static const struct tree_descr client_files[] = {
3054         [0] = {"info", &client_info_fops, S_I    2853         [0] = {"info", &client_info_fops, S_IRUSR},
3055         [1] = {"states", &client_states_fops,    2854         [1] = {"states", &client_states_fops, S_IRUSR},
3056         [2] = {"ctl", &client_ctl_fops, S_IWU    2855         [2] = {"ctl", &client_ctl_fops, S_IWUSR},
3057         [3] = {""},                              2856         [3] = {""},
3058 };                                               2857 };
3059                                                  2858 
3060 static int                                       2859 static int
3061 nfsd4_cb_recall_any_done(struct nfsd4_callbac    2860 nfsd4_cb_recall_any_done(struct nfsd4_callback *cb,
3062                                 struct rpc_ta    2861                                 struct rpc_task *task)
3063 {                                                2862 {
3064         trace_nfsd_cb_recall_any_done(cb, tas    2863         trace_nfsd_cb_recall_any_done(cb, task);
3065         switch (task->tk_status) {               2864         switch (task->tk_status) {
3066         case -NFS4ERR_DELAY:                     2865         case -NFS4ERR_DELAY:
3067                 rpc_delay(task, 2 * HZ);         2866                 rpc_delay(task, 2 * HZ);
3068                 return 0;                        2867                 return 0;
3069         default:                                 2868         default:
3070                 return 1;                        2869                 return 1;
3071         }                                        2870         }
3072 }                                                2871 }
3073                                                  2872 
3074 static void                                      2873 static void
3075 nfsd4_cb_recall_any_release(struct nfsd4_call    2874 nfsd4_cb_recall_any_release(struct nfsd4_callback *cb)
3076 {                                                2875 {
3077         struct nfs4_client *clp = cb->cb_clp;    2876         struct nfs4_client *clp = cb->cb_clp;
                                                   >> 2877         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
3078                                                  2878 
                                                   >> 2879         spin_lock(&nn->client_lock);
3079         clear_bit(NFSD4_CLIENT_CB_RECALL_ANY,    2880         clear_bit(NFSD4_CLIENT_CB_RECALL_ANY, &clp->cl_flags);
3080         drop_client(clp);                     !! 2881         put_client_renew_locked(clp);
3081 }                                             !! 2882         spin_unlock(&nn->client_lock);
3082                                               << 
3083 static int                                    << 
3084 nfsd4_cb_getattr_done(struct nfsd4_callback * << 
3085 {                                             << 
3086         struct nfs4_cb_fattr *ncf =           << 
3087                         container_of(cb, stru << 
3088         struct nfs4_delegation *dp =          << 
3089                         container_of(ncf, str << 
3090                                               << 
3091         trace_nfsd_cb_getattr_done(&dp->dl_st << 
3092         ncf->ncf_cb_status = task->tk_status; << 
3093         switch (task->tk_status) {            << 
3094         case -NFS4ERR_DELAY:                  << 
3095                 rpc_delay(task, 2 * HZ);      << 
3096                 return 0;                     << 
3097         default:                              << 
3098                 return 1;                     << 
3099         }                                     << 
3100 }                                             << 
3101                                               << 
3102 static void                                   << 
3103 nfsd4_cb_getattr_release(struct nfsd4_callbac << 
3104 {                                             << 
3105         struct nfs4_cb_fattr *ncf =           << 
3106                         container_of(cb, stru << 
3107         struct nfs4_delegation *dp =          << 
3108                         container_of(ncf, str << 
3109                                               << 
3110         clear_and_wake_up_bit(CB_GETATTR_BUSY << 
3111         nfs4_put_stid(&dp->dl_stid);          << 
3112 }                                                2883 }
3113                                                  2884 
3114 static const struct nfsd4_callback_ops nfsd4_    2885 static const struct nfsd4_callback_ops nfsd4_cb_recall_any_ops = {
3115         .done           = nfsd4_cb_recall_any    2886         .done           = nfsd4_cb_recall_any_done,
3116         .release        = nfsd4_cb_recall_any    2887         .release        = nfsd4_cb_recall_any_release,
3117         .opcode         = OP_CB_RECALL_ANY,   << 
3118 };                                            << 
3119                                               << 
3120 static const struct nfsd4_callback_ops nfsd4_ << 
3121         .done           = nfsd4_cb_getattr_do << 
3122         .release        = nfsd4_cb_getattr_re << 
3123         .opcode         = OP_CB_GETATTR,      << 
3124 };                                               2888 };
3125                                                  2889 
3126 static void nfs4_cb_getattr(struct nfs4_cb_fa << 
3127 {                                             << 
3128         struct nfs4_delegation *dp =          << 
3129                         container_of(ncf, str << 
3130                                               << 
3131         if (test_and_set_bit(CB_GETATTR_BUSY, << 
3132                 return;                       << 
3133         /* set to proper status when nfsd4_cb << 
3134         ncf->ncf_cb_status = NFS4ERR_IO;      << 
3135                                               << 
3136         refcount_inc(&dp->dl_stid.sc_count);  << 
3137         nfsd4_run_cb(&ncf->ncf_getattr);      << 
3138 }                                             << 
3139                                               << 
3140 static struct nfs4_client *create_client(stru    2890 static struct nfs4_client *create_client(struct xdr_netobj name,
3141                 struct svc_rqst *rqstp, nfs4_    2891                 struct svc_rqst *rqstp, nfs4_verifier *verf)
3142 {                                                2892 {
3143         struct nfs4_client *clp;                 2893         struct nfs4_client *clp;
3144         struct sockaddr *sa = svc_addr(rqstp)    2894         struct sockaddr *sa = svc_addr(rqstp);
3145         int ret;                                 2895         int ret;
3146         struct net *net = SVC_NET(rqstp);        2896         struct net *net = SVC_NET(rqstp);
3147         struct nfsd_net *nn = net_generic(net    2897         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
3148         struct dentry *dentries[ARRAY_SIZE(cl    2898         struct dentry *dentries[ARRAY_SIZE(client_files)];
3149                                                  2899 
3150         clp = alloc_client(name, nn);            2900         clp = alloc_client(name, nn);
3151         if (clp == NULL)                         2901         if (clp == NULL)
3152                 return NULL;                     2902                 return NULL;
3153                                                  2903 
3154         ret = copy_cred(&clp->cl_cred, &rqstp    2904         ret = copy_cred(&clp->cl_cred, &rqstp->rq_cred);
3155         if (ret) {                               2905         if (ret) {
3156                 free_client(clp);                2906                 free_client(clp);
3157                 return NULL;                     2907                 return NULL;
3158         }                                        2908         }
3159         gen_clid(clp, nn);                       2909         gen_clid(clp, nn);
3160         kref_init(&clp->cl_nfsdfs.cl_ref);       2910         kref_init(&clp->cl_nfsdfs.cl_ref);
3161         nfsd4_init_cb(&clp->cl_cb_null, clp,     2911         nfsd4_init_cb(&clp->cl_cb_null, clp, NULL, NFSPROC4_CLNT_CB_NULL);
3162         clp->cl_time = ktime_get_boottime_sec    2912         clp->cl_time = ktime_get_boottime_seconds();
3163         clear_bit(0, &clp->cl_cb_slot_busy);     2913         clear_bit(0, &clp->cl_cb_slot_busy);
3164         copy_verf(clp, verf);                    2914         copy_verf(clp, verf);
3165         memcpy(&clp->cl_addr, sa, sizeof(stru    2915         memcpy(&clp->cl_addr, sa, sizeof(struct sockaddr_storage));
3166         clp->cl_cb_session = NULL;               2916         clp->cl_cb_session = NULL;
3167         clp->net = net;                          2917         clp->net = net;
3168         clp->cl_nfsd_dentry = nfsd_client_mkd    2918         clp->cl_nfsd_dentry = nfsd_client_mkdir(
3169                 nn, &clp->cl_nfsdfs,             2919                 nn, &clp->cl_nfsdfs,
3170                 clp->cl_clientid.cl_id - nn->    2920                 clp->cl_clientid.cl_id - nn->clientid_base,
3171                 client_files, dentries);         2921                 client_files, dentries);
3172         clp->cl_nfsd_info_dentry = dentries[0    2922         clp->cl_nfsd_info_dentry = dentries[0];
3173         if (!clp->cl_nfsd_dentry) {              2923         if (!clp->cl_nfsd_dentry) {
3174                 free_client(clp);                2924                 free_client(clp);
3175                 return NULL;                     2925                 return NULL;
3176         }                                        2926         }
3177         clp->cl_ra = kzalloc(sizeof(*clp->cl_    2927         clp->cl_ra = kzalloc(sizeof(*clp->cl_ra), GFP_KERNEL);
3178         if (!clp->cl_ra) {                       2928         if (!clp->cl_ra) {
3179                 free_client(clp);                2929                 free_client(clp);
3180                 return NULL;                     2930                 return NULL;
3181         }                                        2931         }
3182         clp->cl_ra_time = 0;                     2932         clp->cl_ra_time = 0;
3183         nfsd4_init_cb(&clp->cl_ra->ra_cb, clp    2933         nfsd4_init_cb(&clp->cl_ra->ra_cb, clp, &nfsd4_cb_recall_any_ops,
3184                         NFSPROC4_CLNT_CB_RECA    2934                         NFSPROC4_CLNT_CB_RECALL_ANY);
3185         return clp;                              2935         return clp;
3186 }                                                2936 }
3187                                                  2937 
3188 static void                                      2938 static void
3189 add_clp_to_name_tree(struct nfs4_client *new_    2939 add_clp_to_name_tree(struct nfs4_client *new_clp, struct rb_root *root)
3190 {                                                2940 {
3191         struct rb_node **new = &(root->rb_nod    2941         struct rb_node **new = &(root->rb_node), *parent = NULL;
3192         struct nfs4_client *clp;                 2942         struct nfs4_client *clp;
3193                                                  2943 
3194         while (*new) {                           2944         while (*new) {
3195                 clp = rb_entry(*new, struct n    2945                 clp = rb_entry(*new, struct nfs4_client, cl_namenode);
3196                 parent = *new;                   2946                 parent = *new;
3197                                                  2947 
3198                 if (compare_blob(&clp->cl_nam    2948                 if (compare_blob(&clp->cl_name, &new_clp->cl_name) > 0)
3199                         new = &((*new)->rb_le    2949                         new = &((*new)->rb_left);
3200                 else                             2950                 else
3201                         new = &((*new)->rb_ri    2951                         new = &((*new)->rb_right);
3202         }                                        2952         }
3203                                                  2953 
3204         rb_link_node(&new_clp->cl_namenode, p    2954         rb_link_node(&new_clp->cl_namenode, parent, new);
3205         rb_insert_color(&new_clp->cl_namenode    2955         rb_insert_color(&new_clp->cl_namenode, root);
3206 }                                                2956 }
3207                                                  2957 
3208 static struct nfs4_client *                      2958 static struct nfs4_client *
3209 find_clp_in_name_tree(struct xdr_netobj *name    2959 find_clp_in_name_tree(struct xdr_netobj *name, struct rb_root *root)
3210 {                                                2960 {
3211         int cmp;                                 2961         int cmp;
3212         struct rb_node *node = root->rb_node;    2962         struct rb_node *node = root->rb_node;
3213         struct nfs4_client *clp;                 2963         struct nfs4_client *clp;
3214                                                  2964 
3215         while (node) {                           2965         while (node) {
3216                 clp = rb_entry(node, struct n    2966                 clp = rb_entry(node, struct nfs4_client, cl_namenode);
3217                 cmp = compare_blob(&clp->cl_n    2967                 cmp = compare_blob(&clp->cl_name, name);
3218                 if (cmp > 0)                     2968                 if (cmp > 0)
3219                         node = node->rb_left;    2969                         node = node->rb_left;
3220                 else if (cmp < 0)                2970                 else if (cmp < 0)
3221                         node = node->rb_right    2971                         node = node->rb_right;
3222                 else                             2972                 else
3223                         return clp;              2973                         return clp;
3224         }                                        2974         }
3225         return NULL;                             2975         return NULL;
3226 }                                                2976 }
3227                                                  2977 
3228 static void                                      2978 static void
3229 add_to_unconfirmed(struct nfs4_client *clp)      2979 add_to_unconfirmed(struct nfs4_client *clp)
3230 {                                                2980 {
3231         unsigned int idhashval;                  2981         unsigned int idhashval;
3232         struct nfsd_net *nn = net_generic(clp    2982         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
3233                                                  2983 
3234         lockdep_assert_held(&nn->client_lock)    2984         lockdep_assert_held(&nn->client_lock);
3235                                                  2985 
3236         clear_bit(NFSD4_CLIENT_CONFIRMED, &cl    2986         clear_bit(NFSD4_CLIENT_CONFIRMED, &clp->cl_flags);
3237         add_clp_to_name_tree(clp, &nn->unconf    2987         add_clp_to_name_tree(clp, &nn->unconf_name_tree);
3238         idhashval = clientid_hashval(clp->cl_    2988         idhashval = clientid_hashval(clp->cl_clientid.cl_id);
3239         list_add(&clp->cl_idhash, &nn->unconf    2989         list_add(&clp->cl_idhash, &nn->unconf_id_hashtbl[idhashval]);
3240         renew_client_locked(clp);                2990         renew_client_locked(clp);
3241 }                                                2991 }
3242                                                  2992 
3243 static void                                      2993 static void
3244 move_to_confirmed(struct nfs4_client *clp)       2994 move_to_confirmed(struct nfs4_client *clp)
3245 {                                                2995 {
3246         unsigned int idhashval = clientid_has    2996         unsigned int idhashval = clientid_hashval(clp->cl_clientid.cl_id);
3247         struct nfsd_net *nn = net_generic(clp    2997         struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
3248                                                  2998 
3249         lockdep_assert_held(&nn->client_lock)    2999         lockdep_assert_held(&nn->client_lock);
3250                                                  3000 
3251         list_move(&clp->cl_idhash, &nn->conf_    3001         list_move(&clp->cl_idhash, &nn->conf_id_hashtbl[idhashval]);
3252         rb_erase(&clp->cl_namenode, &nn->unco    3002         rb_erase(&clp->cl_namenode, &nn->unconf_name_tree);
3253         add_clp_to_name_tree(clp, &nn->conf_n    3003         add_clp_to_name_tree(clp, &nn->conf_name_tree);
3254         set_bit(NFSD4_CLIENT_CONFIRMED, &clp-    3004         set_bit(NFSD4_CLIENT_CONFIRMED, &clp->cl_flags);
3255         trace_nfsd_clid_confirmed(&clp->cl_cl    3005         trace_nfsd_clid_confirmed(&clp->cl_clientid);
3256         renew_client_locked(clp);                3006         renew_client_locked(clp);
3257 }                                                3007 }
3258                                                  3008 
3259 static struct nfs4_client *                      3009 static struct nfs4_client *
3260 find_client_in_id_table(struct list_head *tbl    3010 find_client_in_id_table(struct list_head *tbl, clientid_t *clid, bool sessions)
3261 {                                                3011 {
3262         struct nfs4_client *clp;                 3012         struct nfs4_client *clp;
3263         unsigned int idhashval = clientid_has    3013         unsigned int idhashval = clientid_hashval(clid->cl_id);
3264                                                  3014 
3265         list_for_each_entry(clp, &tbl[idhashv    3015         list_for_each_entry(clp, &tbl[idhashval], cl_idhash) {
3266                 if (same_clid(&clp->cl_client    3016                 if (same_clid(&clp->cl_clientid, clid)) {
3267                         if ((bool)clp->cl_min    3017                         if ((bool)clp->cl_minorversion != sessions)
3268                                 return NULL;     3018                                 return NULL;
3269                         renew_client_locked(c    3019                         renew_client_locked(clp);
3270                         return clp;              3020                         return clp;
3271                 }                                3021                 }
3272         }                                        3022         }
3273         return NULL;                             3023         return NULL;
3274 }                                                3024 }
3275                                                  3025 
3276 static struct nfs4_client *                      3026 static struct nfs4_client *
3277 find_confirmed_client(clientid_t *clid, bool     3027 find_confirmed_client(clientid_t *clid, bool sessions, struct nfsd_net *nn)
3278 {                                                3028 {
3279         struct list_head *tbl = nn->conf_id_h    3029         struct list_head *tbl = nn->conf_id_hashtbl;
3280                                                  3030 
3281         lockdep_assert_held(&nn->client_lock)    3031         lockdep_assert_held(&nn->client_lock);
3282         return find_client_in_id_table(tbl, c    3032         return find_client_in_id_table(tbl, clid, sessions);
3283 }                                                3033 }
3284                                                  3034 
3285 static struct nfs4_client *                      3035 static struct nfs4_client *
3286 find_unconfirmed_client(clientid_t *clid, boo    3036 find_unconfirmed_client(clientid_t *clid, bool sessions, struct nfsd_net *nn)
3287 {                                                3037 {
3288         struct list_head *tbl = nn->unconf_id    3038         struct list_head *tbl = nn->unconf_id_hashtbl;
3289                                                  3039 
3290         lockdep_assert_held(&nn->client_lock)    3040         lockdep_assert_held(&nn->client_lock);
3291         return find_client_in_id_table(tbl, c    3041         return find_client_in_id_table(tbl, clid, sessions);
3292 }                                                3042 }
3293                                                  3043 
3294 static bool clp_used_exchangeid(struct nfs4_c    3044 static bool clp_used_exchangeid(struct nfs4_client *clp)
3295 {                                                3045 {
3296         return clp->cl_exchange_flags != 0;      3046         return clp->cl_exchange_flags != 0;
3297 }                                                3047 } 
3298                                                  3048 
3299 static struct nfs4_client *                      3049 static struct nfs4_client *
3300 find_confirmed_client_by_name(struct xdr_neto    3050 find_confirmed_client_by_name(struct xdr_netobj *name, struct nfsd_net *nn)
3301 {                                                3051 {
3302         lockdep_assert_held(&nn->client_lock)    3052         lockdep_assert_held(&nn->client_lock);
3303         return find_clp_in_name_tree(name, &n    3053         return find_clp_in_name_tree(name, &nn->conf_name_tree);
3304 }                                                3054 }
3305                                                  3055 
3306 static struct nfs4_client *                      3056 static struct nfs4_client *
3307 find_unconfirmed_client_by_name(struct xdr_ne    3057 find_unconfirmed_client_by_name(struct xdr_netobj *name, struct nfsd_net *nn)
3308 {                                                3058 {
3309         lockdep_assert_held(&nn->client_lock)    3059         lockdep_assert_held(&nn->client_lock);
3310         return find_clp_in_name_tree(name, &n    3060         return find_clp_in_name_tree(name, &nn->unconf_name_tree);
3311 }                                                3061 }
3312                                                  3062 
3313 static void                                      3063 static void
3314 gen_callback(struct nfs4_client *clp, struct     3064 gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se, struct svc_rqst *rqstp)
3315 {                                                3065 {
3316         struct nfs4_cb_conn *conn = &clp->cl_    3066         struct nfs4_cb_conn *conn = &clp->cl_cb_conn;
3317         struct sockaddr *sa = svc_addr(rqstp)    3067         struct sockaddr *sa = svc_addr(rqstp);
3318         u32 scopeid = rpc_get_scope_id(sa);      3068         u32 scopeid = rpc_get_scope_id(sa);
3319         unsigned short expected_family;          3069         unsigned short expected_family;
3320                                                  3070 
3321         /* Currently, we only support tcp and    3071         /* Currently, we only support tcp and tcp6 for the callback channel */
3322         if (se->se_callback_netid_len == 3 &&    3072         if (se->se_callback_netid_len == 3 &&
3323             !memcmp(se->se_callback_netid_val    3073             !memcmp(se->se_callback_netid_val, "tcp", 3))
3324                 expected_family = AF_INET;       3074                 expected_family = AF_INET;
3325         else if (se->se_callback_netid_len ==    3075         else if (se->se_callback_netid_len == 4 &&
3326                  !memcmp(se->se_callback_neti    3076                  !memcmp(se->se_callback_netid_val, "tcp6", 4))
3327                 expected_family = AF_INET6;      3077                 expected_family = AF_INET6;
3328         else                                     3078         else
3329                 goto out_err;                    3079                 goto out_err;
3330                                                  3080 
3331         conn->cb_addrlen = rpc_uaddr2sockaddr    3081         conn->cb_addrlen = rpc_uaddr2sockaddr(clp->net, se->se_callback_addr_val,
3332                                             s    3082                                             se->se_callback_addr_len,
3333                                             (    3083                                             (struct sockaddr *)&conn->cb_addr,
3334                                             s    3084                                             sizeof(conn->cb_addr));
3335                                                  3085 
3336         if (!conn->cb_addrlen || conn->cb_add    3086         if (!conn->cb_addrlen || conn->cb_addr.ss_family != expected_family)
3337                 goto out_err;                    3087                 goto out_err;
3338                                                  3088 
3339         if (conn->cb_addr.ss_family == AF_INE    3089         if (conn->cb_addr.ss_family == AF_INET6)
3340                 ((struct sockaddr_in6 *)&conn    3090                 ((struct sockaddr_in6 *)&conn->cb_addr)->sin6_scope_id = scopeid;
3341                                                  3091 
3342         conn->cb_prog = se->se_callback_prog;    3092         conn->cb_prog = se->se_callback_prog;
3343         conn->cb_ident = se->se_callback_iden    3093         conn->cb_ident = se->se_callback_ident;
3344         memcpy(&conn->cb_saddr, &rqstp->rq_da    3094         memcpy(&conn->cb_saddr, &rqstp->rq_daddr, rqstp->rq_daddrlen);
3345         trace_nfsd_cb_args(clp, conn);           3095         trace_nfsd_cb_args(clp, conn);
3346         return;                                  3096         return;
3347 out_err:                                         3097 out_err:
3348         conn->cb_addr.ss_family = AF_UNSPEC;     3098         conn->cb_addr.ss_family = AF_UNSPEC;
3349         conn->cb_addrlen = 0;                    3099         conn->cb_addrlen = 0;
3350         trace_nfsd_cb_nodelegs(clp);             3100         trace_nfsd_cb_nodelegs(clp);
3351         return;                                  3101         return;
3352 }                                                3102 }
3353                                                  3103 
3354 /*                                               3104 /*
3355  * Cache a reply. nfsd4_check_resp_size() has    3105  * Cache a reply. nfsd4_check_resp_size() has bounded the cache size.
3356  */                                              3106  */
3357 static void                                      3107 static void
3358 nfsd4_store_cache_entry(struct nfsd4_compound    3108 nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
3359 {                                                3109 {
3360         struct xdr_buf *buf = resp->xdr->buf;    3110         struct xdr_buf *buf = resp->xdr->buf;
3361         struct nfsd4_slot *slot = resp->cstat    3111         struct nfsd4_slot *slot = resp->cstate.slot;
3362         unsigned int base;                       3112         unsigned int base;
3363                                                  3113 
3364         dprintk("--> %s slot %p\n", __func__,    3114         dprintk("--> %s slot %p\n", __func__, slot);
3365                                                  3115 
3366         slot->sl_flags |= NFSD4_SLOT_INITIALI    3116         slot->sl_flags |= NFSD4_SLOT_INITIALIZED;
3367         slot->sl_opcnt = resp->opcnt;            3117         slot->sl_opcnt = resp->opcnt;
3368         slot->sl_status = resp->cstate.status    3118         slot->sl_status = resp->cstate.status;
3369         free_svc_cred(&slot->sl_cred);           3119         free_svc_cred(&slot->sl_cred);
3370         copy_cred(&slot->sl_cred, &resp->rqst    3120         copy_cred(&slot->sl_cred, &resp->rqstp->rq_cred);
3371                                                  3121 
3372         if (!nfsd4_cache_this(resp)) {           3122         if (!nfsd4_cache_this(resp)) {
3373                 slot->sl_flags &= ~NFSD4_SLOT    3123                 slot->sl_flags &= ~NFSD4_SLOT_CACHED;
3374                 return;                          3124                 return;
3375         }                                        3125         }
3376         slot->sl_flags |= NFSD4_SLOT_CACHED;     3126         slot->sl_flags |= NFSD4_SLOT_CACHED;
3377                                                  3127 
3378         base = resp->cstate.data_offset;         3128         base = resp->cstate.data_offset;
3379         slot->sl_datalen = buf->len - base;      3129         slot->sl_datalen = buf->len - base;
3380         if (read_bytes_from_xdr_buf(buf, base    3130         if (read_bytes_from_xdr_buf(buf, base, slot->sl_data, slot->sl_datalen))
3381                 WARN(1, "%s: sessions DRC cou    3131                 WARN(1, "%s: sessions DRC could not cache compound\n",
3382                      __func__);                  3132                      __func__);
3383         return;                                  3133         return;
3384 }                                                3134 }
3385                                                  3135 
3386 /*                                               3136 /*
3387  * Encode the replay sequence operation from     3137  * Encode the replay sequence operation from the slot values.
3388  * If cachethis is FALSE encode the uncached     3138  * If cachethis is FALSE encode the uncached rep error on the next
3389  * operation which sets resp->p and increment    3139  * operation which sets resp->p and increments resp->opcnt for
3390  * nfs4svc_encode_compoundres.                   3140  * nfs4svc_encode_compoundres.
3391  *                                               3141  *
3392  */                                              3142  */
3393 static __be32                                    3143 static __be32
3394 nfsd4_enc_sequence_replay(struct nfsd4_compou    3144 nfsd4_enc_sequence_replay(struct nfsd4_compoundargs *args,
3395                           struct nfsd4_compou    3145                           struct nfsd4_compoundres *resp)
3396 {                                                3146 {
3397         struct nfsd4_op *op;                     3147         struct nfsd4_op *op;
3398         struct nfsd4_slot *slot = resp->cstat    3148         struct nfsd4_slot *slot = resp->cstate.slot;
3399                                                  3149 
3400         /* Encode the replayed sequence opera    3150         /* Encode the replayed sequence operation */
3401         op = &args->ops[resp->opcnt - 1];        3151         op = &args->ops[resp->opcnt - 1];
3402         nfsd4_encode_operation(resp, op);        3152         nfsd4_encode_operation(resp, op);
3403                                                  3153 
3404         if (slot->sl_flags & NFSD4_SLOT_CACHE    3154         if (slot->sl_flags & NFSD4_SLOT_CACHED)
3405                 return op->status;               3155                 return op->status;
3406         if (args->opcnt == 1) {                  3156         if (args->opcnt == 1) {
3407                 /*                               3157                 /*
3408                  * The original operation was    3158                  * The original operation wasn't a solo sequence--we
3409                  * always cache those--so thi    3159                  * always cache those--so this retry must not match the
3410                  * original:                     3160                  * original:
3411                  */                              3161                  */
3412                 op->status = nfserr_seq_false    3162                 op->status = nfserr_seq_false_retry;
3413         } else {                                 3163         } else {
3414                 op = &args->ops[resp->opcnt++    3164                 op = &args->ops[resp->opcnt++];
3415                 op->status = nfserr_retry_unc    3165                 op->status = nfserr_retry_uncached_rep;
3416                 nfsd4_encode_operation(resp,     3166                 nfsd4_encode_operation(resp, op);
3417         }                                        3167         }
3418         return op->status;                       3168         return op->status;
3419 }                                                3169 }
3420                                                  3170 
3421 /*                                               3171 /*
3422  * The sequence operation is not cached becau    3172  * The sequence operation is not cached because we can use the slot and
3423  * session values.                               3173  * session values.
3424  */                                              3174  */
3425 static __be32                                    3175 static __be32
3426 nfsd4_replay_cache_entry(struct nfsd4_compoun    3176 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
3427                          struct nfsd4_sequenc    3177                          struct nfsd4_sequence *seq)
3428 {                                                3178 {
3429         struct nfsd4_slot *slot = resp->cstat    3179         struct nfsd4_slot *slot = resp->cstate.slot;
3430         struct xdr_stream *xdr = resp->xdr;      3180         struct xdr_stream *xdr = resp->xdr;
3431         __be32 *p;                               3181         __be32 *p;
3432         __be32 status;                           3182         __be32 status;
3433                                                  3183 
3434         dprintk("--> %s slot %p\n", __func__,    3184         dprintk("--> %s slot %p\n", __func__, slot);
3435                                                  3185 
3436         status = nfsd4_enc_sequence_replay(re    3186         status = nfsd4_enc_sequence_replay(resp->rqstp->rq_argp, resp);
3437         if (status)                              3187         if (status)
3438                 return status;                   3188                 return status;
3439                                                  3189 
3440         p = xdr_reserve_space(xdr, slot->sl_d    3190         p = xdr_reserve_space(xdr, slot->sl_datalen);
3441         if (!p) {                                3191         if (!p) {
3442                 WARN_ON_ONCE(1);                 3192                 WARN_ON_ONCE(1);
3443                 return nfserr_serverfault;       3193                 return nfserr_serverfault;
3444         }                                        3194         }
3445         xdr_encode_opaque_fixed(p, slot->sl_d    3195         xdr_encode_opaque_fixed(p, slot->sl_data, slot->sl_datalen);
3446         xdr_commit_encode(xdr);                  3196         xdr_commit_encode(xdr);
3447                                                  3197 
3448         resp->opcnt = slot->sl_opcnt;            3198         resp->opcnt = slot->sl_opcnt;
3449         return slot->sl_status;                  3199         return slot->sl_status;
3450 }                                                3200 }
3451                                                  3201 
3452 /*                                               3202 /*
3453  * Set the exchange_id flags returned by the     3203  * Set the exchange_id flags returned by the server.
3454  */                                              3204  */
3455 static void                                      3205 static void
3456 nfsd4_set_ex_flags(struct nfs4_client *new, s    3206 nfsd4_set_ex_flags(struct nfs4_client *new, struct nfsd4_exchange_id *clid)
3457 {                                                3207 {
3458 #ifdef CONFIG_NFSD_PNFS                          3208 #ifdef CONFIG_NFSD_PNFS
3459         new->cl_exchange_flags |= EXCHGID4_FL    3209         new->cl_exchange_flags |= EXCHGID4_FLAG_USE_PNFS_MDS;
3460 #else                                            3210 #else
3461         new->cl_exchange_flags |= EXCHGID4_FL    3211         new->cl_exchange_flags |= EXCHGID4_FLAG_USE_NON_PNFS;
3462 #endif                                           3212 #endif
3463                                                  3213 
3464         /* Referrals are supported, Migration    3214         /* Referrals are supported, Migration is not. */
3465         new->cl_exchange_flags |= EXCHGID4_FL    3215         new->cl_exchange_flags |= EXCHGID4_FLAG_SUPP_MOVED_REFER;
3466                                                  3216 
3467         /* set the wire flags to return to cl    3217         /* set the wire flags to return to client. */
3468         clid->flags = new->cl_exchange_flags;    3218         clid->flags = new->cl_exchange_flags;
3469 }                                                3219 }
3470                                                  3220 
3471 static bool client_has_openowners(struct nfs4    3221 static bool client_has_openowners(struct nfs4_client *clp)
3472 {                                                3222 {
3473         struct nfs4_openowner *oo;               3223         struct nfs4_openowner *oo;
3474                                                  3224 
3475         list_for_each_entry(oo, &clp->cl_open    3225         list_for_each_entry(oo, &clp->cl_openowners, oo_perclient) {
3476                 if (!list_empty(&oo->oo_owner    3226                 if (!list_empty(&oo->oo_owner.so_stateids))
3477                         return true;             3227                         return true;
3478         }                                        3228         }
3479         return false;                            3229         return false;
3480 }                                                3230 }
3481                                                  3231 
3482 static bool client_has_state(struct nfs4_clie    3232 static bool client_has_state(struct nfs4_client *clp)
3483 {                                                3233 {
3484         return client_has_openowners(clp)        3234         return client_has_openowners(clp)
3485 #ifdef CONFIG_NFSD_PNFS                          3235 #ifdef CONFIG_NFSD_PNFS
3486                 || !list_empty(&clp->cl_lo_st    3236                 || !list_empty(&clp->cl_lo_states)
3487 #endif                                           3237 #endif
3488                 || !list_empty(&clp->cl_deleg    3238                 || !list_empty(&clp->cl_delegations)
3489                 || !list_empty(&clp->cl_sessi    3239                 || !list_empty(&clp->cl_sessions)
3490                 || !list_empty(&clp->async_co    3240                 || !list_empty(&clp->async_copies);
3491 }                                                3241 }
3492                                                  3242 
3493 static __be32 copy_impl_id(struct nfs4_client    3243 static __be32 copy_impl_id(struct nfs4_client *clp,
3494                                 struct nfsd4_    3244                                 struct nfsd4_exchange_id *exid)
3495 {                                                3245 {
3496         if (!exid->nii_domain.data)              3246         if (!exid->nii_domain.data)
3497                 return 0;                        3247                 return 0;
3498         xdr_netobj_dup(&clp->cl_nii_domain, &    3248         xdr_netobj_dup(&clp->cl_nii_domain, &exid->nii_domain, GFP_KERNEL);
3499         if (!clp->cl_nii_domain.data)            3249         if (!clp->cl_nii_domain.data)
3500                 return nfserr_jukebox;           3250                 return nfserr_jukebox;
3501         xdr_netobj_dup(&clp->cl_nii_name, &ex    3251         xdr_netobj_dup(&clp->cl_nii_name, &exid->nii_name, GFP_KERNEL);
3502         if (!clp->cl_nii_name.data)              3252         if (!clp->cl_nii_name.data)
3503                 return nfserr_jukebox;           3253                 return nfserr_jukebox;
3504         clp->cl_nii_time = exid->nii_time;       3254         clp->cl_nii_time = exid->nii_time;
3505         return 0;                                3255         return 0;
3506 }                                                3256 }
3507                                                  3257 
3508 __be32                                           3258 __be32
3509 nfsd4_exchange_id(struct svc_rqst *rqstp, str    3259 nfsd4_exchange_id(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
3510                 union nfsd4_op_u *u)             3260                 union nfsd4_op_u *u)
3511 {                                                3261 {
3512         struct nfsd4_exchange_id *exid = &u->    3262         struct nfsd4_exchange_id *exid = &u->exchange_id;
3513         struct nfs4_client *conf, *new;          3263         struct nfs4_client *conf, *new;
3514         struct nfs4_client *unconf = NULL;       3264         struct nfs4_client *unconf = NULL;
3515         __be32 status;                           3265         __be32 status;
3516         char                    addr_str[INET    3266         char                    addr_str[INET6_ADDRSTRLEN];
3517         nfs4_verifier           verf = exid->    3267         nfs4_verifier           verf = exid->verifier;
3518         struct sockaddr         *sa = svc_add    3268         struct sockaddr         *sa = svc_addr(rqstp);
3519         bool    update = exid->flags & EXCHGI    3269         bool    update = exid->flags & EXCHGID4_FLAG_UPD_CONFIRMED_REC_A;
3520         struct nfsd_net         *nn = net_gen    3270         struct nfsd_net         *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
3521                                                  3271 
3522         rpc_ntop(sa, addr_str, sizeof(addr_st    3272         rpc_ntop(sa, addr_str, sizeof(addr_str));
3523         dprintk("%s rqstp=%p exid=%p clname.l    3273         dprintk("%s rqstp=%p exid=%p clname.len=%u clname.data=%p "
3524                 "ip_addr=%s flags %x, spa_how    3274                 "ip_addr=%s flags %x, spa_how %u\n",
3525                 __func__, rqstp, exid, exid->    3275                 __func__, rqstp, exid, exid->clname.len, exid->clname.data,
3526                 addr_str, exid->flags, exid->    3276                 addr_str, exid->flags, exid->spa_how);
3527                                                  3277 
3528         if (exid->flags & ~EXCHGID4_FLAG_MASK    3278         if (exid->flags & ~EXCHGID4_FLAG_MASK_A)
3529                 return nfserr_inval;             3279                 return nfserr_inval;
3530                                                  3280 
3531         new = create_client(exid->clname, rqs    3281         new = create_client(exid->clname, rqstp, &verf);
3532         if (new == NULL)                         3282         if (new == NULL)
3533                 return nfserr_jukebox;           3283                 return nfserr_jukebox;
3534         status = copy_impl_id(new, exid);        3284         status = copy_impl_id(new, exid);
3535         if (status)                              3285         if (status)
3536                 goto out_nolock;                 3286                 goto out_nolock;
3537                                                  3287 
3538         switch (exid->spa_how) {                 3288         switch (exid->spa_how) {
3539         case SP4_MACH_CRED:                      3289         case SP4_MACH_CRED:
3540                 exid->spo_must_enforce[0] = 0    3290                 exid->spo_must_enforce[0] = 0;
3541                 exid->spo_must_enforce[1] = (    3291                 exid->spo_must_enforce[1] = (
3542                         1 << (OP_BIND_CONN_TO    3292                         1 << (OP_BIND_CONN_TO_SESSION - 32) |
3543                         1 << (OP_EXCHANGE_ID     3293                         1 << (OP_EXCHANGE_ID - 32) |
3544                         1 << (OP_CREATE_SESSI    3294                         1 << (OP_CREATE_SESSION - 32) |
3545                         1 << (OP_DESTROY_SESS    3295                         1 << (OP_DESTROY_SESSION - 32) |
3546                         1 << (OP_DESTROY_CLIE    3296                         1 << (OP_DESTROY_CLIENTID - 32));
3547                                                  3297 
3548                 exid->spo_must_allow[0] &= (1    3298                 exid->spo_must_allow[0] &= (1 << (OP_CLOSE) |
3549                                         1 <<     3299                                         1 << (OP_OPEN_DOWNGRADE) |
3550                                         1 <<     3300                                         1 << (OP_LOCKU) |
3551                                         1 <<     3301                                         1 << (OP_DELEGRETURN));
3552                                                  3302 
3553                 exid->spo_must_allow[1] &= (     3303                 exid->spo_must_allow[1] &= (
3554                                         1 <<     3304                                         1 << (OP_TEST_STATEID - 32) |
3555                                         1 <<     3305                                         1 << (OP_FREE_STATEID - 32));
3556                 if (!svc_rqst_integrity_prote    3306                 if (!svc_rqst_integrity_protected(rqstp)) {
3557                         status = nfserr_inval    3307                         status = nfserr_inval;
3558                         goto out_nolock;         3308                         goto out_nolock;
3559                 }                                3309                 }
3560                 /*                               3310                 /*
3561                  * Sometimes userspace doesn'    3311                  * Sometimes userspace doesn't give us a principal.
3562                  * Which is a bug, really.  A    3312                  * Which is a bug, really.  Anyway, we can't enforce
3563                  * MACH_CRED in that case, be    3313                  * MACH_CRED in that case, better to give up now:
3564                  */                              3314                  */
3565                 if (!new->cl_cred.cr_principa    3315                 if (!new->cl_cred.cr_principal &&
3566                                         !new-    3316                                         !new->cl_cred.cr_raw_principal) {
3567                         status = nfserr_serve    3317                         status = nfserr_serverfault;
3568                         goto out_nolock;         3318                         goto out_nolock;
3569                 }                                3319                 }
3570                 new->cl_mach_cred = true;        3320                 new->cl_mach_cred = true;
3571                 break;                           3321                 break;
3572         case SP4_NONE:                           3322         case SP4_NONE:
3573                 break;                           3323                 break;
3574         default:                                 3324         default:                                /* checked by xdr code */
3575                 WARN_ON_ONCE(1);                 3325                 WARN_ON_ONCE(1);
3576                 fallthrough;                     3326                 fallthrough;
3577         case SP4_SSV:                            3327         case SP4_SSV:
3578                 status = nfserr_encr_alg_unsu    3328                 status = nfserr_encr_alg_unsupp;
3579                 goto out_nolock;                 3329                 goto out_nolock;
3580         }                                        3330         }
3581                                                  3331 
3582         /* Cases below refer to rfc 5661 sect    3332         /* Cases below refer to rfc 5661 section 18.35.4: */
3583         spin_lock(&nn->client_lock);             3333         spin_lock(&nn->client_lock);
3584         conf = find_confirmed_client_by_name(    3334         conf = find_confirmed_client_by_name(&exid->clname, nn);
3585         if (conf) {                              3335         if (conf) {
3586                 bool creds_match = same_creds    3336                 bool creds_match = same_creds(&conf->cl_cred, &rqstp->rq_cred);
3587                 bool verfs_match = same_verf(    3337                 bool verfs_match = same_verf(&verf, &conf->cl_verifier);
3588                                                  3338 
3589                 if (update) {                    3339                 if (update) {
3590                         if (!clp_used_exchang    3340                         if (!clp_used_exchangeid(conf)) { /* buggy client */
3591                                 status = nfse    3341                                 status = nfserr_inval;
3592                                 goto out;        3342                                 goto out;
3593                         }                        3343                         }
3594                         if (!nfsd4_mach_creds    3344                         if (!nfsd4_mach_creds_match(conf, rqstp)) {
3595                                 status = nfse    3345                                 status = nfserr_wrong_cred;
3596                                 goto out;        3346                                 goto out;
3597                         }                        3347                         }
3598                         if (!creds_match) { /    3348                         if (!creds_match) { /* case 9 */
3599                                 status = nfse    3349                                 status = nfserr_perm;
3600                                 goto out;        3350                                 goto out;
3601                         }                        3351                         }
3602                         if (!verfs_match) { /    3352                         if (!verfs_match) { /* case 8 */
3603                                 status = nfse    3353                                 status = nfserr_not_same;
3604                                 goto out;        3354                                 goto out;
3605                         }                        3355                         }
3606                         /* case 6 */             3356                         /* case 6 */
3607                         exid->flags |= EXCHGI    3357                         exid->flags |= EXCHGID4_FLAG_CONFIRMED_R;
3608                         trace_nfsd_clid_confi    3358                         trace_nfsd_clid_confirmed_r(conf);
3609                         goto out_copy;           3359                         goto out_copy;
3610                 }                                3360                 }
3611                 if (!creds_match) { /* case 3    3361                 if (!creds_match) { /* case 3 */
3612                         if (client_has_state(    3362                         if (client_has_state(conf)) {
3613                                 status = nfse    3363                                 status = nfserr_clid_inuse;
3614                                 trace_nfsd_cl    3364                                 trace_nfsd_clid_cred_mismatch(conf, rqstp);
3615                                 goto out;        3365                                 goto out;
3616                         }                        3366                         }
3617                         goto out_new;            3367                         goto out_new;
3618                 }                                3368                 }
3619                 if (verfs_match) { /* case 2     3369                 if (verfs_match) { /* case 2 */
3620                         conf->cl_exchange_fla    3370                         conf->cl_exchange_flags |= EXCHGID4_FLAG_CONFIRMED_R;
3621                         trace_nfsd_clid_confi    3371                         trace_nfsd_clid_confirmed_r(conf);
3622                         goto out_copy;           3372                         goto out_copy;
3623                 }                                3373                 }
3624                 /* case 5, client reboot */      3374                 /* case 5, client reboot */
3625                 trace_nfsd_clid_verf_mismatch    3375                 trace_nfsd_clid_verf_mismatch(conf, rqstp, &verf);
3626                 conf = NULL;                     3376                 conf = NULL;
3627                 goto out_new;                    3377                 goto out_new;
3628         }                                        3378         }
3629                                                  3379 
3630         if (update) { /* case 7 */               3380         if (update) { /* case 7 */
3631                 status = nfserr_noent;           3381                 status = nfserr_noent;
3632                 goto out;                        3382                 goto out;
3633         }                                        3383         }
3634                                                  3384 
3635         unconf = find_unconfirmed_client_by_n    3385         unconf = find_unconfirmed_client_by_name(&exid->clname, nn);
3636         if (unconf) /* case 4, possible retry    3386         if (unconf) /* case 4, possible retry or client restart */
3637                 unhash_client_locked(unconf);    3387                 unhash_client_locked(unconf);
3638                                                  3388 
3639         /* case 1, new owner ID */               3389         /* case 1, new owner ID */
3640         trace_nfsd_clid_fresh(new);              3390         trace_nfsd_clid_fresh(new);
3641                                                  3391 
3642 out_new:                                         3392 out_new:
3643         if (conf) {                              3393         if (conf) {
3644                 status = mark_client_expired_    3394                 status = mark_client_expired_locked(conf);
3645                 if (status)                      3395                 if (status)
3646                         goto out;                3396                         goto out;
3647                 trace_nfsd_clid_replaced(&con    3397                 trace_nfsd_clid_replaced(&conf->cl_clientid);
3648         }                                        3398         }
3649         new->cl_minorversion = cstate->minorv    3399         new->cl_minorversion = cstate->minorversion;
3650         new->cl_spo_must_allow.u.words[0] = e    3400         new->cl_spo_must_allow.u.words[0] = exid->spo_must_allow[0];
3651         new->cl_spo_must_allow.u.words[1] = e    3401         new->cl_spo_must_allow.u.words[1] = exid->spo_must_allow[1];
3652                                                  3402 
3653         /* Contrived initial CREATE_SESSION r << 
3654         new->cl_cs_slot.sl_status = nfserr_se << 
3655                                               << 
3656         add_to_unconfirmed(new);                 3403         add_to_unconfirmed(new);
3657         swap(new, conf);                         3404         swap(new, conf);
3658 out_copy:                                        3405 out_copy:
3659         exid->clientid.cl_boot = conf->cl_cli    3406         exid->clientid.cl_boot = conf->cl_clientid.cl_boot;
3660         exid->clientid.cl_id = conf->cl_clien    3407         exid->clientid.cl_id = conf->cl_clientid.cl_id;
3661                                                  3408 
3662         exid->seqid = conf->cl_cs_slot.sl_seq    3409         exid->seqid = conf->cl_cs_slot.sl_seqid + 1;
3663         nfsd4_set_ex_flags(conf, exid);          3410         nfsd4_set_ex_flags(conf, exid);
3664                                                  3411 
3665         dprintk("nfsd4_exchange_id seqid %d f    3412         dprintk("nfsd4_exchange_id seqid %d flags %x\n",
3666                 conf->cl_cs_slot.sl_seqid, co    3413                 conf->cl_cs_slot.sl_seqid, conf->cl_exchange_flags);
3667         status = nfs_ok;                         3414         status = nfs_ok;
3668                                                  3415 
3669 out:                                             3416 out:
3670         spin_unlock(&nn->client_lock);           3417         spin_unlock(&nn->client_lock);
3671 out_nolock:                                      3418 out_nolock:
3672         if (new)                                 3419         if (new)
3673                 expire_client(new);              3420                 expire_client(new);
3674         if (unconf) {                            3421         if (unconf) {
3675                 trace_nfsd_clid_expire_unconf    3422                 trace_nfsd_clid_expire_unconf(&unconf->cl_clientid);
3676                 expire_client(unconf);           3423                 expire_client(unconf);
3677         }                                        3424         }
3678         return status;                           3425         return status;
3679 }                                                3426 }
3680                                                  3427 
3681 static __be32 check_slot_seqid(u32 seqid, u32 !! 3428 static __be32
                                                   >> 3429 check_slot_seqid(u32 seqid, u32 slot_seqid, int slot_inuse)
3682 {                                                3430 {
                                                   >> 3431         dprintk("%s enter. seqid %d slot_seqid %d\n", __func__, seqid,
                                                   >> 3432                 slot_seqid);
                                                   >> 3433 
3683         /* The slot is in use, and no respons    3434         /* The slot is in use, and no response has been sent. */
3684         if (slot_inuse) {                        3435         if (slot_inuse) {
3685                 if (seqid == slot_seqid)         3436                 if (seqid == slot_seqid)
3686                         return nfserr_jukebox    3437                         return nfserr_jukebox;
3687                 else                             3438                 else
3688                         return nfserr_seq_mis    3439                         return nfserr_seq_misordered;
3689         }                                        3440         }
3690         /* Note unsigned 32-bit arithmetic ha    3441         /* Note unsigned 32-bit arithmetic handles wraparound: */
3691         if (likely(seqid == slot_seqid + 1))     3442         if (likely(seqid == slot_seqid + 1))
3692                 return nfs_ok;                   3443                 return nfs_ok;
3693         if (seqid == slot_seqid)                 3444         if (seqid == slot_seqid)
3694                 return nfserr_replay_cache;      3445                 return nfserr_replay_cache;
3695         return nfserr_seq_misordered;            3446         return nfserr_seq_misordered;
3696 }                                                3447 }
3697                                                  3448 
3698 /*                                               3449 /*
3699  * Cache the create session result into the c    3450  * Cache the create session result into the create session single DRC
3700  * slot cache by saving the xdr structure. sl    3451  * slot cache by saving the xdr structure. sl_seqid has been set.
3701  * Do this for solo or embedded create sessio    3452  * Do this for solo or embedded create session operations.
3702  */                                              3453  */
3703 static void                                      3454 static void
3704 nfsd4_cache_create_session(struct nfsd4_creat    3455 nfsd4_cache_create_session(struct nfsd4_create_session *cr_ses,
3705                            struct nfsd4_clid_    3456                            struct nfsd4_clid_slot *slot, __be32 nfserr)
3706 {                                                3457 {
3707         slot->sl_status = nfserr;                3458         slot->sl_status = nfserr;
3708         memcpy(&slot->sl_cr_ses, cr_ses, size    3459         memcpy(&slot->sl_cr_ses, cr_ses, sizeof(*cr_ses));
3709 }                                                3460 }
3710                                                  3461 
3711 static __be32                                    3462 static __be32
3712 nfsd4_replay_create_session(struct nfsd4_crea    3463 nfsd4_replay_create_session(struct nfsd4_create_session *cr_ses,
3713                             struct nfsd4_clid    3464                             struct nfsd4_clid_slot *slot)
3714 {                                                3465 {
3715         memcpy(cr_ses, &slot->sl_cr_ses, size    3466         memcpy(cr_ses, &slot->sl_cr_ses, sizeof(*cr_ses));
3716         return slot->sl_status;                  3467         return slot->sl_status;
3717 }                                                3468 }
3718                                                  3469 
3719 #define NFSD_MIN_REQ_HDR_SEQ_SZ ((\              3470 #define NFSD_MIN_REQ_HDR_SEQ_SZ ((\
3720                         2 * 2 + /* credential    3471                         2 * 2 + /* credential,verifier: AUTH_NULL, length 0 */ \
3721                         1 +     /* MIN tag is    3472                         1 +     /* MIN tag is length with zero, only length */ \
3722                         3 +     /* version, o    3473                         3 +     /* version, opcount, opcode */ \
3723                         XDR_QUADLEN(NFS4_MAX_    3474                         XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + \
3724                                 /* seqid, slo    3475                                 /* seqid, slotID, slotID, cache */ \
3725                         4 ) * sizeof(__be32))    3476                         4 ) * sizeof(__be32))
3726                                                  3477 
3727 #define NFSD_MIN_RESP_HDR_SEQ_SZ ((\             3478 #define NFSD_MIN_RESP_HDR_SEQ_SZ ((\
3728                         2 +     /* verifier:     3479                         2 +     /* verifier: AUTH_NULL, length 0 */\
3729                         1 +     /* status */     3480                         1 +     /* status */ \
3730                         1 +     /* MIN tag is    3481                         1 +     /* MIN tag is length with zero, only length */ \
3731                         3 +     /* opcount, o    3482                         3 +     /* opcount, opcode, opstatus*/ \
3732                         XDR_QUADLEN(NFS4_MAX_    3483                         XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + \
3733                                 /* seqid, slo    3484                                 /* seqid, slotID, slotID, slotID, status */ \
3734                         5 ) * sizeof(__be32))    3485                         5 ) * sizeof(__be32))
3735                                                  3486 
3736 static __be32 check_forechannel_attrs(struct     3487 static __be32 check_forechannel_attrs(struct nfsd4_channel_attrs *ca, struct nfsd_net *nn)
3737 {                                                3488 {
3738         u32 maxrpc = nn->nfsd_serv->sv_max_me    3489         u32 maxrpc = nn->nfsd_serv->sv_max_mesg;
3739                                                  3490 
3740         if (ca->maxreq_sz < NFSD_MIN_REQ_HDR_    3491         if (ca->maxreq_sz < NFSD_MIN_REQ_HDR_SEQ_SZ)
3741                 return nfserr_toosmall;          3492                 return nfserr_toosmall;
3742         if (ca->maxresp_sz < NFSD_MIN_RESP_HD    3493         if (ca->maxresp_sz < NFSD_MIN_RESP_HDR_SEQ_SZ)
3743                 return nfserr_toosmall;          3494                 return nfserr_toosmall;
3744         ca->headerpadsz = 0;                     3495         ca->headerpadsz = 0;
3745         ca->maxreq_sz = min_t(u32, ca->maxreq    3496         ca->maxreq_sz = min_t(u32, ca->maxreq_sz, maxrpc);
3746         ca->maxresp_sz = min_t(u32, ca->maxre    3497         ca->maxresp_sz = min_t(u32, ca->maxresp_sz, maxrpc);
3747         ca->maxops = min_t(u32, ca->maxops, N    3498         ca->maxops = min_t(u32, ca->maxops, NFSD_MAX_OPS_PER_COMPOUND);
3748         ca->maxresp_cached = min_t(u32, ca->m    3499         ca->maxresp_cached = min_t(u32, ca->maxresp_cached,
3749                         NFSD_SLOT_CACHE_SIZE     3500                         NFSD_SLOT_CACHE_SIZE + NFSD_MIN_HDR_SEQ_SZ);
3750         ca->maxreqs = min_t(u32, ca->maxreqs,    3501         ca->maxreqs = min_t(u32, ca->maxreqs, NFSD_MAX_SLOTS_PER_SESSION);
3751         /*                                       3502         /*
3752          * Note decreasing slot size below cl    3503          * Note decreasing slot size below client's request may make it
3753          * difficult for client to function c    3504          * difficult for client to function correctly, whereas
3754          * decreasing the number of slots wil    3505          * decreasing the number of slots will (just?) affect
3755          * performance.  When short on memory    3506          * performance.  When short on memory we therefore prefer to
3756          * decrease number of slots instead o    3507          * decrease number of slots instead of their size.  Clients that
3757          * request larger slots than they nee    3508          * request larger slots than they need will get poor results:
3758          * Note that we always allow at least    3509          * Note that we always allow at least one slot, because our
3759          * accounting is soft and provides no    3510          * accounting is soft and provides no guarantees either way.
3760          */                                      3511          */
3761         ca->maxreqs = nfsd4_get_drc_mem(ca, n    3512         ca->maxreqs = nfsd4_get_drc_mem(ca, nn);
3762                                                  3513 
3763         return nfs_ok;                           3514         return nfs_ok;
3764 }                                                3515 }
3765                                                  3516 
3766 /*                                               3517 /*
3767  * Server's NFSv4.1 backchannel support is AU    3518  * Server's NFSv4.1 backchannel support is AUTH_SYS-only for now.
3768  * These are based on similar macros in linux    3519  * These are based on similar macros in linux/sunrpc/msg_prot.h .
3769  */                                              3520  */
3770 #define RPC_MAX_HEADER_WITH_AUTH_SYS \           3521 #define RPC_MAX_HEADER_WITH_AUTH_SYS \
3771         (RPC_CALLHDRSIZE + 2 * (2 + UNX_CALLS    3522         (RPC_CALLHDRSIZE + 2 * (2 + UNX_CALLSLACK))
3772                                                  3523 
3773 #define RPC_MAX_REPHEADER_WITH_AUTH_SYS \        3524 #define RPC_MAX_REPHEADER_WITH_AUTH_SYS \
3774         (RPC_REPHDRSIZE + (2 + NUL_REPLYSLACK    3525         (RPC_REPHDRSIZE + (2 + NUL_REPLYSLACK))
3775                                                  3526 
3776 #define NFSD_CB_MAX_REQ_SZ      ((NFS4_enc_cb    3527 #define NFSD_CB_MAX_REQ_SZ      ((NFS4_enc_cb_recall_sz + \
3777                                  RPC_MAX_HEAD    3528                                  RPC_MAX_HEADER_WITH_AUTH_SYS) * sizeof(__be32))
3778 #define NFSD_CB_MAX_RESP_SZ     ((NFS4_dec_cb    3529 #define NFSD_CB_MAX_RESP_SZ     ((NFS4_dec_cb_recall_sz + \
3779                                  RPC_MAX_REPH    3530                                  RPC_MAX_REPHEADER_WITH_AUTH_SYS) * \
3780                                  sizeof(__be3    3531                                  sizeof(__be32))
3781                                                  3532 
3782 static __be32 check_backchannel_attrs(struct     3533 static __be32 check_backchannel_attrs(struct nfsd4_channel_attrs *ca)
3783 {                                                3534 {
3784         ca->headerpadsz = 0;                     3535         ca->headerpadsz = 0;
3785                                                  3536 
3786         if (ca->maxreq_sz < NFSD_CB_MAX_REQ_S    3537         if (ca->maxreq_sz < NFSD_CB_MAX_REQ_SZ)
3787                 return nfserr_toosmall;          3538                 return nfserr_toosmall;
3788         if (ca->maxresp_sz < NFSD_CB_MAX_RESP    3539         if (ca->maxresp_sz < NFSD_CB_MAX_RESP_SZ)
3789                 return nfserr_toosmall;          3540                 return nfserr_toosmall;
3790         ca->maxresp_cached = 0;                  3541         ca->maxresp_cached = 0;
3791         if (ca->maxops < 2)                      3542         if (ca->maxops < 2)
3792                 return nfserr_toosmall;          3543                 return nfserr_toosmall;
3793                                                  3544 
3794         return nfs_ok;                           3545         return nfs_ok;
3795 }                                                3546 }
3796                                                  3547 
3797 static __be32 nfsd4_check_cb_sec(struct nfsd4    3548 static __be32 nfsd4_check_cb_sec(struct nfsd4_cb_sec *cbs)
3798 {                                                3549 {
3799         switch (cbs->flavor) {                   3550         switch (cbs->flavor) {
3800         case RPC_AUTH_NULL:                      3551         case RPC_AUTH_NULL:
3801         case RPC_AUTH_UNIX:                      3552         case RPC_AUTH_UNIX:
3802                 return nfs_ok;                   3553                 return nfs_ok;
3803         default:                                 3554         default:
3804                 /*                               3555                 /*
3805                  * GSS case: the spec doesn't    3556                  * GSS case: the spec doesn't allow us to return this
3806                  * error.  But it also doesn'    3557                  * error.  But it also doesn't allow us not to support
3807                  * GSS.                          3558                  * GSS.
3808                  * I'd rather this fail hard     3559                  * I'd rather this fail hard than return some error the
3809                  * client might think it can     3560                  * client might think it can already handle:
3810                  */                              3561                  */
3811                 return nfserr_encr_alg_unsupp    3562                 return nfserr_encr_alg_unsupp;
3812         }                                        3563         }
3813 }                                                3564 }
3814                                                  3565 
3815 __be32                                           3566 __be32
3816 nfsd4_create_session(struct svc_rqst *rqstp,     3567 nfsd4_create_session(struct svc_rqst *rqstp,
3817                 struct nfsd4_compound_state *    3568                 struct nfsd4_compound_state *cstate, union nfsd4_op_u *u)
3818 {                                                3569 {
3819         struct nfsd4_create_session *cr_ses =    3570         struct nfsd4_create_session *cr_ses = &u->create_session;
3820         struct sockaddr *sa = svc_addr(rqstp)    3571         struct sockaddr *sa = svc_addr(rqstp);
3821         struct nfs4_client *conf, *unconf;       3572         struct nfs4_client *conf, *unconf;
3822         struct nfsd4_clid_slot *cs_slot;      << 
3823         struct nfs4_client *old = NULL;          3573         struct nfs4_client *old = NULL;
3824         struct nfsd4_session *new;               3574         struct nfsd4_session *new;
3825         struct nfsd4_conn *conn;                 3575         struct nfsd4_conn *conn;
                                                   >> 3576         struct nfsd4_clid_slot *cs_slot = NULL;
3826         __be32 status = 0;                       3577         __be32 status = 0;
3827         struct nfsd_net *nn = net_generic(SVC    3578         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
3828                                                  3579 
3829         if (cr_ses->flags & ~SESSION4_FLAG_MA    3580         if (cr_ses->flags & ~SESSION4_FLAG_MASK_A)
3830                 return nfserr_inval;             3581                 return nfserr_inval;
3831         status = nfsd4_check_cb_sec(&cr_ses->    3582         status = nfsd4_check_cb_sec(&cr_ses->cb_sec);
3832         if (status)                              3583         if (status)
3833                 return status;                   3584                 return status;
3834         status = check_forechannel_attrs(&cr_    3585         status = check_forechannel_attrs(&cr_ses->fore_channel, nn);
3835         if (status)                              3586         if (status)
3836                 return status;                   3587                 return status;
3837         status = check_backchannel_attrs(&cr_    3588         status = check_backchannel_attrs(&cr_ses->back_channel);
3838         if (status)                              3589         if (status)
3839                 goto out_release_drc_mem;        3590                 goto out_release_drc_mem;
3840         status = nfserr_jukebox;                 3591         status = nfserr_jukebox;
3841         new = alloc_session(&cr_ses->fore_cha    3592         new = alloc_session(&cr_ses->fore_channel, &cr_ses->back_channel);
3842         if (!new)                                3593         if (!new)
3843                 goto out_release_drc_mem;        3594                 goto out_release_drc_mem;
3844         conn = alloc_conn_from_crses(rqstp, c    3595         conn = alloc_conn_from_crses(rqstp, cr_ses);
3845         if (!conn)                               3596         if (!conn)
3846                 goto out_free_session;           3597                 goto out_free_session;
3847                                                  3598 
3848         spin_lock(&nn->client_lock);             3599         spin_lock(&nn->client_lock);
3849                                               << 
3850         /* RFC 8881 Section 18.36.4 Phase 1:  << 
3851         unconf = find_unconfirmed_client(&cr_    3600         unconf = find_unconfirmed_client(&cr_ses->clientid, true, nn);
3852         conf = find_confirmed_client(&cr_ses-    3601         conf = find_confirmed_client(&cr_ses->clientid, true, nn);
3853         if (!conf && !unconf) {               !! 3602         WARN_ON_ONCE(conf && unconf);
3854                 status = nfserr_stale_clienti << 
3855                 goto out_free_conn;           << 
3856         }                                     << 
3857                                               << 
3858         /* RFC 8881 Section 18.36.4 Phase 2:  << 
3859         if (conf) {                           << 
3860                 cs_slot = &conf->cl_cs_slot;  << 
3861                 trace_nfsd_slot_seqid_conf(co << 
3862         } else {                              << 
3863                 cs_slot = &unconf->cl_cs_slot << 
3864                 trace_nfsd_slot_seqid_unconf( << 
3865         }                                     << 
3866         status = check_slot_seqid(cr_ses->seq << 
3867         switch (status) {                     << 
3868         case nfs_ok:                          << 
3869                 cs_slot->sl_seqid++;          << 
3870                 cr_ses->seqid = cs_slot->sl_s << 
3871                 break;                        << 
3872         case nfserr_replay_cache:             << 
3873                 status = nfsd4_replay_create_ << 
3874                 fallthrough;                  << 
3875         case nfserr_jukebox:                  << 
3876                 /* The server MUST NOT cache  << 
3877                 goto out_free_conn;           << 
3878         default:                              << 
3879                 goto out_cache_error;         << 
3880         }                                     << 
3881                                                  3603 
3882         /* RFC 8881 Section 18.36.4 Phase 3:  << 
3883         if (conf) {                              3604         if (conf) {
3884                 status = nfserr_wrong_cred;      3605                 status = nfserr_wrong_cred;
3885                 if (!nfsd4_mach_creds_match(c    3606                 if (!nfsd4_mach_creds_match(conf, rqstp))
3886                         goto out_cache_error; !! 3607                         goto out_free_conn;
3887         } else {                              !! 3608                 cs_slot = &conf->cl_cs_slot;
                                                   >> 3609                 status = check_slot_seqid(cr_ses->seqid, cs_slot->sl_seqid, 0);
                                                   >> 3610                 if (status) {
                                                   >> 3611                         if (status == nfserr_replay_cache)
                                                   >> 3612                                 status = nfsd4_replay_create_session(cr_ses, cs_slot);
                                                   >> 3613                         goto out_free_conn;
                                                   >> 3614                 }
                                                   >> 3615         } else if (unconf) {
3888                 status = nfserr_clid_inuse;      3616                 status = nfserr_clid_inuse;
3889                 if (!same_creds(&unconf->cl_c    3617                 if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
3890                     !rpc_cmp_addr(sa, (struct    3618                     !rpc_cmp_addr(sa, (struct sockaddr *) &unconf->cl_addr)) {
3891                         trace_nfsd_clid_cred_    3619                         trace_nfsd_clid_cred_mismatch(unconf, rqstp);
3892                         goto out_cache_error; !! 3620                         goto out_free_conn;
3893                 }                                3621                 }
3894                 status = nfserr_wrong_cred;      3622                 status = nfserr_wrong_cred;
3895                 if (!nfsd4_mach_creds_match(u    3623                 if (!nfsd4_mach_creds_match(unconf, rqstp))
3896                         goto out_cache_error; !! 3624                         goto out_free_conn;
                                                   >> 3625                 cs_slot = &unconf->cl_cs_slot;
                                                   >> 3626                 status = check_slot_seqid(cr_ses->seqid, cs_slot->sl_seqid, 0);
                                                   >> 3627                 if (status) {
                                                   >> 3628                         /* an unconfirmed replay returns misordered */
                                                   >> 3629                         status = nfserr_seq_misordered;
                                                   >> 3630                         goto out_free_conn;
                                                   >> 3631                 }
3897                 old = find_confirmed_client_b    3632                 old = find_confirmed_client_by_name(&unconf->cl_name, nn);
3898                 if (old) {                       3633                 if (old) {
3899                         status = mark_client_    3634                         status = mark_client_expired_locked(old);
3900                         if (status)           !! 3635                         if (status) {
3901                                 goto out_expi !! 3636                                 old = NULL;
                                                   >> 3637                                 goto out_free_conn;
                                                   >> 3638                         }
3902                         trace_nfsd_clid_repla    3639                         trace_nfsd_clid_replaced(&old->cl_clientid);
3903                 }                                3640                 }
3904                 move_to_confirmed(unconf);       3641                 move_to_confirmed(unconf);
3905                 conf = unconf;                   3642                 conf = unconf;
                                                   >> 3643         } else {
                                                   >> 3644                 status = nfserr_stale_clientid;
                                                   >> 3645                 goto out_free_conn;
3906         }                                        3646         }
3907                                               << 
3908         /* RFC 8881 Section 18.36.4 Phase 4:  << 
3909         status = nfs_ok;                         3647         status = nfs_ok;
3910         /* Persistent sessions are not suppor    3648         /* Persistent sessions are not supported */
3911         cr_ses->flags &= ~SESSION4_PERSIST;      3649         cr_ses->flags &= ~SESSION4_PERSIST;
3912         /* Upshifting from TCP to RDMA is not    3650         /* Upshifting from TCP to RDMA is not supported */
3913         cr_ses->flags &= ~SESSION4_RDMA;         3651         cr_ses->flags &= ~SESSION4_RDMA;
3914                                                  3652 
3915         init_session(rqstp, new, conf, cr_ses    3653         init_session(rqstp, new, conf, cr_ses);
3916         nfsd4_get_session_locked(new);           3654         nfsd4_get_session_locked(new);
3917                                                  3655 
3918         memcpy(cr_ses->sessionid.data, new->s    3656         memcpy(cr_ses->sessionid.data, new->se_sessionid.data,
3919                NFS4_MAX_SESSIONID_LEN);          3657                NFS4_MAX_SESSIONID_LEN);
                                                   >> 3658         cs_slot->sl_seqid++;
                                                   >> 3659         cr_ses->seqid = cs_slot->sl_seqid;
3920                                                  3660 
3921         /* cache solo and embedded create ses    3661         /* cache solo and embedded create sessions under the client_lock */
3922         nfsd4_cache_create_session(cr_ses, cs    3662         nfsd4_cache_create_session(cr_ses, cs_slot, status);
3923         spin_unlock(&nn->client_lock);           3663         spin_unlock(&nn->client_lock);
3924         if (conf == unconf)                      3664         if (conf == unconf)
3925                 fsnotify_dentry(conf->cl_nfsd    3665                 fsnotify_dentry(conf->cl_nfsd_info_dentry, FS_MODIFY);
3926         /* init connection and backchannel */    3666         /* init connection and backchannel */
3927         nfsd4_init_conn(rqstp, conn, new);       3667         nfsd4_init_conn(rqstp, conn, new);
3928         nfsd4_put_session(new);                  3668         nfsd4_put_session(new);
3929         if (old)                                 3669         if (old)
3930                 expire_client(old);              3670                 expire_client(old);
3931         return status;                           3671         return status;
3932                                               << 
3933 out_expired_error:                            << 
3934         old = NULL;                           << 
3935         /*                                    << 
3936          * Revert the slot seq_nr change so t << 
3937          * the client's resend instead of ret << 
3938          */                                   << 
3939         if (status == nfserr_jukebox) {       << 
3940                 cs_slot->sl_seqid--;          << 
3941                 cr_ses->seqid = cs_slot->sl_s << 
3942                 goto out_free_conn;           << 
3943         }                                     << 
3944 out_cache_error:                              << 
3945         nfsd4_cache_create_session(cr_ses, cs << 
3946 out_free_conn:                                   3672 out_free_conn:
3947         spin_unlock(&nn->client_lock);           3673         spin_unlock(&nn->client_lock);
3948         free_conn(conn);                         3674         free_conn(conn);
3949         if (old)                                 3675         if (old)
3950                 expire_client(old);              3676                 expire_client(old);
3951 out_free_session:                                3677 out_free_session:
3952         __free_session(new);                     3678         __free_session(new);
3953 out_release_drc_mem:                             3679 out_release_drc_mem:
3954         nfsd4_put_drc_mem(&cr_ses->fore_chann    3680         nfsd4_put_drc_mem(&cr_ses->fore_channel);
3955         return status;                           3681         return status;
3956 }                                                3682 }
3957                                                  3683 
3958 static __be32 nfsd4_map_bcts_dir(u32 *dir)       3684 static __be32 nfsd4_map_bcts_dir(u32 *dir)
3959 {                                                3685 {
3960         switch (*dir) {                          3686         switch (*dir) {
3961         case NFS4_CDFC4_FORE:                    3687         case NFS4_CDFC4_FORE:
3962         case NFS4_CDFC4_BACK:                    3688         case NFS4_CDFC4_BACK:
3963                 return nfs_ok;                   3689                 return nfs_ok;
3964         case NFS4_CDFC4_FORE_OR_BOTH:            3690         case NFS4_CDFC4_FORE_OR_BOTH:
3965         case NFS4_CDFC4_BACK_OR_BOTH:            3691         case NFS4_CDFC4_BACK_OR_BOTH:
3966                 *dir = NFS4_CDFC4_BOTH;          3692                 *dir = NFS4_CDFC4_BOTH;
3967                 return nfs_ok;                   3693                 return nfs_ok;
3968         }                                        3694         }
3969         return nfserr_inval;                     3695         return nfserr_inval;
3970 }                                                3696 }
3971                                                  3697 
3972 __be32 nfsd4_backchannel_ctl(struct svc_rqst     3698 __be32 nfsd4_backchannel_ctl(struct svc_rqst *rqstp,
3973                 struct nfsd4_compound_state *    3699                 struct nfsd4_compound_state *cstate,
3974                 union nfsd4_op_u *u)             3700                 union nfsd4_op_u *u)
3975 {                                                3701 {
3976         struct nfsd4_backchannel_ctl *bc = &u    3702         struct nfsd4_backchannel_ctl *bc = &u->backchannel_ctl;
3977         struct nfsd4_session *session = cstat    3703         struct nfsd4_session *session = cstate->session;
3978         struct nfsd_net *nn = net_generic(SVC    3704         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
3979         __be32 status;                           3705         __be32 status;
3980                                                  3706 
3981         status = nfsd4_check_cb_sec(&bc->bc_c    3707         status = nfsd4_check_cb_sec(&bc->bc_cb_sec);
3982         if (status)                              3708         if (status)
3983                 return status;                   3709                 return status;
3984         spin_lock(&nn->client_lock);             3710         spin_lock(&nn->client_lock);
3985         session->se_cb_prog = bc->bc_cb_progr    3711         session->se_cb_prog = bc->bc_cb_program;
3986         session->se_cb_sec = bc->bc_cb_sec;      3712         session->se_cb_sec = bc->bc_cb_sec;
3987         spin_unlock(&nn->client_lock);           3713         spin_unlock(&nn->client_lock);
3988                                                  3714 
3989         nfsd4_probe_callback(session->se_clie    3715         nfsd4_probe_callback(session->se_client);
3990                                                  3716 
3991         return nfs_ok;                           3717         return nfs_ok;
3992 }                                                3718 }
3993                                                  3719 
3994 static struct nfsd4_conn *__nfsd4_find_conn(s    3720 static struct nfsd4_conn *__nfsd4_find_conn(struct svc_xprt *xpt, struct nfsd4_session *s)
3995 {                                                3721 {
3996         struct nfsd4_conn *c;                    3722         struct nfsd4_conn *c;
3997                                                  3723 
3998         list_for_each_entry(c, &s->se_conns,     3724         list_for_each_entry(c, &s->se_conns, cn_persession) {
3999                 if (c->cn_xprt == xpt) {         3725                 if (c->cn_xprt == xpt) {
4000                         return c;                3726                         return c;
4001                 }                                3727                 }
4002         }                                        3728         }
4003         return NULL;                             3729         return NULL;
4004 }                                                3730 }
4005                                                  3731 
4006 static __be32 nfsd4_match_existing_connection    3732 static __be32 nfsd4_match_existing_connection(struct svc_rqst *rqst,
4007                 struct nfsd4_session *session    3733                 struct nfsd4_session *session, u32 req, struct nfsd4_conn **conn)
4008 {                                                3734 {
4009         struct nfs4_client *clp = session->se    3735         struct nfs4_client *clp = session->se_client;
4010         struct svc_xprt *xpt = rqst->rq_xprt;    3736         struct svc_xprt *xpt = rqst->rq_xprt;
4011         struct nfsd4_conn *c;                    3737         struct nfsd4_conn *c;
4012         __be32 status;                           3738         __be32 status;
4013                                                  3739 
4014         /* Following the last paragraph of RF    3740         /* Following the last paragraph of RFC 5661 Section 18.34.3: */
4015         spin_lock(&clp->cl_lock);                3741         spin_lock(&clp->cl_lock);
4016         c = __nfsd4_find_conn(xpt, session);     3742         c = __nfsd4_find_conn(xpt, session);
4017         if (!c)                                  3743         if (!c)
4018                 status = nfserr_noent;           3744                 status = nfserr_noent;
4019         else if (req == c->cn_flags)             3745         else if (req == c->cn_flags)
4020                 status = nfs_ok;                 3746                 status = nfs_ok;
4021         else if (req == NFS4_CDFC4_FORE_OR_BO    3747         else if (req == NFS4_CDFC4_FORE_OR_BOTH &&
4022                                 c->cn_flags !    3748                                 c->cn_flags != NFS4_CDFC4_BACK)
4023                 status = nfs_ok;                 3749                 status = nfs_ok;
4024         else if (req == NFS4_CDFC4_BACK_OR_BO    3750         else if (req == NFS4_CDFC4_BACK_OR_BOTH &&
4025                                 c->cn_flags !    3751                                 c->cn_flags != NFS4_CDFC4_FORE)
4026                 status = nfs_ok;                 3752                 status = nfs_ok;
4027         else                                     3753         else
4028                 status = nfserr_inval;           3754                 status = nfserr_inval;
4029         spin_unlock(&clp->cl_lock);              3755         spin_unlock(&clp->cl_lock);
4030         if (status == nfs_ok && conn)            3756         if (status == nfs_ok && conn)
4031                 *conn = c;                       3757                 *conn = c;
4032         return status;                           3758         return status;
4033 }                                                3759 }
4034                                                  3760 
4035 __be32 nfsd4_bind_conn_to_session(struct svc_    3761 __be32 nfsd4_bind_conn_to_session(struct svc_rqst *rqstp,
4036                      struct nfsd4_compound_st    3762                      struct nfsd4_compound_state *cstate,
4037                      union nfsd4_op_u *u)        3763                      union nfsd4_op_u *u)
4038 {                                                3764 {
4039         struct nfsd4_bind_conn_to_session *bc    3765         struct nfsd4_bind_conn_to_session *bcts = &u->bind_conn_to_session;
4040         __be32 status;                           3766         __be32 status;
4041         struct nfsd4_conn *conn;                 3767         struct nfsd4_conn *conn;
4042         struct nfsd4_session *session;           3768         struct nfsd4_session *session;
4043         struct net *net = SVC_NET(rqstp);        3769         struct net *net = SVC_NET(rqstp);
4044         struct nfsd_net *nn = net_generic(net    3770         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
4045                                                  3771 
4046         if (!nfsd4_last_compound_op(rqstp))      3772         if (!nfsd4_last_compound_op(rqstp))
4047                 return nfserr_not_only_op;       3773                 return nfserr_not_only_op;
4048         spin_lock(&nn->client_lock);             3774         spin_lock(&nn->client_lock);
4049         session = find_in_sessionid_hashtbl(&    3775         session = find_in_sessionid_hashtbl(&bcts->sessionid, net, &status);
4050         spin_unlock(&nn->client_lock);           3776         spin_unlock(&nn->client_lock);
4051         if (!session)                            3777         if (!session)
4052                 goto out_no_session;             3778                 goto out_no_session;
4053         status = nfserr_wrong_cred;              3779         status = nfserr_wrong_cred;
4054         if (!nfsd4_mach_creds_match(session->    3780         if (!nfsd4_mach_creds_match(session->se_client, rqstp))
4055                 goto out;                        3781                 goto out;
4056         status = nfsd4_match_existing_connect    3782         status = nfsd4_match_existing_connection(rqstp, session,
4057                         bcts->dir, &conn);       3783                         bcts->dir, &conn);
4058         if (status == nfs_ok) {                  3784         if (status == nfs_ok) {
4059                 if (bcts->dir == NFS4_CDFC4_F    3785                 if (bcts->dir == NFS4_CDFC4_FORE_OR_BOTH ||
4060                                 bcts->dir ==     3786                                 bcts->dir == NFS4_CDFC4_BACK)
4061                         conn->cn_flags |= NFS    3787                         conn->cn_flags |= NFS4_CDFC4_BACK;
4062                 nfsd4_probe_callback(session-    3788                 nfsd4_probe_callback(session->se_client);
4063                 goto out;                        3789                 goto out;
4064         }                                        3790         }
4065         if (status == nfserr_inval)              3791         if (status == nfserr_inval)
4066                 goto out;                        3792                 goto out;
4067         status = nfsd4_map_bcts_dir(&bcts->di    3793         status = nfsd4_map_bcts_dir(&bcts->dir);
4068         if (status)                              3794         if (status)
4069                 goto out;                        3795                 goto out;
4070         conn = alloc_conn(rqstp, bcts->dir);     3796         conn = alloc_conn(rqstp, bcts->dir);
4071         status = nfserr_jukebox;                 3797         status = nfserr_jukebox;
4072         if (!conn)                               3798         if (!conn)
4073                 goto out;                        3799                 goto out;
4074         nfsd4_init_conn(rqstp, conn, session)    3800         nfsd4_init_conn(rqstp, conn, session);
4075         status = nfs_ok;                         3801         status = nfs_ok;
4076 out:                                             3802 out:
4077         nfsd4_put_session(session);              3803         nfsd4_put_session(session);
4078 out_no_session:                                  3804 out_no_session:
4079         return status;                           3805         return status;
4080 }                                                3806 }
4081                                                  3807 
4082 static bool nfsd4_compound_in_session(struct     3808 static bool nfsd4_compound_in_session(struct nfsd4_compound_state *cstate, struct nfs4_sessionid *sid)
4083 {                                                3809 {
4084         if (!cstate->session)                    3810         if (!cstate->session)
4085                 return false;                    3811                 return false;
4086         return !memcmp(sid, &cstate->session-    3812         return !memcmp(sid, &cstate->session->se_sessionid, sizeof(*sid));
4087 }                                                3813 }
4088                                                  3814 
4089 __be32                                           3815 __be32
4090 nfsd4_destroy_session(struct svc_rqst *r, str    3816 nfsd4_destroy_session(struct svc_rqst *r, struct nfsd4_compound_state *cstate,
4091                 union nfsd4_op_u *u)             3817                 union nfsd4_op_u *u)
4092 {                                                3818 {
4093         struct nfs4_sessionid *sessionid = &u    3819         struct nfs4_sessionid *sessionid = &u->destroy_session.sessionid;
4094         struct nfsd4_session *ses;               3820         struct nfsd4_session *ses;
4095         __be32 status;                           3821         __be32 status;
4096         int ref_held_by_me = 0;                  3822         int ref_held_by_me = 0;
4097         struct net *net = SVC_NET(r);            3823         struct net *net = SVC_NET(r);
4098         struct nfsd_net *nn = net_generic(net    3824         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
4099                                                  3825 
4100         status = nfserr_not_only_op;             3826         status = nfserr_not_only_op;
4101         if (nfsd4_compound_in_session(cstate,    3827         if (nfsd4_compound_in_session(cstate, sessionid)) {
4102                 if (!nfsd4_last_compound_op(r    3828                 if (!nfsd4_last_compound_op(r))
4103                         goto out;                3829                         goto out;
4104                 ref_held_by_me++;                3830                 ref_held_by_me++;
4105         }                                        3831         }
4106         dump_sessionid(__func__, sessionid);     3832         dump_sessionid(__func__, sessionid);
4107         spin_lock(&nn->client_lock);             3833         spin_lock(&nn->client_lock);
4108         ses = find_in_sessionid_hashtbl(sessi    3834         ses = find_in_sessionid_hashtbl(sessionid, net, &status);
4109         if (!ses)                                3835         if (!ses)
4110                 goto out_client_lock;            3836                 goto out_client_lock;
4111         status = nfserr_wrong_cred;              3837         status = nfserr_wrong_cred;
4112         if (!nfsd4_mach_creds_match(ses->se_c    3838         if (!nfsd4_mach_creds_match(ses->se_client, r))
4113                 goto out_put_session;            3839                 goto out_put_session;
4114         status = mark_session_dead_locked(ses    3840         status = mark_session_dead_locked(ses, 1 + ref_held_by_me);
4115         if (status)                              3841         if (status)
4116                 goto out_put_session;            3842                 goto out_put_session;
4117         unhash_session(ses);                     3843         unhash_session(ses);
4118         spin_unlock(&nn->client_lock);           3844         spin_unlock(&nn->client_lock);
4119                                                  3845 
4120         nfsd4_probe_callback_sync(ses->se_cli    3846         nfsd4_probe_callback_sync(ses->se_client);
4121                                                  3847 
4122         spin_lock(&nn->client_lock);             3848         spin_lock(&nn->client_lock);
4123         status = nfs_ok;                         3849         status = nfs_ok;
4124 out_put_session:                                 3850 out_put_session:
4125         nfsd4_put_session_locked(ses);           3851         nfsd4_put_session_locked(ses);
4126 out_client_lock:                                 3852 out_client_lock:
4127         spin_unlock(&nn->client_lock);           3853         spin_unlock(&nn->client_lock);
4128 out:                                             3854 out:
4129         return status;                           3855         return status;
4130 }                                                3856 }
4131                                                  3857 
4132 static __be32 nfsd4_sequence_check_conn(struc    3858 static __be32 nfsd4_sequence_check_conn(struct nfsd4_conn *new, struct nfsd4_session *ses)
4133 {                                                3859 {
4134         struct nfs4_client *clp = ses->se_cli    3860         struct nfs4_client *clp = ses->se_client;
4135         struct nfsd4_conn *c;                    3861         struct nfsd4_conn *c;
4136         __be32 status = nfs_ok;                  3862         __be32 status = nfs_ok;
4137         int ret;                                 3863         int ret;
4138                                                  3864 
4139         spin_lock(&clp->cl_lock);                3865         spin_lock(&clp->cl_lock);
4140         c = __nfsd4_find_conn(new->cn_xprt, s    3866         c = __nfsd4_find_conn(new->cn_xprt, ses);
4141         if (c)                                   3867         if (c)
4142                 goto out_free;                   3868                 goto out_free;
4143         status = nfserr_conn_not_bound_to_ses    3869         status = nfserr_conn_not_bound_to_session;
4144         if (clp->cl_mach_cred)                   3870         if (clp->cl_mach_cred)
4145                 goto out_free;                   3871                 goto out_free;
4146         __nfsd4_hash_conn(new, ses);             3872         __nfsd4_hash_conn(new, ses);
4147         spin_unlock(&clp->cl_lock);              3873         spin_unlock(&clp->cl_lock);
4148         ret = nfsd4_register_conn(new);          3874         ret = nfsd4_register_conn(new);
4149         if (ret)                                 3875         if (ret)
4150                 /* oops; xprt is already down    3876                 /* oops; xprt is already down: */
4151                 nfsd4_conn_lost(&new->cn_xpt_    3877                 nfsd4_conn_lost(&new->cn_xpt_user);
4152         return nfs_ok;                           3878         return nfs_ok;
4153 out_free:                                        3879 out_free:
4154         spin_unlock(&clp->cl_lock);              3880         spin_unlock(&clp->cl_lock);
4155         free_conn(new);                          3881         free_conn(new);
4156         return status;                           3882         return status;
4157 }                                                3883 }
4158                                                  3884 
4159 static bool nfsd4_session_too_many_ops(struct    3885 static bool nfsd4_session_too_many_ops(struct svc_rqst *rqstp, struct nfsd4_session *session)
4160 {                                                3886 {
4161         struct nfsd4_compoundargs *args = rqs    3887         struct nfsd4_compoundargs *args = rqstp->rq_argp;
4162                                                  3888 
4163         return args->opcnt > session->se_fcha    3889         return args->opcnt > session->se_fchannel.maxops;
4164 }                                                3890 }
4165                                                  3891 
4166 static bool nfsd4_request_too_big(struct svc_    3892 static bool nfsd4_request_too_big(struct svc_rqst *rqstp,
4167                                   struct nfsd    3893                                   struct nfsd4_session *session)
4168 {                                                3894 {
4169         struct xdr_buf *xb = &rqstp->rq_arg;     3895         struct xdr_buf *xb = &rqstp->rq_arg;
4170                                                  3896 
4171         return xb->len > session->se_fchannel    3897         return xb->len > session->se_fchannel.maxreq_sz;
4172 }                                                3898 }
4173                                                  3899 
4174 static bool replay_matches_cache(struct svc_r    3900 static bool replay_matches_cache(struct svc_rqst *rqstp,
4175                  struct nfsd4_sequence *seq,     3901                  struct nfsd4_sequence *seq, struct nfsd4_slot *slot)
4176 {                                                3902 {
4177         struct nfsd4_compoundargs *argp = rqs    3903         struct nfsd4_compoundargs *argp = rqstp->rq_argp;
4178                                                  3904 
4179         if ((bool)(slot->sl_flags & NFSD4_SLO    3905         if ((bool)(slot->sl_flags & NFSD4_SLOT_CACHETHIS) !=
4180             (bool)seq->cachethis)                3906             (bool)seq->cachethis)
4181                 return false;                    3907                 return false;
4182         /*                                       3908         /*
4183          * If there's an error then the reply    3909          * If there's an error then the reply can have fewer ops than
4184          * the call.                             3910          * the call.
4185          */                                      3911          */
4186         if (slot->sl_opcnt < argp->opcnt && !    3912         if (slot->sl_opcnt < argp->opcnt && !slot->sl_status)
4187                 return false;                    3913                 return false;
4188         /*                                       3914         /*
4189          * But if we cached a reply with *mor    3915          * But if we cached a reply with *more* ops than the call you're
4190          * sending us now, then this new call    3916          * sending us now, then this new call is clearly not really a
4191          * replay of the old one:                3917          * replay of the old one:
4192          */                                      3918          */
4193         if (slot->sl_opcnt > argp->opcnt)        3919         if (slot->sl_opcnt > argp->opcnt)
4194                 return false;                    3920                 return false;
4195         /* This is the only check explicitly     3921         /* This is the only check explicitly called by spec: */
4196         if (!same_creds(&rqstp->rq_cred, &slo    3922         if (!same_creds(&rqstp->rq_cred, &slot->sl_cred))
4197                 return false;                    3923                 return false;
4198         /*                                       3924         /*
4199          * There may be more comparisons we c    3925          * There may be more comparisons we could actually do, but the
4200          * spec doesn't require us to catch e    3926          * spec doesn't require us to catch every case where the calls
4201          * don't match (that would require ca    3927          * don't match (that would require caching the call as well as
4202          * the reply), so we don't bother.       3928          * the reply), so we don't bother.
4203          */                                      3929          */
4204         return true;                             3930         return true;
4205 }                                                3931 }
4206                                                  3932 
4207 __be32                                           3933 __be32
4208 nfsd4_sequence(struct svc_rqst *rqstp, struct    3934 nfsd4_sequence(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
4209                 union nfsd4_op_u *u)             3935                 union nfsd4_op_u *u)
4210 {                                                3936 {
4211         struct nfsd4_sequence *seq = &u->sequ    3937         struct nfsd4_sequence *seq = &u->sequence;
4212         struct nfsd4_compoundres *resp = rqst    3938         struct nfsd4_compoundres *resp = rqstp->rq_resp;
4213         struct xdr_stream *xdr = resp->xdr;      3939         struct xdr_stream *xdr = resp->xdr;
4214         struct nfsd4_session *session;           3940         struct nfsd4_session *session;
4215         struct nfs4_client *clp;                 3941         struct nfs4_client *clp;
4216         struct nfsd4_slot *slot;                 3942         struct nfsd4_slot *slot;
4217         struct nfsd4_conn *conn;                 3943         struct nfsd4_conn *conn;
4218         __be32 status;                           3944         __be32 status;
4219         int buflen;                              3945         int buflen;
4220         struct net *net = SVC_NET(rqstp);        3946         struct net *net = SVC_NET(rqstp);
4221         struct nfsd_net *nn = net_generic(net    3947         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
4222                                                  3948 
4223         if (resp->opcnt != 1)                    3949         if (resp->opcnt != 1)
4224                 return nfserr_sequence_pos;      3950                 return nfserr_sequence_pos;
4225                                                  3951 
4226         /*                                       3952         /*
4227          * Will be either used or freed by nf    3953          * Will be either used or freed by nfsd4_sequence_check_conn
4228          * below.                                3954          * below.
4229          */                                      3955          */
4230         conn = alloc_conn(rqstp, NFS4_CDFC4_F    3956         conn = alloc_conn(rqstp, NFS4_CDFC4_FORE);
4231         if (!conn)                               3957         if (!conn)
4232                 return nfserr_jukebox;           3958                 return nfserr_jukebox;
4233                                                  3959 
4234         spin_lock(&nn->client_lock);             3960         spin_lock(&nn->client_lock);
4235         session = find_in_sessionid_hashtbl(&    3961         session = find_in_sessionid_hashtbl(&seq->sessionid, net, &status);
4236         if (!session)                            3962         if (!session)
4237                 goto out_no_session;             3963                 goto out_no_session;
4238         clp = session->se_client;                3964         clp = session->se_client;
4239                                                  3965 
4240         status = nfserr_too_many_ops;            3966         status = nfserr_too_many_ops;
4241         if (nfsd4_session_too_many_ops(rqstp,    3967         if (nfsd4_session_too_many_ops(rqstp, session))
4242                 goto out_put_session;            3968                 goto out_put_session;
4243                                                  3969 
4244         status = nfserr_req_too_big;             3970         status = nfserr_req_too_big;
4245         if (nfsd4_request_too_big(rqstp, sess    3971         if (nfsd4_request_too_big(rqstp, session))
4246                 goto out_put_session;            3972                 goto out_put_session;
4247                                                  3973 
4248         status = nfserr_badslot;                 3974         status = nfserr_badslot;
4249         if (seq->slotid >= session->se_fchann    3975         if (seq->slotid >= session->se_fchannel.maxreqs)
4250                 goto out_put_session;            3976                 goto out_put_session;
4251                                                  3977 
4252         slot = session->se_slots[seq->slotid]    3978         slot = session->se_slots[seq->slotid];
4253         dprintk("%s: slotid %d\n", __func__,     3979         dprintk("%s: slotid %d\n", __func__, seq->slotid);
4254                                                  3980 
4255         /* We do not negotiate the number of     3981         /* We do not negotiate the number of slots yet, so set the
4256          * maxslots to the session maxreqs wh    3982          * maxslots to the session maxreqs which is used to encode
4257          * sr_highest_slotid and the sr_targe    3983          * sr_highest_slotid and the sr_target_slot id to maxslots */
4258         seq->maxslots = session->se_fchannel.    3984         seq->maxslots = session->se_fchannel.maxreqs;
4259                                                  3985 
4260         trace_nfsd_slot_seqid_sequence(clp, s << 
4261         status = check_slot_seqid(seq->seqid,    3986         status = check_slot_seqid(seq->seqid, slot->sl_seqid,
4262                                         slot-    3987                                         slot->sl_flags & NFSD4_SLOT_INUSE);
4263         if (status == nfserr_replay_cache) {     3988         if (status == nfserr_replay_cache) {
4264                 status = nfserr_seq_misordere    3989                 status = nfserr_seq_misordered;
4265                 if (!(slot->sl_flags & NFSD4_    3990                 if (!(slot->sl_flags & NFSD4_SLOT_INITIALIZED))
4266                         goto out_put_session;    3991                         goto out_put_session;
4267                 status = nfserr_seq_false_ret    3992                 status = nfserr_seq_false_retry;
4268                 if (!replay_matches_cache(rqs    3993                 if (!replay_matches_cache(rqstp, seq, slot))
4269                         goto out_put_session;    3994                         goto out_put_session;
4270                 cstate->slot = slot;             3995                 cstate->slot = slot;
4271                 cstate->session = session;       3996                 cstate->session = session;
4272                 cstate->clp = clp;               3997                 cstate->clp = clp;
4273                 /* Return the cached reply st    3998                 /* Return the cached reply status and set cstate->status
4274                  * for nfsd4_proc_compound pr    3999                  * for nfsd4_proc_compound processing */
4275                 status = nfsd4_replay_cache_e    4000                 status = nfsd4_replay_cache_entry(resp, seq);
4276                 cstate->status = nfserr_repla    4001                 cstate->status = nfserr_replay_cache;
4277                 goto out;                        4002                 goto out;
4278         }                                        4003         }
4279         if (status)                              4004         if (status)
4280                 goto out_put_session;            4005                 goto out_put_session;
4281                                                  4006 
4282         status = nfsd4_sequence_check_conn(co    4007         status = nfsd4_sequence_check_conn(conn, session);
4283         conn = NULL;                             4008         conn = NULL;
4284         if (status)                              4009         if (status)
4285                 goto out_put_session;            4010                 goto out_put_session;
4286                                                  4011 
4287         buflen = (seq->cachethis) ?              4012         buflen = (seq->cachethis) ?
4288                         session->se_fchannel.    4013                         session->se_fchannel.maxresp_cached :
4289                         session->se_fchannel.    4014                         session->se_fchannel.maxresp_sz;
4290         status = (seq->cachethis) ? nfserr_re    4015         status = (seq->cachethis) ? nfserr_rep_too_big_to_cache :
4291                                     nfserr_re    4016                                     nfserr_rep_too_big;
4292         if (xdr_restrict_buflen(xdr, buflen -    4017         if (xdr_restrict_buflen(xdr, buflen - rqstp->rq_auth_slack))
4293                 goto out_put_session;            4018                 goto out_put_session;
4294         svc_reserve(rqstp, buflen);              4019         svc_reserve(rqstp, buflen);
4295                                                  4020 
4296         status = nfs_ok;                         4021         status = nfs_ok;
4297         /* Success! bump slot seqid */           4022         /* Success! bump slot seqid */
4298         slot->sl_seqid = seq->seqid;             4023         slot->sl_seqid = seq->seqid;
4299         slot->sl_flags |= NFSD4_SLOT_INUSE;      4024         slot->sl_flags |= NFSD4_SLOT_INUSE;
4300         if (seq->cachethis)                      4025         if (seq->cachethis)
4301                 slot->sl_flags |= NFSD4_SLOT_    4026                 slot->sl_flags |= NFSD4_SLOT_CACHETHIS;
4302         else                                     4027         else
4303                 slot->sl_flags &= ~NFSD4_SLOT    4028                 slot->sl_flags &= ~NFSD4_SLOT_CACHETHIS;
4304                                                  4029 
4305         cstate->slot = slot;                     4030         cstate->slot = slot;
4306         cstate->session = session;               4031         cstate->session = session;
4307         cstate->clp = clp;                       4032         cstate->clp = clp;
4308                                                  4033 
4309 out:                                             4034 out:
4310         switch (clp->cl_cb_state) {              4035         switch (clp->cl_cb_state) {
4311         case NFSD4_CB_DOWN:                      4036         case NFSD4_CB_DOWN:
4312                 seq->status_flags = SEQ4_STAT    4037                 seq->status_flags = SEQ4_STATUS_CB_PATH_DOWN;
4313                 break;                           4038                 break;
4314         case NFSD4_CB_FAULT:                     4039         case NFSD4_CB_FAULT:
4315                 seq->status_flags = SEQ4_STAT    4040                 seq->status_flags = SEQ4_STATUS_BACKCHANNEL_FAULT;
4316                 break;                           4041                 break;
4317         default:                                 4042         default:
4318                 seq->status_flags = 0;           4043                 seq->status_flags = 0;
4319         }                                        4044         }
4320         if (!list_empty(&clp->cl_revoked))       4045         if (!list_empty(&clp->cl_revoked))
4321                 seq->status_flags |= SEQ4_STA    4046                 seq->status_flags |= SEQ4_STATUS_RECALLABLE_STATE_REVOKED;
4322         if (atomic_read(&clp->cl_admin_revoke << 
4323                 seq->status_flags |= SEQ4_STA << 
4324         trace_nfsd_seq4_status(rqstp, seq);   << 
4325 out_no_session:                                  4047 out_no_session:
4326         if (conn)                                4048         if (conn)
4327                 free_conn(conn);                 4049                 free_conn(conn);
4328         spin_unlock(&nn->client_lock);           4050         spin_unlock(&nn->client_lock);
4329         return status;                           4051         return status;
4330 out_put_session:                                 4052 out_put_session:
4331         nfsd4_put_session_locked(session);       4053         nfsd4_put_session_locked(session);
4332         goto out_no_session;                     4054         goto out_no_session;
4333 }                                                4055 }
4334                                                  4056 
4335 void                                             4057 void
4336 nfsd4_sequence_done(struct nfsd4_compoundres     4058 nfsd4_sequence_done(struct nfsd4_compoundres *resp)
4337 {                                                4059 {
4338         struct nfsd4_compound_state *cs = &re    4060         struct nfsd4_compound_state *cs = &resp->cstate;
4339                                                  4061 
4340         if (nfsd4_has_session(cs)) {             4062         if (nfsd4_has_session(cs)) {
4341                 if (cs->status != nfserr_repl    4063                 if (cs->status != nfserr_replay_cache) {
4342                         nfsd4_store_cache_ent    4064                         nfsd4_store_cache_entry(resp);
4343                         cs->slot->sl_flags &=    4065                         cs->slot->sl_flags &= ~NFSD4_SLOT_INUSE;
4344                 }                                4066                 }
4345                 /* Drop session reference tha    4067                 /* Drop session reference that was taken in nfsd4_sequence() */
4346                 nfsd4_put_session(cs->session    4068                 nfsd4_put_session(cs->session);
4347         } else if (cs->clp)                      4069         } else if (cs->clp)
4348                 put_client_renew(cs->clp);       4070                 put_client_renew(cs->clp);
4349 }                                                4071 }
4350                                                  4072 
4351 __be32                                           4073 __be32
4352 nfsd4_destroy_clientid(struct svc_rqst *rqstp    4074 nfsd4_destroy_clientid(struct svc_rqst *rqstp,
4353                 struct nfsd4_compound_state *    4075                 struct nfsd4_compound_state *cstate,
4354                 union nfsd4_op_u *u)             4076                 union nfsd4_op_u *u)
4355 {                                                4077 {
4356         struct nfsd4_destroy_clientid *dc = &    4078         struct nfsd4_destroy_clientid *dc = &u->destroy_clientid;
4357         struct nfs4_client *conf, *unconf;       4079         struct nfs4_client *conf, *unconf;
4358         struct nfs4_client *clp = NULL;          4080         struct nfs4_client *clp = NULL;
4359         __be32 status = 0;                       4081         __be32 status = 0;
4360         struct nfsd_net *nn = net_generic(SVC    4082         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
4361                                                  4083 
4362         spin_lock(&nn->client_lock);             4084         spin_lock(&nn->client_lock);
4363         unconf = find_unconfirmed_client(&dc-    4085         unconf = find_unconfirmed_client(&dc->clientid, true, nn);
4364         conf = find_confirmed_client(&dc->cli    4086         conf = find_confirmed_client(&dc->clientid, true, nn);
4365         WARN_ON_ONCE(conf && unconf);            4087         WARN_ON_ONCE(conf && unconf);
4366                                                  4088 
4367         if (conf) {                              4089         if (conf) {
4368                 if (client_has_state(conf)) {    4090                 if (client_has_state(conf)) {
4369                         status = nfserr_clien    4091                         status = nfserr_clientid_busy;
4370                         goto out;                4092                         goto out;
4371                 }                                4093                 }
4372                 status = mark_client_expired_    4094                 status = mark_client_expired_locked(conf);
4373                 if (status)                      4095                 if (status)
4374                         goto out;                4096                         goto out;
4375                 clp = conf;                      4097                 clp = conf;
4376         } else if (unconf)                       4098         } else if (unconf)
4377                 clp = unconf;                    4099                 clp = unconf;
4378         else {                                   4100         else {
4379                 status = nfserr_stale_clienti    4101                 status = nfserr_stale_clientid;
4380                 goto out;                        4102                 goto out;
4381         }                                        4103         }
4382         if (!nfsd4_mach_creds_match(clp, rqst    4104         if (!nfsd4_mach_creds_match(clp, rqstp)) {
4383                 clp = NULL;                      4105                 clp = NULL;
4384                 status = nfserr_wrong_cred;      4106                 status = nfserr_wrong_cred;
4385                 goto out;                        4107                 goto out;
4386         }                                        4108         }
4387         trace_nfsd_clid_destroyed(&clp->cl_cl    4109         trace_nfsd_clid_destroyed(&clp->cl_clientid);
4388         unhash_client_locked(clp);               4110         unhash_client_locked(clp);
4389 out:                                             4111 out:
4390         spin_unlock(&nn->client_lock);           4112         spin_unlock(&nn->client_lock);
4391         if (clp)                                 4113         if (clp)
4392                 expire_client(clp);              4114                 expire_client(clp);
4393         return status;                           4115         return status;
4394 }                                                4116 }
4395                                                  4117 
4396 __be32                                           4118 __be32
4397 nfsd4_reclaim_complete(struct svc_rqst *rqstp    4119 nfsd4_reclaim_complete(struct svc_rqst *rqstp,
4398                 struct nfsd4_compound_state *    4120                 struct nfsd4_compound_state *cstate, union nfsd4_op_u *u)
4399 {                                                4121 {
4400         struct nfsd4_reclaim_complete *rc = &    4122         struct nfsd4_reclaim_complete *rc = &u->reclaim_complete;
4401         struct nfs4_client *clp = cstate->clp    4123         struct nfs4_client *clp = cstate->clp;
4402         __be32 status = 0;                       4124         __be32 status = 0;
4403                                                  4125 
4404         if (rc->rca_one_fs) {                    4126         if (rc->rca_one_fs) {
4405                 if (!cstate->current_fh.fh_de    4127                 if (!cstate->current_fh.fh_dentry)
4406                         return nfserr_nofileh    4128                         return nfserr_nofilehandle;
4407                 /*                               4129                 /*
4408                  * We don't take advantage of    4130                  * We don't take advantage of the rca_one_fs case.
4409                  * That's OK, it's optional,     4131                  * That's OK, it's optional, we can safely ignore it.
4410                  */                              4132                  */
4411                 return nfs_ok;                   4133                 return nfs_ok;
4412         }                                        4134         }
4413                                                  4135 
4414         status = nfserr_complete_already;        4136         status = nfserr_complete_already;
4415         if (test_and_set_bit(NFSD4_CLIENT_REC    4137         if (test_and_set_bit(NFSD4_CLIENT_RECLAIM_COMPLETE, &clp->cl_flags))
4416                 goto out;                        4138                 goto out;
4417                                                  4139 
4418         status = nfserr_stale_clientid;          4140         status = nfserr_stale_clientid;
4419         if (is_client_expired(clp))              4141         if (is_client_expired(clp))
4420                 /*                               4142                 /*
4421                  * The following error isn't     4143                  * The following error isn't really legal.
4422                  * But we only get here if th    4144                  * But we only get here if the client just explicitly
4423                  * destroyed the client.  Sur    4145                  * destroyed the client.  Surely it no longer cares what
4424                  * error it gets back on an o    4146                  * error it gets back on an operation for the dead
4425                  * client.                       4147                  * client.
4426                  */                              4148                  */
4427                 goto out;                        4149                 goto out;
4428                                                  4150 
4429         status = nfs_ok;                         4151         status = nfs_ok;
4430         trace_nfsd_clid_reclaim_complete(&clp    4152         trace_nfsd_clid_reclaim_complete(&clp->cl_clientid);
4431         nfsd4_client_record_create(clp);         4153         nfsd4_client_record_create(clp);
4432         inc_reclaim_complete(clp);               4154         inc_reclaim_complete(clp);
4433 out:                                             4155 out:
4434         return status;                           4156         return status;
4435 }                                                4157 }
4436                                                  4158 
4437 __be32                                           4159 __be32
4438 nfsd4_setclientid(struct svc_rqst *rqstp, str    4160 nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
4439                   union nfsd4_op_u *u)           4161                   union nfsd4_op_u *u)
4440 {                                                4162 {
4441         struct nfsd4_setclientid *setclid = &    4163         struct nfsd4_setclientid *setclid = &u->setclientid;
4442         struct xdr_netobj       clname = setc    4164         struct xdr_netobj       clname = setclid->se_name;
4443         nfs4_verifier           clverifier =     4165         nfs4_verifier           clverifier = setclid->se_verf;
4444         struct nfs4_client      *conf, *new;     4166         struct nfs4_client      *conf, *new;
4445         struct nfs4_client      *unconf = NUL    4167         struct nfs4_client      *unconf = NULL;
4446         __be32                  status;          4168         __be32                  status;
4447         struct nfsd_net         *nn = net_gen    4169         struct nfsd_net         *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
4448                                                  4170 
4449         new = create_client(clname, rqstp, &c    4171         new = create_client(clname, rqstp, &clverifier);
4450         if (new == NULL)                         4172         if (new == NULL)
4451                 return nfserr_jukebox;           4173                 return nfserr_jukebox;
4452         spin_lock(&nn->client_lock);             4174         spin_lock(&nn->client_lock);
4453         conf = find_confirmed_client_by_name(    4175         conf = find_confirmed_client_by_name(&clname, nn);
4454         if (conf && client_has_state(conf)) {    4176         if (conf && client_has_state(conf)) {
4455                 status = nfserr_clid_inuse;      4177                 status = nfserr_clid_inuse;
4456                 if (clp_used_exchangeid(conf)    4178                 if (clp_used_exchangeid(conf))
4457                         goto out;                4179                         goto out;
4458                 if (!same_creds(&conf->cl_cre    4180                 if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
4459                         trace_nfsd_clid_cred_    4181                         trace_nfsd_clid_cred_mismatch(conf, rqstp);
4460                         goto out;                4182                         goto out;
4461                 }                                4183                 }
4462         }                                        4184         }
4463         unconf = find_unconfirmed_client_by_n    4185         unconf = find_unconfirmed_client_by_name(&clname, nn);
4464         if (unconf)                              4186         if (unconf)
4465                 unhash_client_locked(unconf);    4187                 unhash_client_locked(unconf);
4466         if (conf) {                              4188         if (conf) {
4467                 if (same_verf(&conf->cl_verif    4189                 if (same_verf(&conf->cl_verifier, &clverifier)) {
4468                         copy_clid(new, conf);    4190                         copy_clid(new, conf);
4469                         gen_confirm(new, nn);    4191                         gen_confirm(new, nn);
4470                 } else                           4192                 } else
4471                         trace_nfsd_clid_verf_    4193                         trace_nfsd_clid_verf_mismatch(conf, rqstp,
4472                                                  4194                                                       &clverifier);
4473         } else                                   4195         } else
4474                 trace_nfsd_clid_fresh(new);      4196                 trace_nfsd_clid_fresh(new);
4475         new->cl_minorversion = 0;                4197         new->cl_minorversion = 0;
4476         gen_callback(new, setclid, rqstp);       4198         gen_callback(new, setclid, rqstp);
4477         add_to_unconfirmed(new);                 4199         add_to_unconfirmed(new);
4478         setclid->se_clientid.cl_boot = new->c    4200         setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot;
4479         setclid->se_clientid.cl_id = new->cl_    4201         setclid->se_clientid.cl_id = new->cl_clientid.cl_id;
4480         memcpy(setclid->se_confirm.data, new-    4202         memcpy(setclid->se_confirm.data, new->cl_confirm.data, sizeof(setclid->se_confirm.data));
4481         new = NULL;                              4203         new = NULL;
4482         status = nfs_ok;                         4204         status = nfs_ok;
4483 out:                                             4205 out:
4484         spin_unlock(&nn->client_lock);           4206         spin_unlock(&nn->client_lock);
4485         if (new)                                 4207         if (new)
4486                 free_client(new);                4208                 free_client(new);
4487         if (unconf) {                            4209         if (unconf) {
4488                 trace_nfsd_clid_expire_unconf    4210                 trace_nfsd_clid_expire_unconf(&unconf->cl_clientid);
4489                 expire_client(unconf);           4211                 expire_client(unconf);
4490         }                                        4212         }
4491         return status;                           4213         return status;
4492 }                                                4214 }
4493                                                  4215 
4494 __be32                                           4216 __be32
4495 nfsd4_setclientid_confirm(struct svc_rqst *rq    4217 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
4496                         struct nfsd4_compound    4218                         struct nfsd4_compound_state *cstate,
4497                         union nfsd4_op_u *u)     4219                         union nfsd4_op_u *u)
4498 {                                                4220 {
4499         struct nfsd4_setclientid_confirm *set    4221         struct nfsd4_setclientid_confirm *setclientid_confirm =
4500                         &u->setclientid_confi    4222                         &u->setclientid_confirm;
4501         struct nfs4_client *conf, *unconf;       4223         struct nfs4_client *conf, *unconf;
4502         struct nfs4_client *old = NULL;          4224         struct nfs4_client *old = NULL;
4503         nfs4_verifier confirm = setclientid_c    4225         nfs4_verifier confirm = setclientid_confirm->sc_confirm; 
4504         clientid_t * clid = &setclientid_conf    4226         clientid_t * clid = &setclientid_confirm->sc_clientid;
4505         __be32 status;                           4227         __be32 status;
4506         struct nfsd_net *nn = net_generic(SVC    4228         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
4507                                                  4229 
4508         if (STALE_CLIENTID(clid, nn))            4230         if (STALE_CLIENTID(clid, nn))
4509                 return nfserr_stale_clientid;    4231                 return nfserr_stale_clientid;
4510                                                  4232 
4511         spin_lock(&nn->client_lock);             4233         spin_lock(&nn->client_lock);
4512         conf = find_confirmed_client(clid, fa    4234         conf = find_confirmed_client(clid, false, nn);
4513         unconf = find_unconfirmed_client(clid    4235         unconf = find_unconfirmed_client(clid, false, nn);
4514         /*                                       4236         /*
4515          * We try hard to give out unique cli    4237          * We try hard to give out unique clientid's, so if we get an
4516          * attempt to confirm the same client    4238          * attempt to confirm the same clientid with a different cred,
4517          * the client may be buggy; this shou    4239          * the client may be buggy; this should never happen.
4518          *                                       4240          *
4519          * Nevertheless, RFC 7530 recommends     4241          * Nevertheless, RFC 7530 recommends INUSE for this case:
4520          */                                      4242          */
4521         status = nfserr_clid_inuse;              4243         status = nfserr_clid_inuse;
4522         if (unconf && !same_creds(&unconf->cl    4244         if (unconf && !same_creds(&unconf->cl_cred, &rqstp->rq_cred)) {
4523                 trace_nfsd_clid_cred_mismatch    4245                 trace_nfsd_clid_cred_mismatch(unconf, rqstp);
4524                 goto out;                        4246                 goto out;
4525         }                                        4247         }
4526         if (conf && !same_creds(&conf->cl_cre    4248         if (conf && !same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
4527                 trace_nfsd_clid_cred_mismatch    4249                 trace_nfsd_clid_cred_mismatch(conf, rqstp);
4528                 goto out;                        4250                 goto out;
4529         }                                        4251         }
4530         if (!unconf || !same_verf(&confirm, &    4252         if (!unconf || !same_verf(&confirm, &unconf->cl_confirm)) {
4531                 if (conf && same_verf(&confir    4253                 if (conf && same_verf(&confirm, &conf->cl_confirm)) {
4532                         status = nfs_ok;         4254                         status = nfs_ok;
4533                 } else                           4255                 } else
4534                         status = nfserr_stale    4256                         status = nfserr_stale_clientid;
4535                 goto out;                        4257                 goto out;
4536         }                                        4258         }
4537         status = nfs_ok;                         4259         status = nfs_ok;
4538         if (conf) {                              4260         if (conf) {
4539                 old = unconf;                    4261                 old = unconf;
4540                 unhash_client_locked(old);       4262                 unhash_client_locked(old);
4541                 nfsd4_change_callback(conf, &    4263                 nfsd4_change_callback(conf, &unconf->cl_cb_conn);
4542         } else {                                 4264         } else {
4543                 old = find_confirmed_client_b    4265                 old = find_confirmed_client_by_name(&unconf->cl_name, nn);
4544                 if (old) {                       4266                 if (old) {
4545                         status = nfserr_clid_    4267                         status = nfserr_clid_inuse;
4546                         if (client_has_state(    4268                         if (client_has_state(old)
4547                                         && !s    4269                                         && !same_creds(&unconf->cl_cred,
4548                                                  4270                                                         &old->cl_cred)) {
4549                                 old = NULL;      4271                                 old = NULL;
4550                                 goto out;        4272                                 goto out;
4551                         }                        4273                         }
4552                         status = mark_client_    4274                         status = mark_client_expired_locked(old);
4553                         if (status) {            4275                         if (status) {
4554                                 old = NULL;      4276                                 old = NULL;
4555                                 goto out;        4277                                 goto out;
4556                         }                        4278                         }
4557                         trace_nfsd_clid_repla    4279                         trace_nfsd_clid_replaced(&old->cl_clientid);
4558                 }                                4280                 }
4559                 move_to_confirmed(unconf);       4281                 move_to_confirmed(unconf);
4560                 conf = unconf;                   4282                 conf = unconf;
4561         }                                        4283         }
4562         get_client_locked(conf);                 4284         get_client_locked(conf);
4563         spin_unlock(&nn->client_lock);           4285         spin_unlock(&nn->client_lock);
4564         if (conf == unconf)                      4286         if (conf == unconf)
4565                 fsnotify_dentry(conf->cl_nfsd    4287                 fsnotify_dentry(conf->cl_nfsd_info_dentry, FS_MODIFY);
4566         nfsd4_probe_callback(conf);              4288         nfsd4_probe_callback(conf);
4567         spin_lock(&nn->client_lock);             4289         spin_lock(&nn->client_lock);
4568         put_client_renew_locked(conf);           4290         put_client_renew_locked(conf);
4569 out:                                             4291 out:
4570         spin_unlock(&nn->client_lock);           4292         spin_unlock(&nn->client_lock);
4571         if (old)                                 4293         if (old)
4572                 expire_client(old);              4294                 expire_client(old);
4573         return status;                           4295         return status;
4574 }                                                4296 }
4575                                                  4297 
4576 static struct nfs4_file *nfsd4_alloc_file(voi    4298 static struct nfs4_file *nfsd4_alloc_file(void)
4577 {                                                4299 {
4578         return kmem_cache_alloc(file_slab, GF    4300         return kmem_cache_alloc(file_slab, GFP_KERNEL);
4579 }                                                4301 }
4580                                                  4302 
4581 /* OPEN Share state helper functions */          4303 /* OPEN Share state helper functions */
4582                                                  4304 
4583 static void nfsd4_file_init(const struct svc_    4305 static void nfsd4_file_init(const struct svc_fh *fh, struct nfs4_file *fp)
4584 {                                                4306 {
4585         refcount_set(&fp->fi_ref, 1);            4307         refcount_set(&fp->fi_ref, 1);
4586         spin_lock_init(&fp->fi_lock);            4308         spin_lock_init(&fp->fi_lock);
4587         INIT_LIST_HEAD(&fp->fi_stateids);        4309         INIT_LIST_HEAD(&fp->fi_stateids);
4588         INIT_LIST_HEAD(&fp->fi_delegations);     4310         INIT_LIST_HEAD(&fp->fi_delegations);
4589         INIT_LIST_HEAD(&fp->fi_clnt_odstate);    4311         INIT_LIST_HEAD(&fp->fi_clnt_odstate);
4590         fh_copy_shallow(&fp->fi_fhandle, &fh-    4312         fh_copy_shallow(&fp->fi_fhandle, &fh->fh_handle);
4591         fp->fi_deleg_file = NULL;                4313         fp->fi_deleg_file = NULL;
4592         fp->fi_had_conflict = false;             4314         fp->fi_had_conflict = false;
4593         fp->fi_share_deny = 0;                   4315         fp->fi_share_deny = 0;
4594         memset(fp->fi_fds, 0, sizeof(fp->fi_f    4316         memset(fp->fi_fds, 0, sizeof(fp->fi_fds));
4595         memset(fp->fi_access, 0, sizeof(fp->f    4317         memset(fp->fi_access, 0, sizeof(fp->fi_access));
4596         fp->fi_aliased = false;                  4318         fp->fi_aliased = false;
4597         fp->fi_inode = d_inode(fh->fh_dentry)    4319         fp->fi_inode = d_inode(fh->fh_dentry);
4598 #ifdef CONFIG_NFSD_PNFS                          4320 #ifdef CONFIG_NFSD_PNFS
4599         INIT_LIST_HEAD(&fp->fi_lo_states);       4321         INIT_LIST_HEAD(&fp->fi_lo_states);
4600         atomic_set(&fp->fi_lo_recalls, 0);       4322         atomic_set(&fp->fi_lo_recalls, 0);
4601 #endif                                           4323 #endif
4602 }                                                4324 }
4603                                                  4325 
4604 void                                             4326 void
4605 nfsd4_free_slabs(void)                           4327 nfsd4_free_slabs(void)
4606 {                                                4328 {
4607         kmem_cache_destroy(client_slab);         4329         kmem_cache_destroy(client_slab);
4608         kmem_cache_destroy(openowner_slab);      4330         kmem_cache_destroy(openowner_slab);
4609         kmem_cache_destroy(lockowner_slab);      4331         kmem_cache_destroy(lockowner_slab);
4610         kmem_cache_destroy(file_slab);           4332         kmem_cache_destroy(file_slab);
4611         kmem_cache_destroy(stateid_slab);        4333         kmem_cache_destroy(stateid_slab);
4612         kmem_cache_destroy(deleg_slab);          4334         kmem_cache_destroy(deleg_slab);
4613         kmem_cache_destroy(odstate_slab);        4335         kmem_cache_destroy(odstate_slab);
4614 }                                                4336 }
4615                                                  4337 
4616 int                                              4338 int
4617 nfsd4_init_slabs(void)                           4339 nfsd4_init_slabs(void)
4618 {                                                4340 {
4619         client_slab = KMEM_CACHE(nfs4_client, !! 4341         client_slab = kmem_cache_create("nfsd4_clients",
                                                   >> 4342                         sizeof(struct nfs4_client), 0, 0, NULL);
4620         if (client_slab == NULL)                 4343         if (client_slab == NULL)
4621                 goto out;                        4344                 goto out;
4622         openowner_slab = KMEM_CACHE(nfs4_open !! 4345         openowner_slab = kmem_cache_create("nfsd4_openowners",
                                                   >> 4346                         sizeof(struct nfs4_openowner), 0, 0, NULL);
4623         if (openowner_slab == NULL)              4347         if (openowner_slab == NULL)
4624                 goto out_free_client_slab;       4348                 goto out_free_client_slab;
4625         lockowner_slab = KMEM_CACHE(nfs4_lock !! 4349         lockowner_slab = kmem_cache_create("nfsd4_lockowners",
                                                   >> 4350                         sizeof(struct nfs4_lockowner), 0, 0, NULL);
4626         if (lockowner_slab == NULL)              4351         if (lockowner_slab == NULL)
4627                 goto out_free_openowner_slab;    4352                 goto out_free_openowner_slab;
4628         file_slab = KMEM_CACHE(nfs4_file, 0); !! 4353         file_slab = kmem_cache_create("nfsd4_files",
                                                   >> 4354                         sizeof(struct nfs4_file), 0, 0, NULL);
4629         if (file_slab == NULL)                   4355         if (file_slab == NULL)
4630                 goto out_free_lockowner_slab;    4356                 goto out_free_lockowner_slab;
4631         stateid_slab = KMEM_CACHE(nfs4_ol_sta !! 4357         stateid_slab = kmem_cache_create("nfsd4_stateids",
                                                   >> 4358                         sizeof(struct nfs4_ol_stateid), 0, 0, NULL);
4632         if (stateid_slab == NULL)                4359         if (stateid_slab == NULL)
4633                 goto out_free_file_slab;         4360                 goto out_free_file_slab;
4634         deleg_slab = KMEM_CACHE(nfs4_delegati !! 4361         deleg_slab = kmem_cache_create("nfsd4_delegations",
                                                   >> 4362                         sizeof(struct nfs4_delegation), 0, 0, NULL);
4635         if (deleg_slab == NULL)                  4363         if (deleg_slab == NULL)
4636                 goto out_free_stateid_slab;      4364                 goto out_free_stateid_slab;
4637         odstate_slab = KMEM_CACHE(nfs4_clnt_o !! 4365         odstate_slab = kmem_cache_create("nfsd4_odstate",
                                                   >> 4366                         sizeof(struct nfs4_clnt_odstate), 0, 0, NULL);
4638         if (odstate_slab == NULL)                4367         if (odstate_slab == NULL)
4639                 goto out_free_deleg_slab;        4368                 goto out_free_deleg_slab;
4640         return 0;                                4369         return 0;
4641                                                  4370 
4642 out_free_deleg_slab:                             4371 out_free_deleg_slab:
4643         kmem_cache_destroy(deleg_slab);          4372         kmem_cache_destroy(deleg_slab);
4644 out_free_stateid_slab:                           4373 out_free_stateid_slab:
4645         kmem_cache_destroy(stateid_slab);        4374         kmem_cache_destroy(stateid_slab);
4646 out_free_file_slab:                              4375 out_free_file_slab:
4647         kmem_cache_destroy(file_slab);           4376         kmem_cache_destroy(file_slab);
4648 out_free_lockowner_slab:                         4377 out_free_lockowner_slab:
4649         kmem_cache_destroy(lockowner_slab);      4378         kmem_cache_destroy(lockowner_slab);
4650 out_free_openowner_slab:                         4379 out_free_openowner_slab:
4651         kmem_cache_destroy(openowner_slab);      4380         kmem_cache_destroy(openowner_slab);
4652 out_free_client_slab:                            4381 out_free_client_slab:
4653         kmem_cache_destroy(client_slab);         4382         kmem_cache_destroy(client_slab);
4654 out:                                             4383 out:
4655         return -ENOMEM;                          4384         return -ENOMEM;
4656 }                                                4385 }
4657                                                  4386 
4658 static unsigned long                             4387 static unsigned long
4659 nfsd4_state_shrinker_count(struct shrinker *s    4388 nfsd4_state_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
4660 {                                                4389 {
4661         int count;                               4390         int count;
4662         struct nfsd_net *nn = shrink->private !! 4391         struct nfsd_net *nn = container_of(shrink,
                                                   >> 4392                         struct nfsd_net, nfsd_client_shrinker);
4663                                                  4393 
4664         count = atomic_read(&nn->nfsd_courtes    4394         count = atomic_read(&nn->nfsd_courtesy_clients);
4665         if (!count)                              4395         if (!count)
4666                 count = atomic_long_read(&num    4396                 count = atomic_long_read(&num_delegations);
4667         if (count)                               4397         if (count)
4668                 queue_work(laundry_wq, &nn->n    4398                 queue_work(laundry_wq, &nn->nfsd_shrinker_work);
4669         return (unsigned long)count;             4399         return (unsigned long)count;
4670 }                                                4400 }
4671                                                  4401 
4672 static unsigned long                             4402 static unsigned long
4673 nfsd4_state_shrinker_scan(struct shrinker *sh    4403 nfsd4_state_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
4674 {                                                4404 {
4675         return SHRINK_STOP;                      4405         return SHRINK_STOP;
4676 }                                                4406 }
4677                                                  4407 
4678 void                                             4408 void
4679 nfsd4_init_leases_net(struct nfsd_net *nn)       4409 nfsd4_init_leases_net(struct nfsd_net *nn)
4680 {                                                4410 {
4681         struct sysinfo si;                       4411         struct sysinfo si;
4682         u64 max_clients;                         4412         u64 max_clients;
4683                                                  4413 
4684         nn->nfsd4_lease = 90;   /* default le    4414         nn->nfsd4_lease = 90;   /* default lease time */
4685         nn->nfsd4_grace = 90;                    4415         nn->nfsd4_grace = 90;
4686         nn->somebody_reclaimed = false;          4416         nn->somebody_reclaimed = false;
4687         nn->track_reclaim_completes = false;     4417         nn->track_reclaim_completes = false;
4688         nn->clverifier_counter = get_random_u    4418         nn->clverifier_counter = get_random_u32();
4689         nn->clientid_base = get_random_u32();    4419         nn->clientid_base = get_random_u32();
4690         nn->clientid_counter = nn->clientid_b    4420         nn->clientid_counter = nn->clientid_base + 1;
4691         nn->s2s_cp_cl_id = nn->clientid_count    4421         nn->s2s_cp_cl_id = nn->clientid_counter++;
4692                                                  4422 
4693         atomic_set(&nn->nfs4_client_count, 0)    4423         atomic_set(&nn->nfs4_client_count, 0);
4694         si_meminfo(&si);                         4424         si_meminfo(&si);
4695         max_clients = (u64)si.totalram * si.m    4425         max_clients = (u64)si.totalram * si.mem_unit / (1024 * 1024 * 1024);
4696         max_clients *= NFS4_CLIENTS_PER_GB;      4426         max_clients *= NFS4_CLIENTS_PER_GB;
4697         nn->nfs4_max_clients = max_t(int, max    4427         nn->nfs4_max_clients = max_t(int, max_clients, NFS4_CLIENTS_PER_GB);
4698                                                  4428 
4699         atomic_set(&nn->nfsd_courtesy_clients    4429         atomic_set(&nn->nfsd_courtesy_clients, 0);
4700 }                                                4430 }
4701                                                  4431 
4702 enum rp_lock {                                << 
4703         RP_UNLOCKED,                          << 
4704         RP_LOCKED,                            << 
4705         RP_UNHASHED,                          << 
4706 };                                            << 
4707                                               << 
4708 static void init_nfs4_replay(struct nfs4_repl    4432 static void init_nfs4_replay(struct nfs4_replay *rp)
4709 {                                                4433 {
4710         rp->rp_status = nfserr_serverfault;      4434         rp->rp_status = nfserr_serverfault;
4711         rp->rp_buflen = 0;                       4435         rp->rp_buflen = 0;
4712         rp->rp_buf = rp->rp_ibuf;                4436         rp->rp_buf = rp->rp_ibuf;
4713         atomic_set(&rp->rp_locked, RP_UNLOCKE !! 4437         mutex_init(&rp->rp_mutex);
4714 }                                                4438 }
4715                                                  4439 
4716 static int nfsd4_cstate_assign_replay(struct  !! 4440 static void nfsd4_cstate_assign_replay(struct nfsd4_compound_state *cstate,
4717                                       struct  !! 4441                 struct nfs4_stateowner *so)
4718 {                                                4442 {
4719         if (!nfsd4_has_session(cstate)) {        4443         if (!nfsd4_has_session(cstate)) {
4720                 wait_var_event(&so->so_replay !! 4444                 mutex_lock(&so->so_replay.rp_mutex);
4721                                atomic_cmpxchg << 
4722                                               << 
4723                 if (atomic_read(&so->so_repla << 
4724                         return -EAGAIN;       << 
4725                 cstate->replay_owner = nfs4_g    4445                 cstate->replay_owner = nfs4_get_stateowner(so);
4726         }                                        4446         }
4727         return 0;                             << 
4728 }                                                4447 }
4729                                                  4448 
4730 void nfsd4_cstate_clear_replay(struct nfsd4_c    4449 void nfsd4_cstate_clear_replay(struct nfsd4_compound_state *cstate)
4731 {                                                4450 {
4732         struct nfs4_stateowner *so = cstate->    4451         struct nfs4_stateowner *so = cstate->replay_owner;
4733                                                  4452 
4734         if (so != NULL) {                        4453         if (so != NULL) {
4735                 cstate->replay_owner = NULL;     4454                 cstate->replay_owner = NULL;
4736                 atomic_set(&so->so_replay.rp_ !! 4455                 mutex_unlock(&so->so_replay.rp_mutex);
4737                 smp_mb__after_atomic();       << 
4738                 wake_up_var(&so->so_replay.rp << 
4739                 nfs4_put_stateowner(so);         4456                 nfs4_put_stateowner(so);
4740         }                                        4457         }
4741 }                                                4458 }
4742                                                  4459 
4743 static inline void *alloc_stateowner(struct k    4460 static inline void *alloc_stateowner(struct kmem_cache *slab, struct xdr_netobj *owner, struct nfs4_client *clp)
4744 {                                                4461 {
4745         struct nfs4_stateowner *sop;             4462         struct nfs4_stateowner *sop;
4746                                                  4463 
4747         sop = kmem_cache_alloc(slab, GFP_KERN    4464         sop = kmem_cache_alloc(slab, GFP_KERNEL);
4748         if (!sop)                                4465         if (!sop)
4749                 return NULL;                     4466                 return NULL;
4750                                                  4467 
4751         xdr_netobj_dup(&sop->so_owner, owner,    4468         xdr_netobj_dup(&sop->so_owner, owner, GFP_KERNEL);
4752         if (!sop->so_owner.data) {               4469         if (!sop->so_owner.data) {
4753                 kmem_cache_free(slab, sop);      4470                 kmem_cache_free(slab, sop);
4754                 return NULL;                     4471                 return NULL;
4755         }                                        4472         }
4756                                                  4473 
4757         INIT_LIST_HEAD(&sop->so_stateids);       4474         INIT_LIST_HEAD(&sop->so_stateids);
4758         sop->so_client = clp;                    4475         sop->so_client = clp;
4759         init_nfs4_replay(&sop->so_replay);       4476         init_nfs4_replay(&sop->so_replay);
4760         atomic_set(&sop->so_count, 1);           4477         atomic_set(&sop->so_count, 1);
4761         return sop;                              4478         return sop;
4762 }                                                4479 }
4763                                                  4480 
4764 static void hash_openowner(struct nfs4_openow    4481 static void hash_openowner(struct nfs4_openowner *oo, struct nfs4_client *clp, unsigned int strhashval)
4765 {                                                4482 {
4766         lockdep_assert_held(&clp->cl_lock);      4483         lockdep_assert_held(&clp->cl_lock);
4767                                                  4484 
4768         list_add(&oo->oo_owner.so_strhash,       4485         list_add(&oo->oo_owner.so_strhash,
4769                  &clp->cl_ownerstr_hashtbl[st    4486                  &clp->cl_ownerstr_hashtbl[strhashval]);
4770         list_add(&oo->oo_perclient, &clp->cl_    4487         list_add(&oo->oo_perclient, &clp->cl_openowners);
4771 }                                                4488 }
4772                                                  4489 
4773 static void nfs4_unhash_openowner(struct nfs4    4490 static void nfs4_unhash_openowner(struct nfs4_stateowner *so)
4774 {                                                4491 {
4775         unhash_openowner_locked(openowner(so)    4492         unhash_openowner_locked(openowner(so));
4776 }                                                4493 }
4777                                                  4494 
4778 static void nfs4_free_openowner(struct nfs4_s    4495 static void nfs4_free_openowner(struct nfs4_stateowner *so)
4779 {                                                4496 {
4780         struct nfs4_openowner *oo = openowner    4497         struct nfs4_openowner *oo = openowner(so);
4781                                                  4498 
4782         kmem_cache_free(openowner_slab, oo);     4499         kmem_cache_free(openowner_slab, oo);
4783 }                                                4500 }
4784                                                  4501 
4785 static const struct nfs4_stateowner_operation    4502 static const struct nfs4_stateowner_operations openowner_ops = {
4786         .so_unhash =    nfs4_unhash_openowner    4503         .so_unhash =    nfs4_unhash_openowner,
4787         .so_free =      nfs4_free_openowner,     4504         .so_free =      nfs4_free_openowner,
4788 };                                               4505 };
4789                                                  4506 
4790 static struct nfs4_ol_stateid *                  4507 static struct nfs4_ol_stateid *
4791 nfsd4_find_existing_open(struct nfs4_file *fp    4508 nfsd4_find_existing_open(struct nfs4_file *fp, struct nfsd4_open *open)
4792 {                                                4509 {
4793         struct nfs4_ol_stateid *local, *ret =    4510         struct nfs4_ol_stateid *local, *ret = NULL;
4794         struct nfs4_openowner *oo = open->op_    4511         struct nfs4_openowner *oo = open->op_openowner;
4795                                                  4512 
4796         lockdep_assert_held(&fp->fi_lock);       4513         lockdep_assert_held(&fp->fi_lock);
4797                                                  4514 
4798         list_for_each_entry(local, &fp->fi_st    4515         list_for_each_entry(local, &fp->fi_stateids, st_perfile) {
4799                 /* ignore lock owners */         4516                 /* ignore lock owners */
4800                 if (local->st_stateowner->so_    4517                 if (local->st_stateowner->so_is_open_owner == 0)
4801                         continue;                4518                         continue;
4802                 if (local->st_stateowner != &    4519                 if (local->st_stateowner != &oo->oo_owner)
4803                         continue;                4520                         continue;
4804                 if (local->st_stid.sc_type == !! 4521                 if (local->st_stid.sc_type == NFS4_OPEN_STID) {
4805                     !local->st_stid.sc_status << 
4806                         ret = local;             4522                         ret = local;
4807                         refcount_inc(&ret->st    4523                         refcount_inc(&ret->st_stid.sc_count);
4808                         break;                   4524                         break;
4809                 }                                4525                 }
4810         }                                        4526         }
4811         return ret;                              4527         return ret;
4812 }                                                4528 }
4813                                                  4529 
4814 static void nfsd4_drop_revoked_stid(struct nf << 
4815         __releases(&s->sc_client->cl_lock)    << 
4816 {                                             << 
4817         struct nfs4_client *cl = s->sc_client << 
4818         LIST_HEAD(reaplist);                  << 
4819         struct nfs4_ol_stateid *stp;          << 
4820         struct nfs4_delegation *dp;           << 
4821         bool unhashed;                        << 
4822                                               << 
4823         switch (s->sc_type) {                 << 
4824         case SC_TYPE_OPEN:                    << 
4825                 stp = openlockstateid(s);     << 
4826                 if (unhash_open_stateid(stp,  << 
4827                         put_ol_stateid_locked << 
4828                 spin_unlock(&cl->cl_lock);    << 
4829                 free_ol_stateid_reaplist(&rea << 
4830                 break;                        << 
4831         case SC_TYPE_LOCK:                    << 
4832                 stp = openlockstateid(s);     << 
4833                 unhashed = unhash_lock_statei << 
4834                 spin_unlock(&cl->cl_lock);    << 
4835                 if (unhashed)                 << 
4836                         nfs4_put_stid(s);     << 
4837                 break;                        << 
4838         case SC_TYPE_DELEG:                   << 
4839                 dp = delegstateid(s);         << 
4840                 list_del_init(&dp->dl_recall_ << 
4841                 spin_unlock(&cl->cl_lock);    << 
4842                 nfs4_put_stid(s);             << 
4843                 break;                        << 
4844         default:                              << 
4845                 spin_unlock(&cl->cl_lock);    << 
4846         }                                     << 
4847 }                                             << 
4848                                               << 
4849 static void nfsd40_drop_revoked_stid(struct n << 
4850                                     stateid_t << 
4851 {                                             << 
4852         /* NFSv4.0 has no way for the client  << 
4853          * that it can forget an admin-revoke << 
4854          * So we keep it around until the fir << 
4855          * client uses it, and drop it the fi << 
4856          * nfserr_admin_revoked is returned.  << 
4857          * For v4.1 and later we wait until e << 
4858          * to free the stateid.               << 
4859          */                                   << 
4860         if (cl->cl_minorversion == 0) {       << 
4861                 struct nfs4_stid *st;         << 
4862                                               << 
4863                 spin_lock(&cl->cl_lock);      << 
4864                 st = find_stateid_locked(cl,  << 
4865                 if (st)                       << 
4866                         nfsd4_drop_revoked_st << 
4867                 else                          << 
4868                         spin_unlock(&cl->cl_l << 
4869         }                                     << 
4870 }                                             << 
4871                                               << 
4872 static __be32                                    4530 static __be32
4873 nfsd4_verify_open_stid(struct nfs4_stid *s)      4531 nfsd4_verify_open_stid(struct nfs4_stid *s)
4874 {                                                4532 {
4875         __be32 ret = nfs_ok;                     4533         __be32 ret = nfs_ok;
4876                                                  4534 
4877         if (s->sc_status & SC_STATUS_ADMIN_RE !! 4535         switch (s->sc_type) {
4878                 ret = nfserr_admin_revoked;   !! 4536         default:
4879         else if (s->sc_status & SC_STATUS_REV !! 4537                 break;
4880                 ret = nfserr_deleg_revoked;   !! 4538         case 0:
4881         else if (s->sc_status & SC_STATUS_CLO !! 4539         case NFS4_CLOSED_STID:
                                                   >> 4540         case NFS4_CLOSED_DELEG_STID:
4882                 ret = nfserr_bad_stateid;        4541                 ret = nfserr_bad_stateid;
                                                   >> 4542                 break;
                                                   >> 4543         case NFS4_REVOKED_DELEG_STID:
                                                   >> 4544                 ret = nfserr_deleg_revoked;
                                                   >> 4545         }
4883         return ret;                              4546         return ret;
4884 }                                                4547 }
4885                                                  4548 
4886 /* Lock the stateid st_mutex, and deal with r    4549 /* Lock the stateid st_mutex, and deal with races with CLOSE */
4887 static __be32                                    4550 static __be32
4888 nfsd4_lock_ol_stateid(struct nfs4_ol_stateid     4551 nfsd4_lock_ol_stateid(struct nfs4_ol_stateid *stp)
4889 {                                                4552 {
4890         __be32 ret;                              4553         __be32 ret;
4891                                                  4554 
4892         mutex_lock_nested(&stp->st_mutex, LOC    4555         mutex_lock_nested(&stp->st_mutex, LOCK_STATEID_MUTEX);
4893         ret = nfsd4_verify_open_stid(&stp->st    4556         ret = nfsd4_verify_open_stid(&stp->st_stid);
4894         if (ret == nfserr_admin_revoked)      << 
4895                 nfsd40_drop_revoked_stid(stp- << 
4896                                         &stp- << 
4897                                               << 
4898         if (ret != nfs_ok)                       4557         if (ret != nfs_ok)
4899                 mutex_unlock(&stp->st_mutex);    4558                 mutex_unlock(&stp->st_mutex);
4900         return ret;                              4559         return ret;
4901 }                                                4560 }
4902                                                  4561 
4903 static struct nfs4_ol_stateid *                  4562 static struct nfs4_ol_stateid *
4904 nfsd4_find_and_lock_existing_open(struct nfs4    4563 nfsd4_find_and_lock_existing_open(struct nfs4_file *fp, struct nfsd4_open *open)
4905 {                                                4564 {
4906         struct nfs4_ol_stateid *stp;             4565         struct nfs4_ol_stateid *stp;
4907         for (;;) {                               4566         for (;;) {
4908                 spin_lock(&fp->fi_lock);         4567                 spin_lock(&fp->fi_lock);
4909                 stp = nfsd4_find_existing_ope    4568                 stp = nfsd4_find_existing_open(fp, open);
4910                 spin_unlock(&fp->fi_lock);       4569                 spin_unlock(&fp->fi_lock);
4911                 if (!stp || nfsd4_lock_ol_sta    4570                 if (!stp || nfsd4_lock_ol_stateid(stp) == nfs_ok)
4912                         break;                   4571                         break;
4913                 nfs4_put_stid(&stp->st_stid);    4572                 nfs4_put_stid(&stp->st_stid);
4914         }                                        4573         }
4915         return stp;                              4574         return stp;
4916 }                                                4575 }
4917                                                  4576 
4918 static struct nfs4_openowner *                   4577 static struct nfs4_openowner *
4919 find_or_alloc_open_stateowner(unsigned int st !! 4578 alloc_init_open_stateowner(unsigned int strhashval, struct nfsd4_open *open,
4920                               struct nfsd4_co !! 4579                            struct nfsd4_compound_state *cstate)
4921 {                                                4580 {
4922         struct nfs4_client *clp = cstate->clp    4581         struct nfs4_client *clp = cstate->clp;
4923         struct nfs4_openowner *oo, *new = NUL !! 4582         struct nfs4_openowner *oo, *ret;
4924                                               << 
4925 retry:                                        << 
4926         spin_lock(&clp->cl_lock);             << 
4927         oo = find_openstateowner_str(strhashv << 
4928         if (!oo && new) {                     << 
4929                 hash_openowner(new, clp, strh << 
4930                 spin_unlock(&clp->cl_lock);   << 
4931                 return new;                   << 
4932         }                                     << 
4933         spin_unlock(&clp->cl_lock);           << 
4934                                                  4583 
4935         if (oo && !(oo->oo_flags & NFS4_OO_CO !! 4584         oo = alloc_stateowner(openowner_slab, &open->op_owner, clp);
4936                 /* Replace unconfirmed owners !! 4585         if (!oo)
4937                 release_openowner(oo);        << 
4938                 oo = NULL;                    << 
4939         }                                     << 
4940         if (oo) {                             << 
4941                 if (new)                      << 
4942                         nfs4_free_stateowner( << 
4943                 return oo;                    << 
4944         }                                     << 
4945                                               << 
4946         new = alloc_stateowner(openowner_slab << 
4947         if (!new)                             << 
4948                 return NULL;                     4586                 return NULL;
4949         new->oo_owner.so_ops = &openowner_ops !! 4587         oo->oo_owner.so_ops = &openowner_ops;
4950         new->oo_owner.so_is_open_owner = 1;   !! 4588         oo->oo_owner.so_is_open_owner = 1;
4951         new->oo_owner.so_seqid = open->op_seq !! 4589         oo->oo_owner.so_seqid = open->op_seqid;
4952         new->oo_flags = 0;                    !! 4590         oo->oo_flags = 0;
4953         if (nfsd4_has_session(cstate))           4591         if (nfsd4_has_session(cstate))
4954                 new->oo_flags |= NFS4_OO_CONF !! 4592                 oo->oo_flags |= NFS4_OO_CONFIRMED;
4955         new->oo_time = 0;                     !! 4593         oo->oo_time = 0;
4956         new->oo_last_closed_stid = NULL;      !! 4594         oo->oo_last_closed_stid = NULL;
4957         INIT_LIST_HEAD(&new->oo_close_lru);   !! 4595         INIT_LIST_HEAD(&oo->oo_close_lru);
4958         goto retry;                           !! 4596         spin_lock(&clp->cl_lock);
                                                   >> 4597         ret = find_openstateowner_str_locked(strhashval, open, clp);
                                                   >> 4598         if (ret == NULL) {
                                                   >> 4599                 hash_openowner(oo, clp, strhashval);
                                                   >> 4600                 ret = oo;
                                                   >> 4601         } else
                                                   >> 4602                 nfs4_free_stateowner(&oo->oo_owner);
                                                   >> 4603 
                                                   >> 4604         spin_unlock(&clp->cl_lock);
                                                   >> 4605         return ret;
4959 }                                                4606 }
4960                                                  4607 
4961 static struct nfs4_ol_stateid *                  4608 static struct nfs4_ol_stateid *
4962 init_open_stateid(struct nfs4_file *fp, struc    4609 init_open_stateid(struct nfs4_file *fp, struct nfsd4_open *open)
4963 {                                                4610 {
4964                                                  4611 
4965         struct nfs4_openowner *oo = open->op_    4612         struct nfs4_openowner *oo = open->op_openowner;
4966         struct nfs4_ol_stateid *retstp = NULL    4613         struct nfs4_ol_stateid *retstp = NULL;
4967         struct nfs4_ol_stateid *stp;             4614         struct nfs4_ol_stateid *stp;
4968                                                  4615 
4969         stp = open->op_stp;                      4616         stp = open->op_stp;
4970         /* We are moving these outside of the    4617         /* We are moving these outside of the spinlocks to avoid the warnings */
4971         mutex_init(&stp->st_mutex);              4618         mutex_init(&stp->st_mutex);
4972         mutex_lock_nested(&stp->st_mutex, OPE    4619         mutex_lock_nested(&stp->st_mutex, OPEN_STATEID_MUTEX);
4973                                                  4620 
4974 retry:                                           4621 retry:
4975         spin_lock(&oo->oo_owner.so_client->cl    4622         spin_lock(&oo->oo_owner.so_client->cl_lock);
4976         spin_lock(&fp->fi_lock);                 4623         spin_lock(&fp->fi_lock);
4977                                                  4624 
4978         retstp = nfsd4_find_existing_open(fp,    4625         retstp = nfsd4_find_existing_open(fp, open);
4979         if (retstp)                              4626         if (retstp)
4980                 goto out_unlock;                 4627                 goto out_unlock;
4981                                                  4628 
4982         open->op_stp = NULL;                     4629         open->op_stp = NULL;
4983         refcount_inc(&stp->st_stid.sc_count);    4630         refcount_inc(&stp->st_stid.sc_count);
4984         stp->st_stid.sc_type = SC_TYPE_OPEN;  !! 4631         stp->st_stid.sc_type = NFS4_OPEN_STID;
4985         INIT_LIST_HEAD(&stp->st_locks);          4632         INIT_LIST_HEAD(&stp->st_locks);
4986         stp->st_stateowner = nfs4_get_stateow    4633         stp->st_stateowner = nfs4_get_stateowner(&oo->oo_owner);
4987         get_nfs4_file(fp);                       4634         get_nfs4_file(fp);
4988         stp->st_stid.sc_file = fp;               4635         stp->st_stid.sc_file = fp;
4989         stp->st_access_bmap = 0;                 4636         stp->st_access_bmap = 0;
4990         stp->st_deny_bmap = 0;                   4637         stp->st_deny_bmap = 0;
4991         stp->st_openstp = NULL;                  4638         stp->st_openstp = NULL;
4992         list_add(&stp->st_perstateowner, &oo-    4639         list_add(&stp->st_perstateowner, &oo->oo_owner.so_stateids);
4993         list_add(&stp->st_perfile, &fp->fi_st    4640         list_add(&stp->st_perfile, &fp->fi_stateids);
4994                                                  4641 
4995 out_unlock:                                      4642 out_unlock:
4996         spin_unlock(&fp->fi_lock);               4643         spin_unlock(&fp->fi_lock);
4997         spin_unlock(&oo->oo_owner.so_client->    4644         spin_unlock(&oo->oo_owner.so_client->cl_lock);
4998         if (retstp) {                            4645         if (retstp) {
4999                 /* Handle races with CLOSE */    4646                 /* Handle races with CLOSE */
5000                 if (nfsd4_lock_ol_stateid(ret    4647                 if (nfsd4_lock_ol_stateid(retstp) != nfs_ok) {
5001                         nfs4_put_stid(&retstp    4648                         nfs4_put_stid(&retstp->st_stid);
5002                         goto retry;              4649                         goto retry;
5003                 }                                4650                 }
5004                 /* To keep mutex tracking hap    4651                 /* To keep mutex tracking happy */
5005                 mutex_unlock(&stp->st_mutex);    4652                 mutex_unlock(&stp->st_mutex);
5006                 stp = retstp;                    4653                 stp = retstp;
5007         }                                        4654         }
5008         return stp;                              4655         return stp;
5009 }                                                4656 }
5010                                                  4657 
5011 /*                                               4658 /*
5012  * In the 4.0 case we need to keep the owners    4659  * In the 4.0 case we need to keep the owners around a little while to handle
5013  * CLOSE replay. We still do need to release     4660  * CLOSE replay. We still do need to release any file access that is held by
5014  * them before returning however.                4661  * them before returning however.
5015  */                                              4662  */
5016 static void                                      4663 static void
5017 move_to_close_lru(struct nfs4_ol_stateid *s,     4664 move_to_close_lru(struct nfs4_ol_stateid *s, struct net *net)
5018 {                                                4665 {
5019         struct nfs4_ol_stateid *last;            4666         struct nfs4_ol_stateid *last;
5020         struct nfs4_openowner *oo = openowner    4667         struct nfs4_openowner *oo = openowner(s->st_stateowner);
5021         struct nfsd_net *nn = net_generic(s->    4668         struct nfsd_net *nn = net_generic(s->st_stid.sc_client->net,
5022                                                  4669                                                 nfsd_net_id);
5023                                                  4670 
5024         dprintk("NFSD: move_to_close_lru nfs4    4671         dprintk("NFSD: move_to_close_lru nfs4_openowner %p\n", oo);
5025                                                  4672 
5026         /*                                       4673         /*
5027          * We know that we hold one reference    4674          * We know that we hold one reference via nfsd4_close, and another
5028          * "persistent" reference for the cli    4675          * "persistent" reference for the client. If the refcount is higher
5029          * than 2, then there are still calls    4676          * than 2, then there are still calls in progress that are using this
5030          * stateid. We can't put the sc_file     4677          * stateid. We can't put the sc_file reference until they are finished.
5031          * Wait for the refcount to drop to 2    4678          * Wait for the refcount to drop to 2. Since it has been unhashed,
5032          * there should be no danger of the r    4679          * there should be no danger of the refcount going back up again at
5033          * this point.                           4680          * this point.
5034          * Some threads with a reference migh << 
5035          * so tell them to stop waiting.      << 
5036          */                                      4681          */
5037         atomic_set(&oo->oo_owner.so_replay.rp << 
5038         smp_mb__after_atomic();               << 
5039         wake_up_var(&oo->oo_owner.so_replay.r << 
5040         wait_event(close_wq, refcount_read(&s    4682         wait_event(close_wq, refcount_read(&s->st_stid.sc_count) == 2);
5041                                                  4683 
5042         release_all_access(s);                   4684         release_all_access(s);
5043         if (s->st_stid.sc_file) {                4685         if (s->st_stid.sc_file) {
5044                 put_nfs4_file(s->st_stid.sc_f    4686                 put_nfs4_file(s->st_stid.sc_file);
5045                 s->st_stid.sc_file = NULL;       4687                 s->st_stid.sc_file = NULL;
5046         }                                        4688         }
5047                                                  4689 
5048         spin_lock(&nn->client_lock);             4690         spin_lock(&nn->client_lock);
5049         last = oo->oo_last_closed_stid;          4691         last = oo->oo_last_closed_stid;
5050         oo->oo_last_closed_stid = s;             4692         oo->oo_last_closed_stid = s;
5051         list_move_tail(&oo->oo_close_lru, &nn    4693         list_move_tail(&oo->oo_close_lru, &nn->close_lru);
5052         oo->oo_time = ktime_get_boottime_seco    4694         oo->oo_time = ktime_get_boottime_seconds();
5053         spin_unlock(&nn->client_lock);           4695         spin_unlock(&nn->client_lock);
5054         if (last)                                4696         if (last)
5055                 nfs4_put_stid(&last->st_stid)    4697                 nfs4_put_stid(&last->st_stid);
5056 }                                                4698 }
5057                                                  4699 
5058 static noinline_for_stack struct nfs4_file *     4700 static noinline_for_stack struct nfs4_file *
5059 nfsd4_file_hash_lookup(const struct svc_fh *f    4701 nfsd4_file_hash_lookup(const struct svc_fh *fhp)
5060 {                                                4702 {
5061         struct inode *inode = d_inode(fhp->fh    4703         struct inode *inode = d_inode(fhp->fh_dentry);
5062         struct rhlist_head *tmp, *list;          4704         struct rhlist_head *tmp, *list;
5063         struct nfs4_file *fi;                    4705         struct nfs4_file *fi;
5064                                                  4706 
5065         rcu_read_lock();                         4707         rcu_read_lock();
5066         list = rhltable_lookup(&nfs4_file_rhl    4708         list = rhltable_lookup(&nfs4_file_rhltable, &inode,
5067                                nfs4_file_rhas    4709                                nfs4_file_rhash_params);
5068         rhl_for_each_entry_rcu(fi, tmp, list,    4710         rhl_for_each_entry_rcu(fi, tmp, list, fi_rlist) {
5069                 if (fh_match(&fi->fi_fhandle,    4711                 if (fh_match(&fi->fi_fhandle, &fhp->fh_handle)) {
5070                         if (refcount_inc_not_    4712                         if (refcount_inc_not_zero(&fi->fi_ref)) {
5071                                 rcu_read_unlo    4713                                 rcu_read_unlock();
5072                                 return fi;       4714                                 return fi;
5073                         }                        4715                         }
5074                 }                                4716                 }
5075         }                                        4717         }
5076         rcu_read_unlock();                       4718         rcu_read_unlock();
5077         return NULL;                             4719         return NULL;
5078 }                                                4720 }
5079                                                  4721 
5080 /*                                               4722 /*
5081  * On hash insertion, identify entries with t    4723  * On hash insertion, identify entries with the same inode but
5082  * distinct filehandles. They will all be on     4724  * distinct filehandles. They will all be on the list returned
5083  * by rhltable_lookup().                         4725  * by rhltable_lookup().
5084  *                                               4726  *
5085  * inode->i_lock prevents racing insertions f    4727  * inode->i_lock prevents racing insertions from adding an entry
5086  * for the same inode/fhp pair twice.            4728  * for the same inode/fhp pair twice.
5087  */                                              4729  */
5088 static noinline_for_stack struct nfs4_file *     4730 static noinline_for_stack struct nfs4_file *
5089 nfsd4_file_hash_insert(struct nfs4_file *new,    4731 nfsd4_file_hash_insert(struct nfs4_file *new, const struct svc_fh *fhp)
5090 {                                                4732 {
5091         struct inode *inode = d_inode(fhp->fh    4733         struct inode *inode = d_inode(fhp->fh_dentry);
5092         struct rhlist_head *tmp, *list;          4734         struct rhlist_head *tmp, *list;
5093         struct nfs4_file *ret = NULL;            4735         struct nfs4_file *ret = NULL;
5094         bool alias_found = false;                4736         bool alias_found = false;
5095         struct nfs4_file *fi;                    4737         struct nfs4_file *fi;
5096         int err;                                 4738         int err;
5097                                                  4739 
5098         rcu_read_lock();                         4740         rcu_read_lock();
5099         spin_lock(&inode->i_lock);               4741         spin_lock(&inode->i_lock);
5100                                                  4742 
5101         list = rhltable_lookup(&nfs4_file_rhl    4743         list = rhltable_lookup(&nfs4_file_rhltable, &inode,
5102                                nfs4_file_rhas    4744                                nfs4_file_rhash_params);
5103         rhl_for_each_entry_rcu(fi, tmp, list,    4745         rhl_for_each_entry_rcu(fi, tmp, list, fi_rlist) {
5104                 if (fh_match(&fi->fi_fhandle,    4746                 if (fh_match(&fi->fi_fhandle, &fhp->fh_handle)) {
5105                         if (refcount_inc_not_    4747                         if (refcount_inc_not_zero(&fi->fi_ref))
5106                                 ret = fi;        4748                                 ret = fi;
5107                 } else                           4749                 } else
5108                         fi->fi_aliased = alia    4750                         fi->fi_aliased = alias_found = true;
5109         }                                        4751         }
5110         if (ret)                                 4752         if (ret)
5111                 goto out_unlock;                 4753                 goto out_unlock;
5112                                                  4754 
5113         nfsd4_file_init(fhp, new);               4755         nfsd4_file_init(fhp, new);
5114         err = rhltable_insert(&nfs4_file_rhlt    4756         err = rhltable_insert(&nfs4_file_rhltable, &new->fi_rlist,
5115                               nfs4_file_rhash    4757                               nfs4_file_rhash_params);
5116         if (err)                                 4758         if (err)
5117                 goto out_unlock;                 4759                 goto out_unlock;
5118                                                  4760 
5119         new->fi_aliased = alias_found;           4761         new->fi_aliased = alias_found;
5120         ret = new;                               4762         ret = new;
5121                                                  4763 
5122 out_unlock:                                      4764 out_unlock:
5123         spin_unlock(&inode->i_lock);             4765         spin_unlock(&inode->i_lock);
5124         rcu_read_unlock();                       4766         rcu_read_unlock();
5125         return ret;                              4767         return ret;
5126 }                                                4768 }
5127                                                  4769 
5128 static noinline_for_stack void nfsd4_file_has    4770 static noinline_for_stack void nfsd4_file_hash_remove(struct nfs4_file *fi)
5129 {                                                4771 {
5130         rhltable_remove(&nfs4_file_rhltable,     4772         rhltable_remove(&nfs4_file_rhltable, &fi->fi_rlist,
5131                         nfs4_file_rhash_param    4773                         nfs4_file_rhash_params);
5132 }                                                4774 }
5133                                                  4775 
5134 /*                                               4776 /*
5135  * Called to check deny when READ with all ze    4777  * Called to check deny when READ with all zero stateid or
5136  * WRITE with all zero or all one stateid        4778  * WRITE with all zero or all one stateid
5137  */                                              4779  */
5138 static __be32                                    4780 static __be32
5139 nfs4_share_conflict(struct svc_fh *current_fh    4781 nfs4_share_conflict(struct svc_fh *current_fh, unsigned int deny_type)
5140 {                                                4782 {
5141         struct nfs4_file *fp;                    4783         struct nfs4_file *fp;
5142         __be32 ret = nfs_ok;                     4784         __be32 ret = nfs_ok;
5143                                                  4785 
5144         fp = nfsd4_file_hash_lookup(current_f    4786         fp = nfsd4_file_hash_lookup(current_fh);
5145         if (!fp)                                 4787         if (!fp)
5146                 return ret;                      4788                 return ret;
5147                                                  4789 
5148         /* Check for conflicting share reserv    4790         /* Check for conflicting share reservations */
5149         spin_lock(&fp->fi_lock);                 4791         spin_lock(&fp->fi_lock);
5150         if (fp->fi_share_deny & deny_type)       4792         if (fp->fi_share_deny & deny_type)
5151                 ret = nfserr_locked;             4793                 ret = nfserr_locked;
5152         spin_unlock(&fp->fi_lock);               4794         spin_unlock(&fp->fi_lock);
5153         put_nfs4_file(fp);                       4795         put_nfs4_file(fp);
5154         return ret;                              4796         return ret;
5155 }                                                4797 }
5156                                                  4798 
5157 static bool nfsd4_deleg_present(const struct     4799 static bool nfsd4_deleg_present(const struct inode *inode)
5158 {                                                4800 {
5159         struct file_lock_context *ctx = locks    4801         struct file_lock_context *ctx = locks_inode_context(inode);
5160                                                  4802 
5161         return ctx && !list_empty_careful(&ct    4803         return ctx && !list_empty_careful(&ctx->flc_lease);
5162 }                                                4804 }
5163                                                  4805 
5164 /**                                              4806 /**
5165  * nfsd_wait_for_delegreturn - wait for deleg    4807  * nfsd_wait_for_delegreturn - wait for delegations to be returned
5166  * @rqstp: the RPC transaction being executed    4808  * @rqstp: the RPC transaction being executed
5167  * @inode: in-core inode of the file being wa    4809  * @inode: in-core inode of the file being waited for
5168  *                                               4810  *
5169  * The timeout prevents deadlock if all nfsd     4811  * The timeout prevents deadlock if all nfsd threads happen to be
5170  * tied up waiting for returning delegations.    4812  * tied up waiting for returning delegations.
5171  *                                               4813  *
5172  * Return values:                                4814  * Return values:
5173  *   %true: delegation was returned              4815  *   %true: delegation was returned
5174  *   %false: timed out waiting for delegretur    4816  *   %false: timed out waiting for delegreturn
5175  */                                              4817  */
5176 bool nfsd_wait_for_delegreturn(struct svc_rqs    4818 bool nfsd_wait_for_delegreturn(struct svc_rqst *rqstp, struct inode *inode)
5177 {                                                4819 {
5178         long __maybe_unused timeo;               4820         long __maybe_unused timeo;
5179                                                  4821 
5180         timeo = wait_var_event_timeout(inode,    4822         timeo = wait_var_event_timeout(inode, !nfsd4_deleg_present(inode),
5181                                        NFSD_D    4823                                        NFSD_DELEGRETURN_TIMEOUT);
5182         trace_nfsd_delegret_wakeup(rqstp, ino    4824         trace_nfsd_delegret_wakeup(rqstp, inode, timeo);
5183         return timeo > 0;                        4825         return timeo > 0;
5184 }                                                4826 }
5185                                                  4827 
5186 static void nfsd4_cb_recall_prepare(struct nf    4828 static void nfsd4_cb_recall_prepare(struct nfsd4_callback *cb)
5187 {                                                4829 {
5188         struct nfs4_delegation *dp = cb_to_de    4830         struct nfs4_delegation *dp = cb_to_delegation(cb);
5189         struct nfsd_net *nn = net_generic(dp-    4831         struct nfsd_net *nn = net_generic(dp->dl_stid.sc_client->net,
5190                                           nfs    4832                                           nfsd_net_id);
5191                                                  4833 
5192         block_delegations(&dp->dl_stid.sc_fil    4834         block_delegations(&dp->dl_stid.sc_file->fi_fhandle);
5193                                                  4835 
5194         /*                                       4836         /*
5195          * We can't do this in nfsd_break_del    4837          * We can't do this in nfsd_break_deleg_cb because it is
5196          * already holding inode->i_lock.        4838          * already holding inode->i_lock.
5197          *                                       4839          *
5198          * If the dl_time != 0, then we know     4840          * If the dl_time != 0, then we know that it has already been
5199          * queued for a lease break. Don't qu    4841          * queued for a lease break. Don't queue it again.
5200          */                                      4842          */
5201         spin_lock(&state_lock);                  4843         spin_lock(&state_lock);
5202         if (delegation_hashed(dp) && dp->dl_t    4844         if (delegation_hashed(dp) && dp->dl_time == 0) {
5203                 dp->dl_time = ktime_get_boott    4845                 dp->dl_time = ktime_get_boottime_seconds();
5204                 list_add_tail(&dp->dl_recall_    4846                 list_add_tail(&dp->dl_recall_lru, &nn->del_recall_lru);
5205         }                                        4847         }
5206         spin_unlock(&state_lock);                4848         spin_unlock(&state_lock);
5207 }                                                4849 }
5208                                                  4850 
5209 static int nfsd4_cb_recall_done(struct nfsd4_    4851 static int nfsd4_cb_recall_done(struct nfsd4_callback *cb,
5210                 struct rpc_task *task)           4852                 struct rpc_task *task)
5211 {                                                4853 {
5212         struct nfs4_delegation *dp = cb_to_de    4854         struct nfs4_delegation *dp = cb_to_delegation(cb);
5213                                                  4855 
5214         trace_nfsd_cb_recall_done(&dp->dl_sti    4856         trace_nfsd_cb_recall_done(&dp->dl_stid.sc_stateid, task);
5215                                                  4857 
5216         if (dp->dl_stid.sc_status)            !! 4858         if (dp->dl_stid.sc_type == NFS4_CLOSED_DELEG_STID ||
5217                 /* CLOSED or REVOKED */       !! 4859             dp->dl_stid.sc_type == NFS4_REVOKED_DELEG_STID)
5218                 return 1;                     !! 4860                 return 1;
5219                                                  4861 
5220         switch (task->tk_status) {               4862         switch (task->tk_status) {
5221         case 0:                                  4863         case 0:
5222                 return 1;                        4864                 return 1;
5223         case -NFS4ERR_DELAY:                     4865         case -NFS4ERR_DELAY:
5224                 rpc_delay(task, 2 * HZ);         4866                 rpc_delay(task, 2 * HZ);
5225                 return 0;                        4867                 return 0;
5226         case -EBADHANDLE:                        4868         case -EBADHANDLE:
5227         case -NFS4ERR_BAD_STATEID:               4869         case -NFS4ERR_BAD_STATEID:
5228                 /*                               4870                 /*
5229                  * Race: client probably got     4871                  * Race: client probably got cb_recall before open reply
5230                  * granting delegation.          4872                  * granting delegation.
5231                  */                              4873                  */
5232                 if (dp->dl_retries--) {          4874                 if (dp->dl_retries--) {
5233                         rpc_delay(task, 2 * H    4875                         rpc_delay(task, 2 * HZ);
5234                         return 0;                4876                         return 0;
5235                 }                                4877                 }
5236                 fallthrough;                     4878                 fallthrough;
5237         default:                                 4879         default:
5238                 return 1;                        4880                 return 1;
5239         }                                        4881         }
5240 }                                                4882 }
5241                                                  4883 
5242 static void nfsd4_cb_recall_release(struct nf    4884 static void nfsd4_cb_recall_release(struct nfsd4_callback *cb)
5243 {                                                4885 {
5244         struct nfs4_delegation *dp = cb_to_de    4886         struct nfs4_delegation *dp = cb_to_delegation(cb);
5245                                                  4887 
5246         nfs4_put_stid(&dp->dl_stid);             4888         nfs4_put_stid(&dp->dl_stid);
5247 }                                                4889 }
5248                                                  4890 
5249 static const struct nfsd4_callback_ops nfsd4_    4891 static const struct nfsd4_callback_ops nfsd4_cb_recall_ops = {
5250         .prepare        = nfsd4_cb_recall_pre    4892         .prepare        = nfsd4_cb_recall_prepare,
5251         .done           = nfsd4_cb_recall_don    4893         .done           = nfsd4_cb_recall_done,
5252         .release        = nfsd4_cb_recall_rel    4894         .release        = nfsd4_cb_recall_release,
5253         .opcode         = OP_CB_RECALL,       << 
5254 };                                               4895 };
5255                                                  4896 
5256 static void nfsd_break_one_deleg(struct nfs4_    4897 static void nfsd_break_one_deleg(struct nfs4_delegation *dp)
5257 {                                                4898 {
5258         /*                                       4899         /*
5259          * We're assuming the state code neve    4900          * We're assuming the state code never drops its reference
5260          * without first removing the lease.     4901          * without first removing the lease.  Since we're in this lease
5261          * callback (and since the lease code    4902          * callback (and since the lease code is serialized by the
5262          * flc_lock) we know the server hasn'    4903          * flc_lock) we know the server hasn't removed the lease yet, and
5263          * we know it's safe to take a refere    4904          * we know it's safe to take a reference.
5264          */                                      4905          */
5265         refcount_inc(&dp->dl_stid.sc_count);     4906         refcount_inc(&dp->dl_stid.sc_count);
5266         WARN_ON_ONCE(!nfsd4_run_cb(&dp->dl_re    4907         WARN_ON_ONCE(!nfsd4_run_cb(&dp->dl_recall));
5267 }                                                4908 }
5268                                                  4909 
5269 /* Called from break_lease() with flc_lock he    4910 /* Called from break_lease() with flc_lock held. */
5270 static bool                                      4911 static bool
5271 nfsd_break_deleg_cb(struct file_lease *fl)    !! 4912 nfsd_break_deleg_cb(struct file_lock *fl)
5272 {                                                4913 {
5273         struct nfs4_delegation *dp = (struct  !! 4914         struct nfs4_delegation *dp = (struct nfs4_delegation *)fl->fl_owner;
5274         struct nfs4_file *fp = dp->dl_stid.sc    4915         struct nfs4_file *fp = dp->dl_stid.sc_file;
5275         struct nfs4_client *clp = dp->dl_stid    4916         struct nfs4_client *clp = dp->dl_stid.sc_client;
5276         struct nfsd_net *nn;                     4917         struct nfsd_net *nn;
5277                                                  4918 
5278         trace_nfsd_cb_recall(&dp->dl_stid);      4919         trace_nfsd_cb_recall(&dp->dl_stid);
5279                                                  4920 
5280         dp->dl_recalled = true;                  4921         dp->dl_recalled = true;
5281         atomic_inc(&clp->cl_delegs_in_recall)    4922         atomic_inc(&clp->cl_delegs_in_recall);
5282         if (try_to_expire_client(clp)) {         4923         if (try_to_expire_client(clp)) {
5283                 nn = net_generic(clp->net, nf    4924                 nn = net_generic(clp->net, nfsd_net_id);
5284                 mod_delayed_work(laundry_wq,     4925                 mod_delayed_work(laundry_wq, &nn->laundromat_work, 0);
5285         }                                        4926         }
5286                                                  4927 
5287         /*                                       4928         /*
5288          * We don't want the locks code to ti    4929          * We don't want the locks code to timeout the lease for us;
5289          * we'll remove it ourself if a deleg    4930          * we'll remove it ourself if a delegation isn't returned
5290          * in time:                              4931          * in time:
5291          */                                      4932          */
5292         fl->fl_break_time = 0;                   4933         fl->fl_break_time = 0;
5293                                                  4934 
                                                   >> 4935         spin_lock(&fp->fi_lock);
5294         fp->fi_had_conflict = true;              4936         fp->fi_had_conflict = true;
5295         nfsd_break_one_deleg(dp);                4937         nfsd_break_one_deleg(dp);
                                                   >> 4938         spin_unlock(&fp->fi_lock);
5296         return false;                            4939         return false;
5297 }                                                4940 }
5298                                                  4941 
5299 /**                                              4942 /**
5300  * nfsd_breaker_owns_lease - Check if lease c    4943  * nfsd_breaker_owns_lease - Check if lease conflict was resolved
5301  * @fl: Lock state to check                      4944  * @fl: Lock state to check
5302  *                                               4945  *
5303  * Return values:                                4946  * Return values:
5304  *   %true: Lease conflict was resolved          4947  *   %true: Lease conflict was resolved
5305  *   %false: Lease conflict was not resolved.    4948  *   %false: Lease conflict was not resolved.
5306  */                                              4949  */
5307 static bool nfsd_breaker_owns_lease(struct fi !! 4950 static bool nfsd_breaker_owns_lease(struct file_lock *fl)
5308 {                                                4951 {
5309         struct nfs4_delegation *dl = fl->c.fl !! 4952         struct nfs4_delegation *dl = fl->fl_owner;
5310         struct svc_rqst *rqst;                   4953         struct svc_rqst *rqst;
5311         struct nfs4_client *clp;                 4954         struct nfs4_client *clp;
5312                                                  4955 
5313         rqst = nfsd_current_rqst();           !! 4956         if (!i_am_nfsd())
5314         if (!nfsd_v4client(rqst))             !! 4957                 return false;
                                                   >> 4958         rqst = kthread_data(current);
                                                   >> 4959         /* Note rq_prog == NFS_ACL_PROGRAM is also possible: */
                                                   >> 4960         if (rqst->rq_prog != NFS_PROGRAM || rqst->rq_vers < 4)
5315                 return false;                    4961                 return false;
5316         clp = *(rqst->rq_lease_breaker);         4962         clp = *(rqst->rq_lease_breaker);
5317         return dl->dl_stid.sc_client == clp;     4963         return dl->dl_stid.sc_client == clp;
5318 }                                                4964 }
5319                                                  4965 
5320 static int                                       4966 static int
5321 nfsd_change_deleg_cb(struct file_lease *onlis !! 4967 nfsd_change_deleg_cb(struct file_lock *onlist, int arg,
5322                      struct list_head *dispos    4968                      struct list_head *dispose)
5323 {                                                4969 {
5324         struct nfs4_delegation *dp = (struct  !! 4970         struct nfs4_delegation *dp = (struct nfs4_delegation *)onlist->fl_owner;
5325         struct nfs4_client *clp = dp->dl_stid    4971         struct nfs4_client *clp = dp->dl_stid.sc_client;
5326                                                  4972 
5327         if (arg & F_UNLCK) {                     4973         if (arg & F_UNLCK) {
5328                 if (dp->dl_recalled)             4974                 if (dp->dl_recalled)
5329                         atomic_dec(&clp->cl_d    4975                         atomic_dec(&clp->cl_delegs_in_recall);
5330                 return lease_modify(onlist, a    4976                 return lease_modify(onlist, arg, dispose);
5331         } else                                   4977         } else
5332                 return -EAGAIN;                  4978                 return -EAGAIN;
5333 }                                                4979 }
5334                                                  4980 
5335 static const struct lease_manager_operations  !! 4981 static const struct lock_manager_operations nfsd_lease_mng_ops = {
5336         .lm_breaker_owns_lease = nfsd_breaker    4982         .lm_breaker_owns_lease = nfsd_breaker_owns_lease,
5337         .lm_break = nfsd_break_deleg_cb,         4983         .lm_break = nfsd_break_deleg_cb,
5338         .lm_change = nfsd_change_deleg_cb,       4984         .lm_change = nfsd_change_deleg_cb,
5339 };                                               4985 };
5340                                                  4986 
5341 static __be32 nfsd4_check_seqid(struct nfsd4_    4987 static __be32 nfsd4_check_seqid(struct nfsd4_compound_state *cstate, struct nfs4_stateowner *so, u32 seqid)
5342 {                                                4988 {
5343         if (nfsd4_has_session(cstate))           4989         if (nfsd4_has_session(cstate))
5344                 return nfs_ok;                   4990                 return nfs_ok;
5345         if (seqid == so->so_seqid - 1)           4991         if (seqid == so->so_seqid - 1)
5346                 return nfserr_replay_me;         4992                 return nfserr_replay_me;
5347         if (seqid == so->so_seqid)               4993         if (seqid == so->so_seqid)
5348                 return nfs_ok;                   4994                 return nfs_ok;
5349         return nfserr_bad_seqid;                 4995         return nfserr_bad_seqid;
5350 }                                                4996 }
5351                                                  4997 
5352 static struct nfs4_client *lookup_clientid(cl    4998 static struct nfs4_client *lookup_clientid(clientid_t *clid, bool sessions,
5353                                                  4999                                                 struct nfsd_net *nn)
5354 {                                                5000 {
5355         struct nfs4_client *found;               5001         struct nfs4_client *found;
5356                                                  5002 
5357         spin_lock(&nn->client_lock);             5003         spin_lock(&nn->client_lock);
5358         found = find_confirmed_client(clid, s    5004         found = find_confirmed_client(clid, sessions, nn);
5359         if (found)                               5005         if (found)
5360                 atomic_inc(&found->cl_rpc_use    5006                 atomic_inc(&found->cl_rpc_users);
5361         spin_unlock(&nn->client_lock);           5007         spin_unlock(&nn->client_lock);
5362         return found;                            5008         return found;
5363 }                                                5009 }
5364                                                  5010 
5365 static __be32 set_client(clientid_t *clid,       5011 static __be32 set_client(clientid_t *clid,
5366                 struct nfsd4_compound_state *    5012                 struct nfsd4_compound_state *cstate,
5367                 struct nfsd_net *nn)             5013                 struct nfsd_net *nn)
5368 {                                                5014 {
5369         if (cstate->clp) {                       5015         if (cstate->clp) {
5370                 if (!same_clid(&cstate->clp->    5016                 if (!same_clid(&cstate->clp->cl_clientid, clid))
5371                         return nfserr_stale_c    5017                         return nfserr_stale_clientid;
5372                 return nfs_ok;                   5018                 return nfs_ok;
5373         }                                        5019         }
5374         if (STALE_CLIENTID(clid, nn))            5020         if (STALE_CLIENTID(clid, nn))
5375                 return nfserr_stale_clientid;    5021                 return nfserr_stale_clientid;
5376         /*                                       5022         /*
5377          * We're in the 4.0 case (otherwise t    5023          * We're in the 4.0 case (otherwise the SEQUENCE op would have
5378          * set cstate->clp), so session = fal    5024          * set cstate->clp), so session = false:
5379          */                                      5025          */
5380         cstate->clp = lookup_clientid(clid, f    5026         cstate->clp = lookup_clientid(clid, false, nn);
5381         if (!cstate->clp)                        5027         if (!cstate->clp)
5382                 return nfserr_expired;           5028                 return nfserr_expired;
5383         return nfs_ok;                           5029         return nfs_ok;
5384 }                                                5030 }
5385                                                  5031 
5386 __be32                                           5032 __be32
5387 nfsd4_process_open1(struct nfsd4_compound_sta    5033 nfsd4_process_open1(struct nfsd4_compound_state *cstate,
5388                     struct nfsd4_open *open,     5034                     struct nfsd4_open *open, struct nfsd_net *nn)
5389 {                                                5035 {
5390         clientid_t *clientid = &open->op_clie    5036         clientid_t *clientid = &open->op_clientid;
5391         struct nfs4_client *clp = NULL;          5037         struct nfs4_client *clp = NULL;
5392         unsigned int strhashval;                 5038         unsigned int strhashval;
5393         struct nfs4_openowner *oo = NULL;        5039         struct nfs4_openowner *oo = NULL;
5394         __be32 status;                           5040         __be32 status;
5395                                                  5041 
5396         /*                                       5042         /*
5397          * In case we need it later, after we    5043          * In case we need it later, after we've already created the
5398          * file and don't want to risk a furt    5044          * file and don't want to risk a further failure:
5399          */                                      5045          */
5400         open->op_file = nfsd4_alloc_file();      5046         open->op_file = nfsd4_alloc_file();
5401         if (open->op_file == NULL)               5047         if (open->op_file == NULL)
5402                 return nfserr_jukebox;           5048                 return nfserr_jukebox;
5403                                                  5049 
5404         status = set_client(clientid, cstate,    5050         status = set_client(clientid, cstate, nn);
5405         if (status)                              5051         if (status)
5406                 return status;                   5052                 return status;
5407         clp = cstate->clp;                       5053         clp = cstate->clp;
5408                                                  5054 
5409         strhashval = ownerstr_hashval(&open->    5055         strhashval = ownerstr_hashval(&open->op_owner);
5410 retry:                                        !! 5056         oo = find_openstateowner_str(strhashval, open, clp);
5411         oo = find_or_alloc_open_stateowner(st << 
5412         open->op_openowner = oo;                 5057         open->op_openowner = oo;
5413         if (!oo)                              !! 5058         if (!oo) {
5414                 return nfserr_jukebox;        !! 5059                 goto new_owner;
5415         if (nfsd4_cstate_assign_replay(cstate !! 5060         }
5416                 nfs4_put_stateowner(&oo->oo_o !! 5061         if (!(oo->oo_flags & NFS4_OO_CONFIRMED)) {
5417                 goto retry;                   !! 5062                 /* Replace unconfirmed owners without checking for replay. */
                                                   >> 5063                 release_openowner(oo);
                                                   >> 5064                 open->op_openowner = NULL;
                                                   >> 5065                 goto new_owner;
5418         }                                        5066         }
5419         status = nfsd4_check_seqid(cstate, &o    5067         status = nfsd4_check_seqid(cstate, &oo->oo_owner, open->op_seqid);
5420         if (status)                              5068         if (status)
5421                 return status;                   5069                 return status;
5422                                               !! 5070         goto alloc_stateid;
                                                   >> 5071 new_owner:
                                                   >> 5072         oo = alloc_init_open_stateowner(strhashval, open, cstate);
                                                   >> 5073         if (oo == NULL)
                                                   >> 5074                 return nfserr_jukebox;
                                                   >> 5075         open->op_openowner = oo;
                                                   >> 5076 alloc_stateid:
5423         open->op_stp = nfs4_alloc_open_statei    5077         open->op_stp = nfs4_alloc_open_stateid(clp);
5424         if (!open->op_stp)                       5078         if (!open->op_stp)
5425                 return nfserr_jukebox;           5079                 return nfserr_jukebox;
5426                                                  5080 
5427         if (nfsd4_has_session(cstate) &&         5081         if (nfsd4_has_session(cstate) &&
5428             (cstate->current_fh.fh_export->ex    5082             (cstate->current_fh.fh_export->ex_flags & NFSEXP_PNFS)) {
5429                 open->op_odstate = alloc_clnt    5083                 open->op_odstate = alloc_clnt_odstate(clp);
5430                 if (!open->op_odstate)           5084                 if (!open->op_odstate)
5431                         return nfserr_jukebox    5085                         return nfserr_jukebox;
5432         }                                        5086         }
5433                                                  5087 
5434         return nfs_ok;                           5088         return nfs_ok;
5435 }                                                5089 }
5436                                                  5090 
5437 static inline __be32                             5091 static inline __be32
5438 nfs4_check_delegmode(struct nfs4_delegation *    5092 nfs4_check_delegmode(struct nfs4_delegation *dp, int flags)
5439 {                                                5093 {
5440         if ((flags & WR_STATE) && (dp->dl_typ    5094         if ((flags & WR_STATE) && (dp->dl_type == NFS4_OPEN_DELEGATE_READ))
5441                 return nfserr_openmode;          5095                 return nfserr_openmode;
5442         else                                     5096         else
5443                 return nfs_ok;                   5097                 return nfs_ok;
5444 }                                                5098 }
5445                                                  5099 
5446 static int share_access_to_flags(u32 share_ac    5100 static int share_access_to_flags(u32 share_access)
5447 {                                                5101 {
5448         return share_access == NFS4_SHARE_ACC    5102         return share_access == NFS4_SHARE_ACCESS_READ ? RD_STATE : WR_STATE;
5449 }                                                5103 }
5450                                                  5104 
5451 static struct nfs4_delegation *find_deleg_sta !! 5105 static struct nfs4_delegation *find_deleg_stateid(struct nfs4_client *cl, stateid_t *s)
5452                                               << 
5453 {                                                5106 {
5454         struct nfs4_stid *ret;                   5107         struct nfs4_stid *ret;
5455                                                  5108 
5456         ret = find_stateid_by_type(cl, s, SC_ !! 5109         ret = find_stateid_by_type(cl, s,
                                                   >> 5110                                 NFS4_DELEG_STID|NFS4_REVOKED_DELEG_STID);
5457         if (!ret)                                5111         if (!ret)
5458                 return NULL;                     5112                 return NULL;
5459         return delegstateid(ret);                5113         return delegstateid(ret);
5460 }                                                5114 }
5461                                                  5115 
5462 static bool nfsd4_is_deleg_cur(struct nfsd4_o    5116 static bool nfsd4_is_deleg_cur(struct nfsd4_open *open)
5463 {                                                5117 {
5464         return open->op_claim_type == NFS4_OP    5118         return open->op_claim_type == NFS4_OPEN_CLAIM_DELEGATE_CUR ||
5465                open->op_claim_type == NFS4_OP    5119                open->op_claim_type == NFS4_OPEN_CLAIM_DELEG_CUR_FH;
5466 }                                                5120 }
5467                                                  5121 
5468 static __be32                                    5122 static __be32
5469 nfs4_check_deleg(struct nfs4_client *cl, stru    5123 nfs4_check_deleg(struct nfs4_client *cl, struct nfsd4_open *open,
5470                 struct nfs4_delegation **dp)     5124                 struct nfs4_delegation **dp)
5471 {                                                5125 {
5472         int flags;                               5126         int flags;
5473         __be32 status = nfserr_bad_stateid;      5127         __be32 status = nfserr_bad_stateid;
5474         struct nfs4_delegation *deleg;           5128         struct nfs4_delegation *deleg;
5475                                                  5129 
5476         deleg = find_deleg_stateid(cl, &open-    5130         deleg = find_deleg_stateid(cl, &open->op_delegate_stateid);
5477         if (deleg == NULL)                       5131         if (deleg == NULL)
5478                 goto out;                        5132                 goto out;
5479         if (deleg->dl_stid.sc_status & SC_STA !! 5133         if (deleg->dl_stid.sc_type == NFS4_REVOKED_DELEG_STID) {
5480                 nfs4_put_stid(&deleg->dl_stid    5134                 nfs4_put_stid(&deleg->dl_stid);
5481                 status = nfserr_admin_revoked !! 5135                 if (cl->cl_minorversion)
5482                 goto out;                     !! 5136                         status = nfserr_deleg_revoked;
5483         }                                     << 
5484         if (deleg->dl_stid.sc_status & SC_STA << 
5485                 nfs4_put_stid(&deleg->dl_stid << 
5486                 nfsd40_drop_revoked_stid(cl,  << 
5487                 status = nfserr_deleg_revoked << 
5488                 goto out;                        5137                 goto out;
5489         }                                        5138         }
5490         flags = share_access_to_flags(open->o    5139         flags = share_access_to_flags(open->op_share_access);
5491         status = nfs4_check_delegmode(deleg,     5140         status = nfs4_check_delegmode(deleg, flags);
5492         if (status) {                            5141         if (status) {
5493                 nfs4_put_stid(&deleg->dl_stid    5142                 nfs4_put_stid(&deleg->dl_stid);
5494                 goto out;                        5143                 goto out;
5495         }                                        5144         }
5496         *dp = deleg;                             5145         *dp = deleg;
5497 out:                                             5146 out:
5498         if (!nfsd4_is_deleg_cur(open))           5147         if (!nfsd4_is_deleg_cur(open))
5499                 return nfs_ok;                   5148                 return nfs_ok;
5500         if (status)                              5149         if (status)
5501                 return status;                   5150                 return status;
5502         open->op_openowner->oo_flags |= NFS4_    5151         open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
5503         return nfs_ok;                           5152         return nfs_ok;
5504 }                                                5153 }
5505                                                  5154 
5506 static inline int nfs4_access_to_access(u32 n    5155 static inline int nfs4_access_to_access(u32 nfs4_access)
5507 {                                                5156 {
5508         int flags = 0;                           5157         int flags = 0;
5509                                                  5158 
5510         if (nfs4_access & NFS4_SHARE_ACCESS_R    5159         if (nfs4_access & NFS4_SHARE_ACCESS_READ)
5511                 flags |= NFSD_MAY_READ;          5160                 flags |= NFSD_MAY_READ;
5512         if (nfs4_access & NFS4_SHARE_ACCESS_W    5161         if (nfs4_access & NFS4_SHARE_ACCESS_WRITE)
5513                 flags |= NFSD_MAY_WRITE;         5162                 flags |= NFSD_MAY_WRITE;
5514         return flags;                            5163         return flags;
5515 }                                                5164 }
5516                                                  5165 
5517 static inline __be32                             5166 static inline __be32
5518 nfsd4_truncate(struct svc_rqst *rqstp, struct    5167 nfsd4_truncate(struct svc_rqst *rqstp, struct svc_fh *fh,
5519                 struct nfsd4_open *open)         5168                 struct nfsd4_open *open)
5520 {                                                5169 {
5521         struct iattr iattr = {                   5170         struct iattr iattr = {
5522                 .ia_valid = ATTR_SIZE,           5171                 .ia_valid = ATTR_SIZE,
5523                 .ia_size = 0,                    5172                 .ia_size = 0,
5524         };                                       5173         };
5525         struct nfsd_attrs attrs = {              5174         struct nfsd_attrs attrs = {
5526                 .na_iattr       = &iattr,        5175                 .na_iattr       = &iattr,
5527         };                                       5176         };
5528         if (!open->op_truncate)                  5177         if (!open->op_truncate)
5529                 return 0;                        5178                 return 0;
5530         if (!(open->op_share_access & NFS4_SH    5179         if (!(open->op_share_access & NFS4_SHARE_ACCESS_WRITE))
5531                 return nfserr_inval;             5180                 return nfserr_inval;
5532         return nfsd_setattr(rqstp, fh, &attrs !! 5181         return nfsd_setattr(rqstp, fh, &attrs, 0, (time64_t)0);
5533 }                                                5182 }
5534                                                  5183 
5535 static __be32 nfs4_get_vfs_file(struct svc_rq    5184 static __be32 nfs4_get_vfs_file(struct svc_rqst *rqstp, struct nfs4_file *fp,
5536                 struct svc_fh *cur_fh, struct    5185                 struct svc_fh *cur_fh, struct nfs4_ol_stateid *stp,
5537                 struct nfsd4_open *open, bool    5186                 struct nfsd4_open *open, bool new_stp)
5538 {                                                5187 {
5539         struct nfsd_file *nf = NULL;             5188         struct nfsd_file *nf = NULL;
5540         __be32 status;                           5189         __be32 status;
5541         int oflag = nfs4_access_to_omode(open    5190         int oflag = nfs4_access_to_omode(open->op_share_access);
5542         int access = nfs4_access_to_access(op    5191         int access = nfs4_access_to_access(open->op_share_access);
5543         unsigned char old_access_bmap, old_de    5192         unsigned char old_access_bmap, old_deny_bmap;
5544                                                  5193 
5545         spin_lock(&fp->fi_lock);                 5194         spin_lock(&fp->fi_lock);
5546                                                  5195 
5547         /*                                       5196         /*
5548          * Are we trying to set a deny mode t    5197          * Are we trying to set a deny mode that would conflict with
5549          * current access?                       5198          * current access?
5550          */                                      5199          */
5551         status = nfs4_file_check_deny(fp, ope    5200         status = nfs4_file_check_deny(fp, open->op_share_deny);
5552         if (status != nfs_ok) {                  5201         if (status != nfs_ok) {
5553                 if (status != nfserr_share_de    5202                 if (status != nfserr_share_denied) {
5554                         spin_unlock(&fp->fi_l    5203                         spin_unlock(&fp->fi_lock);
5555                         goto out;                5204                         goto out;
5556                 }                                5205                 }
5557                 if (nfs4_resolve_deny_conflic    5206                 if (nfs4_resolve_deny_conflicts_locked(fp, new_stp,
5558                                 stp, open->op    5207                                 stp, open->op_share_deny, false))
5559                         status = nfserr_jukeb    5208                         status = nfserr_jukebox;
5560                 spin_unlock(&fp->fi_lock);       5209                 spin_unlock(&fp->fi_lock);
5561                 goto out;                        5210                 goto out;
5562         }                                        5211         }
5563                                                  5212 
5564         /* set access to the file */             5213         /* set access to the file */
5565         status = nfs4_file_get_access(fp, ope    5214         status = nfs4_file_get_access(fp, open->op_share_access);
5566         if (status != nfs_ok) {                  5215         if (status != nfs_ok) {
5567                 if (status != nfserr_share_de    5216                 if (status != nfserr_share_denied) {
5568                         spin_unlock(&fp->fi_l    5217                         spin_unlock(&fp->fi_lock);
5569                         goto out;                5218                         goto out;
5570                 }                                5219                 }
5571                 if (nfs4_resolve_deny_conflic    5220                 if (nfs4_resolve_deny_conflicts_locked(fp, new_stp,
5572                                 stp, open->op    5221                                 stp, open->op_share_access, true))
5573                         status = nfserr_jukeb    5222                         status = nfserr_jukebox;
5574                 spin_unlock(&fp->fi_lock);       5223                 spin_unlock(&fp->fi_lock);
5575                 goto out;                        5224                 goto out;
5576         }                                        5225         }
5577                                                  5226 
5578         /* Set access bits in stateid */         5227         /* Set access bits in stateid */
5579         old_access_bmap = stp->st_access_bmap    5228         old_access_bmap = stp->st_access_bmap;
5580         set_access(open->op_share_access, stp    5229         set_access(open->op_share_access, stp);
5581                                                  5230 
5582         /* Set new deny mask */                  5231         /* Set new deny mask */
5583         old_deny_bmap = stp->st_deny_bmap;       5232         old_deny_bmap = stp->st_deny_bmap;
5584         set_deny(open->op_share_deny, stp);      5233         set_deny(open->op_share_deny, stp);
5585         fp->fi_share_deny |= (open->op_share_    5234         fp->fi_share_deny |= (open->op_share_deny & NFS4_SHARE_DENY_BOTH);
5586                                                  5235 
5587         if (!fp->fi_fds[oflag]) {                5236         if (!fp->fi_fds[oflag]) {
5588                 spin_unlock(&fp->fi_lock);       5237                 spin_unlock(&fp->fi_lock);
5589                                                  5238 
5590                 status = nfsd_file_acquire_op    5239                 status = nfsd_file_acquire_opened(rqstp, cur_fh, access,
5591                                                  5240                                                   open->op_filp, &nf);
5592                 if (status != nfs_ok)            5241                 if (status != nfs_ok)
5593                         goto out_put_access;     5242                         goto out_put_access;
5594                                                  5243 
5595                 spin_lock(&fp->fi_lock);         5244                 spin_lock(&fp->fi_lock);
5596                 if (!fp->fi_fds[oflag]) {        5245                 if (!fp->fi_fds[oflag]) {
5597                         fp->fi_fds[oflag] = n    5246                         fp->fi_fds[oflag] = nf;
5598                         nf = NULL;               5247                         nf = NULL;
5599                 }                                5248                 }
5600         }                                        5249         }
5601         spin_unlock(&fp->fi_lock);               5250         spin_unlock(&fp->fi_lock);
5602         if (nf)                                  5251         if (nf)
5603                 nfsd_file_put(nf);               5252                 nfsd_file_put(nf);
5604                                                  5253 
5605         status = nfserrno(nfsd_open_break_lea    5254         status = nfserrno(nfsd_open_break_lease(cur_fh->fh_dentry->d_inode,
5606                                                  5255                                                                 access));
5607         if (status)                              5256         if (status)
5608                 goto out_put_access;             5257                 goto out_put_access;
5609                                                  5258 
5610         status = nfsd4_truncate(rqstp, cur_fh    5259         status = nfsd4_truncate(rqstp, cur_fh, open);
5611         if (status)                              5260         if (status)
5612                 goto out_put_access;             5261                 goto out_put_access;
5613 out:                                             5262 out:
5614         return status;                           5263         return status;
5615 out_put_access:                                  5264 out_put_access:
5616         stp->st_access_bmap = old_access_bmap    5265         stp->st_access_bmap = old_access_bmap;
5617         nfs4_file_put_access(fp, open->op_sha    5266         nfs4_file_put_access(fp, open->op_share_access);
5618         reset_union_bmap_deny(bmap_to_share_m    5267         reset_union_bmap_deny(bmap_to_share_mode(old_deny_bmap), stp);
5619         goto out;                                5268         goto out;
5620 }                                                5269 }
5621                                                  5270 
5622 static __be32                                    5271 static __be32
5623 nfs4_upgrade_open(struct svc_rqst *rqstp, str    5272 nfs4_upgrade_open(struct svc_rqst *rqstp, struct nfs4_file *fp,
5624                 struct svc_fh *cur_fh, struct    5273                 struct svc_fh *cur_fh, struct nfs4_ol_stateid *stp,
5625                 struct nfsd4_open *open)         5274                 struct nfsd4_open *open)
5626 {                                                5275 {
5627         __be32 status;                           5276         __be32 status;
5628         unsigned char old_deny_bmap = stp->st    5277         unsigned char old_deny_bmap = stp->st_deny_bmap;
5629                                                  5278 
5630         if (!test_access(open->op_share_acces    5279         if (!test_access(open->op_share_access, stp))
5631                 return nfs4_get_vfs_file(rqst    5280                 return nfs4_get_vfs_file(rqstp, fp, cur_fh, stp, open, false);
5632                                                  5281 
5633         /* test and set deny mode */             5282         /* test and set deny mode */
5634         spin_lock(&fp->fi_lock);                 5283         spin_lock(&fp->fi_lock);
5635         status = nfs4_file_check_deny(fp, ope    5284         status = nfs4_file_check_deny(fp, open->op_share_deny);
5636         switch (status) {                        5285         switch (status) {
5637         case nfs_ok:                             5286         case nfs_ok:
5638                 set_deny(open->op_share_deny,    5287                 set_deny(open->op_share_deny, stp);
5639                 fp->fi_share_deny |=             5288                 fp->fi_share_deny |=
5640                         (open->op_share_deny     5289                         (open->op_share_deny & NFS4_SHARE_DENY_BOTH);
5641                 break;                           5290                 break;
5642         case nfserr_share_denied:                5291         case nfserr_share_denied:
5643                 if (nfs4_resolve_deny_conflic    5292                 if (nfs4_resolve_deny_conflicts_locked(fp, false,
5644                                 stp, open->op    5293                                 stp, open->op_share_deny, false))
5645                         status = nfserr_jukeb    5294                         status = nfserr_jukebox;
5646                 break;                           5295                 break;
5647         }                                        5296         }
5648         spin_unlock(&fp->fi_lock);               5297         spin_unlock(&fp->fi_lock);
5649                                                  5298 
5650         if (status != nfs_ok)                    5299         if (status != nfs_ok)
5651                 return status;                   5300                 return status;
5652                                                  5301 
5653         status = nfsd4_truncate(rqstp, cur_fh    5302         status = nfsd4_truncate(rqstp, cur_fh, open);
5654         if (status != nfs_ok)                    5303         if (status != nfs_ok)
5655                 reset_union_bmap_deny(old_den    5304                 reset_union_bmap_deny(old_deny_bmap, stp);
5656         return status;                           5305         return status;
5657 }                                                5306 }
5658                                                  5307 
5659 /* Should we give out recallable state?: */      5308 /* Should we give out recallable state?: */
5660 static bool nfsd4_cb_channel_good(struct nfs4    5309 static bool nfsd4_cb_channel_good(struct nfs4_client *clp)
5661 {                                                5310 {
5662         if (clp->cl_cb_state == NFSD4_CB_UP)     5311         if (clp->cl_cb_state == NFSD4_CB_UP)
5663                 return true;                     5312                 return true;
5664         /*                                       5313         /*
5665          * In the sessions case, since we don    5314          * In the sessions case, since we don't have to establish a
5666          * separate connection for callbacks,    5315          * separate connection for callbacks, we assume it's OK
5667          * until we hear otherwise:              5316          * until we hear otherwise:
5668          */                                      5317          */
5669         return clp->cl_minorversion && clp->c    5318         return clp->cl_minorversion && clp->cl_cb_state == NFSD4_CB_UNKNOWN;
5670 }                                                5319 }
5671                                                  5320 
5672 static struct file_lease *nfs4_alloc_init_lea !! 5321 static struct file_lock *nfs4_alloc_init_lease(struct nfs4_delegation *dp,
5673                                                  5322                                                 int flag)
5674 {                                                5323 {
5675         struct file_lease *fl;                !! 5324         struct file_lock *fl;
5676                                                  5325 
5677         fl = locks_alloc_lease();             !! 5326         fl = locks_alloc_lock();
5678         if (!fl)                                 5327         if (!fl)
5679                 return NULL;                     5328                 return NULL;
5680         fl->fl_lmops = &nfsd_lease_mng_ops;      5329         fl->fl_lmops = &nfsd_lease_mng_ops;
5681         fl->c.flc_flags = FL_DELEG;           !! 5330         fl->fl_flags = FL_DELEG;
5682         fl->c.flc_type = flag == NFS4_OPEN_DE !! 5331         fl->fl_type = flag == NFS4_OPEN_DELEGATE_READ? F_RDLCK: F_WRLCK;
5683         fl->c.flc_owner = (fl_owner_t)dp;     !! 5332         fl->fl_end = OFFSET_MAX;
5684         fl->c.flc_pid = current->tgid;        !! 5333         fl->fl_owner = (fl_owner_t)dp;
5685         fl->c.flc_file = dp->dl_stid.sc_file- !! 5334         fl->fl_pid = current->tgid;
                                                   >> 5335         fl->fl_file = dp->dl_stid.sc_file->fi_deleg_file->nf_file;
5686         return fl;                               5336         return fl;
5687 }                                                5337 }
5688                                                  5338 
5689 static int nfsd4_check_conflicting_opens(stru    5339 static int nfsd4_check_conflicting_opens(struct nfs4_client *clp,
5690                                          stru    5340                                          struct nfs4_file *fp)
5691 {                                                5341 {
5692         struct nfs4_ol_stateid *st;              5342         struct nfs4_ol_stateid *st;
5693         struct file *f = fp->fi_deleg_file->n    5343         struct file *f = fp->fi_deleg_file->nf_file;
5694         struct inode *ino = file_inode(f);       5344         struct inode *ino = file_inode(f);
5695         int writes;                              5345         int writes;
5696                                                  5346 
5697         writes = atomic_read(&ino->i_writecou    5347         writes = atomic_read(&ino->i_writecount);
5698         if (!writes)                             5348         if (!writes)
5699                 return 0;                        5349                 return 0;
5700         /*                                       5350         /*
5701          * There could be multiple filehandle    5351          * There could be multiple filehandles (hence multiple
5702          * nfs4_files) referencing this file,    5352          * nfs4_files) referencing this file, but that's not too
5703          * common; let's just give up in that    5353          * common; let's just give up in that case rather than
5704          * trying to go look up all the clien    5354          * trying to go look up all the clients using that other
5705          * nfs4_file as well:                    5355          * nfs4_file as well:
5706          */                                      5356          */
5707         if (fp->fi_aliased)                      5357         if (fp->fi_aliased)
5708                 return -EAGAIN;                  5358                 return -EAGAIN;
5709         /*                                       5359         /*
5710          * If there's a close in progress, ma    5360          * If there's a close in progress, make sure that we see it
5711          * clear any fi_fds[] entries before     5361          * clear any fi_fds[] entries before we see it decrement
5712          * i_writecount:                         5362          * i_writecount:
5713          */                                      5363          */
5714         smp_mb__after_atomic();                  5364         smp_mb__after_atomic();
5715                                                  5365 
5716         if (fp->fi_fds[O_WRONLY])                5366         if (fp->fi_fds[O_WRONLY])
5717                 writes--;                        5367                 writes--;
5718         if (fp->fi_fds[O_RDWR])                  5368         if (fp->fi_fds[O_RDWR])
5719                 writes--;                        5369                 writes--;
5720         if (writes > 0)                          5370         if (writes > 0)
5721                 return -EAGAIN; /* There may     5371                 return -EAGAIN; /* There may be non-NFSv4 writers */
5722         /*                                       5372         /*
5723          * It's possible there are non-NFSv4     5373          * It's possible there are non-NFSv4 write opens in progress,
5724          * but if they haven't incremented i_    5374          * but if they haven't incremented i_writecount yet then they
5725          * also haven't called break lease ye    5375          * also haven't called break lease yet; so, they'll break this
5726          * lease soon enough.  So, all that's    5376          * lease soon enough.  So, all that's left to check for is NFSv4
5727          * opens:                                5377          * opens:
5728          */                                      5378          */
5729         spin_lock(&fp->fi_lock);                 5379         spin_lock(&fp->fi_lock);
5730         list_for_each_entry(st, &fp->fi_state    5380         list_for_each_entry(st, &fp->fi_stateids, st_perfile) {
5731                 if (st->st_openstp == NULL /*    5381                 if (st->st_openstp == NULL /* it's an open */ &&
5732                     access_permit_write(st) &    5382                     access_permit_write(st) &&
5733                     st->st_stid.sc_client !=     5383                     st->st_stid.sc_client != clp) {
5734                         spin_unlock(&fp->fi_l    5384                         spin_unlock(&fp->fi_lock);
5735                         return -EAGAIN;          5385                         return -EAGAIN;
5736                 }                                5386                 }
5737         }                                        5387         }
5738         spin_unlock(&fp->fi_lock);               5388         spin_unlock(&fp->fi_lock);
5739         /*                                       5389         /*
5740          * There's a small chance that we cou    5390          * There's a small chance that we could be racing with another
5741          * NFSv4 open.  However, any open tha    5391          * NFSv4 open.  However, any open that hasn't added itself to
5742          * the fi_stateids list also hasn't c    5392          * the fi_stateids list also hasn't called break_lease yet; so,
5743          * they'll break this lease soon enou    5393          * they'll break this lease soon enough.
5744          */                                      5394          */
5745         return 0;                                5395         return 0;
5746 }                                                5396 }
5747                                                  5397 
5748 /*                                               5398 /*
5749  * It's possible that between opening the den    5399  * It's possible that between opening the dentry and setting the delegation,
5750  * that it has been renamed or unlinked. Redo    5400  * that it has been renamed or unlinked. Redo the lookup to verify that this
5751  * hasn't happened.                              5401  * hasn't happened.
5752  */                                              5402  */
5753 static int                                       5403 static int
5754 nfsd4_verify_deleg_dentry(struct nfsd4_open *    5404 nfsd4_verify_deleg_dentry(struct nfsd4_open *open, struct nfs4_file *fp,
5755                           struct svc_fh *pare    5405                           struct svc_fh *parent)
5756 {                                                5406 {
5757         struct svc_export *exp;                  5407         struct svc_export *exp;
5758         struct dentry *child;                    5408         struct dentry *child;
5759         __be32 err;                              5409         __be32 err;
5760                                                  5410 
5761         err = nfsd_lookup_dentry(open->op_rqs    5411         err = nfsd_lookup_dentry(open->op_rqstp, parent,
5762                                  open->op_fna    5412                                  open->op_fname, open->op_fnamelen,
5763                                  &exp, &child    5413                                  &exp, &child);
5764                                                  5414 
5765         if (err)                                 5415         if (err)
5766                 return -EAGAIN;                  5416                 return -EAGAIN;
5767                                                  5417 
5768         exp_put(exp);                            5418         exp_put(exp);
5769         dput(child);                             5419         dput(child);
5770         if (child != file_dentry(fp->fi_deleg    5420         if (child != file_dentry(fp->fi_deleg_file->nf_file))
5771                 return -EAGAIN;                  5421                 return -EAGAIN;
5772                                                  5422 
5773         return 0;                                5423         return 0;
5774 }                                                5424 }
5775                                                  5425 
5776 /*                                               5426 /*
5777  * We avoid breaking delegations held by a cl    5427  * We avoid breaking delegations held by a client due to its own activity, but
5778  * clearing setuid/setgid bits on a write is     5428  * clearing setuid/setgid bits on a write is an implicit activity and the client
5779  * may not notice and continue using the old     5429  * may not notice and continue using the old mode. Avoid giving out a delegation
5780  * on setuid/setgid files when the client is     5430  * on setuid/setgid files when the client is requesting an open for write.
5781  */                                              5431  */
5782 static int                                       5432 static int
5783 nfsd4_verify_setuid_write(struct nfsd4_open *    5433 nfsd4_verify_setuid_write(struct nfsd4_open *open, struct nfsd_file *nf)
5784 {                                                5434 {
5785         struct inode *inode = file_inode(nf->    5435         struct inode *inode = file_inode(nf->nf_file);
5786                                                  5436 
5787         if ((open->op_share_access & NFS4_SHA    5437         if ((open->op_share_access & NFS4_SHARE_ACCESS_WRITE) &&
5788             (inode->i_mode & (S_ISUID|S_ISGID    5438             (inode->i_mode & (S_ISUID|S_ISGID)))
5789                 return -EAGAIN;                  5439                 return -EAGAIN;
5790         return 0;                                5440         return 0;
5791 }                                                5441 }
5792                                                  5442 
5793 static struct nfs4_delegation *                  5443 static struct nfs4_delegation *
5794 nfs4_set_delegation(struct nfsd4_open *open,     5444 nfs4_set_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp,
5795                     struct svc_fh *parent)       5445                     struct svc_fh *parent)
5796 {                                                5446 {
5797         int status = 0;                          5447         int status = 0;
5798         struct nfs4_client *clp = stp->st_sti    5448         struct nfs4_client *clp = stp->st_stid.sc_client;
5799         struct nfs4_file *fp = stp->st_stid.s    5449         struct nfs4_file *fp = stp->st_stid.sc_file;
5800         struct nfs4_clnt_odstate *odstate = s    5450         struct nfs4_clnt_odstate *odstate = stp->st_clnt_odstate;
5801         struct nfs4_delegation *dp;              5451         struct nfs4_delegation *dp;
5802         struct nfsd_file *nf = NULL;          !! 5452         struct nfsd_file *nf;
5803         struct file_lease *fl;                !! 5453         struct file_lock *fl;
5804         u32 dl_type;                          << 
5805                                                  5454 
5806         /*                                       5455         /*
5807          * The fi_had_conflict and nfs_get_ex    5456          * The fi_had_conflict and nfs_get_existing_delegation checks
5808          * here are just optimizations; we'll    5457          * here are just optimizations; we'll need to recheck them at
5809          * the end:                              5458          * the end:
5810          */                                      5459          */
5811         if (fp->fi_had_conflict)                 5460         if (fp->fi_had_conflict)
5812                 return ERR_PTR(-EAGAIN);         5461                 return ERR_PTR(-EAGAIN);
5813                                                  5462 
5814         /*                                    !! 5463         nf = find_readable_file(fp);
5815          * Try for a write delegation first.  !! 5464         if (!nf) {
5816          *                                    !! 5465                 /*
5817          *  "An OPEN_DELEGATE_WRITE delegatio !! 5466                  * We probably could attempt another open and get a read
5818          *   on its own, all opens."          !! 5467                  * delegation, but for now, don't bother until the
5819          *                                    !! 5468                  * client actually sends us one.
5820          * Furthermore the client can use a w !! 5469                  */
5821          * operations as well, so we require  << 
5822          *                                    << 
5823          * Offer a write delegation in the ca << 
5824          * we get the O_RDWR descriptor.      << 
5825          */                                   << 
5826         if ((open->op_share_access & NFS4_SHA << 
5827                 nf = find_rw_file(fp);        << 
5828                 dl_type = NFS4_OPEN_DELEGATE_ << 
5829         }                                     << 
5830                                               << 
5831         /*                                    << 
5832          * If the file is being opened O_RDON << 
5833          * file for some reason, then try for << 
5834          */                                   << 
5835         if (!nf && (open->op_share_access & N << 
5836                 nf = find_readable_file(fp);  << 
5837                 dl_type = NFS4_OPEN_DELEGATE_ << 
5838         }                                     << 
5839                                               << 
5840         if (!nf)                              << 
5841                 return ERR_PTR(-EAGAIN);         5470                 return ERR_PTR(-EAGAIN);
5842                                               !! 5471         }
5843         spin_lock(&state_lock);                  5472         spin_lock(&state_lock);
5844         spin_lock(&fp->fi_lock);                 5473         spin_lock(&fp->fi_lock);
5845         if (nfs4_delegation_exists(clp, fp))     5474         if (nfs4_delegation_exists(clp, fp))
5846                 status = -EAGAIN;                5475                 status = -EAGAIN;
5847         else if (nfsd4_verify_setuid_write(op    5476         else if (nfsd4_verify_setuid_write(open, nf))
5848                 status = -EAGAIN;                5477                 status = -EAGAIN;
5849         else if (!fp->fi_deleg_file) {           5478         else if (!fp->fi_deleg_file) {
5850                 fp->fi_deleg_file = nf;          5479                 fp->fi_deleg_file = nf;
5851                 /* increment early to prevent    5480                 /* increment early to prevent fi_deleg_file from being
5852                  * cleared */                    5481                  * cleared */
5853                 fp->fi_delegees = 1;             5482                 fp->fi_delegees = 1;
5854                 nf = NULL;                       5483                 nf = NULL;
5855         } else                                   5484         } else
5856                 fp->fi_delegees++;               5485                 fp->fi_delegees++;
5857         spin_unlock(&fp->fi_lock);               5486         spin_unlock(&fp->fi_lock);
5858         spin_unlock(&state_lock);                5487         spin_unlock(&state_lock);
5859         if (nf)                                  5488         if (nf)
5860                 nfsd_file_put(nf);               5489                 nfsd_file_put(nf);
5861         if (status)                              5490         if (status)
5862                 return ERR_PTR(status);          5491                 return ERR_PTR(status);
5863                                                  5492 
5864         status = -ENOMEM;                        5493         status = -ENOMEM;
5865         dp = alloc_init_deleg(clp, fp, odstat !! 5494         dp = alloc_init_deleg(clp, fp, odstate);
5866         if (!dp)                                 5495         if (!dp)
5867                 goto out_delegees;               5496                 goto out_delegees;
5868                                                  5497 
5869         fl = nfs4_alloc_init_lease(dp, dl_typ !! 5498         fl = nfs4_alloc_init_lease(dp, NFS4_OPEN_DELEGATE_READ);
5870         if (!fl)                                 5499         if (!fl)
5871                 goto out_clnt_odstate;           5500                 goto out_clnt_odstate;
5872                                                  5501 
5873         status = kernel_setlease(fp->fi_deleg !! 5502         status = vfs_setlease(fp->fi_deleg_file->nf_file, fl->fl_type, &fl, NULL);
5874                                       fl->c.f << 
5875         if (fl)                                  5503         if (fl)
5876                 locks_free_lease(fl);         !! 5504                 locks_free_lock(fl);
5877         if (status)                              5505         if (status)
5878                 goto out_clnt_odstate;           5506                 goto out_clnt_odstate;
5879                                                  5507 
5880         if (parent) {                            5508         if (parent) {
5881                 status = nfsd4_verify_deleg_d    5509                 status = nfsd4_verify_deleg_dentry(open, fp, parent);
5882                 if (status)                      5510                 if (status)
5883                         goto out_unlock;         5511                         goto out_unlock;
5884         }                                        5512         }
5885                                                  5513 
5886         status = nfsd4_check_conflicting_open    5514         status = nfsd4_check_conflicting_opens(clp, fp);
5887         if (status)                              5515         if (status)
5888                 goto out_unlock;                 5516                 goto out_unlock;
5889                                                  5517 
5890         /*                                       5518         /*
5891          * Now that the deleg is set, check a    5519          * Now that the deleg is set, check again to ensure that nothing
5892          * raced in and changed the mode whil !! 5520          * raced in and changed the mode while we weren't lookng.
5893          */                                      5521          */
5894         status = nfsd4_verify_setuid_write(op    5522         status = nfsd4_verify_setuid_write(open, fp->fi_deleg_file);
5895         if (status)                              5523         if (status)
5896                 goto out_unlock;                 5524                 goto out_unlock;
5897                                                  5525 
5898         status = -EAGAIN;                     << 
5899         if (fp->fi_had_conflict)              << 
5900                 goto out_unlock;              << 
5901                                               << 
5902         spin_lock(&state_lock);                  5526         spin_lock(&state_lock);
5903         spin_lock(&clp->cl_lock);             << 
5904         spin_lock(&fp->fi_lock);                 5527         spin_lock(&fp->fi_lock);
5905         status = hash_delegation_locked(dp, f !! 5528         if (fp->fi_had_conflict)
                                                   >> 5529                 status = -EAGAIN;
                                                   >> 5530         else
                                                   >> 5531                 status = hash_delegation_locked(dp, fp);
5906         spin_unlock(&fp->fi_lock);               5532         spin_unlock(&fp->fi_lock);
5907         spin_unlock(&clp->cl_lock);           << 
5908         spin_unlock(&state_lock);                5533         spin_unlock(&state_lock);
5909                                                  5534 
5910         if (status)                              5535         if (status)
5911                 goto out_unlock;                 5536                 goto out_unlock;
5912                                                  5537 
5913         return dp;                               5538         return dp;
5914 out_unlock:                                      5539 out_unlock:
5915         kernel_setlease(fp->fi_deleg_file->nf !! 5540         vfs_setlease(fp->fi_deleg_file->nf_file, F_UNLCK, NULL, (void **)&dp);
5916 out_clnt_odstate:                                5541 out_clnt_odstate:
5917         put_clnt_odstate(dp->dl_clnt_odstate)    5542         put_clnt_odstate(dp->dl_clnt_odstate);
5918         nfs4_put_stid(&dp->dl_stid);             5543         nfs4_put_stid(&dp->dl_stid);
5919 out_delegees:                                    5544 out_delegees:
5920         put_deleg_file(fp);                      5545         put_deleg_file(fp);
5921         return ERR_PTR(status);                  5546         return ERR_PTR(status);
5922 }                                                5547 }
5923                                                  5548 
5924 static void nfsd4_open_deleg_none_ext(struct     5549 static void nfsd4_open_deleg_none_ext(struct nfsd4_open *open, int status)
5925 {                                                5550 {
5926         open->op_delegate_type = NFS4_OPEN_DE    5551         open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
5927         if (status == -EAGAIN)                   5552         if (status == -EAGAIN)
5928                 open->op_why_no_deleg = WND4_    5553                 open->op_why_no_deleg = WND4_CONTENTION;
5929         else {                                   5554         else {
5930                 open->op_why_no_deleg = WND4_    5555                 open->op_why_no_deleg = WND4_RESOURCE;
5931                 switch (open->op_deleg_want)     5556                 switch (open->op_deleg_want) {
5932                 case NFS4_SHARE_WANT_READ_DEL    5557                 case NFS4_SHARE_WANT_READ_DELEG:
5933                 case NFS4_SHARE_WANT_WRITE_DE    5558                 case NFS4_SHARE_WANT_WRITE_DELEG:
5934                 case NFS4_SHARE_WANT_ANY_DELE    5559                 case NFS4_SHARE_WANT_ANY_DELEG:
5935                         break;                   5560                         break;
5936                 case NFS4_SHARE_WANT_CANCEL:     5561                 case NFS4_SHARE_WANT_CANCEL:
5937                         open->op_why_no_deleg    5562                         open->op_why_no_deleg = WND4_CANCELLED;
5938                         break;                   5563                         break;
5939                 case NFS4_SHARE_WANT_NO_DELEG    5564                 case NFS4_SHARE_WANT_NO_DELEG:
5940                         WARN_ON_ONCE(1);         5565                         WARN_ON_ONCE(1);
5941                 }                                5566                 }
5942         }                                        5567         }
5943 }                                                5568 }
5944                                                  5569 
5945 static bool                                   << 
5946 nfs4_delegation_stat(struct nfs4_delegation * << 
5947                      struct kstat *stat)      << 
5948 {                                             << 
5949         struct nfsd_file *nf = find_rw_file(d << 
5950         struct path path;                     << 
5951         int rc;                               << 
5952                                               << 
5953         if (!nf)                              << 
5954                 return false;                 << 
5955                                               << 
5956         path.mnt = currentfh->fh_export->ex_p << 
5957         path.dentry = file_dentry(nf->nf_file << 
5958                                               << 
5959         rc = vfs_getattr(&path, stat,         << 
5960                          (STATX_SIZE | STATX_ << 
5961                          AT_STATX_SYNC_AS_STA << 
5962                                               << 
5963         nfsd_file_put(nf);                    << 
5964         return rc == 0;                       << 
5965 }                                             << 
5966                                               << 
5967 /*                                               5570 /*
5968  * The Linux NFS server does not offer write  !! 5571  * Attempt to hand out a delegation.
5969  * clients in order to avoid conflicts betwee << 
5970  * GETATTRs requesting CHANGE or SIZE attribu << 
5971  *                                            << 
5972  * With NFSv4.1 and later minorversions, the  << 
5973  * begins each COMPOUND contains a client ID. << 
5974  * be avoided when the server recognizes the  << 
5975  * GETATTR also holds write delegation it con << 
5976  *                                               5572  *
5977  * However, the NFSv4.0 protocol does not ena !! 5573  * Note we don't support write delegations, and won't until the vfs has
5978  * determine that a GETATTR originated from t !! 5574  * proper support for them.
5979  * conflicting delegation versus coming from  << 
5980  * RFC 7530 Section 16.7.5, the server must r << 
5981  * CB_GETATTR even when the GETATTR originate << 
5982  * holds the conflicting delegation.          << 
5983  *                                            << 
5984  * An NFSv4.0 client can trigger a pathologic << 
5985  * always sends a DELEGRETURN preceded by a c << 
5986  * the same COMPOUND. COMPOUND execution will << 
5987  * GETATTR and the DELEGRETURN will never get << 
5988  * eventually revokes the delegation, which c << 
5989  * open or lock state.                        << 
5990  */                                              5575  */
5991 static void                                      5576 static void
5992 nfs4_open_delegation(struct nfsd4_open *open,    5577 nfs4_open_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp,
5993                      struct svc_fh *currentfh    5578                      struct svc_fh *currentfh)
5994 {                                                5579 {
5995         struct nfs4_delegation *dp;              5580         struct nfs4_delegation *dp;
5996         struct nfs4_openowner *oo = openowner    5581         struct nfs4_openowner *oo = openowner(stp->st_stateowner);
5997         struct nfs4_client *clp = stp->st_sti    5582         struct nfs4_client *clp = stp->st_stid.sc_client;
5998         struct svc_fh *parent = NULL;            5583         struct svc_fh *parent = NULL;
5999         int cb_up;                               5584         int cb_up;
6000         int status = 0;                          5585         int status = 0;
6001         struct kstat stat;                    << 
6002                                                  5586 
6003         cb_up = nfsd4_cb_channel_good(oo->oo_    5587         cb_up = nfsd4_cb_channel_good(oo->oo_owner.so_client);
6004         open->op_recall = false;              !! 5588         open->op_recall = 0;
6005         switch (open->op_claim_type) {           5589         switch (open->op_claim_type) {
6006                 case NFS4_OPEN_CLAIM_PREVIOUS    5590                 case NFS4_OPEN_CLAIM_PREVIOUS:
6007                         if (!cb_up)              5591                         if (!cb_up)
6008                                 open->op_reca !! 5592                                 open->op_recall = 1;
                                                   >> 5593                         if (open->op_delegate_type != NFS4_OPEN_DELEGATE_READ)
                                                   >> 5594                                 goto out_no_deleg;
6009                         break;                   5595                         break;
6010                 case NFS4_OPEN_CLAIM_NULL:       5596                 case NFS4_OPEN_CLAIM_NULL:
6011                         parent = currentfh;      5597                         parent = currentfh;
6012                         fallthrough;             5598                         fallthrough;
6013                 case NFS4_OPEN_CLAIM_FH:         5599                 case NFS4_OPEN_CLAIM_FH:
6014                         /*                       5600                         /*
6015                          * Let's not give out    5601                          * Let's not give out any delegations till everyone's
6016                          * had the chance to     5602                          * had the chance to reclaim theirs, *and* until
6017                          * NLM locks have all    5603                          * NLM locks have all been reclaimed:
6018                          */                      5604                          */
6019                         if (locks_in_grace(cl    5605                         if (locks_in_grace(clp->net))
6020                                 goto out_no_d    5606                                 goto out_no_deleg;
6021                         if (!cb_up || !(oo->o    5607                         if (!cb_up || !(oo->oo_flags & NFS4_OO_CONFIRMED))
6022                                 goto out_no_d    5608                                 goto out_no_deleg;
6023                         if (open->op_share_ac << 
6024                                         !clp- << 
6025                                 goto out_no_d << 
6026                         break;                   5609                         break;
6027                 default:                         5610                 default:
6028                         goto out_no_deleg;       5611                         goto out_no_deleg;
6029         }                                        5612         }
6030         dp = nfs4_set_delegation(open, stp, p    5613         dp = nfs4_set_delegation(open, stp, parent);
6031         if (IS_ERR(dp))                          5614         if (IS_ERR(dp))
6032                 goto out_no_deleg;               5615                 goto out_no_deleg;
6033                                                  5616 
6034         memcpy(&open->op_delegate_stateid, &d    5617         memcpy(&open->op_delegate_stateid, &dp->dl_stid.sc_stateid, sizeof(dp->dl_stid.sc_stateid));
6035                                                  5618 
6036         if (open->op_share_access & NFS4_SHAR !! 5619         trace_nfsd_deleg_read(&dp->dl_stid.sc_stateid);
6037                 if (!nfs4_delegation_stat(dp, !! 5620         open->op_delegate_type = NFS4_OPEN_DELEGATE_READ;
6038                         nfs4_put_stid(&dp->dl << 
6039                         destroy_delegation(dp << 
6040                         goto out_no_deleg;    << 
6041                 }                             << 
6042                 open->op_delegate_type = NFS4 << 
6043                 dp->dl_cb_fattr.ncf_cur_fsize << 
6044                 dp->dl_cb_fattr.ncf_initial_c << 
6045                         nfsd4_change_attribut << 
6046                 trace_nfsd_deleg_write(&dp->d << 
6047         } else {                              << 
6048                 open->op_delegate_type = NFS4 << 
6049                 trace_nfsd_deleg_read(&dp->dl << 
6050         }                                     << 
6051         nfs4_put_stid(&dp->dl_stid);             5621         nfs4_put_stid(&dp->dl_stid);
6052         return;                                  5622         return;
6053 out_no_deleg:                                    5623 out_no_deleg:
6054         open->op_delegate_type = NFS4_OPEN_DE    5624         open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE;
6055         if (open->op_claim_type == NFS4_OPEN_    5625         if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS &&
6056             open->op_delegate_type != NFS4_OP    5626             open->op_delegate_type != NFS4_OPEN_DELEGATE_NONE) {
6057                 dprintk("NFSD: WARNING: refus    5627                 dprintk("NFSD: WARNING: refusing delegation reclaim\n");
6058                 open->op_recall = true;       !! 5628                 open->op_recall = 1;
6059         }                                        5629         }
6060                                                  5630 
6061         /* 4.1 client asking for a delegation    5631         /* 4.1 client asking for a delegation? */
6062         if (open->op_deleg_want)                 5632         if (open->op_deleg_want)
6063                 nfsd4_open_deleg_none_ext(ope    5633                 nfsd4_open_deleg_none_ext(open, status);
6064         return;                                  5634         return;
6065 }                                                5635 }
6066                                                  5636 
6067 static void nfsd4_deleg_xgrade_none_ext(struc    5637 static void nfsd4_deleg_xgrade_none_ext(struct nfsd4_open *open,
6068                                         struc    5638                                         struct nfs4_delegation *dp)
6069 {                                                5639 {
6070         if (open->op_deleg_want == NFS4_SHARE    5640         if (open->op_deleg_want == NFS4_SHARE_WANT_READ_DELEG &&
6071             dp->dl_type == NFS4_OPEN_DELEGATE    5641             dp->dl_type == NFS4_OPEN_DELEGATE_WRITE) {
6072                 open->op_delegate_type = NFS4    5642                 open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
6073                 open->op_why_no_deleg = WND4_    5643                 open->op_why_no_deleg = WND4_NOT_SUPP_DOWNGRADE;
6074         } else if (open->op_deleg_want == NFS    5644         } else if (open->op_deleg_want == NFS4_SHARE_WANT_WRITE_DELEG &&
6075                    dp->dl_type == NFS4_OPEN_D    5645                    dp->dl_type == NFS4_OPEN_DELEGATE_WRITE) {
6076                 open->op_delegate_type = NFS4    5646                 open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
6077                 open->op_why_no_deleg = WND4_    5647                 open->op_why_no_deleg = WND4_NOT_SUPP_UPGRADE;
6078         }                                        5648         }
6079         /* Otherwise the client must be confu    5649         /* Otherwise the client must be confused wanting a delegation
6080          * it already has, therefore we don't    5650          * it already has, therefore we don't return
6081          * NFS4_OPEN_DELEGATE_NONE_EXT and re    5651          * NFS4_OPEN_DELEGATE_NONE_EXT and reason.
6082          */                                      5652          */
6083 }                                                5653 }
6084                                                  5654 
6085 /**                                              5655 /**
6086  * nfsd4_process_open2 - finish open processi    5656  * nfsd4_process_open2 - finish open processing
6087  * @rqstp: the RPC transaction being executed    5657  * @rqstp: the RPC transaction being executed
6088  * @current_fh: NFSv4 COMPOUND's current file    5658  * @current_fh: NFSv4 COMPOUND's current filehandle
6089  * @open: OPEN arguments                         5659  * @open: OPEN arguments
6090  *                                               5660  *
6091  * If successful, (1) truncate the file if op    5661  * If successful, (1) truncate the file if open->op_truncate was
6092  * set, (2) set open->op_stateid, (3) set ope    5662  * set, (2) set open->op_stateid, (3) set open->op_delegation.
6093  *                                               5663  *
6094  * Returns %nfs_ok on success; otherwise an n    5664  * Returns %nfs_ok on success; otherwise an nfs4stat value in
6095  * network byte order is returned.               5665  * network byte order is returned.
6096  */                                              5666  */
6097 __be32                                           5667 __be32
6098 nfsd4_process_open2(struct svc_rqst *rqstp, s    5668 nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
6099 {                                                5669 {
6100         struct nfsd4_compoundres *resp = rqst    5670         struct nfsd4_compoundres *resp = rqstp->rq_resp;
6101         struct nfs4_client *cl = open->op_ope    5671         struct nfs4_client *cl = open->op_openowner->oo_owner.so_client;
6102         struct nfs4_file *fp = NULL;             5672         struct nfs4_file *fp = NULL;
6103         struct nfs4_ol_stateid *stp = NULL;      5673         struct nfs4_ol_stateid *stp = NULL;
6104         struct nfs4_delegation *dp = NULL;       5674         struct nfs4_delegation *dp = NULL;
6105         __be32 status;                           5675         __be32 status;
6106         bool new_stp = false;                    5676         bool new_stp = false;
6107                                                  5677 
6108         /*                                       5678         /*
6109          * Lookup file; if found, lookup stat    5679          * Lookup file; if found, lookup stateid and check open request,
6110          * and check for delegations in the p    5680          * and check for delegations in the process of being recalled.
6111          * If not found, create the nfs4_file    5681          * If not found, create the nfs4_file struct
6112          */                                      5682          */
6113         fp = nfsd4_file_hash_insert(open->op_    5683         fp = nfsd4_file_hash_insert(open->op_file, current_fh);
6114         if (unlikely(!fp))                       5684         if (unlikely(!fp))
6115                 return nfserr_jukebox;           5685                 return nfserr_jukebox;
6116         if (fp != open->op_file) {               5686         if (fp != open->op_file) {
6117                 status = nfs4_check_deleg(cl,    5687                 status = nfs4_check_deleg(cl, open, &dp);
6118                 if (status)                      5688                 if (status)
6119                         goto out;                5689                         goto out;
6120                 stp = nfsd4_find_and_lock_exi    5690                 stp = nfsd4_find_and_lock_existing_open(fp, open);
6121         } else {                                 5691         } else {
6122                 open->op_file = NULL;            5692                 open->op_file = NULL;
6123                 status = nfserr_bad_stateid;     5693                 status = nfserr_bad_stateid;
6124                 if (nfsd4_is_deleg_cur(open))    5694                 if (nfsd4_is_deleg_cur(open))
6125                         goto out;                5695                         goto out;
6126         }                                        5696         }
6127                                                  5697 
6128         if (!stp) {                              5698         if (!stp) {
6129                 stp = init_open_stateid(fp, o    5699                 stp = init_open_stateid(fp, open);
6130                 if (!open->op_stp)               5700                 if (!open->op_stp)
6131                         new_stp = true;          5701                         new_stp = true;
6132         }                                        5702         }
6133                                                  5703 
6134         /*                                       5704         /*
6135          * OPEN the file, or upgrade an exist    5705          * OPEN the file, or upgrade an existing OPEN.
6136          * If truncate fails, the OPEN fails.    5706          * If truncate fails, the OPEN fails.
6137          *                                       5707          *
6138          * stp is already locked.                5708          * stp is already locked.
6139          */                                      5709          */
6140         if (!new_stp) {                          5710         if (!new_stp) {
6141                 /* Stateid was found, this is    5711                 /* Stateid was found, this is an OPEN upgrade */
6142                 status = nfs4_upgrade_open(rq    5712                 status = nfs4_upgrade_open(rqstp, fp, current_fh, stp, open);
6143                 if (status) {                    5713                 if (status) {
6144                         mutex_unlock(&stp->st    5714                         mutex_unlock(&stp->st_mutex);
6145                         goto out;                5715                         goto out;
6146                 }                                5716                 }
6147         } else {                                 5717         } else {
6148                 status = nfs4_get_vfs_file(rq    5718                 status = nfs4_get_vfs_file(rqstp, fp, current_fh, stp, open, true);
6149                 if (status) {                    5719                 if (status) {
                                                   >> 5720                         stp->st_stid.sc_type = NFS4_CLOSED_STID;
6150                         release_open_stateid(    5721                         release_open_stateid(stp);
6151                         mutex_unlock(&stp->st    5722                         mutex_unlock(&stp->st_mutex);
6152                         goto out;                5723                         goto out;
6153                 }                                5724                 }
6154                                                  5725 
6155                 stp->st_clnt_odstate = find_o    5726                 stp->st_clnt_odstate = find_or_hash_clnt_odstate(fp,
6156                                                  5727                                                         open->op_odstate);
6157                 if (stp->st_clnt_odstate == o    5728                 if (stp->st_clnt_odstate == open->op_odstate)
6158                         open->op_odstate = NU    5729                         open->op_odstate = NULL;
6159         }                                        5730         }
6160                                                  5731 
6161         nfs4_inc_and_copy_stateid(&open->op_s    5732         nfs4_inc_and_copy_stateid(&open->op_stateid, &stp->st_stid);
6162         mutex_unlock(&stp->st_mutex);            5733         mutex_unlock(&stp->st_mutex);
6163                                                  5734 
6164         if (nfsd4_has_session(&resp->cstate))    5735         if (nfsd4_has_session(&resp->cstate)) {
6165                 if (open->op_deleg_want & NFS    5736                 if (open->op_deleg_want & NFS4_SHARE_WANT_NO_DELEG) {
6166                         open->op_delegate_typ    5737                         open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
6167                         open->op_why_no_deleg    5738                         open->op_why_no_deleg = WND4_NOT_WANTED;
6168                         goto nodeleg;            5739                         goto nodeleg;
6169                 }                                5740                 }
6170         }                                        5741         }
6171                                                  5742 
6172         /*                                       5743         /*
6173         * Attempt to hand out a delegation. N    5744         * Attempt to hand out a delegation. No error return, because the
6174         * OPEN succeeds even if we fail.         5745         * OPEN succeeds even if we fail.
6175         */                                       5746         */
6176         nfs4_open_delegation(open, stp, &resp    5747         nfs4_open_delegation(open, stp, &resp->cstate.current_fh);
6177 nodeleg:                                         5748 nodeleg:
6178         status = nfs_ok;                         5749         status = nfs_ok;
6179         trace_nfsd_open(&stp->st_stid.sc_stat    5750         trace_nfsd_open(&stp->st_stid.sc_stateid);
6180 out:                                             5751 out:
6181         /* 4.1 client trying to upgrade/downg    5752         /* 4.1 client trying to upgrade/downgrade delegation? */
6182         if (open->op_delegate_type == NFS4_OP    5753         if (open->op_delegate_type == NFS4_OPEN_DELEGATE_NONE && dp &&
6183             open->op_deleg_want)                 5754             open->op_deleg_want)
6184                 nfsd4_deleg_xgrade_none_ext(o    5755                 nfsd4_deleg_xgrade_none_ext(open, dp);
6185                                                  5756 
6186         if (fp)                                  5757         if (fp)
6187                 put_nfs4_file(fp);               5758                 put_nfs4_file(fp);
6188         if (status == 0 && open->op_claim_typ    5759         if (status == 0 && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
6189                 open->op_openowner->oo_flags     5760                 open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
6190         /*                                       5761         /*
6191         * To finish the open response, we jus    5762         * To finish the open response, we just need to set the rflags.
6192         */                                       5763         */
6193         open->op_rflags = NFS4_OPEN_RESULT_LO    5764         open->op_rflags = NFS4_OPEN_RESULT_LOCKTYPE_POSIX;
6194         if (nfsd4_has_session(&resp->cstate))    5765         if (nfsd4_has_session(&resp->cstate))
6195                 open->op_rflags |= NFS4_OPEN_    5766                 open->op_rflags |= NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK;
6196         else if (!(open->op_openowner->oo_fla    5767         else if (!(open->op_openowner->oo_flags & NFS4_OO_CONFIRMED))
6197                 open->op_rflags |= NFS4_OPEN_    5768                 open->op_rflags |= NFS4_OPEN_RESULT_CONFIRM;
6198                                                  5769 
6199         if (dp)                                  5770         if (dp)
6200                 nfs4_put_stid(&dp->dl_stid);     5771                 nfs4_put_stid(&dp->dl_stid);
6201         if (stp)                                 5772         if (stp)
6202                 nfs4_put_stid(&stp->st_stid);    5773                 nfs4_put_stid(&stp->st_stid);
6203                                                  5774 
6204         return status;                           5775         return status;
6205 }                                                5776 }
6206                                                  5777 
6207 void nfsd4_cleanup_open_state(struct nfsd4_co    5778 void nfsd4_cleanup_open_state(struct nfsd4_compound_state *cstate,
6208                               struct nfsd4_op    5779                               struct nfsd4_open *open)
6209 {                                                5780 {
6210         if (open->op_openowner)               !! 5781         if (open->op_openowner) {
6211                 nfs4_put_stateowner(&open->op !! 5782                 struct nfs4_stateowner *so = &open->op_openowner->oo_owner;
                                                   >> 5783 
                                                   >> 5784                 nfsd4_cstate_assign_replay(cstate, so);
                                                   >> 5785                 nfs4_put_stateowner(so);
                                                   >> 5786         }
6212         if (open->op_file)                       5787         if (open->op_file)
6213                 kmem_cache_free(file_slab, op    5788                 kmem_cache_free(file_slab, open->op_file);
6214         if (open->op_stp)                        5789         if (open->op_stp)
6215                 nfs4_put_stid(&open->op_stp->    5790                 nfs4_put_stid(&open->op_stp->st_stid);
6216         if (open->op_odstate)                    5791         if (open->op_odstate)
6217                 kmem_cache_free(odstate_slab,    5792                 kmem_cache_free(odstate_slab, open->op_odstate);
6218 }                                                5793 }
6219                                                  5794 
6220 __be32                                           5795 __be32
6221 nfsd4_renew(struct svc_rqst *rqstp, struct nf    5796 nfsd4_renew(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
6222             union nfsd4_op_u *u)                 5797             union nfsd4_op_u *u)
6223 {                                                5798 {
6224         clientid_t *clid = &u->renew;            5799         clientid_t *clid = &u->renew;
6225         struct nfs4_client *clp;                 5800         struct nfs4_client *clp;
6226         __be32 status;                           5801         __be32 status;
6227         struct nfsd_net *nn = net_generic(SVC    5802         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
6228                                                  5803 
6229         trace_nfsd_clid_renew(clid);             5804         trace_nfsd_clid_renew(clid);
6230         status = set_client(clid, cstate, nn)    5805         status = set_client(clid, cstate, nn);
6231         if (status)                              5806         if (status)
6232                 return status;                   5807                 return status;
6233         clp = cstate->clp;                       5808         clp = cstate->clp;
6234         if (!list_empty(&clp->cl_delegations)    5809         if (!list_empty(&clp->cl_delegations)
6235                         && clp->cl_cb_state !    5810                         && clp->cl_cb_state != NFSD4_CB_UP)
6236                 return nfserr_cb_path_down;      5811                 return nfserr_cb_path_down;
6237         return nfs_ok;                           5812         return nfs_ok;
6238 }                                                5813 }
6239                                                  5814 
6240 void                                             5815 void
6241 nfsd4_end_grace(struct nfsd_net *nn)             5816 nfsd4_end_grace(struct nfsd_net *nn)
6242 {                                                5817 {
6243         /* do nothing if grace period already    5818         /* do nothing if grace period already ended */
6244         if (nn->grace_ended)                     5819         if (nn->grace_ended)
6245                 return;                          5820                 return;
6246                                                  5821 
6247         trace_nfsd_grace_complete(nn);           5822         trace_nfsd_grace_complete(nn);
6248         nn->grace_ended = true;                  5823         nn->grace_ended = true;
6249         /*                                       5824         /*
6250          * If the server goes down again righ    5825          * If the server goes down again right now, an NFSv4
6251          * client will still be allowed to re    5826          * client will still be allowed to reclaim after it comes back up,
6252          * even if it hasn't yet had a chance    5827          * even if it hasn't yet had a chance to reclaim state this time.
6253          *                                       5828          *
6254          */                                      5829          */
6255         nfsd4_record_grace_done(nn);             5830         nfsd4_record_grace_done(nn);
6256         /*                                       5831         /*
6257          * At this point, NFSv4 clients can s    5832          * At this point, NFSv4 clients can still reclaim.  But if the
6258          * server crashes, any that have not     5833          * server crashes, any that have not yet reclaimed will be out
6259          * of luck on the next boot.             5834          * of luck on the next boot.
6260          *                                       5835          *
6261          * (NFSv4.1+ clients are considered t    5836          * (NFSv4.1+ clients are considered to have reclaimed once they
6262          * call RECLAIM_COMPLETE.  NFSv4.0 cl    5837          * call RECLAIM_COMPLETE.  NFSv4.0 clients are considered to
6263          * have reclaimed after their first O    5838          * have reclaimed after their first OPEN.)
6264          */                                      5839          */
6265         locks_end_grace(&nn->nfsd4_manager);     5840         locks_end_grace(&nn->nfsd4_manager);
6266         /*                                       5841         /*
6267          * At this point, and once lockd and/    5842          * At this point, and once lockd and/or any other containers
6268          * exit their grace period, further r    5843          * exit their grace period, further reclaims will fail and
6269          * regular locking can resume.           5844          * regular locking can resume.
6270          */                                      5845          */
6271 }                                                5846 }
6272                                                  5847 
6273 /*                                               5848 /*
6274  * If we've waited a lease period but there a    5849  * If we've waited a lease period but there are still clients trying to
6275  * reclaim, wait a little longer to give them    5850  * reclaim, wait a little longer to give them a chance to finish.
6276  */                                              5851  */
6277 static bool clients_still_reclaiming(struct n    5852 static bool clients_still_reclaiming(struct nfsd_net *nn)
6278 {                                                5853 {
6279         time64_t double_grace_period_end = nn    5854         time64_t double_grace_period_end = nn->boot_time +
6280                                            2     5855                                            2 * nn->nfsd4_lease;
6281                                                  5856 
6282         if (nn->track_reclaim_completes &&       5857         if (nn->track_reclaim_completes &&
6283                         atomic_read(&nn->nr_r    5858                         atomic_read(&nn->nr_reclaim_complete) ==
6284                         nn->reclaim_str_hasht    5859                         nn->reclaim_str_hashtbl_size)
6285                 return false;                    5860                 return false;
6286         if (!nn->somebody_reclaimed)             5861         if (!nn->somebody_reclaimed)
6287                 return false;                    5862                 return false;
6288         nn->somebody_reclaimed = false;          5863         nn->somebody_reclaimed = false;
6289         /*                                       5864         /*
6290          * If we've given them *two* lease ti    5865          * If we've given them *two* lease times to reclaim, and they're
6291          * still not done, give up:              5866          * still not done, give up:
6292          */                                      5867          */
6293         if (ktime_get_boottime_seconds() > do    5868         if (ktime_get_boottime_seconds() > double_grace_period_end)
6294                 return false;                    5869                 return false;
6295         return true;                             5870         return true;
6296 }                                                5871 }
6297                                                  5872 
6298 struct laundry_time {                            5873 struct laundry_time {
6299         time64_t cutoff;                         5874         time64_t cutoff;
6300         time64_t new_timeo;                      5875         time64_t new_timeo;
6301 };                                               5876 };
6302                                                  5877 
6303 static bool state_expired(struct laundry_time    5878 static bool state_expired(struct laundry_time *lt, time64_t last_refresh)
6304 {                                                5879 {
6305         time64_t time_remaining;                 5880         time64_t time_remaining;
6306                                                  5881 
6307         if (last_refresh < lt->cutoff)           5882         if (last_refresh < lt->cutoff)
6308                 return true;                     5883                 return true;
6309         time_remaining = last_refresh - lt->c    5884         time_remaining = last_refresh - lt->cutoff;
6310         lt->new_timeo = min(lt->new_timeo, ti    5885         lt->new_timeo = min(lt->new_timeo, time_remaining);
6311         return false;                            5886         return false;
6312 }                                                5887 }
6313                                                  5888 
6314 #ifdef CONFIG_NFSD_V4_2_INTER_SSC                5889 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
6315 void nfsd4_ssc_init_umount_work(struct nfsd_n    5890 void nfsd4_ssc_init_umount_work(struct nfsd_net *nn)
6316 {                                                5891 {
6317         spin_lock_init(&nn->nfsd_ssc_lock);      5892         spin_lock_init(&nn->nfsd_ssc_lock);
6318         INIT_LIST_HEAD(&nn->nfsd_ssc_mount_li    5893         INIT_LIST_HEAD(&nn->nfsd_ssc_mount_list);
6319         init_waitqueue_head(&nn->nfsd_ssc_wai    5894         init_waitqueue_head(&nn->nfsd_ssc_waitq);
6320 }                                                5895 }
                                                   >> 5896 EXPORT_SYMBOL_GPL(nfsd4_ssc_init_umount_work);
6321                                                  5897 
6322 /*                                               5898 /*
6323  * This is called when nfsd is being shutdown    5899  * This is called when nfsd is being shutdown, after all inter_ssc
6324  * cleanup were done, to destroy the ssc dela    5900  * cleanup were done, to destroy the ssc delayed unmount list.
6325  */                                              5901  */
6326 static void nfsd4_ssc_shutdown_umount(struct     5902 static void nfsd4_ssc_shutdown_umount(struct nfsd_net *nn)
6327 {                                                5903 {
6328         struct nfsd4_ssc_umount_item *ni = NU    5904         struct nfsd4_ssc_umount_item *ni = NULL;
6329         struct nfsd4_ssc_umount_item *tmp;       5905         struct nfsd4_ssc_umount_item *tmp;
6330                                                  5906 
6331         spin_lock(&nn->nfsd_ssc_lock);           5907         spin_lock(&nn->nfsd_ssc_lock);
6332         list_for_each_entry_safe(ni, tmp, &nn    5908         list_for_each_entry_safe(ni, tmp, &nn->nfsd_ssc_mount_list, nsui_list) {
6333                 list_del(&ni->nsui_list);        5909                 list_del(&ni->nsui_list);
6334                 spin_unlock(&nn->nfsd_ssc_loc    5910                 spin_unlock(&nn->nfsd_ssc_lock);
6335                 mntput(ni->nsui_vfsmount);       5911                 mntput(ni->nsui_vfsmount);
6336                 kfree(ni);                       5912                 kfree(ni);
6337                 spin_lock(&nn->nfsd_ssc_lock)    5913                 spin_lock(&nn->nfsd_ssc_lock);
6338         }                                        5914         }
6339         spin_unlock(&nn->nfsd_ssc_lock);         5915         spin_unlock(&nn->nfsd_ssc_lock);
6340 }                                                5916 }
6341                                                  5917 
6342 static void nfsd4_ssc_expire_umount(struct nf    5918 static void nfsd4_ssc_expire_umount(struct nfsd_net *nn)
6343 {                                                5919 {
6344         bool do_wakeup = false;                  5920         bool do_wakeup = false;
6345         struct nfsd4_ssc_umount_item *ni = NU    5921         struct nfsd4_ssc_umount_item *ni = NULL;
6346         struct nfsd4_ssc_umount_item *tmp;       5922         struct nfsd4_ssc_umount_item *tmp;
6347                                                  5923 
6348         spin_lock(&nn->nfsd_ssc_lock);           5924         spin_lock(&nn->nfsd_ssc_lock);
6349         list_for_each_entry_safe(ni, tmp, &nn    5925         list_for_each_entry_safe(ni, tmp, &nn->nfsd_ssc_mount_list, nsui_list) {
6350                 if (time_after(jiffies, ni->n    5926                 if (time_after(jiffies, ni->nsui_expire)) {
6351                         if (refcount_read(&ni    5927                         if (refcount_read(&ni->nsui_refcnt) > 1)
6352                                 continue;        5928                                 continue;
6353                                                  5929 
6354                         /* mark being unmount    5930                         /* mark being unmount */
6355                         ni->nsui_busy = true;    5931                         ni->nsui_busy = true;
6356                         spin_unlock(&nn->nfsd    5932                         spin_unlock(&nn->nfsd_ssc_lock);
6357                         mntput(ni->nsui_vfsmo    5933                         mntput(ni->nsui_vfsmount);
6358                         spin_lock(&nn->nfsd_s    5934                         spin_lock(&nn->nfsd_ssc_lock);
6359                                                  5935 
6360                         /* waiters need to st    5936                         /* waiters need to start from begin of list */
6361                         list_del(&ni->nsui_li    5937                         list_del(&ni->nsui_list);
6362                         kfree(ni);               5938                         kfree(ni);
6363                                                  5939 
6364                         /* wakeup ssc_connect    5940                         /* wakeup ssc_connect waiters */
6365                         do_wakeup = true;        5941                         do_wakeup = true;
6366                         continue;                5942                         continue;
6367                 }                                5943                 }
6368                 break;                           5944                 break;
6369         }                                        5945         }
6370         if (do_wakeup)                           5946         if (do_wakeup)
6371                 wake_up_all(&nn->nfsd_ssc_wai    5947                 wake_up_all(&nn->nfsd_ssc_waitq);
6372         spin_unlock(&nn->nfsd_ssc_lock);         5948         spin_unlock(&nn->nfsd_ssc_lock);
6373 }                                                5949 }
6374 #endif                                           5950 #endif
6375                                                  5951 
6376 /* Check if any lock belonging to this lockow    5952 /* Check if any lock belonging to this lockowner has any blockers */
6377 static bool                                      5953 static bool
6378 nfs4_lockowner_has_blockers(struct nfs4_locko    5954 nfs4_lockowner_has_blockers(struct nfs4_lockowner *lo)
6379 {                                                5955 {
6380         struct file_lock_context *ctx;           5956         struct file_lock_context *ctx;
6381         struct nfs4_ol_stateid *stp;             5957         struct nfs4_ol_stateid *stp;
6382         struct nfs4_file *nf;                    5958         struct nfs4_file *nf;
6383                                                  5959 
6384         list_for_each_entry(stp, &lo->lo_owne    5960         list_for_each_entry(stp, &lo->lo_owner.so_stateids, st_perstateowner) {
6385                 nf = stp->st_stid.sc_file;       5961                 nf = stp->st_stid.sc_file;
6386                 ctx = locks_inode_context(nf-    5962                 ctx = locks_inode_context(nf->fi_inode);
6387                 if (!ctx)                        5963                 if (!ctx)
6388                         continue;                5964                         continue;
6389                 if (locks_owner_has_blockers(    5965                 if (locks_owner_has_blockers(ctx, lo))
6390                         return true;             5966                         return true;
6391         }                                        5967         }
6392         return false;                            5968         return false;
6393 }                                                5969 }
6394                                                  5970 
6395 static bool                                      5971 static bool
6396 nfs4_anylock_blockers(struct nfs4_client *clp    5972 nfs4_anylock_blockers(struct nfs4_client *clp)
6397 {                                                5973 {
6398         int i;                                   5974         int i;
6399         struct nfs4_stateowner *so;              5975         struct nfs4_stateowner *so;
6400         struct nfs4_lockowner *lo;               5976         struct nfs4_lockowner *lo;
6401                                                  5977 
6402         if (atomic_read(&clp->cl_delegs_in_re    5978         if (atomic_read(&clp->cl_delegs_in_recall))
6403                 return true;                     5979                 return true;
6404         spin_lock(&clp->cl_lock);                5980         spin_lock(&clp->cl_lock);
6405         for (i = 0; i < OWNER_HASH_SIZE; i++)    5981         for (i = 0; i < OWNER_HASH_SIZE; i++) {
6406                 list_for_each_entry(so, &clp-    5982                 list_for_each_entry(so, &clp->cl_ownerstr_hashtbl[i],
6407                                 so_strhash) {    5983                                 so_strhash) {
6408                         if (so->so_is_open_ow    5984                         if (so->so_is_open_owner)
6409                                 continue;        5985                                 continue;
6410                         lo = lockowner(so);      5986                         lo = lockowner(so);
6411                         if (nfs4_lockowner_ha    5987                         if (nfs4_lockowner_has_blockers(lo)) {
6412                                 spin_unlock(&    5988                                 spin_unlock(&clp->cl_lock);
6413                                 return true;     5989                                 return true;
6414                         }                        5990                         }
6415                 }                                5991                 }
6416         }                                        5992         }
6417         spin_unlock(&clp->cl_lock);              5993         spin_unlock(&clp->cl_lock);
6418         return false;                            5994         return false;
6419 }                                                5995 }
6420                                                  5996 
6421 static void                                      5997 static void
6422 nfs4_get_client_reaplist(struct nfsd_net *nn,    5998 nfs4_get_client_reaplist(struct nfsd_net *nn, struct list_head *reaplist,
6423                                 struct laundr    5999                                 struct laundry_time *lt)
6424 {                                                6000 {
6425         unsigned int maxreap, reapcnt = 0;       6001         unsigned int maxreap, reapcnt = 0;
6426         struct list_head *pos, *next;            6002         struct list_head *pos, *next;
6427         struct nfs4_client *clp;                 6003         struct nfs4_client *clp;
6428                                                  6004 
6429         maxreap = (atomic_read(&nn->nfs4_clie    6005         maxreap = (atomic_read(&nn->nfs4_client_count) >= nn->nfs4_max_clients) ?
6430                         NFSD_CLIENT_MAX_TRIM_    6006                         NFSD_CLIENT_MAX_TRIM_PER_RUN : 0;
6431         INIT_LIST_HEAD(reaplist);                6007         INIT_LIST_HEAD(reaplist);
6432         spin_lock(&nn->client_lock);             6008         spin_lock(&nn->client_lock);
6433         list_for_each_safe(pos, next, &nn->cl    6009         list_for_each_safe(pos, next, &nn->client_lru) {
6434                 clp = list_entry(pos, struct     6010                 clp = list_entry(pos, struct nfs4_client, cl_lru);
6435                 if (clp->cl_state == NFSD4_EX    6011                 if (clp->cl_state == NFSD4_EXPIRABLE)
6436                         goto exp_client;         6012                         goto exp_client;
6437                 if (!state_expired(lt, clp->c    6013                 if (!state_expired(lt, clp->cl_time))
6438                         break;                   6014                         break;
6439                 if (!atomic_read(&clp->cl_rpc    6015                 if (!atomic_read(&clp->cl_rpc_users)) {
6440                         if (clp->cl_state ==     6016                         if (clp->cl_state == NFSD4_ACTIVE)
6441                                 atomic_inc(&n    6017                                 atomic_inc(&nn->nfsd_courtesy_clients);
6442                         clp->cl_state = NFSD4    6018                         clp->cl_state = NFSD4_COURTESY;
6443                 }                                6019                 }
6444                 if (!client_has_state(clp))      6020                 if (!client_has_state(clp))
6445                         goto exp_client;         6021                         goto exp_client;
6446                 if (!nfs4_anylock_blockers(cl    6022                 if (!nfs4_anylock_blockers(clp))
6447                         if (reapcnt >= maxrea    6023                         if (reapcnt >= maxreap)
6448                                 continue;        6024                                 continue;
6449 exp_client:                                      6025 exp_client:
6450                 if (!mark_client_expired_lock    6026                 if (!mark_client_expired_locked(clp)) {
6451                         list_add(&clp->cl_lru    6027                         list_add(&clp->cl_lru, reaplist);
6452                         reapcnt++;               6028                         reapcnt++;
6453                 }                                6029                 }
6454         }                                        6030         }
6455         spin_unlock(&nn->client_lock);           6031         spin_unlock(&nn->client_lock);
6456 }                                                6032 }
6457                                                  6033 
6458 static void                                      6034 static void
6459 nfs4_get_courtesy_client_reaplist(struct nfsd    6035 nfs4_get_courtesy_client_reaplist(struct nfsd_net *nn,
6460                                 struct list_h    6036                                 struct list_head *reaplist)
6461 {                                                6037 {
6462         unsigned int maxreap = 0, reapcnt = 0    6038         unsigned int maxreap = 0, reapcnt = 0;
6463         struct list_head *pos, *next;            6039         struct list_head *pos, *next;
6464         struct nfs4_client *clp;                 6040         struct nfs4_client *clp;
6465                                                  6041 
6466         maxreap = NFSD_CLIENT_MAX_TRIM_PER_RU    6042         maxreap = NFSD_CLIENT_MAX_TRIM_PER_RUN;
6467         INIT_LIST_HEAD(reaplist);                6043         INIT_LIST_HEAD(reaplist);
6468                                                  6044 
6469         spin_lock(&nn->client_lock);             6045         spin_lock(&nn->client_lock);
6470         list_for_each_safe(pos, next, &nn->cl    6046         list_for_each_safe(pos, next, &nn->client_lru) {
6471                 clp = list_entry(pos, struct     6047                 clp = list_entry(pos, struct nfs4_client, cl_lru);
6472                 if (clp->cl_state == NFSD4_AC    6048                 if (clp->cl_state == NFSD4_ACTIVE)
6473                         break;                   6049                         break;
6474                 if (reapcnt >= maxreap)          6050                 if (reapcnt >= maxreap)
6475                         break;                   6051                         break;
6476                 if (!mark_client_expired_lock    6052                 if (!mark_client_expired_locked(clp)) {
6477                         list_add(&clp->cl_lru    6053                         list_add(&clp->cl_lru, reaplist);
6478                         reapcnt++;               6054                         reapcnt++;
6479                 }                                6055                 }
6480         }                                        6056         }
6481         spin_unlock(&nn->client_lock);           6057         spin_unlock(&nn->client_lock);
6482 }                                                6058 }
6483                                                  6059 
6484 static void                                      6060 static void
6485 nfs4_process_client_reaplist(struct list_head    6061 nfs4_process_client_reaplist(struct list_head *reaplist)
6486 {                                                6062 {
6487         struct list_head *pos, *next;            6063         struct list_head *pos, *next;
6488         struct nfs4_client *clp;                 6064         struct nfs4_client *clp;
6489                                                  6065 
6490         list_for_each_safe(pos, next, reaplis    6066         list_for_each_safe(pos, next, reaplist) {
6491                 clp = list_entry(pos, struct     6067                 clp = list_entry(pos, struct nfs4_client, cl_lru);
6492                 trace_nfsd_clid_purged(&clp->    6068                 trace_nfsd_clid_purged(&clp->cl_clientid);
6493                 list_del_init(&clp->cl_lru);     6069                 list_del_init(&clp->cl_lru);
6494                 expire_client(clp);              6070                 expire_client(clp);
6495         }                                        6071         }
6496 }                                                6072 }
6497                                                  6073 
6498 static void nfs40_clean_admin_revoked(struct  << 
6499                                       struct  << 
6500 {                                             << 
6501         struct nfs4_client *clp;              << 
6502                                               << 
6503         spin_lock(&nn->client_lock);          << 
6504         if (nn->nfs40_last_revoke == 0 ||     << 
6505             nn->nfs40_last_revoke > lt->cutof << 
6506                 spin_unlock(&nn->client_lock) << 
6507                 return;                       << 
6508         }                                     << 
6509         nn->nfs40_last_revoke = 0;            << 
6510                                               << 
6511 retry:                                        << 
6512         list_for_each_entry(clp, &nn->client_ << 
6513                 unsigned long id, tmp;        << 
6514                 struct nfs4_stid *stid;       << 
6515                                               << 
6516                 if (atomic_read(&clp->cl_admi << 
6517                         continue;             << 
6518                                               << 
6519                 spin_lock(&clp->cl_lock);     << 
6520                 idr_for_each_entry_ul(&clp->c << 
6521                         if (stid->sc_status & << 
6522                                 refcount_inc( << 
6523                                 spin_unlock(& << 
6524                                 /* this funct << 
6525                                 nfsd4_drop_re << 
6526                                 nfs4_put_stid << 
6527                                 spin_lock(&nn << 
6528                                 goto retry;   << 
6529                         }                     << 
6530                 spin_unlock(&clp->cl_lock);   << 
6531         }                                     << 
6532         spin_unlock(&nn->client_lock);        << 
6533 }                                             << 
6534                                               << 
6535 static time64_t                                  6074 static time64_t
6536 nfs4_laundromat(struct nfsd_net *nn)             6075 nfs4_laundromat(struct nfsd_net *nn)
6537 {                                                6076 {
6538         struct nfs4_openowner *oo;               6077         struct nfs4_openowner *oo;
6539         struct nfs4_delegation *dp;              6078         struct nfs4_delegation *dp;
6540         struct nfs4_ol_stateid *stp;             6079         struct nfs4_ol_stateid *stp;
6541         struct nfsd4_blocked_lock *nbl;          6080         struct nfsd4_blocked_lock *nbl;
6542         struct list_head *pos, *next, reaplis    6081         struct list_head *pos, *next, reaplist;
6543         struct laundry_time lt = {               6082         struct laundry_time lt = {
6544                 .cutoff = ktime_get_boottime_    6083                 .cutoff = ktime_get_boottime_seconds() - nn->nfsd4_lease,
6545                 .new_timeo = nn->nfsd4_lease     6084                 .new_timeo = nn->nfsd4_lease
6546         };                                       6085         };
6547         struct nfs4_cpntf_state *cps;            6086         struct nfs4_cpntf_state *cps;
6548         copy_stateid_t *cps_t;                   6087         copy_stateid_t *cps_t;
6549         int i;                                   6088         int i;
6550                                                  6089 
6551         if (clients_still_reclaiming(nn)) {      6090         if (clients_still_reclaiming(nn)) {
6552                 lt.new_timeo = 0;                6091                 lt.new_timeo = 0;
6553                 goto out;                        6092                 goto out;
6554         }                                        6093         }
6555         nfsd4_end_grace(nn);                     6094         nfsd4_end_grace(nn);
6556                                                  6095 
6557         spin_lock(&nn->s2s_cp_lock);             6096         spin_lock(&nn->s2s_cp_lock);
6558         idr_for_each_entry(&nn->s2s_cp_statei    6097         idr_for_each_entry(&nn->s2s_cp_stateids, cps_t, i) {
6559                 cps = container_of(cps_t, str    6098                 cps = container_of(cps_t, struct nfs4_cpntf_state, cp_stateid);
6560                 if (cps->cp_stateid.cs_type =    6099                 if (cps->cp_stateid.cs_type == NFS4_COPYNOTIFY_STID &&
6561                                 state_expired    6100                                 state_expired(&lt, cps->cpntf_time))
6562                         _free_cpntf_state_loc    6101                         _free_cpntf_state_locked(nn, cps);
6563         }                                        6102         }
6564         spin_unlock(&nn->s2s_cp_lock);           6103         spin_unlock(&nn->s2s_cp_lock);
6565         nfs4_get_client_reaplist(nn, &reaplis    6104         nfs4_get_client_reaplist(nn, &reaplist, &lt);
6566         nfs4_process_client_reaplist(&reaplis    6105         nfs4_process_client_reaplist(&reaplist);
6567                                                  6106 
6568         nfs40_clean_admin_revoked(nn, &lt);   << 
6569                                               << 
6570         spin_lock(&state_lock);                  6107         spin_lock(&state_lock);
6571         list_for_each_safe(pos, next, &nn->de    6108         list_for_each_safe(pos, next, &nn->del_recall_lru) {
6572                 dp = list_entry (pos, struct     6109                 dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
6573                 if (!state_expired(&lt, dp->d    6110                 if (!state_expired(&lt, dp->dl_time))
6574                         break;                   6111                         break;
6575                 refcount_inc(&dp->dl_stid.sc_ !! 6112                 WARN_ON(!unhash_delegation_locked(dp));
6576                 unhash_delegation_locked(dp,  << 
6577                 list_add(&dp->dl_recall_lru,     6113                 list_add(&dp->dl_recall_lru, &reaplist);
6578         }                                        6114         }
6579         spin_unlock(&state_lock);                6115         spin_unlock(&state_lock);
6580         while (!list_empty(&reaplist)) {         6116         while (!list_empty(&reaplist)) {
6581                 dp = list_first_entry(&reapli    6117                 dp = list_first_entry(&reaplist, struct nfs4_delegation,
6582                                         dl_re    6118                                         dl_recall_lru);
6583                 list_del_init(&dp->dl_recall_    6119                 list_del_init(&dp->dl_recall_lru);
6584                 revoke_delegation(dp);           6120                 revoke_delegation(dp);
6585         }                                        6121         }
6586                                                  6122 
6587         spin_lock(&nn->client_lock);             6123         spin_lock(&nn->client_lock);
6588         while (!list_empty(&nn->close_lru)) {    6124         while (!list_empty(&nn->close_lru)) {
6589                 oo = list_first_entry(&nn->cl    6125                 oo = list_first_entry(&nn->close_lru, struct nfs4_openowner,
6590                                         oo_cl    6126                                         oo_close_lru);
6591                 if (!state_expired(&lt, oo->o    6127                 if (!state_expired(&lt, oo->oo_time))
6592                         break;                   6128                         break;
6593                 list_del_init(&oo->oo_close_l    6129                 list_del_init(&oo->oo_close_lru);
6594                 stp = oo->oo_last_closed_stid    6130                 stp = oo->oo_last_closed_stid;
6595                 oo->oo_last_closed_stid = NUL    6131                 oo->oo_last_closed_stid = NULL;
6596                 spin_unlock(&nn->client_lock)    6132                 spin_unlock(&nn->client_lock);
6597                 nfs4_put_stid(&stp->st_stid);    6133                 nfs4_put_stid(&stp->st_stid);
6598                 spin_lock(&nn->client_lock);     6134                 spin_lock(&nn->client_lock);
6599         }                                        6135         }
6600         spin_unlock(&nn->client_lock);           6136         spin_unlock(&nn->client_lock);
6601                                                  6137 
6602         /*                                       6138         /*
6603          * It's possible for a client to try     6139          * It's possible for a client to try and acquire an already held lock
6604          * that is being held for a long time    6140          * that is being held for a long time, and then lose interest in it.
6605          * So, we clean out any un-revisited     6141          * So, we clean out any un-revisited request after a lease period
6606          * under the assumption that the clie    6142          * under the assumption that the client is no longer interested.
6607          *                                       6143          *
6608          * RFC5661, sec. 9.6 states that the     6144          * RFC5661, sec. 9.6 states that the client must not rely on getting
6609          * notifications and must continue to    6145          * notifications and must continue to poll for locks, even when the
6610          * server supports them. Thus this sh    6146          * server supports them. Thus this shouldn't lead to clients blocking
6611          * indefinitely once the lock does be    6147          * indefinitely once the lock does become free.
6612          */                                      6148          */
6613         BUG_ON(!list_empty(&reaplist));          6149         BUG_ON(!list_empty(&reaplist));
6614         spin_lock(&nn->blocked_locks_lock);      6150         spin_lock(&nn->blocked_locks_lock);
6615         while (!list_empty(&nn->blocked_locks    6151         while (!list_empty(&nn->blocked_locks_lru)) {
6616                 nbl = list_first_entry(&nn->b    6152                 nbl = list_first_entry(&nn->blocked_locks_lru,
6617                                         struc    6153                                         struct nfsd4_blocked_lock, nbl_lru);
6618                 if (!state_expired(&lt, nbl->    6154                 if (!state_expired(&lt, nbl->nbl_time))
6619                         break;                   6155                         break;
6620                 list_move(&nbl->nbl_lru, &rea    6156                 list_move(&nbl->nbl_lru, &reaplist);
6621                 list_del_init(&nbl->nbl_list)    6157                 list_del_init(&nbl->nbl_list);
6622         }                                        6158         }
6623         spin_unlock(&nn->blocked_locks_lock);    6159         spin_unlock(&nn->blocked_locks_lock);
6624                                                  6160 
6625         while (!list_empty(&reaplist)) {         6161         while (!list_empty(&reaplist)) {
6626                 nbl = list_first_entry(&reapl    6162                 nbl = list_first_entry(&reaplist,
6627                                         struc    6163                                         struct nfsd4_blocked_lock, nbl_lru);
6628                 list_del_init(&nbl->nbl_lru);    6164                 list_del_init(&nbl->nbl_lru);
6629                 free_blocked_lock(nbl);          6165                 free_blocked_lock(nbl);
6630         }                                        6166         }
6631 #ifdef CONFIG_NFSD_V4_2_INTER_SSC                6167 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
6632         /* service the server-to-server copy     6168         /* service the server-to-server copy delayed unmount list */
6633         nfsd4_ssc_expire_umount(nn);             6169         nfsd4_ssc_expire_umount(nn);
6634 #endif                                           6170 #endif
6635         if (atomic_long_read(&num_delegations << 
6636                 deleg_reaper(nn);             << 
6637 out:                                             6171 out:
6638         return max_t(time64_t, lt.new_timeo,     6172         return max_t(time64_t, lt.new_timeo, NFSD_LAUNDROMAT_MINTIMEOUT);
6639 }                                                6173 }
6640                                                  6174 
6641 static void laundromat_main(struct work_struc    6175 static void laundromat_main(struct work_struct *);
6642                                                  6176 
6643 static void                                      6177 static void
6644 laundromat_main(struct work_struct *laundry)     6178 laundromat_main(struct work_struct *laundry)
6645 {                                                6179 {
6646         time64_t t;                              6180         time64_t t;
6647         struct delayed_work *dwork = to_delay    6181         struct delayed_work *dwork = to_delayed_work(laundry);
6648         struct nfsd_net *nn = container_of(dw    6182         struct nfsd_net *nn = container_of(dwork, struct nfsd_net,
6649                                            la    6183                                            laundromat_work);
6650                                                  6184 
6651         t = nfs4_laundromat(nn);                 6185         t = nfs4_laundromat(nn);
6652         queue_delayed_work(laundry_wq, &nn->l    6186         queue_delayed_work(laundry_wq, &nn->laundromat_work, t*HZ);
6653 }                                                6187 }
6654                                                  6188 
6655 static void                                      6189 static void
6656 courtesy_client_reaper(struct nfsd_net *nn)      6190 courtesy_client_reaper(struct nfsd_net *nn)
6657 {                                                6191 {
6658         struct list_head reaplist;               6192         struct list_head reaplist;
6659                                                  6193 
6660         nfs4_get_courtesy_client_reaplist(nn,    6194         nfs4_get_courtesy_client_reaplist(nn, &reaplist);
6661         nfs4_process_client_reaplist(&reaplis    6195         nfs4_process_client_reaplist(&reaplist);
6662 }                                                6196 }
6663                                                  6197 
6664 static void                                      6198 static void
6665 deleg_reaper(struct nfsd_net *nn)                6199 deleg_reaper(struct nfsd_net *nn)
6666 {                                                6200 {
6667         struct list_head *pos, *next;            6201         struct list_head *pos, *next;
6668         struct nfs4_client *clp;                 6202         struct nfs4_client *clp;
6669         LIST_HEAD(cblist);                    !! 6203         struct list_head cblist;
6670                                                  6204 
                                                   >> 6205         INIT_LIST_HEAD(&cblist);
6671         spin_lock(&nn->client_lock);             6206         spin_lock(&nn->client_lock);
6672         list_for_each_safe(pos, next, &nn->cl    6207         list_for_each_safe(pos, next, &nn->client_lru) {
6673                 clp = list_entry(pos, struct     6208                 clp = list_entry(pos, struct nfs4_client, cl_lru);
6674                 if (clp->cl_state != NFSD4_AC    6209                 if (clp->cl_state != NFSD4_ACTIVE ||
6675                         list_empty(&clp->cl_d    6210                         list_empty(&clp->cl_delegations) ||
6676                         atomic_read(&clp->cl_    6211                         atomic_read(&clp->cl_delegs_in_recall) ||
6677                         test_bit(NFSD4_CLIENT    6212                         test_bit(NFSD4_CLIENT_CB_RECALL_ANY, &clp->cl_flags) ||
6678                         (ktime_get_boottime_s    6213                         (ktime_get_boottime_seconds() -
6679                                 clp->cl_ra_ti    6214                                 clp->cl_ra_time < 5)) {
6680                         continue;                6215                         continue;
6681                 }                                6216                 }
6682                 list_add(&clp->cl_ra_cblist,     6217                 list_add(&clp->cl_ra_cblist, &cblist);
6683                                                  6218 
6684                 /* release in nfsd4_cb_recall    6219                 /* release in nfsd4_cb_recall_any_release */
6685                 kref_get(&clp->cl_nfsdfs.cl_r !! 6220                 atomic_inc(&clp->cl_rpc_users);
6686                 set_bit(NFSD4_CLIENT_CB_RECAL    6221                 set_bit(NFSD4_CLIENT_CB_RECALL_ANY, &clp->cl_flags);
6687                 clp->cl_ra_time = ktime_get_b    6222                 clp->cl_ra_time = ktime_get_boottime_seconds();
6688         }                                        6223         }
6689         spin_unlock(&nn->client_lock);           6224         spin_unlock(&nn->client_lock);
6690                                                  6225 
6691         while (!list_empty(&cblist)) {           6226         while (!list_empty(&cblist)) {
6692                 clp = list_first_entry(&cblis    6227                 clp = list_first_entry(&cblist, struct nfs4_client,
6693                                         cl_ra    6228                                         cl_ra_cblist);
6694                 list_del_init(&clp->cl_ra_cbl    6229                 list_del_init(&clp->cl_ra_cblist);
6695                 clp->cl_ra->ra_keep = 0;         6230                 clp->cl_ra->ra_keep = 0;
6696                 clp->cl_ra->ra_bmval[0] = BIT !! 6231                 clp->cl_ra->ra_bmval[0] = BIT(RCA4_TYPE_MASK_RDATA_DLG);
6697                                               << 
6698                 trace_nfsd_cb_recall_any(clp-    6232                 trace_nfsd_cb_recall_any(clp->cl_ra);
6699                 nfsd4_run_cb(&clp->cl_ra->ra_    6233                 nfsd4_run_cb(&clp->cl_ra->ra_cb);
6700         }                                        6234         }
6701 }                                                6235 }
6702                                                  6236 
6703 static void                                      6237 static void
6704 nfsd4_state_shrinker_worker(struct work_struc    6238 nfsd4_state_shrinker_worker(struct work_struct *work)
6705 {                                                6239 {
6706         struct nfsd_net *nn = container_of(wo    6240         struct nfsd_net *nn = container_of(work, struct nfsd_net,
6707                                 nfsd_shrinker    6241                                 nfsd_shrinker_work);
6708                                                  6242 
6709         courtesy_client_reaper(nn);              6243         courtesy_client_reaper(nn);
6710         deleg_reaper(nn);                        6244         deleg_reaper(nn);
6711 }                                                6245 }
6712                                                  6246 
6713 static inline __be32 nfs4_check_fh(struct svc    6247 static inline __be32 nfs4_check_fh(struct svc_fh *fhp, struct nfs4_stid *stp)
6714 {                                                6248 {
6715         if (!fh_match(&fhp->fh_handle, &stp->    6249         if (!fh_match(&fhp->fh_handle, &stp->sc_file->fi_fhandle))
6716                 return nfserr_bad_stateid;       6250                 return nfserr_bad_stateid;
6717         return nfs_ok;                           6251         return nfs_ok;
6718 }                                                6252 }
6719                                                  6253 
6720 static                                           6254 static
6721 __be32 nfs4_check_openmode(struct nfs4_ol_sta    6255 __be32 nfs4_check_openmode(struct nfs4_ol_stateid *stp, int flags)
6722 {                                                6256 {
6723         __be32 status = nfserr_openmode;         6257         __be32 status = nfserr_openmode;
6724                                                  6258 
6725         /* For lock stateid's, we test the pa    6259         /* For lock stateid's, we test the parent open, not the lock: */
6726         if (stp->st_openstp)                     6260         if (stp->st_openstp)
6727                 stp = stp->st_openstp;           6261                 stp = stp->st_openstp;
6728         if ((flags & WR_STATE) && !access_per    6262         if ((flags & WR_STATE) && !access_permit_write(stp))
6729                 goto out;                        6263                 goto out;
6730         if ((flags & RD_STATE) && !access_per    6264         if ((flags & RD_STATE) && !access_permit_read(stp))
6731                 goto out;                        6265                 goto out;
6732         status = nfs_ok;                         6266         status = nfs_ok;
6733 out:                                             6267 out:
6734         return status;                           6268         return status;
6735 }                                                6269 }
6736                                                  6270 
6737 static inline __be32                             6271 static inline __be32
6738 check_special_stateids(struct net *net, svc_f    6272 check_special_stateids(struct net *net, svc_fh *current_fh, stateid_t *stateid, int flags)
6739 {                                                6273 {
6740         if (ONE_STATEID(stateid) && (flags &     6274         if (ONE_STATEID(stateid) && (flags & RD_STATE))
6741                 return nfs_ok;                   6275                 return nfs_ok;
6742         else if (opens_in_grace(net)) {          6276         else if (opens_in_grace(net)) {
6743                 /* Answer in remaining cases     6277                 /* Answer in remaining cases depends on existence of
6744                  * conflicting state; so we m    6278                  * conflicting state; so we must wait out the grace period. */
6745                 return nfserr_grace;             6279                 return nfserr_grace;
6746         } else if (flags & WR_STATE)             6280         } else if (flags & WR_STATE)
6747                 return nfs4_share_conflict(cu    6281                 return nfs4_share_conflict(current_fh,
6748                                 NFS4_SHARE_DE    6282                                 NFS4_SHARE_DENY_WRITE);
6749         else /* (flags & RD_STATE) && ZERO_ST    6283         else /* (flags & RD_STATE) && ZERO_STATEID(stateid) */
6750                 return nfs4_share_conflict(cu    6284                 return nfs4_share_conflict(current_fh,
6751                                 NFS4_SHARE_DE    6285                                 NFS4_SHARE_DENY_READ);
6752 }                                                6286 }
6753                                                  6287 
6754 static __be32 check_stateid_generation(statei    6288 static __be32 check_stateid_generation(stateid_t *in, stateid_t *ref, bool has_session)
6755 {                                                6289 {
6756         /*                                       6290         /*
6757          * When sessions are used the stateid    6291          * When sessions are used the stateid generation number is ignored
6758          * when it is zero.                      6292          * when it is zero.
6759          */                                      6293          */
6760         if (has_session && in->si_generation     6294         if (has_session && in->si_generation == 0)
6761                 return nfs_ok;                   6295                 return nfs_ok;
6762                                                  6296 
6763         if (in->si_generation == ref->si_gene    6297         if (in->si_generation == ref->si_generation)
6764                 return nfs_ok;                   6298                 return nfs_ok;
6765                                                  6299 
6766         /* If the client sends us a stateid f    6300         /* If the client sends us a stateid from the future, it's buggy: */
6767         if (nfsd4_stateid_generation_after(in    6301         if (nfsd4_stateid_generation_after(in, ref))
6768                 return nfserr_bad_stateid;       6302                 return nfserr_bad_stateid;
6769         /*                                       6303         /*
6770          * However, we could see a stateid fr    6304          * However, we could see a stateid from the past, even from a
6771          * non-buggy client.  For example, if    6305          * non-buggy client.  For example, if the client sends a lock
6772          * while some IO is outstanding, the     6306          * while some IO is outstanding, the lock may bump si_generation
6773          * while the IO is still in flight.      6307          * while the IO is still in flight.  The client could avoid that
6774          * situation by waiting for responses    6308          * situation by waiting for responses on all the IO requests,
6775          * but better performance may result     6309          * but better performance may result in retrying IO that
6776          * receives an old_stateid error if r    6310          * receives an old_stateid error if requests are rarely
6777          * reordered in flight:                  6311          * reordered in flight:
6778          */                                      6312          */
6779         return nfserr_old_stateid;               6313         return nfserr_old_stateid;
6780 }                                                6314 }
6781                                                  6315 
6782 static __be32 nfsd4_stid_check_stateid_genera    6316 static __be32 nfsd4_stid_check_stateid_generation(stateid_t *in, struct nfs4_stid *s, bool has_session)
6783 {                                                6317 {
6784         __be32 ret;                              6318         __be32 ret;
6785                                                  6319 
6786         spin_lock(&s->sc_lock);                  6320         spin_lock(&s->sc_lock);
6787         ret = nfsd4_verify_open_stid(s);         6321         ret = nfsd4_verify_open_stid(s);
6788         if (ret == nfs_ok)                       6322         if (ret == nfs_ok)
6789                 ret = check_stateid_generatio    6323                 ret = check_stateid_generation(in, &s->sc_stateid, has_session);
6790         spin_unlock(&s->sc_lock);                6324         spin_unlock(&s->sc_lock);
6791         if (ret == nfserr_admin_revoked)      << 
6792                 nfsd40_drop_revoked_stid(s->s << 
6793                                         &s->s << 
6794         return ret;                              6325         return ret;
6795 }                                                6326 }
6796                                                  6327 
6797 static __be32 nfsd4_check_openowner_confirmed    6328 static __be32 nfsd4_check_openowner_confirmed(struct nfs4_ol_stateid *ols)
6798 {                                                6329 {
6799         if (ols->st_stateowner->so_is_open_ow    6330         if (ols->st_stateowner->so_is_open_owner &&
6800             !(openowner(ols->st_stateowner)->    6331             !(openowner(ols->st_stateowner)->oo_flags & NFS4_OO_CONFIRMED))
6801                 return nfserr_bad_stateid;       6332                 return nfserr_bad_stateid;
6802         return nfs_ok;                           6333         return nfs_ok;
6803 }                                                6334 }
6804                                                  6335 
6805 static __be32 nfsd4_validate_stateid(struct n    6336 static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid)
6806 {                                                6337 {
6807         struct nfs4_stid *s;                     6338         struct nfs4_stid *s;
6808         __be32 status = nfserr_bad_stateid;      6339         __be32 status = nfserr_bad_stateid;
6809                                                  6340 
6810         if (ZERO_STATEID(stateid) || ONE_STAT    6341         if (ZERO_STATEID(stateid) || ONE_STATEID(stateid) ||
6811                 CLOSE_STATEID(stateid))          6342                 CLOSE_STATEID(stateid))
6812                 return status;                   6343                 return status;
6813         spin_lock(&cl->cl_lock);                 6344         spin_lock(&cl->cl_lock);
6814         s = find_stateid_locked(cl, stateid);    6345         s = find_stateid_locked(cl, stateid);
6815         if (!s)                                  6346         if (!s)
6816                 goto out_unlock;                 6347                 goto out_unlock;
6817         status = nfsd4_stid_check_stateid_gen    6348         status = nfsd4_stid_check_stateid_generation(stateid, s, 1);
6818         if (status)                              6349         if (status)
6819                 goto out_unlock;                 6350                 goto out_unlock;
6820         status = nfsd4_verify_open_stid(s);   << 
6821         if (status)                           << 
6822                 goto out_unlock;              << 
6823                                               << 
6824         switch (s->sc_type) {                    6351         switch (s->sc_type) {
6825         case SC_TYPE_DELEG:                   !! 6352         case NFS4_DELEG_STID:
6826                 status = nfs_ok;                 6353                 status = nfs_ok;
6827                 break;                           6354                 break;
6828         case SC_TYPE_OPEN:                    !! 6355         case NFS4_REVOKED_DELEG_STID:
6829         case SC_TYPE_LOCK:                    !! 6356                 status = nfserr_deleg_revoked;
                                                   >> 6357                 break;
                                                   >> 6358         case NFS4_OPEN_STID:
                                                   >> 6359         case NFS4_LOCK_STID:
6830                 status = nfsd4_check_openowne    6360                 status = nfsd4_check_openowner_confirmed(openlockstateid(s));
6831                 break;                           6361                 break;
6832         default:                                 6362         default:
6833                 printk("unknown stateid type     6363                 printk("unknown stateid type %x\n", s->sc_type);
                                                   >> 6364                 fallthrough;
                                                   >> 6365         case NFS4_CLOSED_STID:
                                                   >> 6366         case NFS4_CLOSED_DELEG_STID:
6834                 status = nfserr_bad_stateid;     6367                 status = nfserr_bad_stateid;
6835         }                                        6368         }
6836 out_unlock:                                      6369 out_unlock:
6837         spin_unlock(&cl->cl_lock);               6370         spin_unlock(&cl->cl_lock);
6838         if (status == nfserr_admin_revoked)   << 
6839                 nfsd40_drop_revoked_stid(cl,  << 
6840         return status;                           6371         return status;
6841 }                                                6372 }
6842                                                  6373 
6843 __be32                                           6374 __be32
6844 nfsd4_lookup_stateid(struct nfsd4_compound_st    6375 nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate,
6845                      stateid_t *stateid,      !! 6376                      stateid_t *stateid, unsigned char typemask,
6846                      unsigned short typemask, << 
6847                      struct nfs4_stid **s, st    6377                      struct nfs4_stid **s, struct nfsd_net *nn)
6848 {                                                6378 {
6849         __be32 status;                           6379         __be32 status;
6850         struct nfs4_stid *stid;                  6380         struct nfs4_stid *stid;
6851         bool return_revoked = false;             6381         bool return_revoked = false;
6852                                                  6382 
6853         /*                                       6383         /*
6854          *  only return revoked delegations i    6384          *  only return revoked delegations if explicitly asked.
6855          *  otherwise we report revoked or ba    6385          *  otherwise we report revoked or bad_stateid status.
6856          */                                      6386          */
6857         if (statusmask & SC_STATUS_REVOKED)   !! 6387         if (typemask & NFS4_REVOKED_DELEG_STID)
6858                 return_revoked = true;           6388                 return_revoked = true;
6859         if (typemask & SC_TYPE_DELEG)         !! 6389         else if (typemask & NFS4_DELEG_STID)
6860                 /* Always allow REVOKED for D !! 6390                 typemask |= NFS4_REVOKED_DELEG_STID;
6861                  * retturn the appropriate er << 
6862                  */                           << 
6863                 statusmask |= SC_STATUS_REVOK << 
6864                                               << 
6865         statusmask |= SC_STATUS_ADMIN_REVOKED << 
6866                                                  6391 
6867         if (ZERO_STATEID(stateid) || ONE_STAT    6392         if (ZERO_STATEID(stateid) || ONE_STATEID(stateid) ||
6868                 CLOSE_STATEID(stateid))          6393                 CLOSE_STATEID(stateid))
6869                 return nfserr_bad_stateid;       6394                 return nfserr_bad_stateid;
6870         status = set_client(&stateid->si_opaq    6395         status = set_client(&stateid->si_opaque.so_clid, cstate, nn);
6871         if (status == nfserr_stale_clientid)     6396         if (status == nfserr_stale_clientid) {
6872                 if (cstate->session)             6397                 if (cstate->session)
6873                         return nfserr_bad_sta    6398                         return nfserr_bad_stateid;
6874                 return nfserr_stale_stateid;     6399                 return nfserr_stale_stateid;
6875         }                                        6400         }
6876         if (status)                              6401         if (status)
6877                 return status;                   6402                 return status;
6878         stid = find_stateid_by_type(cstate->c !! 6403         stid = find_stateid_by_type(cstate->clp, stateid, typemask);
6879         if (!stid)                               6404         if (!stid)
6880                 return nfserr_bad_stateid;       6405                 return nfserr_bad_stateid;
6881         if ((stid->sc_status & SC_STATUS_REVO !! 6406         if ((stid->sc_type == NFS4_REVOKED_DELEG_STID) && !return_revoked) {
6882                 nfs4_put_stid(stid);          << 
6883                 return nfserr_deleg_revoked;  << 
6884         }                                     << 
6885         if (stid->sc_status & SC_STATUS_ADMIN << 
6886                 nfsd40_drop_revoked_stid(csta << 
6887                 nfs4_put_stid(stid);             6407                 nfs4_put_stid(stid);
6888                 return nfserr_admin_revoked;  !! 6408                 if (cstate->minorversion)
                                                   >> 6409                         return nfserr_deleg_revoked;
                                                   >> 6410                 return nfserr_bad_stateid;
6889         }                                        6411         }
6890         *s = stid;                               6412         *s = stid;
6891         return nfs_ok;                           6413         return nfs_ok;
6892 }                                                6414 }
6893                                                  6415 
6894 static struct nfsd_file *                        6416 static struct nfsd_file *
6895 nfs4_find_file(struct nfs4_stid *s, int flags    6417 nfs4_find_file(struct nfs4_stid *s, int flags)
6896 {                                                6418 {
6897         struct nfsd_file *ret = NULL;            6419         struct nfsd_file *ret = NULL;
6898                                                  6420 
6899         if (!s || s->sc_status)               !! 6421         if (!s)
6900                 return NULL;                     6422                 return NULL;
6901                                                  6423 
6902         switch (s->sc_type) {                    6424         switch (s->sc_type) {
6903         case SC_TYPE_DELEG:                   !! 6425         case NFS4_DELEG_STID:
6904                 spin_lock(&s->sc_file->fi_loc    6426                 spin_lock(&s->sc_file->fi_lock);
6905                 ret = nfsd_file_get(s->sc_fil    6427                 ret = nfsd_file_get(s->sc_file->fi_deleg_file);
6906                 spin_unlock(&s->sc_file->fi_l    6428                 spin_unlock(&s->sc_file->fi_lock);
6907                 break;                           6429                 break;
6908         case SC_TYPE_OPEN:                    !! 6430         case NFS4_OPEN_STID:
6909         case SC_TYPE_LOCK:                    !! 6431         case NFS4_LOCK_STID:
6910                 if (flags & RD_STATE)            6432                 if (flags & RD_STATE)
6911                         ret = find_readable_f    6433                         ret = find_readable_file(s->sc_file);
6912                 else                             6434                 else
6913                         ret = find_writeable_    6435                         ret = find_writeable_file(s->sc_file);
6914         }                                        6436         }
6915                                                  6437 
6916         return ret;                              6438         return ret;
6917 }                                                6439 }
6918                                                  6440 
6919 static __be32                                    6441 static __be32
6920 nfs4_check_olstateid(struct nfs4_ol_stateid *    6442 nfs4_check_olstateid(struct nfs4_ol_stateid *ols, int flags)
6921 {                                                6443 {
6922         __be32 status;                           6444         __be32 status;
6923                                                  6445 
6924         status = nfsd4_check_openowner_confir    6446         status = nfsd4_check_openowner_confirmed(ols);
6925         if (status)                              6447         if (status)
6926                 return status;                   6448                 return status;
6927         return nfs4_check_openmode(ols, flags    6449         return nfs4_check_openmode(ols, flags);
6928 }                                                6450 }
6929                                                  6451 
6930 static __be32                                    6452 static __be32
6931 nfs4_check_file(struct svc_rqst *rqstp, struc    6453 nfs4_check_file(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfs4_stid *s,
6932                 struct nfsd_file **nfp, int f    6454                 struct nfsd_file **nfp, int flags)
6933 {                                                6455 {
6934         int acc = (flags & RD_STATE) ? NFSD_M    6456         int acc = (flags & RD_STATE) ? NFSD_MAY_READ : NFSD_MAY_WRITE;
6935         struct nfsd_file *nf;                    6457         struct nfsd_file *nf;
6936         __be32 status;                           6458         __be32 status;
6937                                                  6459 
6938         nf = nfs4_find_file(s, flags);           6460         nf = nfs4_find_file(s, flags);
6939         if (nf) {                                6461         if (nf) {
6940                 status = nfsd_permission(&rqs !! 6462                 status = nfsd_permission(rqstp, fhp->fh_export, fhp->fh_dentry,
6941                                          fhp- << 
6942                                 acc | NFSD_MA    6463                                 acc | NFSD_MAY_OWNER_OVERRIDE);
6943                 if (status) {                    6464                 if (status) {
6944                         nfsd_file_put(nf);       6465                         nfsd_file_put(nf);
6945                         goto out;                6466                         goto out;
6946                 }                                6467                 }
6947         } else {                                 6468         } else {
6948                 status = nfsd_file_acquire(rq    6469                 status = nfsd_file_acquire(rqstp, fhp, acc, &nf);
6949                 if (status)                      6470                 if (status)
6950                         return status;           6471                         return status;
6951         }                                        6472         }
6952         *nfp = nf;                               6473         *nfp = nf;
6953 out:                                             6474 out:
6954         return status;                           6475         return status;
6955 }                                                6476 }
6956 static void                                      6477 static void
6957 _free_cpntf_state_locked(struct nfsd_net *nn,    6478 _free_cpntf_state_locked(struct nfsd_net *nn, struct nfs4_cpntf_state *cps)
6958 {                                                6479 {
6959         WARN_ON_ONCE(cps->cp_stateid.cs_type     6480         WARN_ON_ONCE(cps->cp_stateid.cs_type != NFS4_COPYNOTIFY_STID);
6960         if (!refcount_dec_and_test(&cps->cp_s    6481         if (!refcount_dec_and_test(&cps->cp_stateid.cs_count))
6961                 return;                          6482                 return;
6962         list_del(&cps->cp_list);                 6483         list_del(&cps->cp_list);
6963         idr_remove(&nn->s2s_cp_stateids,         6484         idr_remove(&nn->s2s_cp_stateids,
6964                    cps->cp_stateid.cs_stid.si    6485                    cps->cp_stateid.cs_stid.si_opaque.so_id);
6965         kfree(cps);                              6486         kfree(cps);
6966 }                                                6487 }
6967 /*                                               6488 /*
6968  * A READ from an inter server to server COPY    6489  * A READ from an inter server to server COPY will have a
6969  * copy stateid. Look up the copy notify stat    6490  * copy stateid. Look up the copy notify stateid from the
6970  * idr structure and take a reference on it.     6491  * idr structure and take a reference on it.
6971  */                                              6492  */
6972 __be32 manage_cpntf_state(struct nfsd_net *nn    6493 __be32 manage_cpntf_state(struct nfsd_net *nn, stateid_t *st,
6973                           struct nfs4_client     6494                           struct nfs4_client *clp,
6974                           struct nfs4_cpntf_s    6495                           struct nfs4_cpntf_state **cps)
6975 {                                                6496 {
6976         copy_stateid_t *cps_t;                   6497         copy_stateid_t *cps_t;
6977         struct nfs4_cpntf_state *state = NULL    6498         struct nfs4_cpntf_state *state = NULL;
6978                                                  6499 
6979         if (st->si_opaque.so_clid.cl_id != nn    6500         if (st->si_opaque.so_clid.cl_id != nn->s2s_cp_cl_id)
6980                 return nfserr_bad_stateid;       6501                 return nfserr_bad_stateid;
6981         spin_lock(&nn->s2s_cp_lock);             6502         spin_lock(&nn->s2s_cp_lock);
6982         cps_t = idr_find(&nn->s2s_cp_stateids    6503         cps_t = idr_find(&nn->s2s_cp_stateids, st->si_opaque.so_id);
6983         if (cps_t) {                             6504         if (cps_t) {
6984                 state = container_of(cps_t, s    6505                 state = container_of(cps_t, struct nfs4_cpntf_state,
6985                                      cp_state    6506                                      cp_stateid);
6986                 if (state->cp_stateid.cs_type    6507                 if (state->cp_stateid.cs_type != NFS4_COPYNOTIFY_STID) {
6987                         state = NULL;            6508                         state = NULL;
6988                         goto unlock;             6509                         goto unlock;
6989                 }                                6510                 }
6990                 if (!clp)                        6511                 if (!clp)
6991                         refcount_inc(&state->    6512                         refcount_inc(&state->cp_stateid.cs_count);
6992                 else                             6513                 else
6993                         _free_cpntf_state_loc    6514                         _free_cpntf_state_locked(nn, state);
6994         }                                        6515         }
6995 unlock:                                          6516 unlock:
6996         spin_unlock(&nn->s2s_cp_lock);           6517         spin_unlock(&nn->s2s_cp_lock);
6997         if (!state)                              6518         if (!state)
6998                 return nfserr_bad_stateid;       6519                 return nfserr_bad_stateid;
6999         if (!clp)                             !! 6520         if (!clp && state)
7000                 *cps = state;                    6521                 *cps = state;
7001         return 0;                                6522         return 0;
7002 }                                                6523 }
7003                                                  6524 
7004 static __be32 find_cpntf_state(struct nfsd_ne    6525 static __be32 find_cpntf_state(struct nfsd_net *nn, stateid_t *st,
7005                                struct nfs4_st    6526                                struct nfs4_stid **stid)
7006 {                                                6527 {
7007         __be32 status;                           6528         __be32 status;
7008         struct nfs4_cpntf_state *cps = NULL;     6529         struct nfs4_cpntf_state *cps = NULL;
7009         struct nfs4_client *found;               6530         struct nfs4_client *found;
7010                                                  6531 
7011         status = manage_cpntf_state(nn, st, N    6532         status = manage_cpntf_state(nn, st, NULL, &cps);
7012         if (status)                              6533         if (status)
7013                 return status;                   6534                 return status;
7014                                                  6535 
7015         cps->cpntf_time = ktime_get_boottime_    6536         cps->cpntf_time = ktime_get_boottime_seconds();
7016                                                  6537 
7017         status = nfserr_expired;                 6538         status = nfserr_expired;
7018         found = lookup_clientid(&cps->cp_p_cl    6539         found = lookup_clientid(&cps->cp_p_clid, true, nn);
7019         if (!found)                              6540         if (!found)
7020                 goto out;                        6541                 goto out;
7021                                                  6542 
7022         *stid = find_stateid_by_type(found, &    6543         *stid = find_stateid_by_type(found, &cps->cp_p_stateid,
7023                                      SC_TYPE_ !! 6544                         NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID);
7024                                      0);      << 
7025         if (*stid)                               6545         if (*stid)
7026                 status = nfs_ok;                 6546                 status = nfs_ok;
7027         else                                     6547         else
7028                 status = nfserr_bad_stateid;     6548                 status = nfserr_bad_stateid;
7029                                                  6549 
7030         put_client_renew(found);                 6550         put_client_renew(found);
7031 out:                                             6551 out:
7032         nfs4_put_cpntf_state(nn, cps);           6552         nfs4_put_cpntf_state(nn, cps);
7033         return status;                           6553         return status;
7034 }                                                6554 }
7035                                                  6555 
7036 void nfs4_put_cpntf_state(struct nfsd_net *nn    6556 void nfs4_put_cpntf_state(struct nfsd_net *nn, struct nfs4_cpntf_state *cps)
7037 {                                                6557 {
7038         spin_lock(&nn->s2s_cp_lock);             6558         spin_lock(&nn->s2s_cp_lock);
7039         _free_cpntf_state_locked(nn, cps);       6559         _free_cpntf_state_locked(nn, cps);
7040         spin_unlock(&nn->s2s_cp_lock);           6560         spin_unlock(&nn->s2s_cp_lock);
7041 }                                                6561 }
7042                                                  6562 
7043 /**                                              6563 /**
7044  * nfs4_preprocess_stateid_op - find and prep    6564  * nfs4_preprocess_stateid_op - find and prep stateid for an operation
7045  * @rqstp: incoming request from client          6565  * @rqstp: incoming request from client
7046  * @cstate: current compound state               6566  * @cstate: current compound state
7047  * @fhp: filehandle associated with requested    6567  * @fhp: filehandle associated with requested stateid
7048  * @stateid: stateid (provided by client)        6568  * @stateid: stateid (provided by client)
7049  * @flags: flags describing type of operation    6569  * @flags: flags describing type of operation to be done
7050  * @nfp: optional nfsd_file return pointer (m    6570  * @nfp: optional nfsd_file return pointer (may be NULL)
7051  * @cstid: optional returned nfs4_stid pointe    6571  * @cstid: optional returned nfs4_stid pointer (may be NULL)
7052  *                                               6572  *
7053  * Given info from the client, look up a nfs4    6573  * Given info from the client, look up a nfs4_stid for the operation. On
7054  * success, it returns a reference to the nfs    6574  * success, it returns a reference to the nfs4_stid and/or the nfsd_file
7055  * associated with it.                           6575  * associated with it.
7056  */                                              6576  */
7057 __be32                                           6577 __be32
7058 nfs4_preprocess_stateid_op(struct svc_rqst *r    6578 nfs4_preprocess_stateid_op(struct svc_rqst *rqstp,
7059                 struct nfsd4_compound_state *    6579                 struct nfsd4_compound_state *cstate, struct svc_fh *fhp,
7060                 stateid_t *stateid, int flags    6580                 stateid_t *stateid, int flags, struct nfsd_file **nfp,
7061                 struct nfs4_stid **cstid)        6581                 struct nfs4_stid **cstid)
7062 {                                                6582 {
7063         struct net *net = SVC_NET(rqstp);        6583         struct net *net = SVC_NET(rqstp);
7064         struct nfsd_net *nn = net_generic(net    6584         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
7065         struct nfs4_stid *s = NULL;              6585         struct nfs4_stid *s = NULL;
7066         __be32 status;                           6586         __be32 status;
7067                                                  6587 
7068         if (nfp)                                 6588         if (nfp)
7069                 *nfp = NULL;                     6589                 *nfp = NULL;
7070                                                  6590 
7071         if (ZERO_STATEID(stateid) || ONE_STAT    6591         if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) {
7072                 status = check_special_statei !! 6592                 if (cstid)
                                                   >> 6593                         status = nfserr_bad_stateid;
                                                   >> 6594                 else
                                                   >> 6595                         status = check_special_stateids(net, fhp, stateid,
                                                   >> 6596                                                                         flags);
7073                 goto done;                       6597                 goto done;
7074         }                                        6598         }
7075                                                  6599 
7076         status = nfsd4_lookup_stateid(cstate,    6600         status = nfsd4_lookup_stateid(cstate, stateid,
7077                                 SC_TYPE_DELEG !! 6601                                 NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID,
7078                                 0, &s, nn);   !! 6602                                 &s, nn);
7079         if (status == nfserr_bad_stateid)        6603         if (status == nfserr_bad_stateid)
7080                 status = find_cpntf_state(nn,    6604                 status = find_cpntf_state(nn, stateid, &s);
7081         if (status)                              6605         if (status)
7082                 return status;                   6606                 return status;
7083         status = nfsd4_stid_check_stateid_gen    6607         status = nfsd4_stid_check_stateid_generation(stateid, s,
7084                         nfsd4_has_session(cst    6608                         nfsd4_has_session(cstate));
7085         if (status)                              6609         if (status)
7086                 goto out;                        6610                 goto out;
7087                                                  6611 
7088         switch (s->sc_type) {                    6612         switch (s->sc_type) {
7089         case SC_TYPE_DELEG:                   !! 6613         case NFS4_DELEG_STID:
7090                 status = nfs4_check_delegmode    6614                 status = nfs4_check_delegmode(delegstateid(s), flags);
7091                 break;                           6615                 break;
7092         case SC_TYPE_OPEN:                    !! 6616         case NFS4_OPEN_STID:
7093         case SC_TYPE_LOCK:                    !! 6617         case NFS4_LOCK_STID:
7094                 status = nfs4_check_olstateid    6618                 status = nfs4_check_olstateid(openlockstateid(s), flags);
7095                 break;                           6619                 break;
                                                   >> 6620         default:
                                                   >> 6621                 status = nfserr_bad_stateid;
                                                   >> 6622                 break;
7096         }                                        6623         }
7097         if (status)                              6624         if (status)
7098                 goto out;                        6625                 goto out;
7099         status = nfs4_check_fh(fhp, s);          6626         status = nfs4_check_fh(fhp, s);
7100                                                  6627 
7101 done:                                            6628 done:
7102         if (status == nfs_ok && nfp)             6629         if (status == nfs_ok && nfp)
7103                 status = nfs4_check_file(rqst    6630                 status = nfs4_check_file(rqstp, fhp, s, nfp, flags);
7104 out:                                             6631 out:
7105         if (s) {                                 6632         if (s) {
7106                 if (!status && cstid)            6633                 if (!status && cstid)
7107                         *cstid = s;              6634                         *cstid = s;
7108                 else                             6635                 else
7109                         nfs4_put_stid(s);        6636                         nfs4_put_stid(s);
7110         }                                        6637         }
7111         return status;                           6638         return status;
7112 }                                                6639 }
7113                                                  6640 
7114 /*                                               6641 /*
7115  * Test if the stateid is valid                  6642  * Test if the stateid is valid
7116  */                                              6643  */
7117 __be32                                           6644 __be32
7118 nfsd4_test_stateid(struct svc_rqst *rqstp, st    6645 nfsd4_test_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
7119                    union nfsd4_op_u *u)          6646                    union nfsd4_op_u *u)
7120 {                                                6647 {
7121         struct nfsd4_test_stateid *test_state    6648         struct nfsd4_test_stateid *test_stateid = &u->test_stateid;
7122         struct nfsd4_test_stateid_id *stateid    6649         struct nfsd4_test_stateid_id *stateid;
7123         struct nfs4_client *cl = cstate->clp;    6650         struct nfs4_client *cl = cstate->clp;
7124                                                  6651 
7125         list_for_each_entry(stateid, &test_st    6652         list_for_each_entry(stateid, &test_stateid->ts_stateid_list, ts_id_list)
7126                 stateid->ts_id_status =          6653                 stateid->ts_id_status =
7127                         nfsd4_validate_statei    6654                         nfsd4_validate_stateid(cl, &stateid->ts_id_stateid);
7128                                                  6655 
7129         return nfs_ok;                           6656         return nfs_ok;
7130 }                                                6657 }
7131                                                  6658 
7132 static __be32                                    6659 static __be32
7133 nfsd4_free_lock_stateid(stateid_t *stateid, s    6660 nfsd4_free_lock_stateid(stateid_t *stateid, struct nfs4_stid *s)
7134 {                                                6661 {
7135         struct nfs4_ol_stateid *stp = openloc    6662         struct nfs4_ol_stateid *stp = openlockstateid(s);
7136         __be32 ret;                              6663         __be32 ret;
7137                                                  6664 
7138         ret = nfsd4_lock_ol_stateid(stp);        6665         ret = nfsd4_lock_ol_stateid(stp);
7139         if (ret)                                 6666         if (ret)
7140                 goto out_put_stid;               6667                 goto out_put_stid;
7141                                                  6668 
7142         ret = check_stateid_generation(statei    6669         ret = check_stateid_generation(stateid, &s->sc_stateid, 1);
7143         if (ret)                                 6670         if (ret)
7144                 goto out;                        6671                 goto out;
7145                                                  6672 
7146         ret = nfserr_locks_held;                 6673         ret = nfserr_locks_held;
7147         if (check_for_locks(stp->st_stid.sc_f    6674         if (check_for_locks(stp->st_stid.sc_file,
7148                             lockowner(stp->st    6675                             lockowner(stp->st_stateowner)))
7149                 goto out;                        6676                 goto out;
7150                                                  6677 
7151         release_lock_stateid(stp);               6678         release_lock_stateid(stp);
7152         ret = nfs_ok;                            6679         ret = nfs_ok;
7153                                                  6680 
7154 out:                                             6681 out:
7155         mutex_unlock(&stp->st_mutex);            6682         mutex_unlock(&stp->st_mutex);
7156 out_put_stid:                                    6683 out_put_stid:
7157         nfs4_put_stid(s);                        6684         nfs4_put_stid(s);
7158         return ret;                              6685         return ret;
7159 }                                                6686 }
7160                                                  6687 
7161 __be32                                           6688 __be32
7162 nfsd4_free_stateid(struct svc_rqst *rqstp, st    6689 nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
7163                    union nfsd4_op_u *u)          6690                    union nfsd4_op_u *u)
7164 {                                                6691 {
7165         struct nfsd4_free_stateid *free_state    6692         struct nfsd4_free_stateid *free_stateid = &u->free_stateid;
7166         stateid_t *stateid = &free_stateid->f    6693         stateid_t *stateid = &free_stateid->fr_stateid;
7167         struct nfs4_stid *s;                     6694         struct nfs4_stid *s;
7168         struct nfs4_delegation *dp;              6695         struct nfs4_delegation *dp;
7169         struct nfs4_client *cl = cstate->clp;    6696         struct nfs4_client *cl = cstate->clp;
7170         __be32 ret = nfserr_bad_stateid;         6697         __be32 ret = nfserr_bad_stateid;
7171                                                  6698 
7172         spin_lock(&cl->cl_lock);                 6699         spin_lock(&cl->cl_lock);
7173         s = find_stateid_locked(cl, stateid);    6700         s = find_stateid_locked(cl, stateid);
7174         if (!s || s->sc_status & SC_STATUS_CL !! 6701         if (!s)
7175                 goto out_unlock;                 6702                 goto out_unlock;
7176         if (s->sc_status & SC_STATUS_ADMIN_RE << 
7177                 nfsd4_drop_revoked_stid(s);   << 
7178                 ret = nfs_ok;                 << 
7179                 goto out;                     << 
7180         }                                     << 
7181         spin_lock(&s->sc_lock);                  6703         spin_lock(&s->sc_lock);
7182         switch (s->sc_type) {                    6704         switch (s->sc_type) {
7183         case SC_TYPE_DELEG:                   !! 6705         case NFS4_DELEG_STID:
7184                 if (s->sc_status & SC_STATUS_ << 
7185                         s->sc_status |= SC_ST << 
7186                         spin_unlock(&s->sc_lo << 
7187                         dp = delegstateid(s); << 
7188                         if (s->sc_status & SC << 
7189                                 list_del_init << 
7190                         s->sc_status |= SC_ST << 
7191                         spin_unlock(&cl->cl_l << 
7192                         nfs4_put_stid(s);     << 
7193                         ret = nfs_ok;         << 
7194                         goto out;             << 
7195                 }                             << 
7196                 ret = nfserr_locks_held;         6706                 ret = nfserr_locks_held;
7197                 break;                           6707                 break;
7198         case SC_TYPE_OPEN:                    !! 6708         case NFS4_OPEN_STID:
7199                 ret = check_stateid_generatio    6709                 ret = check_stateid_generation(stateid, &s->sc_stateid, 1);
7200                 if (ret)                         6710                 if (ret)
7201                         break;                   6711                         break;
7202                 ret = nfserr_locks_held;         6712                 ret = nfserr_locks_held;
7203                 break;                           6713                 break;
7204         case SC_TYPE_LOCK:                    !! 6714         case NFS4_LOCK_STID:
7205                 spin_unlock(&s->sc_lock);        6715                 spin_unlock(&s->sc_lock);
7206                 refcount_inc(&s->sc_count);      6716                 refcount_inc(&s->sc_count);
7207                 spin_unlock(&cl->cl_lock);       6717                 spin_unlock(&cl->cl_lock);
7208                 ret = nfsd4_free_lock_stateid    6718                 ret = nfsd4_free_lock_stateid(stateid, s);
7209                 goto out;                        6719                 goto out;
                                                   >> 6720         case NFS4_REVOKED_DELEG_STID:
                                                   >> 6721                 spin_unlock(&s->sc_lock);
                                                   >> 6722                 dp = delegstateid(s);
                                                   >> 6723                 list_del_init(&dp->dl_recall_lru);
                                                   >> 6724                 spin_unlock(&cl->cl_lock);
                                                   >> 6725                 nfs4_put_stid(s);
                                                   >> 6726                 ret = nfs_ok;
                                                   >> 6727                 goto out;
                                                   >> 6728         /* Default falls through and returns nfserr_bad_stateid */
7210         }                                        6729         }
7211         spin_unlock(&s->sc_lock);                6730         spin_unlock(&s->sc_lock);
7212 out_unlock:                                      6731 out_unlock:
7213         spin_unlock(&cl->cl_lock);               6732         spin_unlock(&cl->cl_lock);
7214 out:                                             6733 out:
7215         return ret;                              6734         return ret;
7216 }                                                6735 }
7217                                                  6736 
7218 static inline int                                6737 static inline int
7219 setlkflg (int type)                              6738 setlkflg (int type)
7220 {                                                6739 {
7221         return (type == NFS4_READW_LT || type    6740         return (type == NFS4_READW_LT || type == NFS4_READ_LT) ?
7222                 RD_STATE : WR_STATE;             6741                 RD_STATE : WR_STATE;
7223 }                                                6742 }
7224                                                  6743 
7225 static __be32 nfs4_seqid_op_checks(struct nfs    6744 static __be32 nfs4_seqid_op_checks(struct nfsd4_compound_state *cstate, stateid_t *stateid, u32 seqid, struct nfs4_ol_stateid *stp)
7226 {                                                6745 {
7227         struct svc_fh *current_fh = &cstate->    6746         struct svc_fh *current_fh = &cstate->current_fh;
7228         struct nfs4_stateowner *sop = stp->st    6747         struct nfs4_stateowner *sop = stp->st_stateowner;
7229         __be32 status;                           6748         __be32 status;
7230                                                  6749 
7231         status = nfsd4_check_seqid(cstate, so    6750         status = nfsd4_check_seqid(cstate, sop, seqid);
7232         if (status)                              6751         if (status)
7233                 return status;                   6752                 return status;
7234         status = nfsd4_lock_ol_stateid(stp);     6753         status = nfsd4_lock_ol_stateid(stp);
7235         if (status != nfs_ok)                    6754         if (status != nfs_ok)
7236                 return status;                   6755                 return status;
7237         status = check_stateid_generation(sta    6756         status = check_stateid_generation(stateid, &stp->st_stid.sc_stateid, nfsd4_has_session(cstate));
7238         if (status == nfs_ok)                    6757         if (status == nfs_ok)
7239                 status = nfs4_check_fh(curren    6758                 status = nfs4_check_fh(current_fh, &stp->st_stid);
7240         if (status != nfs_ok)                    6759         if (status != nfs_ok)
7241                 mutex_unlock(&stp->st_mutex);    6760                 mutex_unlock(&stp->st_mutex);
7242         return status;                           6761         return status;
7243 }                                                6762 }
7244                                                  6763 
7245 /**                                              6764 /**
7246  * nfs4_preprocess_seqid_op - find and prep a    6765  * nfs4_preprocess_seqid_op - find and prep an ol_stateid for a seqid-morphing op
7247  * @cstate: compund state                        6766  * @cstate: compund state
7248  * @seqid: seqid (provided by client)            6767  * @seqid: seqid (provided by client)
7249  * @stateid: stateid (provided by client)        6768  * @stateid: stateid (provided by client)
7250  * @typemask: mask of allowable types for thi    6769  * @typemask: mask of allowable types for this operation
7251  * @statusmask: mask of allowed states: 0 or  << 
7252  * @stpp: return pointer for the stateid foun    6770  * @stpp: return pointer for the stateid found
7253  * @nn: net namespace for request                6771  * @nn: net namespace for request
7254  *                                               6772  *
7255  * Given a stateid+seqid from a client, look     6773  * Given a stateid+seqid from a client, look up an nfs4_ol_stateid and
7256  * return it in @stpp. On a nfs_ok return, th    6774  * return it in @stpp. On a nfs_ok return, the returned stateid will
7257  * have its st_mutex locked.                     6775  * have its st_mutex locked.
7258  */                                              6776  */
7259 static __be32                                    6777 static __be32
7260 nfs4_preprocess_seqid_op(struct nfsd4_compoun    6778 nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
7261                          stateid_t *stateid,  !! 6779                          stateid_t *stateid, char typemask,
7262                          unsigned short typem << 
7263                          struct nfs4_ol_state    6780                          struct nfs4_ol_stateid **stpp,
7264                          struct nfsd_net *nn)    6781                          struct nfsd_net *nn)
7265 {                                                6782 {
7266         __be32 status;                           6783         __be32 status;
7267         struct nfs4_stid *s;                     6784         struct nfs4_stid *s;
7268         struct nfs4_ol_stateid *stp = NULL;      6785         struct nfs4_ol_stateid *stp = NULL;
7269                                                  6786 
7270         trace_nfsd_preprocess(seqid, stateid)    6787         trace_nfsd_preprocess(seqid, stateid);
7271                                                  6788 
7272         *stpp = NULL;                            6789         *stpp = NULL;
7273 retry:                                        !! 6790         status = nfsd4_lookup_stateid(cstate, stateid, typemask, &s, nn);
7274         status = nfsd4_lookup_stateid(cstate, << 
7275                                       typemas << 
7276         if (status)                              6791         if (status)
7277                 return status;                   6792                 return status;
7278         stp = openlockstateid(s);                6793         stp = openlockstateid(s);
7279         if (nfsd4_cstate_assign_replay(cstate !! 6794         nfsd4_cstate_assign_replay(cstate, stp->st_stateowner);
7280                 nfs4_put_stateowner(stp->st_s << 
7281                 goto retry;                   << 
7282         }                                     << 
7283                                                  6795 
7284         status = nfs4_seqid_op_checks(cstate,    6796         status = nfs4_seqid_op_checks(cstate, stateid, seqid, stp);
7285         if (!status)                             6797         if (!status)
7286                 *stpp = stp;                     6798                 *stpp = stp;
7287         else                                     6799         else
7288                 nfs4_put_stid(&stp->st_stid);    6800                 nfs4_put_stid(&stp->st_stid);
7289         return status;                           6801         return status;
7290 }                                                6802 }
7291                                                  6803 
7292 static __be32 nfs4_preprocess_confirmed_seqid    6804 static __be32 nfs4_preprocess_confirmed_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
7293                                                  6805                                                  stateid_t *stateid, struct nfs4_ol_stateid **stpp, struct nfsd_net *nn)
7294 {                                                6806 {
7295         __be32 status;                           6807         __be32 status;
7296         struct nfs4_openowner *oo;               6808         struct nfs4_openowner *oo;
7297         struct nfs4_ol_stateid *stp;             6809         struct nfs4_ol_stateid *stp;
7298                                                  6810 
7299         status = nfs4_preprocess_seqid_op(cst    6811         status = nfs4_preprocess_seqid_op(cstate, seqid, stateid,
7300                                           SC_ !! 6812                                                 NFS4_OPEN_STID, &stp, nn);
7301         if (status)                              6813         if (status)
7302                 return status;                   6814                 return status;
7303         oo = openowner(stp->st_stateowner);      6815         oo = openowner(stp->st_stateowner);
7304         if (!(oo->oo_flags & NFS4_OO_CONFIRME    6816         if (!(oo->oo_flags & NFS4_OO_CONFIRMED)) {
7305                 mutex_unlock(&stp->st_mutex);    6817                 mutex_unlock(&stp->st_mutex);
7306                 nfs4_put_stid(&stp->st_stid);    6818                 nfs4_put_stid(&stp->st_stid);
7307                 return nfserr_bad_stateid;       6819                 return nfserr_bad_stateid;
7308         }                                        6820         }
7309         *stpp = stp;                             6821         *stpp = stp;
7310         return nfs_ok;                           6822         return nfs_ok;
7311 }                                                6823 }
7312                                                  6824 
7313 __be32                                           6825 __be32
7314 nfsd4_open_confirm(struct svc_rqst *rqstp, st    6826 nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
7315                    union nfsd4_op_u *u)          6827                    union nfsd4_op_u *u)
7316 {                                                6828 {
7317         struct nfsd4_open_confirm *oc = &u->o    6829         struct nfsd4_open_confirm *oc = &u->open_confirm;
7318         __be32 status;                           6830         __be32 status;
7319         struct nfs4_openowner *oo;               6831         struct nfs4_openowner *oo;
7320         struct nfs4_ol_stateid *stp;             6832         struct nfs4_ol_stateid *stp;
7321         struct nfsd_net *nn = net_generic(SVC    6833         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
7322                                                  6834 
7323         dprintk("NFSD: nfsd4_open_confirm on     6835         dprintk("NFSD: nfsd4_open_confirm on file %pd\n",
7324                         cstate->current_fh.fh    6836                         cstate->current_fh.fh_dentry);
7325                                                  6837 
7326         status = fh_verify(rqstp, &cstate->cu    6838         status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0);
7327         if (status)                              6839         if (status)
7328                 return status;                   6840                 return status;
7329                                                  6841 
7330         status = nfs4_preprocess_seqid_op(cst    6842         status = nfs4_preprocess_seqid_op(cstate,
7331                                           oc- !! 6843                                         oc->oc_seqid, &oc->oc_req_stateid,
7332                                           SC_ !! 6844                                         NFS4_OPEN_STID, &stp, nn);
7333         if (status)                              6845         if (status)
7334                 goto out;                        6846                 goto out;
7335         oo = openowner(stp->st_stateowner);      6847         oo = openowner(stp->st_stateowner);
7336         status = nfserr_bad_stateid;             6848         status = nfserr_bad_stateid;
7337         if (oo->oo_flags & NFS4_OO_CONFIRMED)    6849         if (oo->oo_flags & NFS4_OO_CONFIRMED) {
7338                 mutex_unlock(&stp->st_mutex);    6850                 mutex_unlock(&stp->st_mutex);
7339                 goto put_stateid;                6851                 goto put_stateid;
7340         }                                        6852         }
7341         oo->oo_flags |= NFS4_OO_CONFIRMED;       6853         oo->oo_flags |= NFS4_OO_CONFIRMED;
7342         nfs4_inc_and_copy_stateid(&oc->oc_res    6854         nfs4_inc_and_copy_stateid(&oc->oc_resp_stateid, &stp->st_stid);
7343         mutex_unlock(&stp->st_mutex);            6855         mutex_unlock(&stp->st_mutex);
7344         trace_nfsd_open_confirm(oc->oc_seqid,    6856         trace_nfsd_open_confirm(oc->oc_seqid, &stp->st_stid.sc_stateid);
7345         nfsd4_client_record_create(oo->oo_own    6857         nfsd4_client_record_create(oo->oo_owner.so_client);
7346         status = nfs_ok;                         6858         status = nfs_ok;
7347 put_stateid:                                     6859 put_stateid:
7348         nfs4_put_stid(&stp->st_stid);            6860         nfs4_put_stid(&stp->st_stid);
7349 out:                                             6861 out:
7350         nfsd4_bump_seqid(cstate, status);        6862         nfsd4_bump_seqid(cstate, status);
7351         return status;                           6863         return status;
7352 }                                                6864 }
7353                                                  6865 
7354 static inline void nfs4_stateid_downgrade_bit    6866 static inline void nfs4_stateid_downgrade_bit(struct nfs4_ol_stateid *stp, u32 access)
7355 {                                                6867 {
7356         if (!test_access(access, stp))           6868         if (!test_access(access, stp))
7357                 return;                          6869                 return;
7358         nfs4_file_put_access(stp->st_stid.sc_    6870         nfs4_file_put_access(stp->st_stid.sc_file, access);
7359         clear_access(access, stp);               6871         clear_access(access, stp);
7360 }                                                6872 }
7361                                                  6873 
7362 static inline void nfs4_stateid_downgrade(str    6874 static inline void nfs4_stateid_downgrade(struct nfs4_ol_stateid *stp, u32 to_access)
7363 {                                                6875 {
7364         switch (to_access) {                     6876         switch (to_access) {
7365         case NFS4_SHARE_ACCESS_READ:             6877         case NFS4_SHARE_ACCESS_READ:
7366                 nfs4_stateid_downgrade_bit(st    6878                 nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_WRITE);
7367                 nfs4_stateid_downgrade_bit(st    6879                 nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_BOTH);
7368                 break;                           6880                 break;
7369         case NFS4_SHARE_ACCESS_WRITE:            6881         case NFS4_SHARE_ACCESS_WRITE:
7370                 nfs4_stateid_downgrade_bit(st    6882                 nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_READ);
7371                 nfs4_stateid_downgrade_bit(st    6883                 nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_BOTH);
7372                 break;                           6884                 break;
7373         case NFS4_SHARE_ACCESS_BOTH:             6885         case NFS4_SHARE_ACCESS_BOTH:
7374                 break;                           6886                 break;
7375         default:                                 6887         default:
7376                 WARN_ON_ONCE(1);                 6888                 WARN_ON_ONCE(1);
7377         }                                        6889         }
7378 }                                                6890 }
7379                                                  6891 
7380 __be32                                           6892 __be32
7381 nfsd4_open_downgrade(struct svc_rqst *rqstp,     6893 nfsd4_open_downgrade(struct svc_rqst *rqstp,
7382                      struct nfsd4_compound_st    6894                      struct nfsd4_compound_state *cstate, union nfsd4_op_u *u)
7383 {                                                6895 {
7384         struct nfsd4_open_downgrade *od = &u-    6896         struct nfsd4_open_downgrade *od = &u->open_downgrade;
7385         __be32 status;                           6897         __be32 status;
7386         struct nfs4_ol_stateid *stp;             6898         struct nfs4_ol_stateid *stp;
7387         struct nfsd_net *nn = net_generic(SVC    6899         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
7388                                                  6900 
7389         dprintk("NFSD: nfsd4_open_downgrade o    6901         dprintk("NFSD: nfsd4_open_downgrade on file %pd\n", 
7390                         cstate->current_fh.fh    6902                         cstate->current_fh.fh_dentry);
7391                                                  6903 
7392         /* We don't yet support WANT bits: */    6904         /* We don't yet support WANT bits: */
7393         if (od->od_deleg_want)                   6905         if (od->od_deleg_want)
7394                 dprintk("NFSD: %s: od_deleg_w    6906                 dprintk("NFSD: %s: od_deleg_want=0x%x ignored\n", __func__,
7395                         od->od_deleg_want);      6907                         od->od_deleg_want);
7396                                                  6908 
7397         status = nfs4_preprocess_confirmed_se    6909         status = nfs4_preprocess_confirmed_seqid_op(cstate, od->od_seqid,
7398                                         &od->    6910                                         &od->od_stateid, &stp, nn);
7399         if (status)                              6911         if (status)
7400                 goto out;                        6912                 goto out; 
7401         status = nfserr_inval;                   6913         status = nfserr_inval;
7402         if (!test_access(od->od_share_access,    6914         if (!test_access(od->od_share_access, stp)) {
7403                 dprintk("NFSD: access not a s    6915                 dprintk("NFSD: access not a subset of current bitmap: 0x%hhx, input access=%08x\n",
7404                         stp->st_access_bmap,     6916                         stp->st_access_bmap, od->od_share_access);
7405                 goto put_stateid;                6917                 goto put_stateid;
7406         }                                        6918         }
7407         if (!test_deny(od->od_share_deny, stp    6919         if (!test_deny(od->od_share_deny, stp)) {
7408                 dprintk("NFSD: deny not a sub    6920                 dprintk("NFSD: deny not a subset of current bitmap: 0x%hhx, input deny=%08x\n",
7409                         stp->st_deny_bmap, od    6921                         stp->st_deny_bmap, od->od_share_deny);
7410                 goto put_stateid;                6922                 goto put_stateid;
7411         }                                        6923         }
7412         nfs4_stateid_downgrade(stp, od->od_sh    6924         nfs4_stateid_downgrade(stp, od->od_share_access);
7413         reset_union_bmap_deny(od->od_share_de    6925         reset_union_bmap_deny(od->od_share_deny, stp);
7414         nfs4_inc_and_copy_stateid(&od->od_sta    6926         nfs4_inc_and_copy_stateid(&od->od_stateid, &stp->st_stid);
7415         status = nfs_ok;                         6927         status = nfs_ok;
7416 put_stateid:                                     6928 put_stateid:
7417         mutex_unlock(&stp->st_mutex);            6929         mutex_unlock(&stp->st_mutex);
7418         nfs4_put_stid(&stp->st_stid);            6930         nfs4_put_stid(&stp->st_stid);
7419 out:                                             6931 out:
7420         nfsd4_bump_seqid(cstate, status);        6932         nfsd4_bump_seqid(cstate, status);
7421         return status;                           6933         return status;
7422 }                                                6934 }
7423                                                  6935 
7424 static bool nfsd4_close_open_stateid(struct n !! 6936 static void nfsd4_close_open_stateid(struct nfs4_ol_stateid *s)
7425 {                                                6937 {
7426         struct nfs4_client *clp = s->st_stid.    6938         struct nfs4_client *clp = s->st_stid.sc_client;
7427         bool unhashed;                           6939         bool unhashed;
7428         LIST_HEAD(reaplist);                     6940         LIST_HEAD(reaplist);
7429         struct nfs4_ol_stateid *stp;             6941         struct nfs4_ol_stateid *stp;
7430                                                  6942 
7431         spin_lock(&clp->cl_lock);                6943         spin_lock(&clp->cl_lock);
7432         unhashed = unhash_open_stateid(s, &re    6944         unhashed = unhash_open_stateid(s, &reaplist);
7433                                                  6945 
7434         if (clp->cl_minorversion) {              6946         if (clp->cl_minorversion) {
7435                 if (unhashed)                    6947                 if (unhashed)
7436                         put_ol_stateid_locked    6948                         put_ol_stateid_locked(s, &reaplist);
7437                 spin_unlock(&clp->cl_lock);      6949                 spin_unlock(&clp->cl_lock);
7438                 list_for_each_entry(stp, &rea    6950                 list_for_each_entry(stp, &reaplist, st_locks)
7439                         nfs4_free_cpntf_state    6951                         nfs4_free_cpntf_statelist(clp->net, &stp->st_stid);
7440                 free_ol_stateid_reaplist(&rea    6952                 free_ol_stateid_reaplist(&reaplist);
7441                 return false;                 << 
7442         } else {                                 6953         } else {
7443                 spin_unlock(&clp->cl_lock);      6954                 spin_unlock(&clp->cl_lock);
7444                 free_ol_stateid_reaplist(&rea    6955                 free_ol_stateid_reaplist(&reaplist);
7445                 return unhashed;              !! 6956                 if (unhashed)
                                                   >> 6957                         move_to_close_lru(s, clp->net);
7446         }                                        6958         }
7447 }                                                6959 }
7448                                                  6960 
7449 /*                                               6961 /*
7450  * nfs4_unlock_state() called after encode       6962  * nfs4_unlock_state() called after encode
7451  */                                              6963  */
7452 __be32                                           6964 __be32
7453 nfsd4_close(struct svc_rqst *rqstp, struct nf    6965 nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
7454                 union nfsd4_op_u *u)             6966                 union nfsd4_op_u *u)
7455 {                                                6967 {
7456         struct nfsd4_close *close = &u->close    6968         struct nfsd4_close *close = &u->close;
7457         __be32 status;                           6969         __be32 status;
7458         struct nfs4_ol_stateid *stp;             6970         struct nfs4_ol_stateid *stp;
7459         struct net *net = SVC_NET(rqstp);        6971         struct net *net = SVC_NET(rqstp);
7460         struct nfsd_net *nn = net_generic(net    6972         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
7461         bool need_move_to_close_list;         << 
7462                                                  6973 
7463         dprintk("NFSD: nfsd4_close on file %p !! 6974         dprintk("NFSD: nfsd4_close on file %pd\n", 
7464                         cstate->current_fh.fh    6975                         cstate->current_fh.fh_dentry);
7465                                                  6976 
7466         status = nfs4_preprocess_seqid_op(cst    6977         status = nfs4_preprocess_seqid_op(cstate, close->cl_seqid,
7467                                           &cl !! 6978                                         &close->cl_stateid,
7468                                           SC_ !! 6979                                         NFS4_OPEN_STID|NFS4_CLOSED_STID,
7469                                           &st !! 6980                                         &stp, nn);
7470         nfsd4_bump_seqid(cstate, status);        6981         nfsd4_bump_seqid(cstate, status);
7471         if (status)                              6982         if (status)
7472                 goto out;                     !! 6983                 goto out; 
7473                                                  6984 
7474         spin_lock(&stp->st_stid.sc_client->cl !! 6985         stp->st_stid.sc_type = NFS4_CLOSED_STID;
7475         stp->st_stid.sc_status |= SC_STATUS_C << 
7476         spin_unlock(&stp->st_stid.sc_client-> << 
7477                                                  6986 
7478         /*                                       6987         /*
7479          * Technically we don't _really_ have    6988          * Technically we don't _really_ have to increment or copy it, since
7480          * it should just be gone after this     6989          * it should just be gone after this operation and we clobber the
7481          * copied value below, but we continu    6990          * copied value below, but we continue to do so here just to ensure
7482          * that racing ops see that there was    6991          * that racing ops see that there was a state change.
7483          */                                      6992          */
7484         nfs4_inc_and_copy_stateid(&close->cl_    6993         nfs4_inc_and_copy_stateid(&close->cl_stateid, &stp->st_stid);
7485                                                  6994 
7486         need_move_to_close_list = nfsd4_close !! 6995         nfsd4_close_open_stateid(stp);
7487         mutex_unlock(&stp->st_mutex);            6996         mutex_unlock(&stp->st_mutex);
7488         if (need_move_to_close_list)          << 
7489                 move_to_close_lru(stp, net);  << 
7490                                                  6997 
7491         /* v4.1+ suggests that we send a spec    6998         /* v4.1+ suggests that we send a special stateid in here, since the
7492          * clients should just ignore this an    6999          * clients should just ignore this anyway. Since this is not useful
7493          * for v4.0 clients either, we set it    7000          * for v4.0 clients either, we set it to the special close_stateid
7494          * universally.                          7001          * universally.
7495          *                                       7002          *
7496          * See RFC5661 section 18.2.4, and RF    7003          * See RFC5661 section 18.2.4, and RFC7530 section 16.2.5
7497          */                                      7004          */
7498         memcpy(&close->cl_stateid, &close_sta    7005         memcpy(&close->cl_stateid, &close_stateid, sizeof(close->cl_stateid));
7499                                                  7006 
7500         /* put reference from nfs4_preprocess    7007         /* put reference from nfs4_preprocess_seqid_op */
7501         nfs4_put_stid(&stp->st_stid);            7008         nfs4_put_stid(&stp->st_stid);
7502 out:                                             7009 out:
7503         return status;                           7010         return status;
7504 }                                                7011 }
7505                                                  7012 
7506 __be32                                           7013 __be32
7507 nfsd4_delegreturn(struct svc_rqst *rqstp, str    7014 nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
7508                   union nfsd4_op_u *u)           7015                   union nfsd4_op_u *u)
7509 {                                                7016 {
7510         struct nfsd4_delegreturn *dr = &u->de    7017         struct nfsd4_delegreturn *dr = &u->delegreturn;
7511         struct nfs4_delegation *dp;              7018         struct nfs4_delegation *dp;
7512         stateid_t *stateid = &dr->dr_stateid;    7019         stateid_t *stateid = &dr->dr_stateid;
7513         struct nfs4_stid *s;                     7020         struct nfs4_stid *s;
7514         __be32 status;                           7021         __be32 status;
7515         struct nfsd_net *nn = net_generic(SVC    7022         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
7516                                                  7023 
7517         if ((status = fh_verify(rqstp, &cstat    7024         if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
7518                 return status;                   7025                 return status;
7519                                                  7026 
7520         status = nfsd4_lookup_stateid(cstate, !! 7027         status = nfsd4_lookup_stateid(cstate, stateid, NFS4_DELEG_STID, &s, nn);
7521                                       SC_STAT << 
7522                                       &s, nn) << 
7523         if (status)                              7028         if (status)
7524                 goto out;                        7029                 goto out;
7525         dp = delegstateid(s);                    7030         dp = delegstateid(s);
7526         status = nfsd4_stid_check_stateid_gen    7031         status = nfsd4_stid_check_stateid_generation(stateid, &dp->dl_stid, nfsd4_has_session(cstate));
7527         if (status)                              7032         if (status)
7528                 goto put_stateid;                7033                 goto put_stateid;
7529                                                  7034 
7530         trace_nfsd_deleg_return(stateid);        7035         trace_nfsd_deleg_return(stateid);
7531         destroy_delegation(dp);               << 
7532         smp_mb__after_atomic();               << 
7533         wake_up_var(d_inode(cstate->current_f    7036         wake_up_var(d_inode(cstate->current_fh.fh_dentry));
                                                   >> 7037         destroy_delegation(dp);
7534 put_stateid:                                     7038 put_stateid:
7535         nfs4_put_stid(&dp->dl_stid);             7039         nfs4_put_stid(&dp->dl_stid);
7536 out:                                             7040 out:
7537         return status;                           7041         return status;
7538 }                                                7042 }
7539                                                  7043 
7540 /* last octet in a range */                      7044 /* last octet in a range */
7541 static inline u64                                7045 static inline u64
7542 last_byte_offset(u64 start, u64 len)             7046 last_byte_offset(u64 start, u64 len)
7543 {                                                7047 {
7544         u64 end;                                 7048         u64 end;
7545                                                  7049 
7546         WARN_ON_ONCE(!len);                      7050         WARN_ON_ONCE(!len);
7547         end = start + len;                       7051         end = start + len;
7548         return end > start ? end - 1: NFS4_MA    7052         return end > start ? end - 1: NFS4_MAX_UINT64;
7549 }                                                7053 }
7550                                                  7054 
7551 /*                                               7055 /*
7552  * TODO: Linux file offsets are _signed_ 64-b    7056  * TODO: Linux file offsets are _signed_ 64-bit quantities, which means that
7553  * we can't properly handle lock requests tha    7057  * we can't properly handle lock requests that go beyond the (2^63 - 1)-th
7554  * byte, because of sign extension problems.     7058  * byte, because of sign extension problems.  Since NFSv4 calls for 64-bit
7555  * locking, this prevents us from being compl    7059  * locking, this prevents us from being completely protocol-compliant.  The
7556  * real solution to this problem is to start     7060  * real solution to this problem is to start using unsigned file offsets in
7557  * the VFS, but this is a very deep change!      7061  * the VFS, but this is a very deep change!
7558  */                                              7062  */
7559 static inline void                               7063 static inline void
7560 nfs4_transform_lock_offset(struct file_lock *    7064 nfs4_transform_lock_offset(struct file_lock *lock)
7561 {                                                7065 {
7562         if (lock->fl_start < 0)                  7066         if (lock->fl_start < 0)
7563                 lock->fl_start = OFFSET_MAX;     7067                 lock->fl_start = OFFSET_MAX;
7564         if (lock->fl_end < 0)                    7068         if (lock->fl_end < 0)
7565                 lock->fl_end = OFFSET_MAX;       7069                 lock->fl_end = OFFSET_MAX;
7566 }                                                7070 }
7567                                                  7071 
7568 static fl_owner_t                                7072 static fl_owner_t
7569 nfsd4_lm_get_owner(fl_owner_t owner)             7073 nfsd4_lm_get_owner(fl_owner_t owner)
7570 {                                                7074 {
7571         struct nfs4_lockowner *lo = (struct n    7075         struct nfs4_lockowner *lo = (struct nfs4_lockowner *)owner;
7572                                                  7076 
7573         nfs4_get_stateowner(&lo->lo_owner);      7077         nfs4_get_stateowner(&lo->lo_owner);
7574         return owner;                            7078         return owner;
7575 }                                                7079 }
7576                                                  7080 
7577 static void                                      7081 static void
7578 nfsd4_lm_put_owner(fl_owner_t owner)             7082 nfsd4_lm_put_owner(fl_owner_t owner)
7579 {                                                7083 {
7580         struct nfs4_lockowner *lo = (struct n    7084         struct nfs4_lockowner *lo = (struct nfs4_lockowner *)owner;
7581                                                  7085 
7582         if (lo)                                  7086         if (lo)
7583                 nfs4_put_stateowner(&lo->lo_o    7087                 nfs4_put_stateowner(&lo->lo_owner);
7584 }                                                7088 }
7585                                                  7089 
7586 /* return pointer to struct nfs4_client if cl    7090 /* return pointer to struct nfs4_client if client is expirable */
7587 static bool                                      7091 static bool
7588 nfsd4_lm_lock_expirable(struct file_lock *cfl    7092 nfsd4_lm_lock_expirable(struct file_lock *cfl)
7589 {                                                7093 {
7590         struct nfs4_lockowner *lo = (struct n !! 7094         struct nfs4_lockowner *lo = (struct nfs4_lockowner *)cfl->fl_owner;
7591         struct nfs4_client *clp = lo->lo_owne    7095         struct nfs4_client *clp = lo->lo_owner.so_client;
7592         struct nfsd_net *nn;                     7096         struct nfsd_net *nn;
7593                                                  7097 
7594         if (try_to_expire_client(clp)) {         7098         if (try_to_expire_client(clp)) {
7595                 nn = net_generic(clp->net, nf    7099                 nn = net_generic(clp->net, nfsd_net_id);
7596                 mod_delayed_work(laundry_wq,     7100                 mod_delayed_work(laundry_wq, &nn->laundromat_work, 0);
7597                 return true;                     7101                 return true;
7598         }                                        7102         }
7599         return false;                            7103         return false;
7600 }                                                7104 }
7601                                                  7105 
7602 /* schedule laundromat to run immediately and    7106 /* schedule laundromat to run immediately and wait for it to complete */
7603 static void                                      7107 static void
7604 nfsd4_lm_expire_lock(void)                       7108 nfsd4_lm_expire_lock(void)
7605 {                                                7109 {
7606         flush_workqueue(laundry_wq);             7110         flush_workqueue(laundry_wq);
7607 }                                                7111 }
7608                                                  7112 
7609 static void                                      7113 static void
7610 nfsd4_lm_notify(struct file_lock *fl)            7114 nfsd4_lm_notify(struct file_lock *fl)
7611 {                                                7115 {
7612         struct nfs4_lockowner           *lo = !! 7116         struct nfs4_lockowner           *lo = (struct nfs4_lockowner *)fl->fl_owner;
7613         struct net                      *net     7117         struct net                      *net = lo->lo_owner.so_client->net;
7614         struct nfsd_net                 *nn =    7118         struct nfsd_net                 *nn = net_generic(net, nfsd_net_id);
7615         struct nfsd4_blocked_lock       *nbl     7119         struct nfsd4_blocked_lock       *nbl = container_of(fl,
7616                                                  7120                                                 struct nfsd4_blocked_lock, nbl_lock);
7617         bool queue = false;                      7121         bool queue = false;
7618                                                  7122 
7619         /* An empty list means that something    7123         /* An empty list means that something else is going to be using it */
7620         spin_lock(&nn->blocked_locks_lock);      7124         spin_lock(&nn->blocked_locks_lock);
7621         if (!list_empty(&nbl->nbl_list)) {       7125         if (!list_empty(&nbl->nbl_list)) {
7622                 list_del_init(&nbl->nbl_list)    7126                 list_del_init(&nbl->nbl_list);
7623                 list_del_init(&nbl->nbl_lru);    7127                 list_del_init(&nbl->nbl_lru);
7624                 queue = true;                    7128                 queue = true;
7625         }                                        7129         }
7626         spin_unlock(&nn->blocked_locks_lock);    7130         spin_unlock(&nn->blocked_locks_lock);
7627                                                  7131 
7628         if (queue) {                             7132         if (queue) {
7629                 trace_nfsd_cb_notify_lock(lo,    7133                 trace_nfsd_cb_notify_lock(lo, nbl);
7630                 nfsd4_run_cb(&nbl->nbl_cb);      7134                 nfsd4_run_cb(&nbl->nbl_cb);
7631         }                                        7135         }
7632 }                                                7136 }
7633                                                  7137 
7634 static const struct lock_manager_operations n    7138 static const struct lock_manager_operations nfsd_posix_mng_ops  = {
7635         .lm_mod_owner = THIS_MODULE,             7139         .lm_mod_owner = THIS_MODULE,
7636         .lm_notify = nfsd4_lm_notify,            7140         .lm_notify = nfsd4_lm_notify,
7637         .lm_get_owner = nfsd4_lm_get_owner,      7141         .lm_get_owner = nfsd4_lm_get_owner,
7638         .lm_put_owner = nfsd4_lm_put_owner,      7142         .lm_put_owner = nfsd4_lm_put_owner,
7639         .lm_lock_expirable = nfsd4_lm_lock_ex    7143         .lm_lock_expirable = nfsd4_lm_lock_expirable,
7640         .lm_expire_lock = nfsd4_lm_expire_loc    7144         .lm_expire_lock = nfsd4_lm_expire_lock,
7641 };                                               7145 };
7642                                                  7146 
7643 static inline void                               7147 static inline void
7644 nfs4_set_lock_denied(struct file_lock *fl, st    7148 nfs4_set_lock_denied(struct file_lock *fl, struct nfsd4_lock_denied *deny)
7645 {                                                7149 {
7646         struct nfs4_lockowner *lo;               7150         struct nfs4_lockowner *lo;
7647                                                  7151 
7648         if (fl->fl_lmops == &nfsd_posix_mng_o    7152         if (fl->fl_lmops == &nfsd_posix_mng_ops) {
7649                 lo = (struct nfs4_lockowner * !! 7153                 lo = (struct nfs4_lockowner *) fl->fl_owner;
7650                 xdr_netobj_dup(&deny->ld_owne    7154                 xdr_netobj_dup(&deny->ld_owner, &lo->lo_owner.so_owner,
7651                                                  7155                                                 GFP_KERNEL);
7652                 if (!deny->ld_owner.data)        7156                 if (!deny->ld_owner.data)
7653                         /* We just don't care    7157                         /* We just don't care that much */
7654                         goto nevermind;          7158                         goto nevermind;
7655                 deny->ld_clientid = lo->lo_ow    7159                 deny->ld_clientid = lo->lo_owner.so_client->cl_clientid;
7656         } else {                                 7160         } else {
7657 nevermind:                                       7161 nevermind:
7658                 deny->ld_owner.len = 0;          7162                 deny->ld_owner.len = 0;
7659                 deny->ld_owner.data = NULL;      7163                 deny->ld_owner.data = NULL;
7660                 deny->ld_clientid.cl_boot = 0    7164                 deny->ld_clientid.cl_boot = 0;
7661                 deny->ld_clientid.cl_id = 0;     7165                 deny->ld_clientid.cl_id = 0;
7662         }                                        7166         }
7663         deny->ld_start = fl->fl_start;           7167         deny->ld_start = fl->fl_start;
7664         deny->ld_length = NFS4_MAX_UINT64;       7168         deny->ld_length = NFS4_MAX_UINT64;
7665         if (fl->fl_end != NFS4_MAX_UINT64)       7169         if (fl->fl_end != NFS4_MAX_UINT64)
7666                 deny->ld_length = fl->fl_end     7170                 deny->ld_length = fl->fl_end - fl->fl_start + 1;        
7667         deny->ld_type = NFS4_READ_LT;            7171         deny->ld_type = NFS4_READ_LT;
7668         if (fl->c.flc_type != F_RDLCK)        !! 7172         if (fl->fl_type != F_RDLCK)
7669                 deny->ld_type = NFS4_WRITE_LT    7173                 deny->ld_type = NFS4_WRITE_LT;
7670 }                                                7174 }
7671                                                  7175 
7672 static struct nfs4_lockowner *                   7176 static struct nfs4_lockowner *
7673 find_lockowner_str_locked(struct nfs4_client     7177 find_lockowner_str_locked(struct nfs4_client *clp, struct xdr_netobj *owner)
7674 {                                                7178 {
7675         unsigned int strhashval = ownerstr_ha    7179         unsigned int strhashval = ownerstr_hashval(owner);
7676         struct nfs4_stateowner *so;              7180         struct nfs4_stateowner *so;
7677                                                  7181 
7678         lockdep_assert_held(&clp->cl_lock);      7182         lockdep_assert_held(&clp->cl_lock);
7679                                                  7183 
7680         list_for_each_entry(so, &clp->cl_owne    7184         list_for_each_entry(so, &clp->cl_ownerstr_hashtbl[strhashval],
7681                             so_strhash) {        7185                             so_strhash) {
7682                 if (so->so_is_open_owner)        7186                 if (so->so_is_open_owner)
7683                         continue;                7187                         continue;
7684                 if (same_owner_str(so, owner)    7188                 if (same_owner_str(so, owner))
7685                         return lockowner(nfs4    7189                         return lockowner(nfs4_get_stateowner(so));
7686         }                                        7190         }
7687         return NULL;                             7191         return NULL;
7688 }                                                7192 }
7689                                                  7193 
7690 static struct nfs4_lockowner *                   7194 static struct nfs4_lockowner *
7691 find_lockowner_str(struct nfs4_client *clp, s    7195 find_lockowner_str(struct nfs4_client *clp, struct xdr_netobj *owner)
7692 {                                                7196 {
7693         struct nfs4_lockowner *lo;               7197         struct nfs4_lockowner *lo;
7694                                                  7198 
7695         spin_lock(&clp->cl_lock);                7199         spin_lock(&clp->cl_lock);
7696         lo = find_lockowner_str_locked(clp, o    7200         lo = find_lockowner_str_locked(clp, owner);
7697         spin_unlock(&clp->cl_lock);              7201         spin_unlock(&clp->cl_lock);
7698         return lo;                               7202         return lo;
7699 }                                                7203 }
7700                                                  7204 
7701 static void nfs4_unhash_lockowner(struct nfs4    7205 static void nfs4_unhash_lockowner(struct nfs4_stateowner *sop)
7702 {                                                7206 {
7703         unhash_lockowner_locked(lockowner(sop    7207         unhash_lockowner_locked(lockowner(sop));
7704 }                                                7208 }
7705                                                  7209 
7706 static void nfs4_free_lockowner(struct nfs4_s    7210 static void nfs4_free_lockowner(struct nfs4_stateowner *sop)
7707 {                                                7211 {
7708         struct nfs4_lockowner *lo = lockowner    7212         struct nfs4_lockowner *lo = lockowner(sop);
7709                                                  7213 
7710         kmem_cache_free(lockowner_slab, lo);     7214         kmem_cache_free(lockowner_slab, lo);
7711 }                                                7215 }
7712                                                  7216 
7713 static const struct nfs4_stateowner_operation    7217 static const struct nfs4_stateowner_operations lockowner_ops = {
7714         .so_unhash =    nfs4_unhash_lockowner    7218         .so_unhash =    nfs4_unhash_lockowner,
7715         .so_free =      nfs4_free_lockowner,     7219         .so_free =      nfs4_free_lockowner,
7716 };                                               7220 };
7717                                                  7221 
7718 /*                                               7222 /*
7719  * Alloc a lock owner structure.                 7223  * Alloc a lock owner structure.
7720  * Called in nfsd4_lock - therefore, OPEN and    7224  * Called in nfsd4_lock - therefore, OPEN and OPEN_CONFIRM (if needed) has 
7721  * occurred.                                     7225  * occurred. 
7722  *                                               7226  *
7723  * strhashval = ownerstr_hashval                 7227  * strhashval = ownerstr_hashval
7724  */                                              7228  */
7725 static struct nfs4_lockowner *                   7229 static struct nfs4_lockowner *
7726 alloc_init_lock_stateowner(unsigned int strha    7230 alloc_init_lock_stateowner(unsigned int strhashval, struct nfs4_client *clp,
7727                            struct nfs4_ol_sta    7231                            struct nfs4_ol_stateid *open_stp,
7728                            struct nfsd4_lock     7232                            struct nfsd4_lock *lock)
7729 {                                                7233 {
7730         struct nfs4_lockowner *lo, *ret;         7234         struct nfs4_lockowner *lo, *ret;
7731                                                  7235 
7732         lo = alloc_stateowner(lockowner_slab,    7236         lo = alloc_stateowner(lockowner_slab, &lock->lk_new_owner, clp);
7733         if (!lo)                                 7237         if (!lo)
7734                 return NULL;                     7238                 return NULL;
7735         INIT_LIST_HEAD(&lo->lo_blocked);         7239         INIT_LIST_HEAD(&lo->lo_blocked);
7736         INIT_LIST_HEAD(&lo->lo_owner.so_state    7240         INIT_LIST_HEAD(&lo->lo_owner.so_stateids);
7737         lo->lo_owner.so_is_open_owner = 0;       7241         lo->lo_owner.so_is_open_owner = 0;
7738         lo->lo_owner.so_seqid = lock->lk_new_    7242         lo->lo_owner.so_seqid = lock->lk_new_lock_seqid;
7739         lo->lo_owner.so_ops = &lockowner_ops;    7243         lo->lo_owner.so_ops = &lockowner_ops;
7740         spin_lock(&clp->cl_lock);                7244         spin_lock(&clp->cl_lock);
7741         ret = find_lockowner_str_locked(clp,     7245         ret = find_lockowner_str_locked(clp, &lock->lk_new_owner);
7742         if (ret == NULL) {                       7246         if (ret == NULL) {
7743                 list_add(&lo->lo_owner.so_str    7247                 list_add(&lo->lo_owner.so_strhash,
7744                          &clp->cl_ownerstr_ha    7248                          &clp->cl_ownerstr_hashtbl[strhashval]);
7745                 ret = lo;                        7249                 ret = lo;
7746         } else                                   7250         } else
7747                 nfs4_free_stateowner(&lo->lo_    7251                 nfs4_free_stateowner(&lo->lo_owner);
7748                                                  7252 
7749         spin_unlock(&clp->cl_lock);              7253         spin_unlock(&clp->cl_lock);
7750         return ret;                              7254         return ret;
7751 }                                                7255 }
7752                                                  7256 
7753 static struct nfs4_ol_stateid *                  7257 static struct nfs4_ol_stateid *
7754 find_lock_stateid(const struct nfs4_lockowner    7258 find_lock_stateid(const struct nfs4_lockowner *lo,
7755                   const struct nfs4_ol_statei    7259                   const struct nfs4_ol_stateid *ost)
7756 {                                                7260 {
7757         struct nfs4_ol_stateid *lst;             7261         struct nfs4_ol_stateid *lst;
7758                                                  7262 
7759         lockdep_assert_held(&ost->st_stid.sc_    7263         lockdep_assert_held(&ost->st_stid.sc_client->cl_lock);
7760                                                  7264 
7761         /* If ost is not hashed, ost->st_lock    7265         /* If ost is not hashed, ost->st_locks will not be valid */
7762         if (!nfs4_ol_stateid_unhashed(ost))      7266         if (!nfs4_ol_stateid_unhashed(ost))
7763                 list_for_each_entry(lst, &ost    7267                 list_for_each_entry(lst, &ost->st_locks, st_locks) {
7764                         if (lst->st_stateowne    7268                         if (lst->st_stateowner == &lo->lo_owner) {
7765                                 refcount_inc(    7269                                 refcount_inc(&lst->st_stid.sc_count);
7766                                 return lst;      7270                                 return lst;
7767                         }                        7271                         }
7768                 }                                7272                 }
7769         return NULL;                             7273         return NULL;
7770 }                                                7274 }
7771                                                  7275 
7772 static struct nfs4_ol_stateid *                  7276 static struct nfs4_ol_stateid *
7773 init_lock_stateid(struct nfs4_ol_stateid *stp    7277 init_lock_stateid(struct nfs4_ol_stateid *stp, struct nfs4_lockowner *lo,
7774                   struct nfs4_file *fp, struc    7278                   struct nfs4_file *fp, struct inode *inode,
7775                   struct nfs4_ol_stateid *ope    7279                   struct nfs4_ol_stateid *open_stp)
7776 {                                                7280 {
7777         struct nfs4_client *clp = lo->lo_owne    7281         struct nfs4_client *clp = lo->lo_owner.so_client;
7778         struct nfs4_ol_stateid *retstp;          7282         struct nfs4_ol_stateid *retstp;
7779                                                  7283 
7780         mutex_init(&stp->st_mutex);              7284         mutex_init(&stp->st_mutex);
7781         mutex_lock_nested(&stp->st_mutex, OPE    7285         mutex_lock_nested(&stp->st_mutex, OPEN_STATEID_MUTEX);
7782 retry:                                           7286 retry:
7783         spin_lock(&clp->cl_lock);                7287         spin_lock(&clp->cl_lock);
7784         if (nfs4_ol_stateid_unhashed(open_stp    7288         if (nfs4_ol_stateid_unhashed(open_stp))
7785                 goto out_close;                  7289                 goto out_close;
7786         retstp = find_lock_stateid(lo, open_s    7290         retstp = find_lock_stateid(lo, open_stp);
7787         if (retstp)                              7291         if (retstp)
7788                 goto out_found;                  7292                 goto out_found;
7789         refcount_inc(&stp->st_stid.sc_count);    7293         refcount_inc(&stp->st_stid.sc_count);
7790         stp->st_stid.sc_type = SC_TYPE_LOCK;  !! 7294         stp->st_stid.sc_type = NFS4_LOCK_STID;
7791         stp->st_stateowner = nfs4_get_stateow    7295         stp->st_stateowner = nfs4_get_stateowner(&lo->lo_owner);
7792         get_nfs4_file(fp);                       7296         get_nfs4_file(fp);
7793         stp->st_stid.sc_file = fp;               7297         stp->st_stid.sc_file = fp;
7794         stp->st_access_bmap = 0;                 7298         stp->st_access_bmap = 0;
7795         stp->st_deny_bmap = open_stp->st_deny    7299         stp->st_deny_bmap = open_stp->st_deny_bmap;
7796         stp->st_openstp = open_stp;              7300         stp->st_openstp = open_stp;
7797         spin_lock(&fp->fi_lock);                 7301         spin_lock(&fp->fi_lock);
7798         list_add(&stp->st_locks, &open_stp->s    7302         list_add(&stp->st_locks, &open_stp->st_locks);
7799         list_add(&stp->st_perstateowner, &lo-    7303         list_add(&stp->st_perstateowner, &lo->lo_owner.so_stateids);
7800         list_add(&stp->st_perfile, &fp->fi_st    7304         list_add(&stp->st_perfile, &fp->fi_stateids);
7801         spin_unlock(&fp->fi_lock);               7305         spin_unlock(&fp->fi_lock);
7802         spin_unlock(&clp->cl_lock);              7306         spin_unlock(&clp->cl_lock);
7803         return stp;                              7307         return stp;
7804 out_found:                                       7308 out_found:
7805         spin_unlock(&clp->cl_lock);              7309         spin_unlock(&clp->cl_lock);
7806         if (nfsd4_lock_ol_stateid(retstp) !=     7310         if (nfsd4_lock_ol_stateid(retstp) != nfs_ok) {
7807                 nfs4_put_stid(&retstp->st_sti    7311                 nfs4_put_stid(&retstp->st_stid);
7808                 goto retry;                      7312                 goto retry;
7809         }                                        7313         }
7810         /* To keep mutex tracking happy */       7314         /* To keep mutex tracking happy */
7811         mutex_unlock(&stp->st_mutex);            7315         mutex_unlock(&stp->st_mutex);
7812         return retstp;                           7316         return retstp;
7813 out_close:                                       7317 out_close:
7814         spin_unlock(&clp->cl_lock);              7318         spin_unlock(&clp->cl_lock);
7815         mutex_unlock(&stp->st_mutex);            7319         mutex_unlock(&stp->st_mutex);
7816         return NULL;                             7320         return NULL;
7817 }                                                7321 }
7818                                                  7322 
7819 static struct nfs4_ol_stateid *                  7323 static struct nfs4_ol_stateid *
7820 find_or_create_lock_stateid(struct nfs4_locko    7324 find_or_create_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fi,
7821                             struct inode *ino    7325                             struct inode *inode, struct nfs4_ol_stateid *ost,
7822                             bool *new)           7326                             bool *new)
7823 {                                                7327 {
7824         struct nfs4_stid *ns = NULL;             7328         struct nfs4_stid *ns = NULL;
7825         struct nfs4_ol_stateid *lst;             7329         struct nfs4_ol_stateid *lst;
7826         struct nfs4_openowner *oo = openowner    7330         struct nfs4_openowner *oo = openowner(ost->st_stateowner);
7827         struct nfs4_client *clp = oo->oo_owne    7331         struct nfs4_client *clp = oo->oo_owner.so_client;
7828                                                  7332 
7829         *new = false;                            7333         *new = false;
7830         spin_lock(&clp->cl_lock);                7334         spin_lock(&clp->cl_lock);
7831         lst = find_lock_stateid(lo, ost);        7335         lst = find_lock_stateid(lo, ost);
7832         spin_unlock(&clp->cl_lock);              7336         spin_unlock(&clp->cl_lock);
7833         if (lst != NULL) {                       7337         if (lst != NULL) {
7834                 if (nfsd4_lock_ol_stateid(lst    7338                 if (nfsd4_lock_ol_stateid(lst) == nfs_ok)
7835                         goto out;                7339                         goto out;
7836                 nfs4_put_stid(&lst->st_stid);    7340                 nfs4_put_stid(&lst->st_stid);
7837         }                                        7341         }
7838         ns = nfs4_alloc_stid(clp, stateid_sla    7342         ns = nfs4_alloc_stid(clp, stateid_slab, nfs4_free_lock_stateid);
7839         if (ns == NULL)                          7343         if (ns == NULL)
7840                 return NULL;                     7344                 return NULL;
7841                                                  7345 
7842         lst = init_lock_stateid(openlockstate    7346         lst = init_lock_stateid(openlockstateid(ns), lo, fi, inode, ost);
7843         if (lst == openlockstateid(ns))          7347         if (lst == openlockstateid(ns))
7844                 *new = true;                     7348                 *new = true;
7845         else                                     7349         else
7846                 nfs4_put_stid(ns);               7350                 nfs4_put_stid(ns);
7847 out:                                             7351 out:
7848         return lst;                              7352         return lst;
7849 }                                                7353 }
7850                                                  7354 
7851 static int                                       7355 static int
7852 check_lock_length(u64 offset, u64 length)        7356 check_lock_length(u64 offset, u64 length)
7853 {                                                7357 {
7854         return ((length == 0) || ((length !=     7358         return ((length == 0) || ((length != NFS4_MAX_UINT64) &&
7855                 (length > ~offset)));            7359                 (length > ~offset)));
7856 }                                                7360 }
7857                                                  7361 
7858 static void get_lock_access(struct nfs4_ol_st    7362 static void get_lock_access(struct nfs4_ol_stateid *lock_stp, u32 access)
7859 {                                                7363 {
7860         struct nfs4_file *fp = lock_stp->st_s    7364         struct nfs4_file *fp = lock_stp->st_stid.sc_file;
7861                                                  7365 
7862         lockdep_assert_held(&fp->fi_lock);       7366         lockdep_assert_held(&fp->fi_lock);
7863                                                  7367 
7864         if (test_access(access, lock_stp))       7368         if (test_access(access, lock_stp))
7865                 return;                          7369                 return;
7866         __nfs4_file_get_access(fp, access);      7370         __nfs4_file_get_access(fp, access);
7867         set_access(access, lock_stp);            7371         set_access(access, lock_stp);
7868 }                                                7372 }
7869                                                  7373 
7870 static __be32                                    7374 static __be32
7871 lookup_or_create_lock_state(struct nfsd4_comp    7375 lookup_or_create_lock_state(struct nfsd4_compound_state *cstate,
7872                             struct nfs4_ol_st    7376                             struct nfs4_ol_stateid *ost,
7873                             struct nfsd4_lock    7377                             struct nfsd4_lock *lock,
7874                             struct nfs4_ol_st    7378                             struct nfs4_ol_stateid **plst, bool *new)
7875 {                                                7379 {
7876         __be32 status;                           7380         __be32 status;
7877         struct nfs4_file *fi = ost->st_stid.s    7381         struct nfs4_file *fi = ost->st_stid.sc_file;
7878         struct nfs4_openowner *oo = openowner    7382         struct nfs4_openowner *oo = openowner(ost->st_stateowner);
7879         struct nfs4_client *cl = oo->oo_owner    7383         struct nfs4_client *cl = oo->oo_owner.so_client;
7880         struct inode *inode = d_inode(cstate-    7384         struct inode *inode = d_inode(cstate->current_fh.fh_dentry);
7881         struct nfs4_lockowner *lo;               7385         struct nfs4_lockowner *lo;
7882         struct nfs4_ol_stateid *lst;             7386         struct nfs4_ol_stateid *lst;
7883         unsigned int strhashval;                 7387         unsigned int strhashval;
7884                                                  7388 
7885         lo = find_lockowner_str(cl, &lock->lk    7389         lo = find_lockowner_str(cl, &lock->lk_new_owner);
7886         if (!lo) {                               7390         if (!lo) {
7887                 strhashval = ownerstr_hashval    7391                 strhashval = ownerstr_hashval(&lock->lk_new_owner);
7888                 lo = alloc_init_lock_stateown    7392                 lo = alloc_init_lock_stateowner(strhashval, cl, ost, lock);
7889                 if (lo == NULL)                  7393                 if (lo == NULL)
7890                         return nfserr_jukebox    7394                         return nfserr_jukebox;
7891         } else {                                 7395         } else {
7892                 /* with an existing lockowner    7396                 /* with an existing lockowner, seqids must be the same */
7893                 status = nfserr_bad_seqid;       7397                 status = nfserr_bad_seqid;
7894                 if (!cstate->minorversion &&     7398                 if (!cstate->minorversion &&
7895                     lock->lk_new_lock_seqid !    7399                     lock->lk_new_lock_seqid != lo->lo_owner.so_seqid)
7896                         goto out;                7400                         goto out;
7897         }                                        7401         }
7898                                                  7402 
7899         lst = find_or_create_lock_stateid(lo,    7403         lst = find_or_create_lock_stateid(lo, fi, inode, ost, new);
7900         if (lst == NULL) {                       7404         if (lst == NULL) {
7901                 status = nfserr_jukebox;         7405                 status = nfserr_jukebox;
7902                 goto out;                        7406                 goto out;
7903         }                                        7407         }
7904                                                  7408 
7905         status = nfs_ok;                         7409         status = nfs_ok;
7906         *plst = lst;                             7410         *plst = lst;
7907 out:                                             7411 out:
7908         nfs4_put_stateowner(&lo->lo_owner);      7412         nfs4_put_stateowner(&lo->lo_owner);
7909         return status;                           7413         return status;
7910 }                                                7414 }
7911                                                  7415 
7912 /*                                               7416 /*
7913  *  LOCK operation                               7417  *  LOCK operation 
7914  */                                              7418  */
7915 __be32                                           7419 __be32
7916 nfsd4_lock(struct svc_rqst *rqstp, struct nfs    7420 nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
7917            union nfsd4_op_u *u)                  7421            union nfsd4_op_u *u)
7918 {                                                7422 {
7919         struct nfsd4_lock *lock = &u->lock;      7423         struct nfsd4_lock *lock = &u->lock;
7920         struct nfs4_openowner *open_sop = NUL    7424         struct nfs4_openowner *open_sop = NULL;
7921         struct nfs4_lockowner *lock_sop = NUL    7425         struct nfs4_lockowner *lock_sop = NULL;
7922         struct nfs4_ol_stateid *lock_stp = NU    7426         struct nfs4_ol_stateid *lock_stp = NULL;
7923         struct nfs4_ol_stateid *open_stp = NU    7427         struct nfs4_ol_stateid *open_stp = NULL;
7924         struct nfs4_file *fp;                    7428         struct nfs4_file *fp;
7925         struct nfsd_file *nf = NULL;             7429         struct nfsd_file *nf = NULL;
7926         struct nfsd4_blocked_lock *nbl = NULL    7430         struct nfsd4_blocked_lock *nbl = NULL;
7927         struct file_lock *file_lock = NULL;      7431         struct file_lock *file_lock = NULL;
7928         struct file_lock *conflock = NULL;       7432         struct file_lock *conflock = NULL;
7929         struct super_block *sb;               << 
7930         __be32 status = 0;                       7433         __be32 status = 0;
7931         int lkflg;                               7434         int lkflg;
7932         int err;                                 7435         int err;
7933         bool new = false;                        7436         bool new = false;
7934         unsigned char type;                   !! 7437         unsigned char fl_type;
7935         unsigned int flags = FL_POSIX;        !! 7438         unsigned int fl_flags = FL_POSIX;
7936         struct net *net = SVC_NET(rqstp);        7439         struct net *net = SVC_NET(rqstp);
7937         struct nfsd_net *nn = net_generic(net    7440         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
7938                                                  7441 
7939         dprintk("NFSD: nfsd4_lock: start=%Ld     7442         dprintk("NFSD: nfsd4_lock: start=%Ld length=%Ld\n",
7940                 (long long) lock->lk_offset,     7443                 (long long) lock->lk_offset,
7941                 (long long) lock->lk_length);    7444                 (long long) lock->lk_length);
7942                                                  7445 
7943         if (check_lock_length(lock->lk_offset    7446         if (check_lock_length(lock->lk_offset, lock->lk_length))
7944                  return nfserr_inval;            7447                  return nfserr_inval;
7945                                                  7448 
7946         if ((status = fh_verify(rqstp, &cstat    7449         if ((status = fh_verify(rqstp, &cstate->current_fh,
7947                                 S_IFREG, NFSD    7450                                 S_IFREG, NFSD_MAY_LOCK))) {
7948                 dprintk("NFSD: nfsd4_lock: pe    7451                 dprintk("NFSD: nfsd4_lock: permission denied!\n");
7949                 return status;                   7452                 return status;
7950         }                                        7453         }
7951         sb = cstate->current_fh.fh_dentry->d_ << 
7952                                                  7454 
7953         if (lock->lk_is_new) {                   7455         if (lock->lk_is_new) {
7954                 if (nfsd4_has_session(cstate)    7456                 if (nfsd4_has_session(cstate))
7955                         /* See rfc 5661 18.10    7457                         /* See rfc 5661 18.10.3: given clientid is ignored: */
7956                         memcpy(&lock->lk_new_    7458                         memcpy(&lock->lk_new_clientid,
7957                                 &cstate->clp-    7459                                 &cstate->clp->cl_clientid,
7958                                 sizeof(client    7460                                 sizeof(clientid_t));
7959                                                  7461 
7960                 /* validate and update open s    7462                 /* validate and update open stateid and open seqid */
7961                 status = nfs4_preprocess_conf    7463                 status = nfs4_preprocess_confirmed_seqid_op(cstate,
7962                                         lock-    7464                                         lock->lk_new_open_seqid,
7963                                         &lock    7465                                         &lock->lk_new_open_stateid,
7964                                         &open    7466                                         &open_stp, nn);
7965                 if (status)                      7467                 if (status)
7966                         goto out;                7468                         goto out;
7967                 mutex_unlock(&open_stp->st_mu    7469                 mutex_unlock(&open_stp->st_mutex);
7968                 open_sop = openowner(open_stp    7470                 open_sop = openowner(open_stp->st_stateowner);
7969                 status = nfserr_bad_stateid;     7471                 status = nfserr_bad_stateid;
7970                 if (!same_clid(&open_sop->oo_    7472                 if (!same_clid(&open_sop->oo_owner.so_client->cl_clientid,
7971                                                  7473                                                 &lock->lk_new_clientid))
7972                         goto out;                7474                         goto out;
7973                 status = lookup_or_create_loc    7475                 status = lookup_or_create_lock_state(cstate, open_stp, lock,
7974                                                  7476                                                         &lock_stp, &new);
7975         } else {                                 7477         } else {
7976                 status = nfs4_preprocess_seqi    7478                 status = nfs4_preprocess_seqid_op(cstate,
7977                                               !! 7479                                        lock->lk_old_lock_seqid,
7978                                               !! 7480                                        &lock->lk_old_lock_stateid,
7979                                               !! 7481                                        NFS4_LOCK_STID, &lock_stp, nn);
7980                                               << 
7981         }                                        7482         }
7982         if (status)                              7483         if (status)
7983                 goto out;                        7484                 goto out;
7984         lock_sop = lockowner(lock_stp->st_sta    7485         lock_sop = lockowner(lock_stp->st_stateowner);
7985                                                  7486 
7986         lkflg = setlkflg(lock->lk_type);         7487         lkflg = setlkflg(lock->lk_type);
7987         status = nfs4_check_openmode(lock_stp    7488         status = nfs4_check_openmode(lock_stp, lkflg);
7988         if (status)                              7489         if (status)
7989                 goto out;                        7490                 goto out;
7990                                                  7491 
7991         status = nfserr_grace;                   7492         status = nfserr_grace;
7992         if (locks_in_grace(net) && !lock->lk_    7493         if (locks_in_grace(net) && !lock->lk_reclaim)
7993                 goto out;                        7494                 goto out;
7994         status = nfserr_no_grace;                7495         status = nfserr_no_grace;
7995         if (!locks_in_grace(net) && lock->lk_    7496         if (!locks_in_grace(net) && lock->lk_reclaim)
7996                 goto out;                        7497                 goto out;
7997                                                  7498 
7998         if (lock->lk_reclaim)                    7499         if (lock->lk_reclaim)
7999                 flags |= FL_RECLAIM;          !! 7500                 fl_flags |= FL_RECLAIM;
8000                                                  7501 
8001         fp = lock_stp->st_stid.sc_file;          7502         fp = lock_stp->st_stid.sc_file;
8002         switch (lock->lk_type) {                 7503         switch (lock->lk_type) {
8003                 case NFS4_READW_LT:              7504                 case NFS4_READW_LT:
8004                         if (nfsd4_has_session !! 7505                         if (nfsd4_has_session(cstate))
8005                             exportfs_lock_op_ !! 7506                                 fl_flags |= FL_SLEEP;
8006                                 flags |= FL_S << 
8007                         fallthrough;             7507                         fallthrough;
8008                 case NFS4_READ_LT:               7508                 case NFS4_READ_LT:
8009                         spin_lock(&fp->fi_loc    7509                         spin_lock(&fp->fi_lock);
8010                         nf = find_readable_fi    7510                         nf = find_readable_file_locked(fp);
8011                         if (nf)                  7511                         if (nf)
8012                                 get_lock_acce    7512                                 get_lock_access(lock_stp, NFS4_SHARE_ACCESS_READ);
8013                         spin_unlock(&fp->fi_l    7513                         spin_unlock(&fp->fi_lock);
8014                         type = F_RDLCK;       !! 7514                         fl_type = F_RDLCK;
8015                         break;                   7515                         break;
8016                 case NFS4_WRITEW_LT:             7516                 case NFS4_WRITEW_LT:
8017                         if (nfsd4_has_session !! 7517                         if (nfsd4_has_session(cstate))
8018                             exportfs_lock_op_ !! 7518                                 fl_flags |= FL_SLEEP;
8019                                 flags |= FL_S << 
8020                         fallthrough;             7519                         fallthrough;
8021                 case NFS4_WRITE_LT:              7520                 case NFS4_WRITE_LT:
8022                         spin_lock(&fp->fi_loc    7521                         spin_lock(&fp->fi_lock);
8023                         nf = find_writeable_f    7522                         nf = find_writeable_file_locked(fp);
8024                         if (nf)                  7523                         if (nf)
8025                                 get_lock_acce    7524                                 get_lock_access(lock_stp, NFS4_SHARE_ACCESS_WRITE);
8026                         spin_unlock(&fp->fi_l    7525                         spin_unlock(&fp->fi_lock);
8027                         type = F_WRLCK;       !! 7526                         fl_type = F_WRLCK;
8028                         break;                   7527                         break;
8029                 default:                         7528                 default:
8030                         status = nfserr_inval    7529                         status = nfserr_inval;
8031                 goto out;                        7530                 goto out;
8032         }                                        7531         }
8033                                                  7532 
8034         if (!nf) {                               7533         if (!nf) {
8035                 status = nfserr_openmode;        7534                 status = nfserr_openmode;
8036                 goto out;                        7535                 goto out;
8037         }                                        7536         }
8038                                                  7537 
8039         /*                                       7538         /*
8040          * Most filesystems with their own ->    7539          * Most filesystems with their own ->lock operations will block
8041          * the nfsd thread waiting to acquire    7540          * the nfsd thread waiting to acquire the lock.  That leads to
8042          * deadlocks (we don't want every nfs    7541          * deadlocks (we don't want every nfsd thread tied up waiting
8043          * for file locks), so don't attempt     7542          * for file locks), so don't attempt blocking lock notifications
8044          * on those filesystems:                 7543          * on those filesystems:
8045          */                                      7544          */
8046         if (!exportfs_lock_op_is_async(sb->s_ !! 7545         if (nf->nf_file->f_op->lock)
8047                 flags &= ~FL_SLEEP;           !! 7546                 fl_flags &= ~FL_SLEEP;
8048                                                  7547 
8049         nbl = find_or_allocate_block(lock_sop    7548         nbl = find_or_allocate_block(lock_sop, &fp->fi_fhandle, nn);
8050         if (!nbl) {                              7549         if (!nbl) {
8051                 dprintk("NFSD: %s: unable to     7550                 dprintk("NFSD: %s: unable to allocate block!\n", __func__);
8052                 status = nfserr_jukebox;         7551                 status = nfserr_jukebox;
8053                 goto out;                        7552                 goto out;
8054         }                                        7553         }
8055                                                  7554 
8056         file_lock = &nbl->nbl_lock;              7555         file_lock = &nbl->nbl_lock;
8057         file_lock->c.flc_type = type;         !! 7556         file_lock->fl_type = fl_type;
8058         file_lock->c.flc_owner = (fl_owner_t) !! 7557         file_lock->fl_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(&lock_sop->lo_owner));
8059         file_lock->c.flc_pid = current->tgid; !! 7558         file_lock->fl_pid = current->tgid;
8060         file_lock->c.flc_file = nf->nf_file;  !! 7559         file_lock->fl_file = nf->nf_file;
8061         file_lock->c.flc_flags = flags;       !! 7560         file_lock->fl_flags = fl_flags;
8062         file_lock->fl_lmops = &nfsd_posix_mng    7561         file_lock->fl_lmops = &nfsd_posix_mng_ops;
8063         file_lock->fl_start = lock->lk_offset    7562         file_lock->fl_start = lock->lk_offset;
8064         file_lock->fl_end = last_byte_offset(    7563         file_lock->fl_end = last_byte_offset(lock->lk_offset, lock->lk_length);
8065         nfs4_transform_lock_offset(file_lock)    7564         nfs4_transform_lock_offset(file_lock);
8066                                                  7565 
8067         conflock = locks_alloc_lock();           7566         conflock = locks_alloc_lock();
8068         if (!conflock) {                         7567         if (!conflock) {
8069                 dprintk("NFSD: %s: unable to     7568                 dprintk("NFSD: %s: unable to allocate lock!\n", __func__);
8070                 status = nfserr_jukebox;         7569                 status = nfserr_jukebox;
8071                 goto out;                        7570                 goto out;
8072         }                                        7571         }
8073                                                  7572 
8074         if (flags & FL_SLEEP) {               !! 7573         if (fl_flags & FL_SLEEP) {
8075                 nbl->nbl_time = ktime_get_boo    7574                 nbl->nbl_time = ktime_get_boottime_seconds();
8076                 spin_lock(&nn->blocked_locks_    7575                 spin_lock(&nn->blocked_locks_lock);
8077                 list_add_tail(&nbl->nbl_list,    7576                 list_add_tail(&nbl->nbl_list, &lock_sop->lo_blocked);
8078                 list_add_tail(&nbl->nbl_lru,     7577                 list_add_tail(&nbl->nbl_lru, &nn->blocked_locks_lru);
8079                 kref_get(&nbl->nbl_kref);        7578                 kref_get(&nbl->nbl_kref);
8080                 spin_unlock(&nn->blocked_lock    7579                 spin_unlock(&nn->blocked_locks_lock);
8081         }                                        7580         }
8082                                                  7581 
8083         err = vfs_lock_file(nf->nf_file, F_SE    7582         err = vfs_lock_file(nf->nf_file, F_SETLK, file_lock, conflock);
8084         switch (err) {                           7583         switch (err) {
8085         case 0: /* success! */                   7584         case 0: /* success! */
8086                 nfs4_inc_and_copy_stateid(&lo    7585                 nfs4_inc_and_copy_stateid(&lock->lk_resp_stateid, &lock_stp->st_stid);
8087                 status = 0;                      7586                 status = 0;
8088                 if (lock->lk_reclaim)            7587                 if (lock->lk_reclaim)
8089                         nn->somebody_reclaime    7588                         nn->somebody_reclaimed = true;
8090                 break;                           7589                 break;
8091         case FILE_LOCK_DEFERRED:                 7590         case FILE_LOCK_DEFERRED:
8092                 kref_put(&nbl->nbl_kref, free    7591                 kref_put(&nbl->nbl_kref, free_nbl);
8093                 nbl = NULL;                      7592                 nbl = NULL;
8094                 fallthrough;                     7593                 fallthrough;
8095         case -EAGAIN:           /* conflock h    7594         case -EAGAIN:           /* conflock holds conflicting lock */
8096                 status = nfserr_denied;          7595                 status = nfserr_denied;
8097                 dprintk("NFSD: nfsd4_lock: co    7596                 dprintk("NFSD: nfsd4_lock: conflicting lock found!\n");
8098                 nfs4_set_lock_denied(conflock    7597                 nfs4_set_lock_denied(conflock, &lock->lk_denied);
8099                 break;                           7598                 break;
8100         case -EDEADLK:                           7599         case -EDEADLK:
8101                 status = nfserr_deadlock;        7600                 status = nfserr_deadlock;
8102                 break;                           7601                 break;
8103         default:                                 7602         default:
8104                 dprintk("NFSD: nfsd4_lock: vf    7603                 dprintk("NFSD: nfsd4_lock: vfs_lock_file() failed! status %d\n",err);
8105                 status = nfserrno(err);          7604                 status = nfserrno(err);
8106                 break;                           7605                 break;
8107         }                                        7606         }
8108 out:                                             7607 out:
8109         if (nbl) {                               7608         if (nbl) {
8110                 /* dequeue it if we queued it    7609                 /* dequeue it if we queued it before */
8111                 if (flags & FL_SLEEP) {       !! 7610                 if (fl_flags & FL_SLEEP) {
8112                         spin_lock(&nn->blocke    7611                         spin_lock(&nn->blocked_locks_lock);
8113                         if (!list_empty(&nbl-    7612                         if (!list_empty(&nbl->nbl_list) &&
8114                             !list_empty(&nbl-    7613                             !list_empty(&nbl->nbl_lru)) {
8115                                 list_del_init    7614                                 list_del_init(&nbl->nbl_list);
8116                                 list_del_init    7615                                 list_del_init(&nbl->nbl_lru);
8117                                 kref_put(&nbl    7616                                 kref_put(&nbl->nbl_kref, free_nbl);
8118                         }                        7617                         }
8119                         /* nbl can use one of    7618                         /* nbl can use one of lists to be linked to reaplist */
8120                         spin_unlock(&nn->bloc    7619                         spin_unlock(&nn->blocked_locks_lock);
8121                 }                                7620                 }
8122                 free_blocked_lock(nbl);          7621                 free_blocked_lock(nbl);
8123         }                                        7622         }
8124         if (nf)                                  7623         if (nf)
8125                 nfsd_file_put(nf);               7624                 nfsd_file_put(nf);
8126         if (lock_stp) {                          7625         if (lock_stp) {
8127                 /* Bump seqid manually if the    7626                 /* Bump seqid manually if the 4.0 replay owner is openowner */
8128                 if (cstate->replay_owner &&      7627                 if (cstate->replay_owner &&
8129                     cstate->replay_owner != &    7628                     cstate->replay_owner != &lock_sop->lo_owner &&
8130                     seqid_mutating_err(ntohl(    7629                     seqid_mutating_err(ntohl(status)))
8131                         lock_sop->lo_owner.so    7630                         lock_sop->lo_owner.so_seqid++;
8132                                                  7631 
8133                 /*                               7632                 /*
8134                  * If this is a new, never-be    7633                  * If this is a new, never-before-used stateid, and we are
8135                  * returning an error, then j    7634                  * returning an error, then just go ahead and release it.
8136                  */                              7635                  */
8137                 if (status && new)               7636                 if (status && new)
8138                         release_lock_stateid(    7637                         release_lock_stateid(lock_stp);
8139                                                  7638 
8140                 mutex_unlock(&lock_stp->st_mu    7639                 mutex_unlock(&lock_stp->st_mutex);
8141                                                  7640 
8142                 nfs4_put_stid(&lock_stp->st_s    7641                 nfs4_put_stid(&lock_stp->st_stid);
8143         }                                        7642         }
8144         if (open_stp)                            7643         if (open_stp)
8145                 nfs4_put_stid(&open_stp->st_s    7644                 nfs4_put_stid(&open_stp->st_stid);
8146         nfsd4_bump_seqid(cstate, status);        7645         nfsd4_bump_seqid(cstate, status);
8147         if (conflock)                            7646         if (conflock)
8148                 locks_free_lock(conflock);       7647                 locks_free_lock(conflock);
8149         return status;                           7648         return status;
8150 }                                                7649 }
8151                                                  7650 
8152 void nfsd4_lock_release(union nfsd4_op_u *u)  << 
8153 {                                             << 
8154         struct nfsd4_lock *lock = &u->lock;   << 
8155         struct nfsd4_lock_denied *deny = &loc << 
8156                                               << 
8157         kfree(deny->ld_owner.data);           << 
8158 }                                             << 
8159                                               << 
8160 /*                                               7651 /*
8161  * The NFSv4 spec allows a client to do a LOC    7652  * The NFSv4 spec allows a client to do a LOCKT without holding an OPEN,
8162  * so we do a temporary open here just to get    7653  * so we do a temporary open here just to get an open file to pass to
8163  * vfs_test_lock.                                7654  * vfs_test_lock.
8164  */                                              7655  */
8165 static __be32 nfsd_test_lock(struct svc_rqst     7656 static __be32 nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock)
8166 {                                                7657 {
8167         struct nfsd_file *nf;                    7658         struct nfsd_file *nf;
8168         struct inode *inode;                     7659         struct inode *inode;
8169         __be32 err;                              7660         __be32 err;
8170                                                  7661 
8171         err = nfsd_file_acquire(rqstp, fhp, N    7662         err = nfsd_file_acquire(rqstp, fhp, NFSD_MAY_READ, &nf);
8172         if (err)                                 7663         if (err)
8173                 return err;                      7664                 return err;
8174         inode = fhp->fh_dentry->d_inode;         7665         inode = fhp->fh_dentry->d_inode;
8175         inode_lock(inode); /* to block new le    7666         inode_lock(inode); /* to block new leases till after test_lock: */
8176         err = nfserrno(nfsd_open_break_lease(    7667         err = nfserrno(nfsd_open_break_lease(inode, NFSD_MAY_READ));
8177         if (err)                                 7668         if (err)
8178                 goto out;                        7669                 goto out;
8179         lock->c.flc_file = nf->nf_file;       !! 7670         lock->fl_file = nf->nf_file;
8180         err = nfserrno(vfs_test_lock(nf->nf_f    7671         err = nfserrno(vfs_test_lock(nf->nf_file, lock));
8181         lock->c.flc_file = NULL;              !! 7672         lock->fl_file = NULL;
8182 out:                                             7673 out:
8183         inode_unlock(inode);                     7674         inode_unlock(inode);
8184         nfsd_file_put(nf);                       7675         nfsd_file_put(nf);
8185         return err;                              7676         return err;
8186 }                                                7677 }
8187                                                  7678 
8188 /*                                               7679 /*
8189  * LOCKT operation                               7680  * LOCKT operation
8190  */                                              7681  */
8191 __be32                                           7682 __be32
8192 nfsd4_lockt(struct svc_rqst *rqstp, struct nf    7683 nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
8193             union nfsd4_op_u *u)                 7684             union nfsd4_op_u *u)
8194 {                                                7685 {
8195         struct nfsd4_lockt *lockt = &u->lockt    7686         struct nfsd4_lockt *lockt = &u->lockt;
8196         struct file_lock *file_lock = NULL;      7687         struct file_lock *file_lock = NULL;
8197         struct nfs4_lockowner *lo = NULL;        7688         struct nfs4_lockowner *lo = NULL;
8198         __be32 status;                           7689         __be32 status;
8199         struct nfsd_net *nn = net_generic(SVC    7690         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
8200                                                  7691 
8201         if (locks_in_grace(SVC_NET(rqstp)))      7692         if (locks_in_grace(SVC_NET(rqstp)))
8202                 return nfserr_grace;             7693                 return nfserr_grace;
8203                                                  7694 
8204         if (check_lock_length(lockt->lt_offse    7695         if (check_lock_length(lockt->lt_offset, lockt->lt_length))
8205                  return nfserr_inval;            7696                  return nfserr_inval;
8206                                                  7697 
8207         if (!nfsd4_has_session(cstate)) {        7698         if (!nfsd4_has_session(cstate)) {
8208                 status = set_client(&lockt->l    7699                 status = set_client(&lockt->lt_clientid, cstate, nn);
8209                 if (status)                      7700                 if (status)
8210                         goto out;                7701                         goto out;
8211         }                                        7702         }
8212                                                  7703 
8213         if ((status = fh_verify(rqstp, &cstat    7704         if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
8214                 goto out;                        7705                 goto out;
8215                                                  7706 
8216         file_lock = locks_alloc_lock();          7707         file_lock = locks_alloc_lock();
8217         if (!file_lock) {                        7708         if (!file_lock) {
8218                 dprintk("NFSD: %s: unable to     7709                 dprintk("NFSD: %s: unable to allocate lock!\n", __func__);
8219                 status = nfserr_jukebox;         7710                 status = nfserr_jukebox;
8220                 goto out;                        7711                 goto out;
8221         }                                        7712         }
8222                                                  7713 
8223         switch (lockt->lt_type) {                7714         switch (lockt->lt_type) {
8224                 case NFS4_READ_LT:               7715                 case NFS4_READ_LT:
8225                 case NFS4_READW_LT:              7716                 case NFS4_READW_LT:
8226                         file_lock->c.flc_type !! 7717                         file_lock->fl_type = F_RDLCK;
8227                         break;                   7718                         break;
8228                 case NFS4_WRITE_LT:              7719                 case NFS4_WRITE_LT:
8229                 case NFS4_WRITEW_LT:             7720                 case NFS4_WRITEW_LT:
8230                         file_lock->c.flc_type !! 7721                         file_lock->fl_type = F_WRLCK;
8231                         break;                   7722                         break;
8232                 default:                         7723                 default:
8233                         dprintk("NFSD: nfs4_l    7724                         dprintk("NFSD: nfs4_lockt: bad lock type!\n");
8234                         status = nfserr_inval    7725                         status = nfserr_inval;
8235                         goto out;                7726                         goto out;
8236         }                                        7727         }
8237                                                  7728 
8238         lo = find_lockowner_str(cstate->clp,     7729         lo = find_lockowner_str(cstate->clp, &lockt->lt_owner);
8239         if (lo)                                  7730         if (lo)
8240                 file_lock->c.flc_owner = (fl_ !! 7731                 file_lock->fl_owner = (fl_owner_t)lo;
8241         file_lock->c.flc_pid = current->tgid; !! 7732         file_lock->fl_pid = current->tgid;
8242         file_lock->c.flc_flags = FL_POSIX;    !! 7733         file_lock->fl_flags = FL_POSIX;
8243                                                  7734 
8244         file_lock->fl_start = lockt->lt_offse    7735         file_lock->fl_start = lockt->lt_offset;
8245         file_lock->fl_end = last_byte_offset(    7736         file_lock->fl_end = last_byte_offset(lockt->lt_offset, lockt->lt_length);
8246                                                  7737 
8247         nfs4_transform_lock_offset(file_lock)    7738         nfs4_transform_lock_offset(file_lock);
8248                                                  7739 
8249         status = nfsd_test_lock(rqstp, &cstat    7740         status = nfsd_test_lock(rqstp, &cstate->current_fh, file_lock);
8250         if (status)                              7741         if (status)
8251                 goto out;                        7742                 goto out;
8252                                                  7743 
8253         if (file_lock->c.flc_type != F_UNLCK) !! 7744         if (file_lock->fl_type != F_UNLCK) {
8254                 status = nfserr_denied;          7745                 status = nfserr_denied;
8255                 nfs4_set_lock_denied(file_loc    7746                 nfs4_set_lock_denied(file_lock, &lockt->lt_denied);
8256         }                                        7747         }
8257 out:                                             7748 out:
8258         if (lo)                                  7749         if (lo)
8259                 nfs4_put_stateowner(&lo->lo_o    7750                 nfs4_put_stateowner(&lo->lo_owner);
8260         if (file_lock)                           7751         if (file_lock)
8261                 locks_free_lock(file_lock);      7752                 locks_free_lock(file_lock);
8262         return status;                           7753         return status;
8263 }                                                7754 }
8264                                                  7755 
8265 void nfsd4_lockt_release(union nfsd4_op_u *u) << 
8266 {                                             << 
8267         struct nfsd4_lockt *lockt = &u->lockt << 
8268         struct nfsd4_lock_denied *deny = &loc << 
8269                                               << 
8270         kfree(deny->ld_owner.data);           << 
8271 }                                             << 
8272                                               << 
8273 __be32                                           7756 __be32
8274 nfsd4_locku(struct svc_rqst *rqstp, struct nf    7757 nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
8275             union nfsd4_op_u *u)                 7758             union nfsd4_op_u *u)
8276 {                                                7759 {
8277         struct nfsd4_locku *locku = &u->locku    7760         struct nfsd4_locku *locku = &u->locku;
8278         struct nfs4_ol_stateid *stp;             7761         struct nfs4_ol_stateid *stp;
8279         struct nfsd_file *nf = NULL;             7762         struct nfsd_file *nf = NULL;
8280         struct file_lock *file_lock = NULL;      7763         struct file_lock *file_lock = NULL;
8281         __be32 status;                           7764         __be32 status;
8282         int err;                                 7765         int err;
8283         struct nfsd_net *nn = net_generic(SVC    7766         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
8284                                                  7767 
8285         dprintk("NFSD: nfsd4_locku: start=%Ld    7768         dprintk("NFSD: nfsd4_locku: start=%Ld length=%Ld\n",
8286                 (long long) locku->lu_offset,    7769                 (long long) locku->lu_offset,
8287                 (long long) locku->lu_length)    7770                 (long long) locku->lu_length);
8288                                                  7771 
8289         if (check_lock_length(locku->lu_offse    7772         if (check_lock_length(locku->lu_offset, locku->lu_length))
8290                  return nfserr_inval;            7773                  return nfserr_inval;
8291                                                  7774 
8292         status = nfs4_preprocess_seqid_op(cst    7775         status = nfs4_preprocess_seqid_op(cstate, locku->lu_seqid,
8293                                           &lo !! 7776                                         &locku->lu_stateid, NFS4_LOCK_STID,
8294                                           &st !! 7777                                         &stp, nn);
8295         if (status)                              7778         if (status)
8296                 goto out;                        7779                 goto out;
8297         nf = find_any_file(stp->st_stid.sc_fi    7780         nf = find_any_file(stp->st_stid.sc_file);
8298         if (!nf) {                               7781         if (!nf) {
8299                 status = nfserr_lock_range;      7782                 status = nfserr_lock_range;
8300                 goto put_stateid;                7783                 goto put_stateid;
8301         }                                        7784         }
8302         file_lock = locks_alloc_lock();          7785         file_lock = locks_alloc_lock();
8303         if (!file_lock) {                        7786         if (!file_lock) {
8304                 dprintk("NFSD: %s: unable to     7787                 dprintk("NFSD: %s: unable to allocate lock!\n", __func__);
8305                 status = nfserr_jukebox;         7788                 status = nfserr_jukebox;
8306                 goto put_file;                   7789                 goto put_file;
8307         }                                        7790         }
8308                                                  7791 
8309         file_lock->c.flc_type = F_UNLCK;      !! 7792         file_lock->fl_type = F_UNLCK;
8310         file_lock->c.flc_owner = (fl_owner_t) !! 7793         file_lock->fl_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(stp->st_stateowner));
8311         file_lock->c.flc_pid = current->tgid; !! 7794         file_lock->fl_pid = current->tgid;
8312         file_lock->c.flc_file = nf->nf_file;  !! 7795         file_lock->fl_file = nf->nf_file;
8313         file_lock->c.flc_flags = FL_POSIX;    !! 7796         file_lock->fl_flags = FL_POSIX;
8314         file_lock->fl_lmops = &nfsd_posix_mng    7797         file_lock->fl_lmops = &nfsd_posix_mng_ops;
8315         file_lock->fl_start = locku->lu_offse    7798         file_lock->fl_start = locku->lu_offset;
8316                                                  7799 
8317         file_lock->fl_end = last_byte_offset(    7800         file_lock->fl_end = last_byte_offset(locku->lu_offset,
8318                                                  7801                                                 locku->lu_length);
8319         nfs4_transform_lock_offset(file_lock)    7802         nfs4_transform_lock_offset(file_lock);
8320                                                  7803 
8321         err = vfs_lock_file(nf->nf_file, F_SE    7804         err = vfs_lock_file(nf->nf_file, F_SETLK, file_lock, NULL);
8322         if (err) {                               7805         if (err) {
8323                 dprintk("NFSD: nfs4_locku: vf    7806                 dprintk("NFSD: nfs4_locku: vfs_lock_file failed!\n");
8324                 goto out_nfserr;                 7807                 goto out_nfserr;
8325         }                                        7808         }
8326         nfs4_inc_and_copy_stateid(&locku->lu_    7809         nfs4_inc_and_copy_stateid(&locku->lu_stateid, &stp->st_stid);
8327 put_file:                                        7810 put_file:
8328         nfsd_file_put(nf);                       7811         nfsd_file_put(nf);
8329 put_stateid:                                     7812 put_stateid:
8330         mutex_unlock(&stp->st_mutex);            7813         mutex_unlock(&stp->st_mutex);
8331         nfs4_put_stid(&stp->st_stid);            7814         nfs4_put_stid(&stp->st_stid);
8332 out:                                             7815 out:
8333         nfsd4_bump_seqid(cstate, status);        7816         nfsd4_bump_seqid(cstate, status);
8334         if (file_lock)                           7817         if (file_lock)
8335                 locks_free_lock(file_lock);      7818                 locks_free_lock(file_lock);
8336         return status;                           7819         return status;
8337                                                  7820 
8338 out_nfserr:                                      7821 out_nfserr:
8339         status = nfserrno(err);                  7822         status = nfserrno(err);
8340         goto put_file;                           7823         goto put_file;
8341 }                                                7824 }
8342                                                  7825 
8343 /*                                               7826 /*
8344  * returns                                       7827  * returns
8345  *      true:  locks held by lockowner           7828  *      true:  locks held by lockowner
8346  *      false: no locks held by lockowner        7829  *      false: no locks held by lockowner
8347  */                                              7830  */
8348 static bool                                      7831 static bool
8349 check_for_locks(struct nfs4_file *fp, struct     7832 check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
8350 {                                                7833 {
8351         struct file_lock *fl;                    7834         struct file_lock *fl;
8352         int status = false;                      7835         int status = false;
8353         struct nfsd_file *nf;                 !! 7836         struct nfsd_file *nf = find_any_file(fp);
8354         struct inode *inode;                     7837         struct inode *inode;
8355         struct file_lock_context *flctx;         7838         struct file_lock_context *flctx;
8356                                                  7839 
8357         spin_lock(&fp->fi_lock);              << 
8358         nf = find_any_file_locked(fp);        << 
8359         if (!nf) {                               7840         if (!nf) {
8360                 /* Any valid lock stateid sho    7841                 /* Any valid lock stateid should have some sort of access */
8361                 WARN_ON_ONCE(1);                 7842                 WARN_ON_ONCE(1);
8362                 goto out;                     !! 7843                 return status;
8363         }                                        7844         }
8364                                                  7845 
8365         inode = file_inode(nf->nf_file);         7846         inode = file_inode(nf->nf_file);
8366         flctx = locks_inode_context(inode);      7847         flctx = locks_inode_context(inode);
8367                                                  7848 
8368         if (flctx && !list_empty_careful(&flc    7849         if (flctx && !list_empty_careful(&flctx->flc_posix)) {
8369                 spin_lock(&flctx->flc_lock);     7850                 spin_lock(&flctx->flc_lock);
8370                 for_each_file_lock(fl, &flctx !! 7851                 list_for_each_entry(fl, &flctx->flc_posix, fl_list) {
8371                         if (fl->c.flc_owner = !! 7852                         if (fl->fl_owner == (fl_owner_t)lowner) {
8372                                 status = true    7853                                 status = true;
8373                                 break;           7854                                 break;
8374                         }                        7855                         }
8375                 }                                7856                 }
8376                 spin_unlock(&flctx->flc_lock)    7857                 spin_unlock(&flctx->flc_lock);
8377         }                                        7858         }
8378 out:                                          !! 7859         nfsd_file_put(nf);
8379         spin_unlock(&fp->fi_lock);            << 
8380         return status;                           7860         return status;
8381 }                                                7861 }
8382                                                  7862 
8383 /**                                              7863 /**
8384  * nfsd4_release_lockowner - process NFSv4.0     7864  * nfsd4_release_lockowner - process NFSv4.0 RELEASE_LOCKOWNER operations
8385  * @rqstp: RPC transaction                       7865  * @rqstp: RPC transaction
8386  * @cstate: NFSv4 COMPOUND state                 7866  * @cstate: NFSv4 COMPOUND state
8387  * @u: RELEASE_LOCKOWNER arguments               7867  * @u: RELEASE_LOCKOWNER arguments
8388  *                                               7868  *
8389  * Check if there are any locks still held an !! 7869  * The lockowner's so_count is bumped when a lock record is added
8390  * and any lock state that is owned.          !! 7870  * or when copying a conflicting lock. The latter case is brief,
                                                   >> 7871  * but can lead to fleeting false positives when looking for
                                                   >> 7872  * locks-in-use.
8391  *                                               7873  *
8392  * Return values:                                7874  * Return values:
8393  *   %nfs_ok: lockowner released or not found    7875  *   %nfs_ok: lockowner released or not found
8394  *   %nfserr_locks_held: lockowner still in u    7876  *   %nfserr_locks_held: lockowner still in use
8395  *   %nfserr_stale_clientid: clientid no long    7877  *   %nfserr_stale_clientid: clientid no longer active
8396  *   %nfserr_expired: clientid not recognized    7878  *   %nfserr_expired: clientid not recognized
8397  */                                              7879  */
8398 __be32                                           7880 __be32
8399 nfsd4_release_lockowner(struct svc_rqst *rqst    7881 nfsd4_release_lockowner(struct svc_rqst *rqstp,
8400                         struct nfsd4_compound    7882                         struct nfsd4_compound_state *cstate,
8401                         union nfsd4_op_u *u)     7883                         union nfsd4_op_u *u)
8402 {                                                7884 {
8403         struct nfsd4_release_lockowner *rlock    7885         struct nfsd4_release_lockowner *rlockowner = &u->release_lockowner;
8404         struct nfsd_net *nn = net_generic(SVC    7886         struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
8405         clientid_t *clid = &rlockowner->rl_cl    7887         clientid_t *clid = &rlockowner->rl_clientid;
8406         struct nfs4_ol_stateid *stp;             7888         struct nfs4_ol_stateid *stp;
8407         struct nfs4_lockowner *lo;               7889         struct nfs4_lockowner *lo;
8408         struct nfs4_client *clp;                 7890         struct nfs4_client *clp;
8409         LIST_HEAD(reaplist);                     7891         LIST_HEAD(reaplist);
8410         __be32 status;                           7892         __be32 status;
8411                                                  7893 
8412         dprintk("nfsd4_release_lockowner clie    7894         dprintk("nfsd4_release_lockowner clientid: (%08x/%08x):\n",
8413                 clid->cl_boot, clid->cl_id);     7895                 clid->cl_boot, clid->cl_id);
8414                                                  7896 
8415         status = set_client(clid, cstate, nn)    7897         status = set_client(clid, cstate, nn);
8416         if (status)                              7898         if (status)
8417                 return status;                   7899                 return status;
8418         clp = cstate->clp;                       7900         clp = cstate->clp;
8419                                                  7901 
8420         spin_lock(&clp->cl_lock);                7902         spin_lock(&clp->cl_lock);
8421         lo = find_lockowner_str_locked(clp, &    7903         lo = find_lockowner_str_locked(clp, &rlockowner->rl_owner);
8422         if (!lo) {                               7904         if (!lo) {
8423                 spin_unlock(&clp->cl_lock);      7905                 spin_unlock(&clp->cl_lock);
8424                 return nfs_ok;                   7906                 return nfs_ok;
8425         }                                        7907         }
8426                                               !! 7908         if (atomic_read(&lo->lo_owner.so_count) != 2) {
8427         list_for_each_entry(stp, &lo->lo_owne !! 7909                 spin_unlock(&clp->cl_lock);
8428                 if (check_for_locks(stp->st_s !! 7910                 nfs4_put_stateowner(&lo->lo_owner);
8429                         spin_unlock(&clp->cl_ !! 7911                 return nfserr_locks_held;
8430                         nfs4_put_stateowner(& << 
8431                         return nfserr_locks_h << 
8432                 }                             << 
8433         }                                        7912         }
8434         unhash_lockowner_locked(lo);             7913         unhash_lockowner_locked(lo);
8435         while (!list_empty(&lo->lo_owner.so_s    7914         while (!list_empty(&lo->lo_owner.so_stateids)) {
8436                 stp = list_first_entry(&lo->l    7915                 stp = list_first_entry(&lo->lo_owner.so_stateids,
8437                                        struct    7916                                        struct nfs4_ol_stateid,
8438                                        st_per    7917                                        st_perstateowner);
8439                 unhash_lock_stateid(stp);     !! 7918                 WARN_ON(!unhash_lock_stateid(stp));
8440                 put_ol_stateid_locked(stp, &r    7919                 put_ol_stateid_locked(stp, &reaplist);
8441         }                                        7920         }
8442         spin_unlock(&clp->cl_lock);              7921         spin_unlock(&clp->cl_lock);
8443                                                  7922 
8444         free_ol_stateid_reaplist(&reaplist);     7923         free_ol_stateid_reaplist(&reaplist);
8445         remove_blocked_locks(lo);                7924         remove_blocked_locks(lo);
8446         nfs4_put_stateowner(&lo->lo_owner);      7925         nfs4_put_stateowner(&lo->lo_owner);
8447         return nfs_ok;                           7926         return nfs_ok;
8448 }                                                7927 }
8449                                                  7928 
8450 static inline struct nfs4_client_reclaim *       7929 static inline struct nfs4_client_reclaim *
8451 alloc_reclaim(void)                              7930 alloc_reclaim(void)
8452 {                                                7931 {
8453         return kmalloc(sizeof(struct nfs4_cli    7932         return kmalloc(sizeof(struct nfs4_client_reclaim), GFP_KERNEL);
8454 }                                                7933 }
8455                                                  7934 
8456 bool                                             7935 bool
8457 nfs4_has_reclaimed_state(struct xdr_netobj na    7936 nfs4_has_reclaimed_state(struct xdr_netobj name, struct nfsd_net *nn)
8458 {                                                7937 {
8459         struct nfs4_client_reclaim *crp;         7938         struct nfs4_client_reclaim *crp;
8460                                                  7939 
8461         crp = nfsd4_find_reclaim_client(name,    7940         crp = nfsd4_find_reclaim_client(name, nn);
8462         return (crp && crp->cr_clp);             7941         return (crp && crp->cr_clp);
8463 }                                                7942 }
8464                                                  7943 
8465 /*                                               7944 /*
8466  * failure => all reset bets are off, nfserr_    7945  * failure => all reset bets are off, nfserr_no_grace...
8467  *                                               7946  *
8468  * The caller is responsible for freeing name    7947  * The caller is responsible for freeing name.data if NULL is returned (it
8469  * will be freed in nfs4_remove_reclaim_recor    7948  * will be freed in nfs4_remove_reclaim_record in the normal case).
8470  */                                              7949  */
8471 struct nfs4_client_reclaim *                     7950 struct nfs4_client_reclaim *
8472 nfs4_client_to_reclaim(struct xdr_netobj name    7951 nfs4_client_to_reclaim(struct xdr_netobj name, struct xdr_netobj princhash,
8473                 struct nfsd_net *nn)             7952                 struct nfsd_net *nn)
8474 {                                                7953 {
8475         unsigned int strhashval;                 7954         unsigned int strhashval;
8476         struct nfs4_client_reclaim *crp;         7955         struct nfs4_client_reclaim *crp;
8477                                                  7956 
8478         crp = alloc_reclaim();                   7957         crp = alloc_reclaim();
8479         if (crp) {                               7958         if (crp) {
8480                 strhashval = clientstr_hashva    7959                 strhashval = clientstr_hashval(name);
8481                 INIT_LIST_HEAD(&crp->cr_strha    7960                 INIT_LIST_HEAD(&crp->cr_strhash);
8482                 list_add(&crp->cr_strhash, &n    7961                 list_add(&crp->cr_strhash, &nn->reclaim_str_hashtbl[strhashval]);
8483                 crp->cr_name.data = name.data    7962                 crp->cr_name.data = name.data;
8484                 crp->cr_name.len = name.len;     7963                 crp->cr_name.len = name.len;
8485                 crp->cr_princhash.data = prin    7964                 crp->cr_princhash.data = princhash.data;
8486                 crp->cr_princhash.len = princ    7965                 crp->cr_princhash.len = princhash.len;
8487                 crp->cr_clp = NULL;              7966                 crp->cr_clp = NULL;
8488                 nn->reclaim_str_hashtbl_size+    7967                 nn->reclaim_str_hashtbl_size++;
8489         }                                        7968         }
8490         return crp;                              7969         return crp;
8491 }                                                7970 }
8492                                                  7971 
8493 void                                             7972 void
8494 nfs4_remove_reclaim_record(struct nfs4_client    7973 nfs4_remove_reclaim_record(struct nfs4_client_reclaim *crp, struct nfsd_net *nn)
8495 {                                                7974 {
8496         list_del(&crp->cr_strhash);              7975         list_del(&crp->cr_strhash);
8497         kfree(crp->cr_name.data);                7976         kfree(crp->cr_name.data);
8498         kfree(crp->cr_princhash.data);           7977         kfree(crp->cr_princhash.data);
8499         kfree(crp);                              7978         kfree(crp);
8500         nn->reclaim_str_hashtbl_size--;          7979         nn->reclaim_str_hashtbl_size--;
8501 }                                                7980 }
8502                                                  7981 
8503 void                                             7982 void
8504 nfs4_release_reclaim(struct nfsd_net *nn)        7983 nfs4_release_reclaim(struct nfsd_net *nn)
8505 {                                                7984 {
8506         struct nfs4_client_reclaim *crp = NUL    7985         struct nfs4_client_reclaim *crp = NULL;
8507         int i;                                   7986         int i;
8508                                                  7987 
8509         for (i = 0; i < CLIENT_HASH_SIZE; i++    7988         for (i = 0; i < CLIENT_HASH_SIZE; i++) {
8510                 while (!list_empty(&nn->recla    7989                 while (!list_empty(&nn->reclaim_str_hashtbl[i])) {
8511                         crp = list_entry(nn->    7990                         crp = list_entry(nn->reclaim_str_hashtbl[i].next,
8512                                         struc    7991                                         struct nfs4_client_reclaim, cr_strhash);
8513                         nfs4_remove_reclaim_r    7992                         nfs4_remove_reclaim_record(crp, nn);
8514                 }                                7993                 }
8515         }                                        7994         }
8516         WARN_ON_ONCE(nn->reclaim_str_hashtbl_    7995         WARN_ON_ONCE(nn->reclaim_str_hashtbl_size);
8517 }                                                7996 }
8518                                                  7997 
8519 /*                                               7998 /*
8520  * called from OPEN, CLAIM_PREVIOUS with a ne    7999  * called from OPEN, CLAIM_PREVIOUS with a new clientid. */
8521 struct nfs4_client_reclaim *                     8000 struct nfs4_client_reclaim *
8522 nfsd4_find_reclaim_client(struct xdr_netobj n    8001 nfsd4_find_reclaim_client(struct xdr_netobj name, struct nfsd_net *nn)
8523 {                                                8002 {
8524         unsigned int strhashval;                 8003         unsigned int strhashval;
8525         struct nfs4_client_reclaim *crp = NUL    8004         struct nfs4_client_reclaim *crp = NULL;
8526                                                  8005 
8527         strhashval = clientstr_hashval(name);    8006         strhashval = clientstr_hashval(name);
8528         list_for_each_entry(crp, &nn->reclaim    8007         list_for_each_entry(crp, &nn->reclaim_str_hashtbl[strhashval], cr_strhash) {
8529                 if (compare_blob(&crp->cr_nam    8008                 if (compare_blob(&crp->cr_name, &name) == 0) {
8530                         return crp;              8009                         return crp;
8531                 }                                8010                 }
8532         }                                        8011         }
8533         return NULL;                             8012         return NULL;
8534 }                                                8013 }
8535                                                  8014 
8536 __be32                                           8015 __be32
8537 nfs4_check_open_reclaim(struct nfs4_client *c    8016 nfs4_check_open_reclaim(struct nfs4_client *clp)
8538 {                                                8017 {
8539         if (test_bit(NFSD4_CLIENT_RECLAIM_COM    8018         if (test_bit(NFSD4_CLIENT_RECLAIM_COMPLETE, &clp->cl_flags))
8540                 return nfserr_no_grace;          8019                 return nfserr_no_grace;
8541                                                  8020 
8542         if (nfsd4_client_record_check(clp))      8021         if (nfsd4_client_record_check(clp))
8543                 return nfserr_reclaim_bad;       8022                 return nfserr_reclaim_bad;
8544                                                  8023 
8545         return nfs_ok;                           8024         return nfs_ok;
8546 }                                                8025 }
8547                                                  8026 
8548 /*                                               8027 /*
8549  * Since the lifetime of a delegation isn't l    8028  * Since the lifetime of a delegation isn't limited to that of an open, a
8550  * client may quite reasonably hang on to a d    8029  * client may quite reasonably hang on to a delegation as long as it has
8551  * the inode cached.  This becomes an obvious    8030  * the inode cached.  This becomes an obvious problem the first time a
8552  * client's inode cache approaches the size o    8031  * client's inode cache approaches the size of the server's total memory.
8553  *                                               8032  *
8554  * For now we avoid this problem by imposing     8033  * For now we avoid this problem by imposing a hard limit on the number
8555  * of delegations, which varies according to     8034  * of delegations, which varies according to the server's memory size.
8556  */                                              8035  */
8557 static void                                      8036 static void
8558 set_max_delegations(void)                        8037 set_max_delegations(void)
8559 {                                                8038 {
8560         /*                                       8039         /*
8561          * Allow at most 4 delegations per me    8040          * Allow at most 4 delegations per megabyte of RAM.  Quick
8562          * estimates suggest that in the wors    8041          * estimates suggest that in the worst case (where every delegation
8563          * is for a different inode), a deleg    8042          * is for a different inode), a delegation could take about 1.5K,
8564          * giving a worst case usage of about    8043          * giving a worst case usage of about 6% of memory.
8565          */                                      8044          */
8566         max_delegations = nr_free_buffer_page    8045         max_delegations = nr_free_buffer_pages() >> (20 - 2 - PAGE_SHIFT);
8567 }                                                8046 }
8568                                                  8047 
8569 static int nfs4_state_create_net(struct net *    8048 static int nfs4_state_create_net(struct net *net)
8570 {                                                8049 {
8571         struct nfsd_net *nn = net_generic(net    8050         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
8572         int i;                                   8051         int i;
8573                                                  8052 
8574         nn->conf_id_hashtbl = kmalloc_array(C    8053         nn->conf_id_hashtbl = kmalloc_array(CLIENT_HASH_SIZE,
8575                                             s    8054                                             sizeof(struct list_head),
8576                                             G    8055                                             GFP_KERNEL);
8577         if (!nn->conf_id_hashtbl)                8056         if (!nn->conf_id_hashtbl)
8578                 goto err;                        8057                 goto err;
8579         nn->unconf_id_hashtbl = kmalloc_array    8058         nn->unconf_id_hashtbl = kmalloc_array(CLIENT_HASH_SIZE,
8580                                                  8059                                               sizeof(struct list_head),
8581                                                  8060                                               GFP_KERNEL);
8582         if (!nn->unconf_id_hashtbl)              8061         if (!nn->unconf_id_hashtbl)
8583                 goto err_unconf_id;              8062                 goto err_unconf_id;
8584         nn->sessionid_hashtbl = kmalloc_array    8063         nn->sessionid_hashtbl = kmalloc_array(SESSION_HASH_SIZE,
8585                                                  8064                                               sizeof(struct list_head),
8586                                                  8065                                               GFP_KERNEL);
8587         if (!nn->sessionid_hashtbl)              8066         if (!nn->sessionid_hashtbl)
8588                 goto err_sessionid;              8067                 goto err_sessionid;
8589                                                  8068 
8590         for (i = 0; i < CLIENT_HASH_SIZE; i++    8069         for (i = 0; i < CLIENT_HASH_SIZE; i++) {
8591                 INIT_LIST_HEAD(&nn->conf_id_h    8070                 INIT_LIST_HEAD(&nn->conf_id_hashtbl[i]);
8592                 INIT_LIST_HEAD(&nn->unconf_id    8071                 INIT_LIST_HEAD(&nn->unconf_id_hashtbl[i]);
8593         }                                        8072         }
8594         for (i = 0; i < SESSION_HASH_SIZE; i+    8073         for (i = 0; i < SESSION_HASH_SIZE; i++)
8595                 INIT_LIST_HEAD(&nn->sessionid    8074                 INIT_LIST_HEAD(&nn->sessionid_hashtbl[i]);
8596         nn->conf_name_tree = RB_ROOT;            8075         nn->conf_name_tree = RB_ROOT;
8597         nn->unconf_name_tree = RB_ROOT;          8076         nn->unconf_name_tree = RB_ROOT;
8598         nn->boot_time = ktime_get_real_second    8077         nn->boot_time = ktime_get_real_seconds();
8599         nn->grace_ended = false;                 8078         nn->grace_ended = false;
8600         nn->nfsd4_manager.block_opens = true;    8079         nn->nfsd4_manager.block_opens = true;
8601         INIT_LIST_HEAD(&nn->nfsd4_manager.lis    8080         INIT_LIST_HEAD(&nn->nfsd4_manager.list);
8602         INIT_LIST_HEAD(&nn->client_lru);         8081         INIT_LIST_HEAD(&nn->client_lru);
8603         INIT_LIST_HEAD(&nn->close_lru);          8082         INIT_LIST_HEAD(&nn->close_lru);
8604         INIT_LIST_HEAD(&nn->del_recall_lru);     8083         INIT_LIST_HEAD(&nn->del_recall_lru);
8605         spin_lock_init(&nn->client_lock);        8084         spin_lock_init(&nn->client_lock);
8606         spin_lock_init(&nn->s2s_cp_lock);        8085         spin_lock_init(&nn->s2s_cp_lock);
8607         idr_init(&nn->s2s_cp_stateids);          8086         idr_init(&nn->s2s_cp_stateids);
8608         atomic_set(&nn->pending_async_copies, << 
8609                                                  8087 
8610         spin_lock_init(&nn->blocked_locks_loc    8088         spin_lock_init(&nn->blocked_locks_lock);
8611         INIT_LIST_HEAD(&nn->blocked_locks_lru    8089         INIT_LIST_HEAD(&nn->blocked_locks_lru);
8612                                                  8090 
8613         INIT_DELAYED_WORK(&nn->laundromat_wor    8091         INIT_DELAYED_WORK(&nn->laundromat_work, laundromat_main);
8614         INIT_WORK(&nn->nfsd_shrinker_work, nf    8092         INIT_WORK(&nn->nfsd_shrinker_work, nfsd4_state_shrinker_worker);
8615         get_net(net);                            8093         get_net(net);
8616                                                  8094 
8617         nn->nfsd_client_shrinker = shrinker_a !! 8095         nn->nfsd_client_shrinker.scan_objects = nfsd4_state_shrinker_scan;
8618         if (!nn->nfsd_client_shrinker)        !! 8096         nn->nfsd_client_shrinker.count_objects = nfsd4_state_shrinker_count;
8619                 goto err_shrinker;            !! 8097         nn->nfsd_client_shrinker.seeks = DEFAULT_SEEKS;
8620                                               << 
8621         nn->nfsd_client_shrinker->scan_object << 
8622         nn->nfsd_client_shrinker->count_objec << 
8623         nn->nfsd_client_shrinker->private_dat << 
8624                                               << 
8625         shrinker_register(nn->nfsd_client_shr << 
8626                                                  8098 
                                                   >> 8099         if (register_shrinker(&nn->nfsd_client_shrinker, "nfsd-client"))
                                                   >> 8100                 goto err_shrinker;
8627         return 0;                                8101         return 0;
8628                                                  8102 
8629 err_shrinker:                                    8103 err_shrinker:
8630         put_net(net);                            8104         put_net(net);
8631         kfree(nn->sessionid_hashtbl);            8105         kfree(nn->sessionid_hashtbl);
8632 err_sessionid:                                   8106 err_sessionid:
8633         kfree(nn->unconf_id_hashtbl);            8107         kfree(nn->unconf_id_hashtbl);
8634 err_unconf_id:                                   8108 err_unconf_id:
8635         kfree(nn->conf_id_hashtbl);              8109         kfree(nn->conf_id_hashtbl);
8636 err:                                             8110 err:
8637         return -ENOMEM;                          8111         return -ENOMEM;
8638 }                                                8112 }
8639                                                  8113 
8640 static void                                      8114 static void
8641 nfs4_state_destroy_net(struct net *net)          8115 nfs4_state_destroy_net(struct net *net)
8642 {                                                8116 {
8643         int i;                                   8117         int i;
8644         struct nfs4_client *clp = NULL;          8118         struct nfs4_client *clp = NULL;
8645         struct nfsd_net *nn = net_generic(net    8119         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
8646                                                  8120 
8647         for (i = 0; i < CLIENT_HASH_SIZE; i++    8121         for (i = 0; i < CLIENT_HASH_SIZE; i++) {
8648                 while (!list_empty(&nn->conf_    8122                 while (!list_empty(&nn->conf_id_hashtbl[i])) {
8649                         clp = list_entry(nn->    8123                         clp = list_entry(nn->conf_id_hashtbl[i].next, struct nfs4_client, cl_idhash);
8650                         destroy_client(clp);     8124                         destroy_client(clp);
8651                 }                                8125                 }
8652         }                                        8126         }
8653                                                  8127 
8654         WARN_ON(!list_empty(&nn->blocked_lock    8128         WARN_ON(!list_empty(&nn->blocked_locks_lru));
8655                                                  8129 
8656         for (i = 0; i < CLIENT_HASH_SIZE; i++    8130         for (i = 0; i < CLIENT_HASH_SIZE; i++) {
8657                 while (!list_empty(&nn->uncon    8131                 while (!list_empty(&nn->unconf_id_hashtbl[i])) {
8658                         clp = list_entry(nn->    8132                         clp = list_entry(nn->unconf_id_hashtbl[i].next, struct nfs4_client, cl_idhash);
8659                         destroy_client(clp);     8133                         destroy_client(clp);
8660                 }                                8134                 }
8661         }                                        8135         }
8662                                                  8136 
8663         kfree(nn->sessionid_hashtbl);            8137         kfree(nn->sessionid_hashtbl);
8664         kfree(nn->unconf_id_hashtbl);            8138         kfree(nn->unconf_id_hashtbl);
8665         kfree(nn->conf_id_hashtbl);              8139         kfree(nn->conf_id_hashtbl);
8666         put_net(net);                            8140         put_net(net);
8667 }                                                8141 }
8668                                                  8142 
8669 int                                              8143 int
8670 nfs4_state_start_net(struct net *net)            8144 nfs4_state_start_net(struct net *net)
8671 {                                                8145 {
8672         struct nfsd_net *nn = net_generic(net    8146         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
8673         int ret;                                 8147         int ret;
8674                                                  8148 
8675         ret = nfs4_state_create_net(net);        8149         ret = nfs4_state_create_net(net);
8676         if (ret)                                 8150         if (ret)
8677                 return ret;                      8151                 return ret;
8678         locks_start_grace(net, &nn->nfsd4_man    8152         locks_start_grace(net, &nn->nfsd4_manager);
8679         nfsd4_client_tracking_init(net);         8153         nfsd4_client_tracking_init(net);
8680         if (nn->track_reclaim_completes && nn    8154         if (nn->track_reclaim_completes && nn->reclaim_str_hashtbl_size == 0)
8681                 goto skip_grace;                 8155                 goto skip_grace;
8682         printk(KERN_INFO "NFSD: starting %lld    8156         printk(KERN_INFO "NFSD: starting %lld-second grace period (net %x)\n",
8683                nn->nfsd4_grace, net->ns.inum)    8157                nn->nfsd4_grace, net->ns.inum);
8684         trace_nfsd_grace_start(nn);              8158         trace_nfsd_grace_start(nn);
8685         queue_delayed_work(laundry_wq, &nn->l    8159         queue_delayed_work(laundry_wq, &nn->laundromat_work, nn->nfsd4_grace * HZ);
8686         return 0;                                8160         return 0;
8687                                                  8161 
8688 skip_grace:                                      8162 skip_grace:
8689         printk(KERN_INFO "NFSD: no clients to    8163         printk(KERN_INFO "NFSD: no clients to reclaim, skipping NFSv4 grace period (net %x)\n",
8690                         net->ns.inum);           8164                         net->ns.inum);
8691         queue_delayed_work(laundry_wq, &nn->l    8165         queue_delayed_work(laundry_wq, &nn->laundromat_work, nn->nfsd4_lease * HZ);
8692         nfsd4_end_grace(nn);                     8166         nfsd4_end_grace(nn);
8693         return 0;                                8167         return 0;
8694 }                                                8168 }
8695                                                  8169 
8696 /* initialization to perform when the nfsd se    8170 /* initialization to perform when the nfsd service is started: */
8697                                                  8171 
8698 int                                              8172 int
8699 nfs4_state_start(void)                           8173 nfs4_state_start(void)
8700 {                                                8174 {
8701         int ret;                                 8175         int ret;
8702                                                  8176 
8703         ret = rhltable_init(&nfs4_file_rhltab    8177         ret = rhltable_init(&nfs4_file_rhltable, &nfs4_file_rhash_params);
8704         if (ret)                                 8178         if (ret)
8705                 return ret;                      8179                 return ret;
8706                                                  8180 
                                                   >> 8181         ret = nfsd4_create_callback_queue();
                                                   >> 8182         if (ret) {
                                                   >> 8183                 rhltable_destroy(&nfs4_file_rhltable);
                                                   >> 8184                 return ret;
                                                   >> 8185         }
                                                   >> 8186 
8707         set_max_delegations();                   8187         set_max_delegations();
8708         return 0;                                8188         return 0;
8709 }                                                8189 }
8710                                                  8190 
8711 void                                             8191 void
8712 nfs4_state_shutdown_net(struct net *net)         8192 nfs4_state_shutdown_net(struct net *net)
8713 {                                                8193 {
8714         struct nfs4_delegation *dp = NULL;       8194         struct nfs4_delegation *dp = NULL;
8715         struct list_head *pos, *next, reaplis    8195         struct list_head *pos, *next, reaplist;
8716         struct nfsd_net *nn = net_generic(net    8196         struct nfsd_net *nn = net_generic(net, nfsd_net_id);
8717                                                  8197 
8718         shrinker_free(nn->nfsd_client_shrinke !! 8198         unregister_shrinker(&nn->nfsd_client_shrinker);
8719         cancel_work_sync(&nn->nfsd_shrinker_w !! 8199         cancel_work(&nn->nfsd_shrinker_work);
8720         cancel_delayed_work_sync(&nn->laundro    8200         cancel_delayed_work_sync(&nn->laundromat_work);
8721         locks_end_grace(&nn->nfsd4_manager);     8201         locks_end_grace(&nn->nfsd4_manager);
8722                                                  8202 
8723         INIT_LIST_HEAD(&reaplist);               8203         INIT_LIST_HEAD(&reaplist);
8724         spin_lock(&state_lock);                  8204         spin_lock(&state_lock);
8725         list_for_each_safe(pos, next, &nn->de    8205         list_for_each_safe(pos, next, &nn->del_recall_lru) {
8726                 dp = list_entry (pos, struct     8206                 dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
8727                 unhash_delegation_locked(dp,  !! 8207                 WARN_ON(!unhash_delegation_locked(dp));
8728                 list_add(&dp->dl_recall_lru,     8208                 list_add(&dp->dl_recall_lru, &reaplist);
8729         }                                        8209         }
8730         spin_unlock(&state_lock);                8210         spin_unlock(&state_lock);
8731         list_for_each_safe(pos, next, &reapli    8211         list_for_each_safe(pos, next, &reaplist) {
8732                 dp = list_entry (pos, struct     8212                 dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
8733                 list_del_init(&dp->dl_recall_    8213                 list_del_init(&dp->dl_recall_lru);
8734                 destroy_unhashed_deleg(dp);      8214                 destroy_unhashed_deleg(dp);
8735         }                                        8215         }
8736                                                  8216 
8737         nfsd4_client_tracking_exit(net);         8217         nfsd4_client_tracking_exit(net);
8738         nfs4_state_destroy_net(net);             8218         nfs4_state_destroy_net(net);
8739 #ifdef CONFIG_NFSD_V4_2_INTER_SSC                8219 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
8740         nfsd4_ssc_shutdown_umount(nn);           8220         nfsd4_ssc_shutdown_umount(nn);
8741 #endif                                           8221 #endif
8742 }                                                8222 }
8743                                                  8223 
8744 void                                             8224 void
8745 nfs4_state_shutdown(void)                        8225 nfs4_state_shutdown(void)
8746 {                                                8226 {
                                                   >> 8227         nfsd4_destroy_callback_queue();
8747         rhltable_destroy(&nfs4_file_rhltable)    8228         rhltable_destroy(&nfs4_file_rhltable);
8748 }                                                8229 }
8749                                                  8230 
8750 static void                                      8231 static void
8751 get_stateid(struct nfsd4_compound_state *csta    8232 get_stateid(struct nfsd4_compound_state *cstate, stateid_t *stateid)
8752 {                                                8233 {
8753         if (HAS_CSTATE_FLAG(cstate, CURRENT_S    8234         if (HAS_CSTATE_FLAG(cstate, CURRENT_STATE_ID_FLAG) &&
8754             CURRENT_STATEID(stateid))            8235             CURRENT_STATEID(stateid))
8755                 memcpy(stateid, &cstate->curr    8236                 memcpy(stateid, &cstate->current_stateid, sizeof(stateid_t));
8756 }                                                8237 }
8757                                                  8238 
8758 static void                                      8239 static void
8759 put_stateid(struct nfsd4_compound_state *csta    8240 put_stateid(struct nfsd4_compound_state *cstate, stateid_t *stateid)
8760 {                                                8241 {
8761         if (cstate->minorversion) {              8242         if (cstate->minorversion) {
8762                 memcpy(&cstate->current_state    8243                 memcpy(&cstate->current_stateid, stateid, sizeof(stateid_t));
8763                 SET_CSTATE_FLAG(cstate, CURRE    8244                 SET_CSTATE_FLAG(cstate, CURRENT_STATE_ID_FLAG);
8764         }                                        8245         }
8765 }                                                8246 }
8766                                                  8247 
8767 void                                             8248 void
8768 clear_current_stateid(struct nfsd4_compound_s    8249 clear_current_stateid(struct nfsd4_compound_state *cstate)
8769 {                                                8250 {
8770         CLEAR_CSTATE_FLAG(cstate, CURRENT_STA    8251         CLEAR_CSTATE_FLAG(cstate, CURRENT_STATE_ID_FLAG);
8771 }                                                8252 }
8772                                                  8253 
8773 /*                                               8254 /*
8774  * functions to set current state id             8255  * functions to set current state id
8775  */                                              8256  */
8776 void                                             8257 void
8777 nfsd4_set_opendowngradestateid(struct nfsd4_c    8258 nfsd4_set_opendowngradestateid(struct nfsd4_compound_state *cstate,
8778                 union nfsd4_op_u *u)             8259                 union nfsd4_op_u *u)
8779 {                                                8260 {
8780         put_stateid(cstate, &u->open_downgrad    8261         put_stateid(cstate, &u->open_downgrade.od_stateid);
8781 }                                                8262 }
8782                                                  8263 
8783 void                                             8264 void
8784 nfsd4_set_openstateid(struct nfsd4_compound_s    8265 nfsd4_set_openstateid(struct nfsd4_compound_state *cstate,
8785                 union nfsd4_op_u *u)             8266                 union nfsd4_op_u *u)
8786 {                                                8267 {
8787         put_stateid(cstate, &u->open.op_state    8268         put_stateid(cstate, &u->open.op_stateid);
8788 }                                                8269 }
8789                                                  8270 
8790 void                                             8271 void
8791 nfsd4_set_closestateid(struct nfsd4_compound_    8272 nfsd4_set_closestateid(struct nfsd4_compound_state *cstate,
8792                 union nfsd4_op_u *u)             8273                 union nfsd4_op_u *u)
8793 {                                                8274 {
8794         put_stateid(cstate, &u->close.cl_stat    8275         put_stateid(cstate, &u->close.cl_stateid);
8795 }                                                8276 }
8796                                                  8277 
8797 void                                             8278 void
8798 nfsd4_set_lockstateid(struct nfsd4_compound_s    8279 nfsd4_set_lockstateid(struct nfsd4_compound_state *cstate,
8799                 union nfsd4_op_u *u)             8280                 union nfsd4_op_u *u)
8800 {                                                8281 {
8801         put_stateid(cstate, &u->lock.lk_resp_    8282         put_stateid(cstate, &u->lock.lk_resp_stateid);
8802 }                                                8283 }
8803                                                  8284 
8804 /*                                               8285 /*
8805  * functions to consume current state id         8286  * functions to consume current state id
8806  */                                              8287  */
8807                                                  8288 
8808 void                                             8289 void
8809 nfsd4_get_opendowngradestateid(struct nfsd4_c    8290 nfsd4_get_opendowngradestateid(struct nfsd4_compound_state *cstate,
8810                 union nfsd4_op_u *u)             8291                 union nfsd4_op_u *u)
8811 {                                                8292 {
8812         get_stateid(cstate, &u->open_downgrad    8293         get_stateid(cstate, &u->open_downgrade.od_stateid);
8813 }                                                8294 }
8814                                                  8295 
8815 void                                             8296 void
8816 nfsd4_get_delegreturnstateid(struct nfsd4_com    8297 nfsd4_get_delegreturnstateid(struct nfsd4_compound_state *cstate,
8817                 union nfsd4_op_u *u)             8298                 union nfsd4_op_u *u)
8818 {                                                8299 {
8819         get_stateid(cstate, &u->delegreturn.d    8300         get_stateid(cstate, &u->delegreturn.dr_stateid);
8820 }                                                8301 }
8821                                                  8302 
8822 void                                             8303 void
8823 nfsd4_get_freestateid(struct nfsd4_compound_s    8304 nfsd4_get_freestateid(struct nfsd4_compound_state *cstate,
8824                 union nfsd4_op_u *u)             8305                 union nfsd4_op_u *u)
8825 {                                                8306 {
8826         get_stateid(cstate, &u->free_stateid.    8307         get_stateid(cstate, &u->free_stateid.fr_stateid);
8827 }                                                8308 }
8828                                                  8309 
8829 void                                             8310 void
8830 nfsd4_get_setattrstateid(struct nfsd4_compoun    8311 nfsd4_get_setattrstateid(struct nfsd4_compound_state *cstate,
8831                 union nfsd4_op_u *u)             8312                 union nfsd4_op_u *u)
8832 {                                                8313 {
8833         get_stateid(cstate, &u->setattr.sa_st    8314         get_stateid(cstate, &u->setattr.sa_stateid);
8834 }                                                8315 }
8835                                                  8316 
8836 void                                             8317 void
8837 nfsd4_get_closestateid(struct nfsd4_compound_    8318 nfsd4_get_closestateid(struct nfsd4_compound_state *cstate,
8838                 union nfsd4_op_u *u)             8319                 union nfsd4_op_u *u)
8839 {                                                8320 {
8840         get_stateid(cstate, &u->close.cl_stat    8321         get_stateid(cstate, &u->close.cl_stateid);
8841 }                                                8322 }
8842                                                  8323 
8843 void                                             8324 void
8844 nfsd4_get_lockustateid(struct nfsd4_compound_    8325 nfsd4_get_lockustateid(struct nfsd4_compound_state *cstate,
8845                 union nfsd4_op_u *u)             8326                 union nfsd4_op_u *u)
8846 {                                                8327 {
8847         get_stateid(cstate, &u->locku.lu_stat    8328         get_stateid(cstate, &u->locku.lu_stateid);
8848 }                                                8329 }
8849                                                  8330 
8850 void                                             8331 void
8851 nfsd4_get_readstateid(struct nfsd4_compound_s    8332 nfsd4_get_readstateid(struct nfsd4_compound_state *cstate,
8852                 union nfsd4_op_u *u)             8333                 union nfsd4_op_u *u)
8853 {                                                8334 {
8854         get_stateid(cstate, &u->read.rd_state    8335         get_stateid(cstate, &u->read.rd_stateid);
8855 }                                                8336 }
8856                                                  8337 
8857 void                                             8338 void
8858 nfsd4_get_writestateid(struct nfsd4_compound_    8339 nfsd4_get_writestateid(struct nfsd4_compound_state *cstate,
8859                 union nfsd4_op_u *u)             8340                 union nfsd4_op_u *u)
8860 {                                                8341 {
8861         get_stateid(cstate, &u->write.wr_stat    8342         get_stateid(cstate, &u->write.wr_stateid);
8862 }                                             << 
8863                                               << 
8864 /**                                           << 
8865  * nfsd4_deleg_getattr_conflict - Recall if G << 
8866  * @rqstp: RPC transaction context            << 
8867  * @dentry: dentry of inode to be checked for << 
8868  * @modified: return true if file was modifie << 
8869  * @size: new size of file if modified is tru << 
8870  *                                            << 
8871  * This function is called when there is a co << 
8872  * delegation and a change/size GETATTR from  << 
8873  * must either use the CB_GETATTR to get the  << 
8874  * attributes from the client that holds the  << 
8875  * delegation before replying to the GETATTR. << 
8876  * 18.7.4.                                    << 
8877  *                                            << 
8878  * Returns 0 if there is no conflict; otherwi << 
8879  * code is returned.                          << 
8880  */                                           << 
8881 __be32                                        << 
8882 nfsd4_deleg_getattr_conflict(struct svc_rqst  << 
8883                                 bool *modifie << 
8884 {                                             << 
8885         __be32 status;                        << 
8886         struct nfsd_net *nn = net_generic(SVC << 
8887         struct file_lock_context *ctx;        << 
8888         struct nfs4_delegation *dp = NULL;    << 
8889         struct file_lease *fl;                << 
8890         struct iattr attrs;                   << 
8891         struct nfs4_cb_fattr *ncf;            << 
8892         struct inode *inode = d_inode(dentry) << 
8893                                               << 
8894         *modified = false;                    << 
8895         ctx = locks_inode_context(inode);     << 
8896         if (!ctx)                             << 
8897                 return 0;                     << 
8898                                               << 
8899 #define NON_NFSD_LEASE ((void *)1)            << 
8900                                               << 
8901         spin_lock(&ctx->flc_lock);            << 
8902         for_each_file_lock(fl, &ctx->flc_leas << 
8903                 if (fl->c.flc_flags == FL_LAY << 
8904                         continue;             << 
8905                 if (fl->c.flc_type == F_WRLCK << 
8906                         if (fl->fl_lmops == & << 
8907                                 dp = fl->c.fl << 
8908                         else                  << 
8909                                 dp = NON_NFSD << 
8910                 }                             << 
8911                 break;                        << 
8912         }                                     << 
8913         if (dp == NULL || dp == NON_NFSD_LEAS << 
8914             dp->dl_recall.cb_clp == *(rqstp-> << 
8915                 spin_unlock(&ctx->flc_lock);  << 
8916                 if (dp == NON_NFSD_LEASE) {   << 
8917                         status = nfserrno(nfs << 
8918                                               << 
8919                         if (status != nfserr_ << 
8920                             !nfsd_wait_for_de << 
8921                                 return status << 
8922                 }                             << 
8923                 return 0;                     << 
8924         }                                     << 
8925                                               << 
8926         nfsd_stats_wdeleg_getattr_inc(nn);    << 
8927         refcount_inc(&dp->dl_stid.sc_count);  << 
8928         ncf = &dp->dl_cb_fattr;               << 
8929         nfs4_cb_getattr(&dp->dl_cb_fattr);    << 
8930         spin_unlock(&ctx->flc_lock);          << 
8931                                               << 
8932         wait_on_bit_timeout(&ncf->ncf_cb_flag << 
8933                             TASK_INTERRUPTIBL << 
8934         if (ncf->ncf_cb_status) {             << 
8935                 /* Recall delegation only if  << 
8936                 status = nfserrno(nfsd_open_b << 
8937                 if (status != nfserr_jukebox  << 
8938                     !nfsd_wait_for_delegretur << 
8939                         goto out_status;      << 
8940         }                                     << 
8941         if (!ncf->ncf_file_modified &&        << 
8942             (ncf->ncf_initial_cinfo != ncf->n << 
8943              ncf->ncf_cur_fsize != ncf->ncf_c << 
8944                 ncf->ncf_file_modified = true << 
8945         if (ncf->ncf_file_modified) {         << 
8946                 int err;                      << 
8947                                               << 
8948                 /*                            << 
8949                  * Per section 10.4.3 of RFC  << 
8950                  * not update the file's meta << 
8951                  * modified size              << 
8952                  */                           << 
8953                 attrs.ia_mtime = attrs.ia_cti << 
8954                 attrs.ia_valid = ATTR_MTIME | << 
8955                 inode_lock(inode);            << 
8956                 err = notify_change(&nop_mnt_ << 
8957                 inode_unlock(inode);          << 
8958                 if (err) {                    << 
8959                         status = nfserrno(err << 
8960                         goto out_status;      << 
8961                 }                             << 
8962                 ncf->ncf_cur_fsize = ncf->ncf << 
8963                 *size = ncf->ncf_cur_fsize;   << 
8964                 *modified = true;             << 
8965         }                                     << 
8966         status = 0;                           << 
8967 out_status:                                   << 
8968         nfs4_put_stid(&dp->dl_stid);          << 
8969         return status;                        << 
8970 }                                                8343 }
8971                                                  8344 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php