1
2
3
4
5
6
7
8#include <linux/compiler.h>
9#include <linux/kernel.h>
10#include <linux/ktime.h>
11#include <linux/fs.h>
12#include <linux/pagemap.h>
13#include <linux/rxrpc.h>
14#include <linux/key.h>
15#include <linux/workqueue.h>
16#include <linux/sched.h>
17#include <linux/fscache.h>
18#include <linux/backing-dev.h>
19#include <linux/uuid.h>
20#include <linux/mm_types.h>
21#include <linux/dns_resolver.h>
22#include <net/net_namespace.h>
23#include <net/netns/generic.h>
24#include <net/sock.h>
25#include <net/af_rxrpc.h>
26
27#include "afs.h"
28#include "afs_vl.h"
29
30#define AFS_CELL_MAX_ADDRS 15
31
32struct pagevec;
33struct afs_call;
34
35
36
37
38
39enum afs_flock_mode {
40 afs_flock_mode_unset,
41 afs_flock_mode_local,
42 afs_flock_mode_openafs,
43 afs_flock_mode_strict,
44 afs_flock_mode_write,
45};
46
47struct afs_fs_context {
48 bool force;
49 bool autocell;
50 bool dyn_root;
51 bool no_cell;
52 enum afs_flock_mode flock_mode;
53 afs_voltype_t type;
54 unsigned int volnamesz;
55 const char *volname;
56 struct afs_net *net;
57 struct afs_cell *cell;
58 struct afs_volume *volume;
59 struct key *key;
60};
61
62enum afs_call_state {
63 AFS_CALL_CL_REQUESTING,
64 AFS_CALL_CL_AWAIT_REPLY,
65 AFS_CALL_CL_PROC_REPLY,
66 AFS_CALL_SV_AWAIT_OP_ID,
67 AFS_CALL_SV_AWAIT_REQUEST,
68 AFS_CALL_SV_REPLYING,
69 AFS_CALL_SV_AWAIT_ACK,
70 AFS_CALL_COMPLETE,
71};
72
73
74
75
76struct afs_addr_list {
77 struct rcu_head rcu;
78 refcount_t usage;
79 u32 version;
80 unsigned char max_addrs;
81 unsigned char nr_addrs;
82 unsigned char preferred;
83 unsigned char nr_ipv4;
84 enum dns_record_source source:8;
85 enum dns_lookup_status status:8;
86 unsigned long failed;
87 unsigned long responded;
88 struct sockaddr_rxrpc addrs[];
89#define AFS_MAX_ADDRESSES ((unsigned int)(sizeof(unsigned long) * 8))
90};
91
92
93
94
95struct afs_call {
96 const struct afs_call_type *type;
97 struct afs_addr_list *alist;
98 wait_queue_head_t waitq;
99 struct work_struct async_work;
100 struct work_struct work;
101 struct rxrpc_call *rxcall;
102 struct key *key;
103 struct afs_net *net;
104 struct afs_server *server;
105 struct afs_vlserver *vlserver;
106 void *request;
107 struct iov_iter def_iter;
108 struct iov_iter *iter;
109 union {
110 struct kvec kvec[1];
111 struct bio_vec bvec[1];
112 };
113 void *buffer;
114 union {
115 long ret0;
116 struct afs_addr_list *ret_alist;
117 struct afs_vldb_entry *ret_vldb;
118 char *ret_str;
119 };
120 struct afs_operation *op;
121 unsigned int server_index;
122 atomic_t usage;
123 enum afs_call_state state;
124 spinlock_t state_lock;
125 int error;
126 u32 abort_code;
127 unsigned int max_lifespan;
128 unsigned request_size;
129 unsigned reply_max;
130 unsigned count2;
131 unsigned char unmarshall;
132 unsigned char addr_ix;
133 bool drop_ref;
134 bool send_pages;
135 bool need_attention;
136 bool async;
137 bool upgrade;
138 bool have_reply_time;
139 bool intr;
140 bool unmarshalling_error;
141 u16 service_id;
142 unsigned int debug_id;
143 u32 operation_ID;
144 u32 count;
145 union {
146 struct {
147 __be32 tmp_u;
148 __be32 tmp;
149 } __attribute__((packed));
150 __be64 tmp64;
151 };
152 ktime_t reply_time;
153};
154
155struct afs_call_type {
156 const char *name;
157 unsigned int op;
158
159
160
161
162 int (*deliver)(struct afs_call *call);
163
164
165 void (*destructor)(struct afs_call *call);
166
167
168 void (*work)(struct work_struct *work);
169
170
171 void (*done)(struct afs_call *call);
172};
173
174
175
176
177struct afs_wb_key {
178 refcount_t usage;
179 struct key *key;
180 struct list_head vnode_link;
181};
182
183
184
185
186struct afs_file {
187 struct key *key;
188 struct afs_wb_key *wb;
189};
190
191static inline struct key *afs_file_key(struct file *file)
192{
193 struct afs_file *af = file->private_data;
194
195 return af->key;
196}
197
198
199
200
201struct afs_read {
202 loff_t pos;
203 loff_t len;
204 loff_t actual_len;
205 loff_t remain;
206 loff_t file_size;
207 afs_dataversion_t data_version;
208 refcount_t usage;
209 unsigned int index;
210 unsigned int nr_pages;
211 unsigned int offset;
212 struct afs_vnode *vnode;
213 void (*page_done)(struct afs_read *);
214 struct page **pages;
215 struct page *array[];
216};
217
218
219
220
221
222struct afs_super_info {
223 struct net *net_ns;
224 struct afs_cell *cell;
225 struct afs_volume *volume;
226 enum afs_flock_mode flock_mode:8;
227 bool dyn_root;
228};
229
230static inline struct afs_super_info *AFS_FS_S(struct super_block *sb)
231{
232 return sb->s_fs_info;
233}
234
235extern struct file_system_type afs_fs_type;
236
237
238
239
240struct afs_sysnames {
241#define AFS_NR_SYSNAME 16
242 char *subs[AFS_NR_SYSNAME];
243 refcount_t usage;
244 unsigned short nr;
245 char blank[1];
246};
247
248
249
250
251struct afs_net {
252 struct net *net;
253 struct afs_uuid uuid;
254 bool live;
255
256
257 struct socket *socket;
258 struct afs_call *spare_incoming_call;
259 struct work_struct charge_preallocation_work;
260 struct mutex socket_mutex;
261 atomic_t nr_outstanding_calls;
262 atomic_t nr_superblocks;
263
264
265 struct rb_root cells;
266 struct afs_cell __rcu *ws_cell;
267 struct work_struct cells_manager;
268 struct timer_list cells_timer;
269 atomic_t cells_outstanding;
270 seqlock_t cells_lock;
271 struct mutex cells_alias_lock;
272
273 struct mutex proc_cells_lock;
274 struct hlist_head proc_cells;
275
276
277
278
279
280 seqlock_t fs_lock;
281 struct rb_root fs_servers;
282 struct list_head fs_probe_fast;
283 struct list_head fs_probe_slow;
284 struct hlist_head fs_proc;
285
286 struct hlist_head fs_addresses4;
287 struct hlist_head fs_addresses6;
288 seqlock_t fs_addr_lock;
289
290 struct work_struct fs_manager;
291 struct timer_list fs_timer;
292
293 struct work_struct fs_prober;
294 struct timer_list fs_probe_timer;
295 atomic_t servers_outstanding;
296
297
298 struct mutex lock_manager_mutex;
299
300
301 struct super_block *dynroot_sb;
302 struct proc_dir_entry *proc_afs;
303 struct afs_sysnames *sysnames;
304 rwlock_t sysnames_lock;
305
306
307 atomic_t n_lookup;
308 atomic_t n_reval;
309 atomic_t n_inval;
310 atomic_t n_relpg;
311 atomic_t n_read_dir;
312 atomic_t n_dir_cr;
313 atomic_t n_dir_rm;
314 atomic_t n_stores;
315 atomic_long_t n_store_bytes;
316 atomic_long_t n_fetch_bytes;
317 atomic_t n_fetches;
318};
319
320extern const char afs_init_sysname[];
321
322enum afs_cell_state {
323 AFS_CELL_UNSET,
324 AFS_CELL_ACTIVATING,
325 AFS_CELL_ACTIVE,
326 AFS_CELL_DEACTIVATING,
327 AFS_CELL_INACTIVE,
328 AFS_CELL_FAILED,
329};
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350struct afs_cell {
351 union {
352 struct rcu_head rcu;
353 struct rb_node net_node;
354 };
355 struct afs_net *net;
356 struct afs_cell *alias_of;
357 struct afs_volume *root_volume;
358 struct key *anonymous_key;
359 struct work_struct manager;
360 struct hlist_node proc_link;
361#ifdef CONFIG_AFS_FSCACHE
362 struct fscache_cookie *cache;
363#endif
364 time64_t dns_expiry;
365 time64_t last_inactive;
366 atomic_t usage;
367 unsigned long flags;
368#define AFS_CELL_FL_NO_GC 0
369#define AFS_CELL_FL_DO_LOOKUP 1
370#define AFS_CELL_FL_CHECK_ALIAS 2
371 enum afs_cell_state state;
372 short error;
373 enum dns_record_source dns_source:8;
374 enum dns_lookup_status dns_status:8;
375 unsigned int dns_lookup_count;
376
377
378 struct rb_root volumes;
379 struct hlist_head proc_volumes;
380 seqlock_t volume_lock;
381
382
383 struct rb_root fs_servers;
384 seqlock_t fs_lock;
385
386
387 rwlock_t vl_servers_lock;
388 struct afs_vlserver_list __rcu *vl_servers;
389
390 u8 name_len;
391 char *name;
392};
393
394
395
396
397struct afs_vlserver {
398 struct rcu_head rcu;
399 struct afs_addr_list __rcu *addresses;
400 unsigned long flags;
401#define AFS_VLSERVER_FL_PROBED 0
402#define AFS_VLSERVER_FL_PROBING 1
403#define AFS_VLSERVER_FL_IS_YFS 2
404 rwlock_t lock;
405 atomic_t usage;
406
407
408 wait_queue_head_t probe_wq;
409 atomic_t probe_outstanding;
410 spinlock_t probe_lock;
411 struct {
412 unsigned int rtt;
413 u32 abort_code;
414 short error;
415 bool have_result;
416 bool responded:1;
417 bool is_yfs:1;
418 bool not_yfs:1;
419 bool local_failure:1;
420 } probe;
421
422 u16 port;
423 u16 name_len;
424 char name[];
425};
426
427
428
429
430struct afs_vlserver_entry {
431 u16 priority;
432 u16 weight;
433 enum dns_record_source source:8;
434 enum dns_lookup_status status:8;
435 struct afs_vlserver *server;
436};
437
438struct afs_vlserver_list {
439 struct rcu_head rcu;
440 atomic_t usage;
441 u8 nr_servers;
442 u8 index;
443 u8 preferred;
444 enum dns_record_source source:8;
445 enum dns_lookup_status status:8;
446 rwlock_t lock;
447 struct afs_vlserver_entry servers[];
448};
449
450
451
452
453
454
455struct afs_vldb_entry {
456 afs_volid_t vid[3];
457
458 unsigned long flags;
459#define AFS_VLDB_HAS_RW 0
460#define AFS_VLDB_HAS_RO 1
461#define AFS_VLDB_HAS_BAK 2
462#define AFS_VLDB_QUERY_VALID 3
463#define AFS_VLDB_QUERY_ERROR 4
464
465 uuid_t fs_server[AFS_NMAXNSERVERS];
466 u32 addr_version[AFS_NMAXNSERVERS];
467 u8 fs_mask[AFS_NMAXNSERVERS];
468#define AFS_VOL_VTM_RW 0x01
469#define AFS_VOL_VTM_RO 0x02
470#define AFS_VOL_VTM_BAK 0x04
471 short error;
472 u8 nr_servers;
473 u8 name_len;
474 u8 name[AFS_MAXVOLNAME + 1];
475};
476
477
478
479
480struct afs_server {
481 struct rcu_head rcu;
482 union {
483 uuid_t uuid;
484 struct afs_uuid _uuid;
485 };
486
487 struct afs_addr_list __rcu *addresses;
488 struct afs_cell *cell;
489 struct rb_node uuid_rb;
490 struct afs_server __rcu *uuid_next;
491 struct afs_server *uuid_prev;
492 struct list_head probe_link;
493 struct hlist_node addr4_link;
494 struct hlist_node addr6_link;
495 struct hlist_node proc_link;
496 struct afs_server *gc_next;
497 time64_t unuse_time;
498 unsigned long flags;
499#define AFS_SERVER_FL_RESPONDING 0
500#define AFS_SERVER_FL_UPDATING 1
501#define AFS_SERVER_FL_NEEDS_UPDATE 2
502#define AFS_SERVER_FL_NOT_READY 4
503#define AFS_SERVER_FL_NOT_FOUND 5
504#define AFS_SERVER_FL_VL_FAIL 6
505#define AFS_SERVER_FL_MAY_HAVE_CB 8
506#define AFS_SERVER_FL_IS_YFS 16
507#define AFS_SERVER_FL_NO_IBULK 17
508#define AFS_SERVER_FL_NO_RM2 18
509 atomic_t ref;
510 atomic_t active;
511 u32 addr_version;
512 unsigned int rtt;
513 unsigned int debug_id;
514
515
516 rwlock_t fs_lock;
517
518
519 unsigned cb_s_break;
520
521
522 unsigned long probed_at;
523 wait_queue_head_t probe_wq;
524 atomic_t probe_outstanding;
525 spinlock_t probe_lock;
526 struct {
527 unsigned int rtt;
528 u32 abort_code;
529 short error;
530 bool responded:1;
531 bool is_yfs:1;
532 bool not_yfs:1;
533 bool local_failure:1;
534 } probe;
535};
536
537
538
539
540struct afs_server_entry {
541 struct afs_server *server;
542};
543
544struct afs_server_list {
545 afs_volid_t vids[AFS_MAXTYPES];
546 refcount_t usage;
547 unsigned char nr_servers;
548 unsigned char preferred;
549 unsigned short vnovol_mask;
550 unsigned int seq;
551 rwlock_t lock;
552 struct afs_server_entry servers[];
553};
554
555
556
557
558struct afs_volume {
559 union {
560 struct rcu_head rcu;
561 afs_volid_t vid;
562 };
563 atomic_t usage;
564 time64_t update_at;
565 struct afs_cell *cell;
566 struct rb_node cell_node;
567 struct hlist_node proc_link;
568 struct super_block __rcu *sb;
569 unsigned long flags;
570#define AFS_VOLUME_NEEDS_UPDATE 0
571#define AFS_VOLUME_UPDATING 1
572#define AFS_VOLUME_WAIT 2
573#define AFS_VOLUME_DELETED 3
574#define AFS_VOLUME_OFFLINE 4
575#define AFS_VOLUME_BUSY 5
576#define AFS_VOLUME_MAYBE_NO_IBULK 6
577#ifdef CONFIG_AFS_FSCACHE
578 struct fscache_cookie *cache;
579#endif
580 struct afs_server_list __rcu *servers;
581 rwlock_t servers_lock;
582 unsigned int servers_seq;
583
584 unsigned cb_v_break;
585 rwlock_t cb_v_break_lock;
586
587 afs_voltype_t type;
588 char type_force;
589 u8 name_len;
590 u8 name[AFS_MAXVOLNAME + 1];
591};
592
593enum afs_lock_state {
594 AFS_VNODE_LOCK_NONE,
595 AFS_VNODE_LOCK_WAITING_FOR_CB,
596 AFS_VNODE_LOCK_SETTING,
597 AFS_VNODE_LOCK_GRANTED,
598 AFS_VNODE_LOCK_EXTENDING,
599 AFS_VNODE_LOCK_NEED_UNLOCK,
600 AFS_VNODE_LOCK_UNLOCKING,
601 AFS_VNODE_LOCK_DELETED,
602};
603
604
605
606
607
608
609
610struct afs_vnode {
611 struct inode vfs_inode;
612
613 struct afs_volume *volume;
614 struct afs_fid fid;
615 struct afs_file_status status;
616 afs_dataversion_t invalid_before;
617#ifdef CONFIG_AFS_FSCACHE
618 struct fscache_cookie *cache;
619#endif
620 struct afs_permits __rcu *permit_cache;
621 struct mutex io_lock;
622 struct rw_semaphore validate_lock;
623 struct rw_semaphore rmdir_lock;
624 struct key *silly_key;
625 spinlock_t wb_lock;
626 spinlock_t lock;
627 unsigned long flags;
628#define AFS_VNODE_CB_PROMISED 0
629#define AFS_VNODE_UNSET 1
630#define AFS_VNODE_DIR_VALID 2
631#define AFS_VNODE_ZAP_DATA 3
632#define AFS_VNODE_DELETED 4
633#define AFS_VNODE_MOUNTPOINT 5
634#define AFS_VNODE_AUTOCELL 6
635#define AFS_VNODE_PSEUDODIR 7
636#define AFS_VNODE_NEW_CONTENT 8
637#define AFS_VNODE_SILLY_DELETED 9
638
639 struct list_head wb_keys;
640 struct list_head pending_locks;
641 struct list_head granted_locks;
642 struct delayed_work lock_work;
643 struct key *lock_key;
644 ktime_t locked_at;
645 enum afs_lock_state lock_state : 8;
646 afs_lock_type_t lock_type : 8;
647
648
649 void *cb_server;
650 unsigned int cb_s_break;
651 unsigned int cb_v_break;
652 unsigned int cb_break;
653 seqlock_t cb_lock;
654
655 time64_t cb_expires_at;
656};
657
658static inline struct fscache_cookie *afs_vnode_cache(struct afs_vnode *vnode)
659{
660#ifdef CONFIG_AFS_FSCACHE
661 return vnode->cache;
662#else
663 return NULL;
664#endif
665}
666
667
668
669
670struct afs_permit {
671 struct key *key;
672 afs_access_t access;
673};
674
675
676
677
678
679struct afs_permits {
680 struct rcu_head rcu;
681 struct hlist_node hash_node;
682 unsigned long h;
683 refcount_t usage;
684 unsigned short nr_permits;
685 bool invalidated;
686 struct afs_permit permits[];
687};
688
689
690
691
692struct afs_error {
693 short error;
694 bool responded;
695};
696
697
698
699
700struct afs_addr_cursor {
701 struct afs_addr_list *alist;
702 unsigned long tried;
703 signed char index;
704 bool responded;
705 unsigned short nr_iterations;
706 short error;
707 u32 abort_code;
708};
709
710
711
712
713struct afs_vl_cursor {
714 struct afs_addr_cursor ac;
715 struct afs_cell *cell;
716 struct afs_vlserver_list *server_list;
717 struct afs_vlserver *server;
718 struct key *key;
719 unsigned long untried;
720 short index;
721 short error;
722 unsigned short flags;
723#define AFS_VL_CURSOR_STOP 0x0001
724#define AFS_VL_CURSOR_RETRY 0x0002
725#define AFS_VL_CURSOR_RETRIED 0x0004
726 unsigned short nr_iterations;
727};
728
729
730
731
732struct afs_operation_ops {
733 void (*issue_afs_rpc)(struct afs_operation *op);
734 void (*issue_yfs_rpc)(struct afs_operation *op);
735 void (*success)(struct afs_operation *op);
736 void (*aborted)(struct afs_operation *op);
737 void (*edit_dir)(struct afs_operation *op);
738 void (*put)(struct afs_operation *op);
739};
740
741struct afs_vnode_param {
742 struct afs_vnode *vnode;
743 struct afs_fid fid;
744 struct afs_status_cb scb;
745 afs_dataversion_t dv_before;
746 unsigned int cb_break_before;
747 u8 dv_delta;
748 bool put_vnode:1;
749 bool need_io_lock:1;
750 bool update_ctime:1;
751 bool set_size:1;
752 bool op_unlinked:1;
753};
754
755
756
757
758
759struct afs_operation {
760 struct afs_net *net;
761 struct key *key;
762 const struct afs_call_type *type;
763 const struct afs_operation_ops *ops;
764
765
766 struct afs_volume *volume;
767 struct afs_vnode_param file[2];
768 struct afs_vnode_param *more_files;
769 struct afs_volsync volsync;
770 struct dentry *dentry;
771 struct dentry *dentry_2;
772 struct timespec64 mtime;
773 struct timespec64 ctime;
774 short nr_files;
775 short error;
776 unsigned int debug_id;
777
778 unsigned int cb_v_break;
779 unsigned int cb_s_break;
780
781 union {
782 struct {
783 int which;
784 } fetch_status;
785 struct {
786 int reason;
787 mode_t mode;
788 const char *symlink;
789 } create;
790 struct {
791 bool need_rehash;
792 } unlink;
793 struct {
794 struct dentry *rehash;
795 struct dentry *tmp;
796 bool new_negative;
797 } rename;
798 struct {
799 struct afs_read *req;
800 } fetch;
801 struct {
802 afs_lock_type_t type;
803 } lock;
804 struct {
805 struct address_space *mapping;
806 pgoff_t first;
807 pgoff_t last;
808 unsigned first_offset;
809 unsigned last_to;
810 } store;
811 struct {
812 struct iattr *attr;
813 } setattr;
814 struct afs_acl *acl;
815 struct yfs_acl *yacl;
816 struct {
817 struct afs_volume_status vs;
818 struct kstatfs *buf;
819 } volstatus;
820 };
821
822
823 struct afs_addr_cursor ac;
824 struct afs_server_list *server_list;
825 struct afs_server *server;
826 struct afs_call *call;
827 unsigned long untried;
828 short index;
829 unsigned short nr_iterations;
830
831 unsigned int flags;
832#define AFS_OPERATION_STOP 0x0001
833#define AFS_OPERATION_VBUSY 0x0002
834#define AFS_OPERATION_VMOVED 0x0004
835#define AFS_OPERATION_VNOVOL 0x0008
836#define AFS_OPERATION_CUR_ONLY 0x0010
837#define AFS_OPERATION_NO_VSLEEP 0x0020
838#define AFS_OPERATION_UNINTR 0x0040
839#define AFS_OPERATION_DOWNGRADE 0x0080
840#define AFS_OPERATION_LOCK_0 0x0100
841#define AFS_OPERATION_LOCK_1 0x0200
842#define AFS_OPERATION_TRIED_ALL 0x0400
843#define AFS_OPERATION_RETRY_SERVER 0x0800
844#define AFS_OPERATION_DIR_CONFLICT 0x1000
845};
846
847
848
849
850struct afs_vnode_cache_aux {
851 u64 data_version;
852} __packed;
853
854#include <trace/events/afs.h>
855
856
857
858
859
860static inline struct afs_addr_list *afs_get_addrlist(struct afs_addr_list *alist)
861{
862 if (alist)
863 refcount_inc(&alist->usage);
864 return alist;
865}
866extern struct afs_addr_list *afs_alloc_addrlist(unsigned int,
867 unsigned short,
868 unsigned short);
869extern void afs_put_addrlist(struct afs_addr_list *);
870extern struct afs_vlserver_list *afs_parse_text_addrs(struct afs_net *,
871 const char *, size_t, char,
872 unsigned short, unsigned short);
873extern struct afs_vlserver_list *afs_dns_query(struct afs_cell *, time64_t *);
874extern bool afs_iterate_addresses(struct afs_addr_cursor *);
875extern int afs_end_cursor(struct afs_addr_cursor *);
876
877extern void afs_merge_fs_addr4(struct afs_addr_list *, __be32, u16);
878extern void afs_merge_fs_addr6(struct afs_addr_list *, __be32 *, u16);
879
880
881
882
883#ifdef CONFIG_AFS_FSCACHE
884extern struct fscache_netfs afs_cache_netfs;
885extern struct fscache_cookie_def afs_cell_cache_index_def;
886extern struct fscache_cookie_def afs_volume_cache_index_def;
887extern struct fscache_cookie_def afs_vnode_cache_index_def;
888#else
889#define afs_cell_cache_index_def (*(struct fscache_cookie_def *) NULL)
890#define afs_volume_cache_index_def (*(struct fscache_cookie_def *) NULL)
891#define afs_vnode_cache_index_def (*(struct fscache_cookie_def *) NULL)
892#endif
893
894
895
896
897extern void afs_init_callback_state(struct afs_server *);
898extern void __afs_break_callback(struct afs_vnode *, enum afs_cb_break_reason);
899extern void afs_break_callback(struct afs_vnode *, enum afs_cb_break_reason);
900extern void afs_break_callbacks(struct afs_server *, size_t, struct afs_callback_break *);
901
902static inline unsigned int afs_calc_vnode_cb_break(struct afs_vnode *vnode)
903{
904 return vnode->cb_break + vnode->cb_v_break;
905}
906
907static inline bool afs_cb_is_broken(unsigned int cb_break,
908 const struct afs_vnode *vnode)
909{
910 return cb_break != (vnode->cb_break + vnode->volume->cb_v_break);
911}
912
913
914
915
916extern int afs_cell_init(struct afs_net *, const char *);
917extern struct afs_cell *afs_lookup_cell_rcu(struct afs_net *, const char *, unsigned);
918extern struct afs_cell *afs_lookup_cell(struct afs_net *, const char *, unsigned,
919 const char *, bool);
920extern struct afs_cell *afs_get_cell(struct afs_cell *);
921extern void afs_put_cell(struct afs_net *, struct afs_cell *);
922extern void afs_manage_cells(struct work_struct *);
923extern void afs_cells_timer(struct timer_list *);
924extern void __net_exit afs_cell_purge(struct afs_net *);
925
926
927
928
929extern bool afs_cm_incoming_call(struct afs_call *);
930
931
932
933
934extern const struct file_operations afs_dir_file_operations;
935extern const struct inode_operations afs_dir_inode_operations;
936extern const struct address_space_operations afs_dir_aops;
937extern const struct dentry_operations afs_fs_dentry_operations;
938
939extern void afs_d_release(struct dentry *);
940extern void afs_check_for_remote_deletion(struct afs_operation *);
941
942
943
944
945extern void afs_edit_dir_add(struct afs_vnode *, struct qstr *, struct afs_fid *,
946 enum afs_edit_dir_reason);
947extern void afs_edit_dir_remove(struct afs_vnode *, struct qstr *, enum afs_edit_dir_reason);
948
949
950
951
952extern int afs_sillyrename(struct afs_vnode *, struct afs_vnode *,
953 struct dentry *, struct key *);
954extern int afs_silly_iput(struct dentry *, struct inode *);
955
956
957
958
959extern const struct inode_operations afs_dynroot_inode_operations;
960extern const struct dentry_operations afs_dynroot_dentry_operations;
961
962extern struct inode *afs_try_auto_mntpt(struct dentry *, struct inode *);
963extern int afs_dynroot_mkdir(struct afs_net *, struct afs_cell *);
964extern void afs_dynroot_rmdir(struct afs_net *, struct afs_cell *);
965extern int afs_dynroot_populate(struct super_block *);
966extern void afs_dynroot_depopulate(struct super_block *);
967
968
969
970
971extern const struct address_space_operations afs_fs_aops;
972extern const struct inode_operations afs_file_inode_operations;
973extern const struct file_operations afs_file_operations;
974
975extern int afs_cache_wb_key(struct afs_vnode *, struct afs_file *);
976extern void afs_put_wb_key(struct afs_wb_key *);
977extern int afs_open(struct inode *, struct file *);
978extern int afs_release(struct inode *, struct file *);
979extern int afs_fetch_data(struct afs_vnode *, struct key *, struct afs_read *);
980extern int afs_page_filler(void *, struct page *);
981extern void afs_put_read(struct afs_read *);
982
983static inline struct afs_read *afs_get_read(struct afs_read *req)
984{
985 refcount_inc(&req->usage);
986 return req;
987}
988
989
990
991
992extern struct workqueue_struct *afs_lock_manager;
993
994extern void afs_lock_op_done(struct afs_call *);
995extern void afs_lock_work(struct work_struct *);
996extern void afs_lock_may_be_available(struct afs_vnode *);
997extern int afs_lock(struct file *, int, struct file_lock *);
998extern int afs_flock(struct file *, int, struct file_lock *);
999
1000
1001
1002
1003extern void afs_fs_fetch_status(struct afs_operation *);
1004extern void afs_fs_fetch_data(struct afs_operation *);
1005extern void afs_fs_create_file(struct afs_operation *);
1006extern void afs_fs_make_dir(struct afs_operation *);
1007extern void afs_fs_remove_file(struct afs_operation *);
1008extern void afs_fs_remove_dir(struct afs_operation *);
1009extern void afs_fs_link(struct afs_operation *);
1010extern void afs_fs_symlink(struct afs_operation *);
1011extern void afs_fs_rename(struct afs_operation *);
1012extern void afs_fs_store_data(struct afs_operation *);
1013extern void afs_fs_setattr(struct afs_operation *);
1014extern void afs_fs_get_volume_status(struct afs_operation *);
1015extern void afs_fs_set_lock(struct afs_operation *);
1016extern void afs_fs_extend_lock(struct afs_operation *);
1017extern void afs_fs_release_lock(struct afs_operation *);
1018extern int afs_fs_give_up_all_callbacks(struct afs_net *, struct afs_server *,
1019 struct afs_addr_cursor *, struct key *);
1020extern bool afs_fs_get_capabilities(struct afs_net *, struct afs_server *,
1021 struct afs_addr_cursor *, struct key *);
1022extern void afs_fs_inline_bulk_status(struct afs_operation *);
1023
1024struct afs_acl {
1025 u32 size;
1026 u8 data[];
1027};
1028
1029extern void afs_fs_fetch_acl(struct afs_operation *);
1030extern void afs_fs_store_acl(struct afs_operation *);
1031
1032
1033
1034
1035extern struct afs_operation *afs_alloc_operation(struct key *, struct afs_volume *);
1036extern int afs_put_operation(struct afs_operation *);
1037extern bool afs_begin_vnode_operation(struct afs_operation *);
1038extern void afs_wait_for_operation(struct afs_operation *);
1039extern int afs_do_sync_operation(struct afs_operation *);
1040
1041static inline void afs_op_nomem(struct afs_operation *op)
1042{
1043 op->error = -ENOMEM;
1044}
1045
1046static inline void afs_op_set_vnode(struct afs_operation *op, unsigned int n,
1047 struct afs_vnode *vnode)
1048{
1049 op->file[n].vnode = vnode;
1050 op->file[n].need_io_lock = true;
1051}
1052
1053static inline void afs_op_set_fid(struct afs_operation *op, unsigned int n,
1054 const struct afs_fid *fid)
1055{
1056 op->file[n].fid = *fid;
1057}
1058
1059
1060
1061
1062extern void afs_fileserver_probe_result(struct afs_call *);
1063extern void afs_fs_probe_fileserver(struct afs_net *, struct afs_server *, struct key *, bool);
1064extern int afs_wait_for_fs_probes(struct afs_server_list *, unsigned long);
1065extern void afs_probe_fileserver(struct afs_net *, struct afs_server *);
1066extern void afs_fs_probe_dispatcher(struct work_struct *);
1067extern int afs_wait_for_one_fs_probe(struct afs_server *, bool);
1068extern void afs_fs_probe_cleanup(struct afs_net *);
1069
1070
1071
1072
1073extern const struct afs_operation_ops afs_fetch_status_operation;
1074
1075extern void afs_vnode_commit_status(struct afs_operation *, struct afs_vnode_param *);
1076extern int afs_fetch_status(struct afs_vnode *, struct key *, bool, afs_access_t *);
1077extern int afs_ilookup5_test_by_fid(struct inode *, void *);
1078extern struct inode *afs_iget_pseudo_dir(struct super_block *, bool);
1079extern struct inode *afs_iget(struct afs_operation *, struct afs_vnode_param *);
1080extern struct inode *afs_root_iget(struct super_block *, struct key *);
1081extern bool afs_check_validity(struct afs_vnode *);
1082extern int afs_validate(struct afs_vnode *, struct key *);
1083extern int afs_getattr(const struct path *, struct kstat *, u32, unsigned int);
1084extern int afs_setattr(struct dentry *, struct iattr *);
1085extern void afs_evict_inode(struct inode *);
1086extern int afs_drop_inode(struct inode *);
1087
1088
1089
1090
1091extern struct workqueue_struct *afs_wq;
1092extern int afs_net_id;
1093
1094static inline struct afs_net *afs_net(struct net *net)
1095{
1096 return net_generic(net, afs_net_id);
1097}
1098
1099static inline struct afs_net *afs_sb2net(struct super_block *sb)
1100{
1101 return afs_net(AFS_FS_S(sb)->net_ns);
1102}
1103
1104static inline struct afs_net *afs_d2net(struct dentry *dentry)
1105{
1106 return afs_sb2net(dentry->d_sb);
1107}
1108
1109static inline struct afs_net *afs_i2net(struct inode *inode)
1110{
1111 return afs_sb2net(inode->i_sb);
1112}
1113
1114static inline struct afs_net *afs_v2net(struct afs_vnode *vnode)
1115{
1116 return afs_i2net(&vnode->vfs_inode);
1117}
1118
1119static inline struct afs_net *afs_sock2net(struct sock *sk)
1120{
1121 return net_generic(sock_net(sk), afs_net_id);
1122}
1123
1124static inline void __afs_stat(atomic_t *s)
1125{
1126 atomic_inc(s);
1127}
1128
1129#define afs_stat_v(vnode, n) __afs_stat(&afs_v2net(vnode)->n)
1130
1131
1132
1133
1134extern int afs_abort_to_error(u32);
1135extern void afs_prioritise_error(struct afs_error *, int, u32);
1136
1137
1138
1139
1140extern const struct inode_operations afs_mntpt_inode_operations;
1141extern const struct inode_operations afs_autocell_inode_operations;
1142extern const struct file_operations afs_mntpt_file_operations;
1143
1144extern struct vfsmount *afs_d_automount(struct path *);
1145extern void afs_mntpt_kill_timer(void);
1146
1147
1148
1149
1150#ifdef CONFIG_PROC_FS
1151extern int __net_init afs_proc_init(struct afs_net *);
1152extern void __net_exit afs_proc_cleanup(struct afs_net *);
1153extern int afs_proc_cell_setup(struct afs_cell *);
1154extern void afs_proc_cell_remove(struct afs_cell *);
1155extern void afs_put_sysnames(struct afs_sysnames *);
1156#else
1157static inline int afs_proc_init(struct afs_net *net) { return 0; }
1158static inline void afs_proc_cleanup(struct afs_net *net) {}
1159static inline int afs_proc_cell_setup(struct afs_cell *cell) { return 0; }
1160static inline void afs_proc_cell_remove(struct afs_cell *cell) {}
1161static inline void afs_put_sysnames(struct afs_sysnames *sysnames) {}
1162#endif
1163
1164
1165
1166
1167extern bool afs_select_fileserver(struct afs_operation *);
1168extern void afs_dump_edestaddrreq(const struct afs_operation *);
1169
1170
1171
1172
1173extern struct workqueue_struct *afs_async_calls;
1174
1175extern int __net_init afs_open_socket(struct afs_net *);
1176extern void __net_exit afs_close_socket(struct afs_net *);
1177extern void afs_charge_preallocation(struct work_struct *);
1178extern void afs_put_call(struct afs_call *);
1179extern void afs_make_call(struct afs_addr_cursor *, struct afs_call *, gfp_t);
1180extern long afs_wait_for_call_to_complete(struct afs_call *, struct afs_addr_cursor *);
1181extern struct afs_call *afs_alloc_flat_call(struct afs_net *,
1182 const struct afs_call_type *,
1183 size_t, size_t);
1184extern void afs_flat_call_destructor(struct afs_call *);
1185extern void afs_send_empty_reply(struct afs_call *);
1186extern void afs_send_simple_reply(struct afs_call *, const void *, size_t);
1187extern int afs_extract_data(struct afs_call *, bool);
1188extern int afs_protocol_error(struct afs_call *, enum afs_eproto_cause);
1189
1190static inline void afs_make_op_call(struct afs_operation *op, struct afs_call *call,
1191 gfp_t gfp)
1192{
1193 op->call = call;
1194 op->type = call->type;
1195 call->op = op;
1196 call->key = op->key;
1197 call->intr = !(op->flags & AFS_OPERATION_UNINTR);
1198 afs_make_call(&op->ac, call, gfp);
1199}
1200
1201static inline void afs_extract_begin(struct afs_call *call, void *buf, size_t size)
1202{
1203 call->kvec[0].iov_base = buf;
1204 call->kvec[0].iov_len = size;
1205 iov_iter_kvec(&call->def_iter, READ, call->kvec, 1, size);
1206}
1207
1208static inline void afs_extract_to_tmp(struct afs_call *call)
1209{
1210 afs_extract_begin(call, &call->tmp, sizeof(call->tmp));
1211}
1212
1213static inline void afs_extract_to_tmp64(struct afs_call *call)
1214{
1215 afs_extract_begin(call, &call->tmp64, sizeof(call->tmp64));
1216}
1217
1218static inline void afs_extract_discard(struct afs_call *call, size_t size)
1219{
1220 iov_iter_discard(&call->def_iter, READ, size);
1221}
1222
1223static inline void afs_extract_to_buf(struct afs_call *call, size_t size)
1224{
1225 afs_extract_begin(call, call->buffer, size);
1226}
1227
1228static inline int afs_transfer_reply(struct afs_call *call)
1229{
1230 return afs_extract_data(call, false);
1231}
1232
1233static inline bool afs_check_call_state(struct afs_call *call,
1234 enum afs_call_state state)
1235{
1236 return READ_ONCE(call->state) == state;
1237}
1238
1239static inline bool afs_set_call_state(struct afs_call *call,
1240 enum afs_call_state from,
1241 enum afs_call_state to)
1242{
1243 bool ok = false;
1244
1245 spin_lock_bh(&call->state_lock);
1246 if (call->state == from) {
1247 call->state = to;
1248 trace_afs_call_state(call, from, to, 0, 0);
1249 ok = true;
1250 }
1251 spin_unlock_bh(&call->state_lock);
1252 return ok;
1253}
1254
1255static inline void afs_set_call_complete(struct afs_call *call,
1256 int error, u32 remote_abort)
1257{
1258 enum afs_call_state state;
1259 bool ok = false;
1260
1261 spin_lock_bh(&call->state_lock);
1262 state = call->state;
1263 if (state != AFS_CALL_COMPLETE) {
1264 call->abort_code = remote_abort;
1265 call->error = error;
1266 call->state = AFS_CALL_COMPLETE;
1267 trace_afs_call_state(call, state, AFS_CALL_COMPLETE,
1268 error, remote_abort);
1269 ok = true;
1270 }
1271 spin_unlock_bh(&call->state_lock);
1272 if (ok) {
1273 trace_afs_call_done(call);
1274
1275
1276
1277
1278
1279 if (call->drop_ref)
1280 afs_put_call(call);
1281 }
1282}
1283
1284
1285
1286
1287extern void afs_put_permits(struct afs_permits *);
1288extern void afs_clear_permits(struct afs_vnode *);
1289extern void afs_cache_permit(struct afs_vnode *, struct key *, unsigned int,
1290 struct afs_status_cb *);
1291extern void afs_zap_permits(struct rcu_head *);
1292extern struct key *afs_request_key(struct afs_cell *);
1293extern struct key *afs_request_key_rcu(struct afs_cell *);
1294extern int afs_check_permit(struct afs_vnode *, struct key *, afs_access_t *);
1295extern int afs_permission(struct inode *, int);
1296extern void __exit afs_clean_up_permit_cache(void);
1297
1298
1299
1300
1301extern spinlock_t afs_server_peer_lock;
1302
1303extern struct afs_server *afs_find_server(struct afs_net *,
1304 const struct sockaddr_rxrpc *);
1305extern struct afs_server *afs_find_server_by_uuid(struct afs_net *, const uuid_t *);
1306extern struct afs_server *afs_lookup_server(struct afs_cell *, struct key *, const uuid_t *, u32);
1307extern struct afs_server *afs_get_server(struct afs_server *, enum afs_server_trace);
1308extern struct afs_server *afs_use_server(struct afs_server *, enum afs_server_trace);
1309extern void afs_unuse_server(struct afs_net *, struct afs_server *, enum afs_server_trace);
1310extern void afs_unuse_server_notime(struct afs_net *, struct afs_server *, enum afs_server_trace);
1311extern void afs_put_server(struct afs_net *, struct afs_server *, enum afs_server_trace);
1312extern void afs_manage_servers(struct work_struct *);
1313extern void afs_servers_timer(struct timer_list *);
1314extern void afs_fs_probe_timer(struct timer_list *);
1315extern void __net_exit afs_purge_servers(struct afs_net *);
1316extern bool afs_check_server_record(struct afs_operation *, struct afs_server *);
1317
1318static inline void afs_inc_servers_outstanding(struct afs_net *net)
1319{
1320 atomic_inc(&net->servers_outstanding);
1321}
1322
1323static inline void afs_dec_servers_outstanding(struct afs_net *net)
1324{
1325 if (atomic_dec_and_test(&net->servers_outstanding))
1326 wake_up_var(&net->servers_outstanding);
1327}
1328
1329static inline bool afs_is_probing_server(struct afs_server *server)
1330{
1331 return list_empty(&server->probe_link);
1332}
1333
1334
1335
1336
1337static inline struct afs_server_list *afs_get_serverlist(struct afs_server_list *slist)
1338{
1339 refcount_inc(&slist->usage);
1340 return slist;
1341}
1342
1343extern void afs_put_serverlist(struct afs_net *, struct afs_server_list *);
1344extern struct afs_server_list *afs_alloc_server_list(struct afs_cell *, struct key *,
1345 struct afs_vldb_entry *,
1346 u8);
1347extern bool afs_annotate_server_list(struct afs_server_list *, struct afs_server_list *);
1348
1349
1350
1351
1352extern int __init afs_fs_init(void);
1353extern void afs_fs_exit(void);
1354
1355
1356
1357
1358extern struct afs_vldb_entry *afs_vl_get_entry_by_name_u(struct afs_vl_cursor *,
1359 const char *, int);
1360extern struct afs_addr_list *afs_vl_get_addrs_u(struct afs_vl_cursor *, const uuid_t *);
1361extern struct afs_call *afs_vl_get_capabilities(struct afs_net *, struct afs_addr_cursor *,
1362 struct key *, struct afs_vlserver *, unsigned int);
1363extern struct afs_addr_list *afs_yfsvl_get_endpoints(struct afs_vl_cursor *, const uuid_t *);
1364extern char *afs_yfsvl_get_cell_name(struct afs_vl_cursor *);
1365
1366
1367
1368
1369extern int afs_cell_detect_alias(struct afs_cell *, struct key *);
1370
1371
1372
1373
1374extern void afs_vlserver_probe_result(struct afs_call *);
1375extern int afs_send_vl_probes(struct afs_net *, struct key *, struct afs_vlserver_list *);
1376extern int afs_wait_for_vl_probes(struct afs_vlserver_list *, unsigned long);
1377
1378
1379
1380
1381extern bool afs_begin_vlserver_operation(struct afs_vl_cursor *,
1382 struct afs_cell *, struct key *);
1383extern bool afs_select_vlserver(struct afs_vl_cursor *);
1384extern bool afs_select_current_vlserver(struct afs_vl_cursor *);
1385extern int afs_end_vlserver_operation(struct afs_vl_cursor *);
1386
1387
1388
1389
1390static inline struct afs_vlserver *afs_get_vlserver(struct afs_vlserver *vlserver)
1391{
1392 atomic_inc(&vlserver->usage);
1393 return vlserver;
1394}
1395
1396static inline struct afs_vlserver_list *afs_get_vlserverlist(struct afs_vlserver_list *vllist)
1397{
1398 if (vllist)
1399 atomic_inc(&vllist->usage);
1400 return vllist;
1401}
1402
1403extern struct afs_vlserver *afs_alloc_vlserver(const char *, size_t, unsigned short);
1404extern void afs_put_vlserver(struct afs_net *, struct afs_vlserver *);
1405extern struct afs_vlserver_list *afs_alloc_vlserver_list(unsigned int);
1406extern void afs_put_vlserverlist(struct afs_net *, struct afs_vlserver_list *);
1407extern struct afs_vlserver_list *afs_extract_vlserver_list(struct afs_cell *,
1408 const void *, size_t);
1409
1410
1411
1412
1413extern struct afs_volume *afs_create_volume(struct afs_fs_context *);
1414extern void afs_activate_volume(struct afs_volume *);
1415extern void afs_deactivate_volume(struct afs_volume *);
1416extern struct afs_volume *afs_get_volume(struct afs_volume *, enum afs_volume_trace);
1417extern void afs_put_volume(struct afs_net *, struct afs_volume *, enum afs_volume_trace);
1418extern int afs_check_volume_status(struct afs_volume *, struct afs_operation *);
1419
1420
1421
1422
1423extern int afs_set_page_dirty(struct page *);
1424extern int afs_write_begin(struct file *file, struct address_space *mapping,
1425 loff_t pos, unsigned len, unsigned flags,
1426 struct page **pagep, void **fsdata);
1427extern int afs_write_end(struct file *file, struct address_space *mapping,
1428 loff_t pos, unsigned len, unsigned copied,
1429 struct page *page, void *fsdata);
1430extern int afs_writepage(struct page *, struct writeback_control *);
1431extern int afs_writepages(struct address_space *, struct writeback_control *);
1432extern ssize_t afs_file_write(struct kiocb *, struct iov_iter *);
1433extern int afs_fsync(struct file *, loff_t, loff_t, int);
1434extern vm_fault_t afs_page_mkwrite(struct vm_fault *vmf);
1435extern void afs_prune_wb_keys(struct afs_vnode *);
1436extern int afs_launder_page(struct page *);
1437
1438
1439
1440
1441extern const struct xattr_handler *afs_xattr_handlers[];
1442extern ssize_t afs_listxattr(struct dentry *, char *, size_t);
1443
1444
1445
1446
1447extern void yfs_fs_fetch_data(struct afs_operation *);
1448extern void yfs_fs_create_file(struct afs_operation *);
1449extern void yfs_fs_make_dir(struct afs_operation *);
1450extern void yfs_fs_remove_file2(struct afs_operation *);
1451extern void yfs_fs_remove_file(struct afs_operation *);
1452extern void yfs_fs_remove_dir(struct afs_operation *);
1453extern void yfs_fs_link(struct afs_operation *);
1454extern void yfs_fs_symlink(struct afs_operation *);
1455extern void yfs_fs_rename(struct afs_operation *);
1456extern void yfs_fs_store_data(struct afs_operation *);
1457extern void yfs_fs_setattr(struct afs_operation *);
1458extern void yfs_fs_get_volume_status(struct afs_operation *);
1459extern void yfs_fs_set_lock(struct afs_operation *);
1460extern void yfs_fs_extend_lock(struct afs_operation *);
1461extern void yfs_fs_release_lock(struct afs_operation *);
1462extern void yfs_fs_fetch_status(struct afs_operation *);
1463extern void yfs_fs_inline_bulk_status(struct afs_operation *);
1464
1465struct yfs_acl {
1466 struct afs_acl *acl;
1467 struct afs_acl *vol_acl;
1468 u32 inherit_flag;
1469 u32 num_cleaned;
1470 unsigned int flags;
1471#define YFS_ACL_WANT_ACL 0x01
1472#define YFS_ACL_WANT_VOL_ACL 0x02
1473};
1474
1475extern void yfs_free_opaque_acl(struct yfs_acl *);
1476extern void yfs_fs_fetch_opaque_acl(struct afs_operation *);
1477extern void yfs_fs_store_opaque_acl2(struct afs_operation *);
1478
1479
1480
1481
1482static inline struct afs_vnode *AFS_FS_I(struct inode *inode)
1483{
1484 return container_of(inode, struct afs_vnode, vfs_inode);
1485}
1486
1487static inline struct inode *AFS_VNODE_TO_I(struct afs_vnode *vnode)
1488{
1489 return &vnode->vfs_inode;
1490}
1491
1492
1493
1494
1495
1496
1497static inline void afs_update_dentry_version(struct afs_operation *op,
1498 struct afs_vnode_param *dir_vp,
1499 struct dentry *dentry)
1500{
1501 if (!op->error)
1502 dentry->d_fsdata =
1503 (void *)(unsigned long)dir_vp->scb.status.data_version;
1504}
1505
1506
1507
1508
1509
1510
1511static inline void afs_check_dir_conflict(struct afs_operation *op,
1512 struct afs_vnode_param *dvp)
1513{
1514 if (dvp->dv_before + dvp->dv_delta != dvp->scb.status.data_version)
1515 op->flags |= AFS_OPERATION_DIR_CONFLICT;
1516}
1517
1518static inline int afs_io_error(struct afs_call *call, enum afs_io_error where)
1519{
1520 trace_afs_io_error(call->debug_id, -EIO, where);
1521 return -EIO;
1522}
1523
1524static inline int afs_bad(struct afs_vnode *vnode, enum afs_file_error where)
1525{
1526 trace_afs_file_error(vnode, -EIO, where);
1527 return -EIO;
1528}
1529
1530
1531
1532
1533
1534extern unsigned afs_debug;
1535
1536#define dbgprintk(FMT,...) \
1537 printk("[%-6.6s] "FMT"\n", current->comm ,##__VA_ARGS__)
1538
1539#define kenter(FMT,...) dbgprintk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
1540#define kleave(FMT,...) dbgprintk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
1541#define kdebug(FMT,...) dbgprintk(" "FMT ,##__VA_ARGS__)
1542
1543
1544#if defined(__KDEBUG)
1545#define _enter(FMT,...) kenter(FMT,##__VA_ARGS__)
1546#define _leave(FMT,...) kleave(FMT,##__VA_ARGS__)
1547#define _debug(FMT,...) kdebug(FMT,##__VA_ARGS__)
1548
1549#elif defined(CONFIG_AFS_DEBUG)
1550#define AFS_DEBUG_KENTER 0x01
1551#define AFS_DEBUG_KLEAVE 0x02
1552#define AFS_DEBUG_KDEBUG 0x04
1553
1554#define _enter(FMT,...) \
1555do { \
1556 if (unlikely(afs_debug & AFS_DEBUG_KENTER)) \
1557 kenter(FMT,##__VA_ARGS__); \
1558} while (0)
1559
1560#define _leave(FMT,...) \
1561do { \
1562 if (unlikely(afs_debug & AFS_DEBUG_KLEAVE)) \
1563 kleave(FMT,##__VA_ARGS__); \
1564} while (0)
1565
1566#define _debug(FMT,...) \
1567do { \
1568 if (unlikely(afs_debug & AFS_DEBUG_KDEBUG)) \
1569 kdebug(FMT,##__VA_ARGS__); \
1570} while (0)
1571
1572#else
1573#define _enter(FMT,...) no_printk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
1574#define _leave(FMT,...) no_printk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
1575#define _debug(FMT,...) no_printk(" "FMT ,##__VA_ARGS__)
1576#endif
1577
1578
1579
1580
1581#if 1
1582
1583#define ASSERT(X) \
1584do { \
1585 if (unlikely(!(X))) { \
1586 printk(KERN_ERR "\n"); \
1587 printk(KERN_ERR "AFS: Assertion failed\n"); \
1588 BUG(); \
1589 } \
1590} while(0)
1591
1592#define ASSERTCMP(X, OP, Y) \
1593do { \
1594 if (unlikely(!((X) OP (Y)))) { \
1595 printk(KERN_ERR "\n"); \
1596 printk(KERN_ERR "AFS: Assertion failed\n"); \
1597 printk(KERN_ERR "%lu " #OP " %lu is false\n", \
1598 (unsigned long)(X), (unsigned long)(Y)); \
1599 printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
1600 (unsigned long)(X), (unsigned long)(Y)); \
1601 BUG(); \
1602 } \
1603} while(0)
1604
1605#define ASSERTRANGE(L, OP1, N, OP2, H) \
1606do { \
1607 if (unlikely(!((L) OP1 (N)) || !((N) OP2 (H)))) { \
1608 printk(KERN_ERR "\n"); \
1609 printk(KERN_ERR "AFS: Assertion failed\n"); \
1610 printk(KERN_ERR "%lu "#OP1" %lu "#OP2" %lu is false\n", \
1611 (unsigned long)(L), (unsigned long)(N), \
1612 (unsigned long)(H)); \
1613 printk(KERN_ERR "0x%lx "#OP1" 0x%lx "#OP2" 0x%lx is false\n", \
1614 (unsigned long)(L), (unsigned long)(N), \
1615 (unsigned long)(H)); \
1616 BUG(); \
1617 } \
1618} while(0)
1619
1620#define ASSERTIF(C, X) \
1621do { \
1622 if (unlikely((C) && !(X))) { \
1623 printk(KERN_ERR "\n"); \
1624 printk(KERN_ERR "AFS: Assertion failed\n"); \
1625 BUG(); \
1626 } \
1627} while(0)
1628
1629#define ASSERTIFCMP(C, X, OP, Y) \
1630do { \
1631 if (unlikely((C) && !((X) OP (Y)))) { \
1632 printk(KERN_ERR "\n"); \
1633 printk(KERN_ERR "AFS: Assertion failed\n"); \
1634 printk(KERN_ERR "%lu " #OP " %lu is false\n", \
1635 (unsigned long)(X), (unsigned long)(Y)); \
1636 printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
1637 (unsigned long)(X), (unsigned long)(Y)); \
1638 BUG(); \
1639 } \
1640} while(0)
1641
1642#else
1643
1644#define ASSERT(X) \
1645do { \
1646} while(0)
1647
1648#define ASSERTCMP(X, OP, Y) \
1649do { \
1650} while(0)
1651
1652#define ASSERTRANGE(L, OP1, N, OP2, H) \
1653do { \
1654} while(0)
1655
1656#define ASSERTIF(C, X) \
1657do { \
1658} while(0)
1659
1660#define ASSERTIFCMP(C, X, OP, Y) \
1661do { \
1662} while(0)
1663
1664#endif
1665