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

TOMOYO Linux Cross Reference
Linux/fs/nfsd/state.h

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/state.h (Version linux-6.12-rc7) and /fs/nfsd/state.h (Version linux-2.4.37.11)


  1 /*                                                  1 
  2  *  Copyright (c) 2001 The Regents of the Univ    
  3  *  All rights reserved.                          
  4  *                                                
  5  *  Kendrick Smith <kmsmith@umich.edu>            
  6  *  Andy Adamson <andros@umich.edu>               
  7  *                                                
  8  *  Redistribution and use in source and binar    
  9  *  modification, are permitted provided that     
 10  *  are met:                                      
 11  *                                                
 12  *  1. Redistributions of source code must ret    
 13  *     notice, this list of conditions and the    
 14  *  2. Redistributions in binary form must rep    
 15  *     notice, this list of conditions and the    
 16  *     documentation and/or other materials pr    
 17  *  3. Neither the name of the University nor     
 18  *     contributors may be used to endorse or     
 19  *     from this software without specific pri    
 20  *                                                
 21  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND AN    
 22  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO,    
 23  *  MERCHANTABILITY AND FITNESS FOR A PARTICUL    
 24  *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS     
 25  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPEC    
 26  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     
 27  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,    
 28  *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND     
 29  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIA    
 30  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WA    
 31  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILI    
 32  *                                                
 33  */                                               
 34                                                   
 35 #ifndef _NFSD4_STATE_H                            
 36 #define _NFSD4_STATE_H                            
 37                                                   
 38 #include <linux/idr.h>                            
 39 #include <linux/refcount.h>                       
 40 #include <linux/sunrpc/svc_xprt.h>                
 41 #include "nfsfh.h"                                
 42 #include "nfsd.h"                                 
 43                                                   
 44 typedef struct {                                  
 45         u32             cl_boot;                  
 46         u32             cl_id;                    
 47 } clientid_t;                                     
 48                                                   
 49 typedef struct {                                  
 50         clientid_t      so_clid;                  
 51         u32             so_id;                    
 52 } stateid_opaque_t;                               
 53                                                   
 54 typedef struct {                                  
 55         u32                     si_generation;    
 56         stateid_opaque_t        si_opaque;        
 57 } stateid_t;                                      
 58                                                   
 59 typedef struct {                                  
 60         stateid_t               cs_stid;          
 61 #define NFS4_COPY_STID 1                          
 62 #define NFS4_COPYNOTIFY_STID 2                    
 63         unsigned char           cs_type;          
 64         refcount_t              cs_count;         
 65 } copy_stateid_t;                                 
 66                                                   
 67 struct nfsd4_callback {                           
 68         struct nfs4_client *cb_clp;               
 69         struct rpc_message cb_msg;                
 70         const struct nfsd4_callback_ops *cb_op    
 71         struct work_struct cb_work;               
 72         int cb_seq_status;                        
 73         int cb_status;                            
 74         bool cb_need_restart;                     
 75         bool cb_holds_slot;                       
 76 };                                                
 77                                                   
 78 struct nfsd4_callback_ops {                       
 79         void (*prepare)(struct nfsd4_callback     
 80         int (*done)(struct nfsd4_callback *, s    
 81         void (*release)(struct nfsd4_callback     
 82         uint32_t opcode;                          
 83 };                                                
 84                                                   
 85 /*                                                
 86  * A core object that represents a "common" st    
 87  * embedded within the different (more specifi    
 88  * fields that are of general use to any state    
 89  */                                               
 90 struct nfs4_stid {                                
 91         refcount_t              sc_count;         
 92                                                   
 93         /* A new stateid is added to the cl_st    
 94          * is fully initialised.  Its sc_type     
 95          * initialisation the sc_type it set u    
 96          * never changes.                         
 97          */                                       
 98 #define SC_TYPE_OPEN            BIT(0)            
 99 #define SC_TYPE_LOCK            BIT(1)            
100 #define SC_TYPE_DELEG           BIT(2)            
101 #define SC_TYPE_LAYOUT          BIT(3)            
102         unsigned short          sc_type;          
103                                                   
104 /* state_lock protects sc_status for delegatio    
105  * ->cl_lock protects sc_status for open and l    
106  * ->st_mutex also protect sc_status for open     
107  * ->ls_lock protects sc_status for layout sta    
108  */                                               
109 /*                                                
110  * For an open stateid kept around *only* to p    
111  * For deleg stateid, kept in idr until last r    
112  */                                               
113 #define SC_STATUS_CLOSED        BIT(0)            
114 /* For a deleg stateid kept around only to pro    
115 #define SC_STATUS_REVOKED       BIT(1)            
116 #define SC_STATUS_ADMIN_REVOKED BIT(2)            
117 #define SC_STATUS_FREEABLE      BIT(3)            
118 #define SC_STATUS_FREED         BIT(4)            
119         unsigned short          sc_status;        
120                                                   
121         struct list_head        sc_cp_list;       
122         stateid_t               sc_stateid;       
123         spinlock_t              sc_lock;          
124         struct nfs4_client      *sc_client;       
125         struct nfs4_file        *sc_file;         
126         void                    (*sc_free)(str    
127 };                                                
128                                                   
129 /* Keep a list of stateids issued by the COPY_    
130  * parent OPEN/LOCK/DELEG stateid.                
131  */                                               
132 struct nfs4_cpntf_state {                         
133         copy_stateid_t          cp_stateid;       
134         struct list_head        cp_list;          
135         stateid_t               cp_p_stateid;     
136         clientid_t              cp_p_clid;        
137         time64_t                cpntf_time;       
138 };                                                
139                                                   
140 struct nfs4_cb_fattr {                            
141         struct nfsd4_callback ncf_getattr;        
142         u32 ncf_cb_status;                        
143         u32 ncf_cb_bmap[1];                       
144                                                   
145         /* from CB_GETATTR reply */               
146         u64 ncf_cb_change;                        
147         u64 ncf_cb_fsize;                         
148                                                   
149         unsigned long ncf_cb_flags;               
150         bool ncf_file_modified;                   
151         u64 ncf_initial_cinfo;                    
152         u64 ncf_cur_fsize;                        
153 };                                                
154                                                   
155 /* bits for ncf_cb_flags */                       
156 #define CB_GETATTR_BUSY         0                 
157                                                   
158 /*                                                
159  * Represents a delegation stateid. The nfs4_c    
160  * and they are put when it is being destroyed    
161  * returned by the client:                        
162  *                                                
163  * o 1 reference as long as a delegation is st    
164  *   alloc'd, put when it's returned or revoke    
165  *                                                
166  * o 1 reference as long as a recall rpc is in    
167  *   is broken, put when the rpc exits)           
168  *                                                
169  * o 1 more ephemeral reference for each nfsd     
170  *   with that delegation without holding the     
171  *                                                
172  * If the server attempts to recall a delegati    
173  * before a timeout, the server may also revok    
174  * the object will either be destroyed (v4.0)     
175  * revoked delegations (v4.1+).                   
176  *                                                
177  * This object is a superset of the nfs4_stid.    
178  */                                               
179 struct nfs4_delegation {                          
180         struct nfs4_stid        dl_stid; /* mu    
181         struct list_head        dl_perfile;       
182         struct list_head        dl_perclnt;       
183         struct list_head        dl_recall_lru;    
184         struct nfs4_clnt_odstate *dl_clnt_odst    
185         u32                     dl_type;          
186         time64_t                dl_time;          
187 /* For recall: */                                 
188         int                     dl_retries;       
189         struct nfsd4_callback   dl_recall;        
190         bool                    dl_recalled;      
191                                                   
192         /* for CB_GETATTR */                      
193         struct nfs4_cb_fattr    dl_cb_fattr;      
194 };                                                
195                                                   
196 #define cb_to_delegation(cb) \                    
197         container_of(cb, struct nfs4_delegatio    
198                                                   
199 /* client delegation callback info */             
200 struct nfs4_cb_conn {                             
201         /* SETCLIENTID info */                    
202         struct sockaddr_storage cb_addr;          
203         struct sockaddr_storage cb_saddr;         
204         size_t                  cb_addrlen;       
205         u32                     cb_prog; /* us    
206                                             pe    
207         u32                     cb_ident;         
208         struct svc_xprt         *cb_xprt;         
209 };                                                
210                                                   
211 static inline struct nfs4_delegation *delegsta    
212 {                                                 
213         return container_of(s, struct nfs4_del    
214 }                                                 
215                                                   
216 /* Maximum number of slots per session. 160 is    
217 #define NFSD_MAX_SLOTS_PER_SESSION     160        
218 /* Maximum  session per slot cache size */        
219 #define NFSD_SLOT_CACHE_SIZE            2048      
220 /* Maximum number of NFSD_SLOT_CACHE_SIZE slot    
221 #define NFSD_CACHE_SIZE_SLOTS_PER_SESSION         
222 #define NFSD_MAX_MEM_PER_SESSION  \               
223                 (NFSD_CACHE_SIZE_SLOTS_PER_SES    
224                                                   
225 struct nfsd4_slot {                               
226         u32     sl_seqid;                         
227         __be32  sl_status;                        
228         struct svc_cred sl_cred;                  
229         u32     sl_datalen;                       
230         u16     sl_opcnt;                         
231 #define NFSD4_SLOT_INUSE        (1 << 0)          
232 #define NFSD4_SLOT_CACHETHIS    (1 << 1)          
233 #define NFSD4_SLOT_INITIALIZED  (1 << 2)          
234 #define NFSD4_SLOT_CACHED       (1 << 3)          
235         u8      sl_flags;                         
236         char    sl_data[];                        
237 };                                                
238                                                   
239 struct nfsd4_channel_attrs {                      
240         u32             headerpadsz;              
241         u32             maxreq_sz;                
242         u32             maxresp_sz;               
243         u32             maxresp_cached;           
244         u32             maxops;                   
245         u32             maxreqs;                  
246         u32             nr_rdma_attrs;            
247         u32             rdma_attrs;               
248 };                                                
249                                                   
250 struct nfsd4_cb_sec {                             
251         u32     flavor; /* (u32)(-1) used to m    
252         kuid_t  uid;                              
253         kgid_t  gid;                              
254 };                                                
255                                                   
256 struct nfsd4_create_session {                     
257         clientid_t                      client    
258         struct nfs4_sessionid           sessio    
259         u32                             seqid;    
260         u32                             flags;    
261         struct nfsd4_channel_attrs      fore_c    
262         struct nfsd4_channel_attrs      back_c    
263         u32                             callba    
264         struct nfsd4_cb_sec             cb_sec    
265 };                                                
266                                                   
267 struct nfsd4_backchannel_ctl {                    
268         u32     bc_cb_program;                    
269         struct nfsd4_cb_sec             bc_cb_    
270 };                                                
271                                                   
272 struct nfsd4_bind_conn_to_session {               
273         struct nfs4_sessionid           sessio    
274         u32                             dir;      
275 };                                                
276                                                   
277 /* The single slot clientid cache structure */    
278 struct nfsd4_clid_slot {                          
279         u32                             sl_seq    
280         __be32                          sl_sta    
281         struct nfsd4_create_session     sl_cr_    
282 };                                                
283                                                   
284 struct nfsd4_conn {                               
285         struct list_head cn_persession;           
286         struct svc_xprt *cn_xprt;                 
287         struct svc_xpt_user cn_xpt_user;          
288         struct nfsd4_session *cn_session;         
289 /* CDFC4_FORE, CDFC4_BACK: */                     
290         unsigned char cn_flags;                   
291 };                                                
292                                                   
293 /*                                                
294  * Representation of a v4.1+ session. These ar    
295  * to the nfs4_client. References are only tak    
296  * working on the object (primarily during the    
297  */                                               
298 struct nfsd4_session {                            
299         atomic_t                se_ref;           
300         struct list_head        se_hash;          
301         struct list_head        se_perclnt;       
302 /* See SESSION4_PERSIST, etc. for standard fla    
303 #define NFS4_SESSION_DEAD       0x010             
304         u32                     se_flags;         
305         struct nfs4_client      *se_client;       
306         struct nfs4_sessionid   se_sessionid;     
307         struct nfsd4_channel_attrs se_fchannel    
308         struct nfsd4_channel_attrs se_bchannel    
309         struct nfsd4_cb_sec     se_cb_sec;        
310         struct list_head        se_conns;         
311         u32                     se_cb_prog;       
312         u32                     se_cb_seq_nr;     
313         struct nfsd4_slot       *se_slots[];      
314 };                                                
315                                                   
316 /* formatted contents of nfs4_sessionid */        
317 struct nfsd4_sessionid {                          
318         clientid_t      clientid;                 
319         u32             sequence;                 
320         u32             reserved;                 
321 };                                                
322                                                   
323 #define HEXDIR_LEN     33 /* hex version of 16    
324                                                   
325 /*                                                
326  *       State                Meaning             
327  * -------------------------------------------    
328  * | NFSD4_ACTIVE      | Confirmed, active        
329  * |------------------- ----------------------    
330  * | NFSD4_COURTESY    | Courtesy state.          
331  * |                   | Lease/lock/share         
332  * |                   | reservation conflict     
333  * |                   | can cause Courtesy       
334  * |                   | client to be expired     
335  * |------------------------------------------    
336  * | NFSD4_EXPIRABLE   | Courtesy client to be    
337  * |                   | expired by Laundromat    
338  * |                   | due to conflict          
339  * |------------------------------------------    
340  */                                               
341 enum {                                            
342         NFSD4_ACTIVE = 0,                         
343         NFSD4_COURTESY,                           
344         NFSD4_EXPIRABLE,                          
345 };                                                
346                                                   
347 /*                                                
348  * struct nfs4_client - one per client.  Clien    
349  *                                                
350  * The initial object created by an NFS client    
351  * or EXCHANGE_ID (for NFSv4.1+). These object    
352  * Each nfsd_net_ns object contains a set of t    
353  * short and long form clientid. They are hash    
354  * per-nfsd_net client_lock spinlock.             
355  *                                                
356  * References to it are only held during the p    
357  * certain other operations. In their "resting    
358  * 0. If they are not renewed within a lease p    
359  * destruction by the laundromat.                 
360  *                                                
361  * These objects can also be destroyed if the     
362  * SETCLIENTID or EXCHANGE_ID operations.         
363  *                                                
364  * Care is taken *not* to do this however when    
365  * refcount.                                      
366  *                                                
367  * o Each nfs4_client is hashed by clientid       
368  *                                                
369  * o Each nfs4_clients is also hashed by name     
370  *   sent by the client to identify itself).      
371  *                                                
372  * o cl_perclient list is used to ensure no da    
373  *   when we expire the nfs4_client               
374  */                                               
375 struct nfs4_client {                              
376         struct list_head        cl_idhash;        
377         struct rb_node          cl_namenode;      
378         struct list_head        *cl_ownerstr_h    
379         struct list_head        cl_openowners;    
380         struct idr              cl_stateids;      
381         struct list_head        cl_delegations    
382         struct list_head        cl_revoked;       
383         struct list_head        cl_lru;           
384 #ifdef CONFIG_NFSD_PNFS                           
385         struct list_head        cl_lo_states;     
386 #endif                                            
387         struct xdr_netobj       cl_name;          
388         nfs4_verifier           cl_verifier;      
389         time64_t                cl_time;          
390         struct sockaddr_storage cl_addr;          
391         bool                    cl_mach_cred;     
392         struct svc_cred         cl_cred;          
393         clientid_t              cl_clientid;      
394         nfs4_verifier           cl_confirm;       
395         u32                     cl_minorversio    
396         atomic_t                cl_admin_revok    
397         /* NFSv4.1 client implementation id: *    
398         struct xdr_netobj       cl_nii_domain;    
399         struct xdr_netobj       cl_nii_name;      
400         struct timespec64       cl_nii_time;      
401                                                   
402         /* for v4.0 and v4.1 callbacks: */        
403         struct nfs4_cb_conn     cl_cb_conn;       
404 #define NFSD4_CLIENT_CB_UPDATE          (0)       
405 #define NFSD4_CLIENT_CB_KILL            (1)       
406 #define NFSD4_CLIENT_STABLE             (2)       
407 #define NFSD4_CLIENT_RECLAIM_COMPLETE   (3)       
408 #define NFSD4_CLIENT_CONFIRMED          (4)       
409 #define NFSD4_CLIENT_UPCALL_LOCK        (5)       
410 #define NFSD4_CLIENT_CB_FLAG_MASK       (1 <<     
411                                          1 <<     
412 #define NFSD4_CLIENT_CB_RECALL_ANY      (6)       
413         unsigned long           cl_flags;         
414                                                   
415         struct workqueue_struct *cl_callback_w    
416         const struct cred       *cl_cb_cred;      
417         struct rpc_clnt         *cl_cb_client;    
418         u32                     cl_cb_ident;      
419 #define NFSD4_CB_UP             0                 
420 #define NFSD4_CB_UNKNOWN        1                 
421 #define NFSD4_CB_DOWN           2                 
422 #define NFSD4_CB_FAULT          3                 
423         int                     cl_cb_state;      
424         struct nfsd4_callback   cl_cb_null;       
425         struct nfsd4_session    *cl_cb_session    
426                                                   
427         /* for all client information that cal    
428         spinlock_t              cl_lock;          
429                                                   
430         /* for nfs41 */                           
431         struct list_head        cl_sessions;      
432         struct nfsd4_clid_slot  cl_cs_slot;       
433         u32                     cl_exchange_fl    
434         /* number of rpc's in progress over an    
435         atomic_t                cl_rpc_users;     
436         struct nfsdfs_client    cl_nfsdfs;        
437         struct nfs4_op_map      cl_spo_must_al    
438                                                   
439         /* debugging info directory under nfsd    
440         struct dentry           *cl_nfsd_dentr    
441         /* 'info' file within that directory.     
442          * but will remain valid iff cl_nfsd_d    
443          */                                       
444         struct dentry           *cl_nfsd_info_    
445                                                   
446         /* for nfs41 callbacks */                 
447         /* We currently support a single back     
448         unsigned long           cl_cb_slot_bus    
449         struct rpc_wait_queue   cl_cb_waitq;      
450                                                   
451         struct net              *net;             
452         struct list_head        async_copies;     
453         spinlock_t              async_lock;       
454         atomic_t                cl_cb_inflight    
455                                                   
456         unsigned int            cl_state;         
457         atomic_t                cl_delegs_in_r    
458                                                   
459         struct nfsd4_cb_recall_any      *cl_ra    
460         time64_t                cl_ra_time;       
461         struct list_head        cl_ra_cblist;     
462 };                                                
463                                                   
464 /* struct nfs4_client_reset                       
465  * one per old client. Populates reset_str_has    
466  * upon lease reset, or from upcall to state_d    
467  * from non-volitile storage) upon reboot.        
468  */                                               
469 struct nfs4_client_reclaim {                      
470         struct list_head        cr_strhash;       
471         struct nfs4_client      *cr_clp;          
472         struct xdr_netobj       cr_name;          
473         struct xdr_netobj       cr_princhash;     
474 };                                                
475                                                   
476 /* A reasonable value for REPLAY_ISIZE was est    
477  * The OPEN response, typically the largest, r    
478  *   4(status) + 8(stateid) + 20(changeinfo) +    
479  *   4(deleg. type) + 8(deleg. stateid) + 4(de    
480  *   20(deleg. space limit) + ~32(deleg. ace)     
481  */                                               
482                                                   
483 #define NFSD4_REPLAY_ISIZE       112              
484                                                   
485 /*                                                
486  * Replay buffer, where the result of the last    
487  * is cached.                                     
488  */                                               
489 struct nfs4_replay {                              
490         __be32                  rp_status;        
491         unsigned int            rp_buflen;        
492         char                    *rp_buf;          
493         struct knfsd_fh         rp_openfh;        
494         atomic_t                rp_locked;        
495         char                    rp_ibuf[NFSD4_    
496 };                                                
497                                                   
498 struct nfs4_stateowner;                           
499                                                   
500 struct nfs4_stateowner_operations {               
501         void (*so_unhash)(struct nfs4_stateown    
502         void (*so_free)(struct nfs4_stateowner    
503 };                                                
504                                                   
505 /*                                                
506  * A core object that represents either an ope    
507  * lock owner objects have one of these embedd    
508  * other fields common to both owner types are    
509  * structures.                                    
510  */                                               
511 struct nfs4_stateowner {                          
512         struct list_head                          
513         struct list_head                          
514         struct nfs4_client                        
515         const struct nfs4_stateowner_operation    
516         /* after increment in nfsd4_bump_seqid    
517          * sequence id expected from the clien    
518         atomic_t                                  
519         u32                                       
520         struct xdr_netobj                         
521         struct nfs4_replay                        
522         bool                                      
523 };                                                
524                                                   
525 /*                                                
526  * When a file is opened, the client provides     
527  * that indicates the "owner" of that open. Th    
528  * References to it are held by each open stat    
529  * is a superset of the nfs4_stateowner struct    
530  */                                               
531 struct nfs4_openowner {                           
532         struct nfs4_stateowner  oo_owner; /* m    
533         struct list_head        oo_perclient;     
534         /*                                        
535          * We keep around openowners a little     
536          * which saves clients from having to     
537          * handle close replays if they come s    
538          * is a list of such openowners, to be    
539          * thread eventually if they remain un    
540          */                                       
541         struct list_head        oo_close_lru;     
542         struct nfs4_ol_stateid *oo_last_closed    
543         time64_t                oo_time; /* ti    
544 #define NFS4_OO_CONFIRMED   1                     
545         unsigned char           oo_flags;         
546 };                                                
547                                                   
548 /*                                                
549  * Represents a generic "lockowner". Similar t    
550  * are held by the lock stateids that are crea    
551  * a superset of the nfs4_stateowner struct.      
552  */                                               
553 struct nfs4_lockowner {                           
554         struct nfs4_stateowner  lo_owner;         
555         struct list_head        lo_blocked;       
556 };                                                
557                                                   
558 static inline struct nfs4_openowner * openowne    
559 {                                                 
560         return container_of(so, struct nfs4_op    
561 }                                                 
562                                                   
563 static inline struct nfs4_lockowner * lockowne    
564 {                                                 
565         return container_of(so, struct nfs4_lo    
566 }                                                 
567                                                   
568 /*                                                
569  * Per-client state indicating no. of opens an    
570  * on a file from a particular client.'od' sta    
571  */                                               
572 struct nfs4_clnt_odstate {                        
573         struct nfs4_client      *co_client;       
574         struct nfs4_file        *co_file;         
575         struct list_head        co_perfile;       
576         refcount_t              co_odcount;       
577 };                                                
578                                                   
579 /*                                                
580  * nfs4_file: a file opened by some number of     
581  *                                                
582  * These objects are global. nfsd keeps one in    
583  * filehandle (though it may keep multiple fil    
584  * inode can have multiple filehandles associa    
585  * (potentially) a many to one relationship be    
586  * inode.                                         
587  */                                               
588 struct nfs4_file {                                
589         refcount_t              fi_ref;           
590         struct inode *          fi_inode;         
591         bool                    fi_aliased;       
592         spinlock_t              fi_lock;          
593         struct rhlist_head      fi_rlist;         
594         struct list_head        fi_stateids;      
595         union {                                   
596                 struct list_head        fi_del    
597                 struct rcu_head         fi_rcu    
598         };                                        
599         struct list_head        fi_clnt_odstat    
600         /* One each for O_RDONLY, O_WRONLY, O_    
601         struct nfsd_file        *fi_fds[3];       
602         /*                                        
603          * Each open or lock stateid contribut    
604          * below depending on which bits are s    
605          *     1 to fi_access[O_RDONLY] if NFS    
606          *   + 1 to fi_access[O_WRONLY] if NFS    
607          *   + 1 to both of the above if NFS4_    
608          */                                       
609         atomic_t                fi_access[2];     
610         u32                     fi_share_deny;    
611         struct nfsd_file        *fi_deleg_file    
612         int                     fi_delegees;      
613         struct knfsd_fh         fi_fhandle;       
614         bool                    fi_had_conflic    
615 #ifdef CONFIG_NFSD_PNFS                           
616         struct list_head        fi_lo_states;     
617         atomic_t                fi_lo_recalls;    
618 #endif                                            
619 };                                                
620                                                   
621 /*                                                
622  * A generic struct representing either a open    
623  * holds a reference to each of these objects,    
624  * reference to their respective stateowners.     
625  * released in response to a close or unlock (    
626  * or lock stateid) or when the client is bein    
627  *                                                
628  * In the case of v4.0 open stateids, these ob    
629  * while after close in order to handle CLOSE     
630  * reclaimed via a LRU scheme by the laundroma    
631  *                                                
632  * This object is a superset of the nfs4_stid.    
633  * Better suggestions welcome.                    
634  */                                               
635 struct nfs4_ol_stateid {                          
636         struct nfs4_stid                st_sti    
637         struct list_head                st_per    
638         struct list_head                st_per    
639         struct list_head                st_loc    
640         struct nfs4_stateowner          *st_st    
641         struct nfs4_clnt_odstate        *st_cl    
642 /*                                                
643  * These bitmasks use 3 separate bits for READ    
644  * comment above bmap_to_share_mode() for expl    
645  */                                               
646         unsigned char                   st_acc    
647         unsigned char                   st_den    
648         struct nfs4_ol_stateid          *st_op    
649         struct mutex                    st_mut    
650 };                                                
651                                                   
652 static inline struct nfs4_ol_stateid *openlock    
653 {                                                 
654         return container_of(s, struct nfs4_ol_    
655 }                                                 
656                                                   
657 struct nfs4_layout_stateid {                      
658         struct nfs4_stid                ls_sti    
659         struct list_head                ls_per    
660         struct list_head                ls_per    
661         spinlock_t                      ls_loc    
662         struct list_head                ls_lay    
663         u32                             ls_lay    
664         struct nfsd_file                *ls_fi    
665         struct nfsd4_callback           ls_rec    
666         stateid_t                       ls_rec    
667         bool                            ls_rec    
668         struct mutex                    ls_mut    
669 };                                                
670                                                   
671 static inline struct nfs4_layout_stateid *layo    
672 {                                                 
673         return container_of(s, struct nfs4_lay    
674 }                                                 
675                                                   
676 /* flags for preprocess_seqid_op() */             
677 #define RD_STATE                0x00000010        
678 #define WR_STATE                0x00000020        
679                                                   
680 enum nfsd4_cb_op {                                
681         NFSPROC4_CLNT_CB_NULL = 0,                
682         NFSPROC4_CLNT_CB_RECALL,                  
683         NFSPROC4_CLNT_CB_LAYOUT,                  
684         NFSPROC4_CLNT_CB_OFFLOAD,                 
685         NFSPROC4_CLNT_CB_SEQUENCE,                
686         NFSPROC4_CLNT_CB_NOTIFY_LOCK,             
687         NFSPROC4_CLNT_CB_RECALL_ANY,              
688         NFSPROC4_CLNT_CB_GETATTR,                 
689 };                                                
690                                                   
691 /* Returns true iff a is later than b: */         
692 static inline bool nfsd4_stateid_generation_af    
693 {                                                 
694         return (s32)(a->si_generation - b->si_    
695 }                                                 
696                                                   
697 /*                                                
698  * When a client tries to get a lock on a file    
699  * on the blocking lock. When the lock becomes    
700  * CB_NOTIFY_LOCK to the server.                  
701  */                                               
702 struct nfsd4_blocked_lock {                       
703         struct list_head        nbl_list;         
704         struct list_head        nbl_lru;          
705         time64_t                nbl_time;         
706         struct file_lock        nbl_lock;         
707         struct knfsd_fh         nbl_fh;           
708         struct nfsd4_callback   nbl_cb;           
709         struct kref             nbl_kref;         
710 };                                                
711                                                   
712 struct nfsd4_compound_state;                      
713 struct nfsd_net;                                  
714 struct nfsd4_copy;                                
715                                                   
716 extern __be32 nfs4_preprocess_stateid_op(struc    
717                 struct nfsd4_compound_state *c    
718                 stateid_t *stateid, int flags,    
719                 struct nfs4_stid **cstid);        
720 __be32 nfsd4_lookup_stateid(struct nfsd4_compo    
721                             stateid_t *stateid    
722                             unsigned short sta    
723                             struct nfs4_stid *    
724 struct nfs4_stid *nfs4_alloc_stid(struct nfs4_    
725                                   void (*sc_fr    
726 int nfs4_init_copy_state(struct nfsd_net *nn,     
727 void nfs4_free_copy_state(struct nfsd4_copy *c    
728 struct nfs4_cpntf_state *nfs4_alloc_init_cpntf    
729                         struct nfs4_stid *p_st    
730 void nfs4_put_stid(struct nfs4_stid *s);          
731 void nfs4_inc_and_copy_stateid(stateid_t *dst,    
732 void nfs4_remove_reclaim_record(struct nfs4_cl    
733 extern void nfs4_release_reclaim(struct nfsd_n    
734 extern struct nfs4_client_reclaim *nfsd4_find_    
735                                                   
736 extern __be32 nfs4_check_open_reclaim(struct n    
737 extern void nfsd4_probe_callback(struct nfs4_c    
738 extern void nfsd4_probe_callback_sync(struct n    
739 extern void nfsd4_change_callback(struct nfs4_    
740 extern void nfsd4_init_cb(struct nfsd4_callbac    
741                 const struct nfsd4_callback_op    
742 extern bool nfsd4_run_cb(struct nfsd4_callback    
743 extern void nfsd4_shutdown_callback(struct nfs    
744 extern void nfsd4_shutdown_copy(struct nfs4_cl    
745 extern struct nfs4_client_reclaim *nfs4_client    
746                                 struct xdr_net    
747 extern bool nfs4_has_reclaimed_state(struct xd    
748                                                   
749 void put_nfs4_file(struct nfs4_file *fi);         
750 extern void nfs4_put_cpntf_state(struct nfsd_n    
751                                  struct nfs4_c    
752 extern __be32 manage_cpntf_state(struct nfsd_n    
753                                  struct nfs4_c    
754                                  struct nfs4_c    
755 static inline void get_nfs4_file(struct nfs4_f    
756 {                                                 
757         refcount_inc(&fi->fi_ref);                
758 }                                                 
759 struct nfsd_file *find_any_file(struct nfs4_fi    
760                                                   
761 #ifdef CONFIG_NFSD_V4                             
762 void nfsd4_revoke_states(struct net *net, stru    
763 #else                                             
764 static inline void nfsd4_revoke_states(struct     
765 {                                                 
766 }                                                 
767 #endif                                            
768                                                   
769 /* grace period management */                     
770 void nfsd4_end_grace(struct nfsd_net *nn);        
771                                                   
772 /* nfs4recover operations */                      
773 extern int nfsd4_client_tracking_init(struct n    
774 extern void nfsd4_client_tracking_exit(struct     
775 extern void nfsd4_client_record_create(struct     
776 extern void nfsd4_client_record_remove(struct     
777 extern int nfsd4_client_record_check(struct nf    
778 extern void nfsd4_record_grace_done(struct nfs    
779                                                   
780 static inline bool try_to_expire_client(struct    
781 {                                                 
782         cmpxchg(&clp->cl_state, NFSD4_COURTESY    
783         return clp->cl_state == NFSD4_EXPIRABL    
784 }                                                 
785                                                   
786 extern __be32 nfsd4_deleg_getattr_conflict(str    
787                 struct dentry *dentry, bool *f    
788 #endif   /* NFSD4_STATE_H */                      
789                                                   

~ [ 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