1
2
3
4
5
6
7
8
9
10
11
12#include <linux/compiler.h>
13#include <linux/kernel.h>
14#include <linux/ktime.h>
15#include <linux/fs.h>
16#include <linux/pagemap.h>
17#include <linux/rxrpc.h>
18#include <linux/key.h>
19#include <linux/workqueue.h>
20#include <linux/sched.h>
21#include <linux/fscache.h>
22#include <linux/backing-dev.h>
23#include <linux/uuid.h>
24#include <net/af_rxrpc.h>
25
26#include "afs.h"
27#include "afs_vl.h"
28
29#define AFS_CELL_MAX_ADDRS 15
30
31struct pagevec;
32struct afs_call;
33
34typedef enum {
35 AFS_VL_NEW,
36 AFS_VL_CREATING,
37 AFS_VL_VALID,
38 AFS_VL_NO_VOLUME,
39 AFS_VL_UPDATING,
40 AFS_VL_VOLUME_DELETED,
41 AFS_VL_UNCERTAIN,
42} __attribute__((packed)) afs_vlocation_state_t;
43
44struct afs_mount_params {
45 bool rwpath;
46 bool force;
47 bool autocell;
48 afs_voltype_t type;
49 int volnamesz;
50 const char *volname;
51 struct afs_cell *cell;
52 struct afs_volume *volume;
53 struct key *key;
54};
55
56enum afs_call_state {
57 AFS_CALL_REQUESTING,
58 AFS_CALL_AWAIT_REPLY,
59 AFS_CALL_AWAIT_OP_ID,
60 AFS_CALL_AWAIT_REQUEST,
61 AFS_CALL_REPLYING,
62 AFS_CALL_AWAIT_ACK,
63 AFS_CALL_COMPLETE,
64};
65
66
67
68struct afs_call {
69 const struct afs_call_type *type;
70 wait_queue_head_t waitq;
71 struct work_struct async_work;
72 struct work_struct work;
73 struct rxrpc_call *rxcall;
74 struct key *key;
75 struct afs_server *server;
76 void *request;
77 struct address_space *mapping;
78 struct afs_writeback *wb;
79 void *buffer;
80 void *reply;
81 void *reply2;
82 void *reply3;
83 void *reply4;
84 pgoff_t first;
85 pgoff_t last;
86 size_t offset;
87 atomic_t usage;
88 enum afs_call_state state;
89 int error;
90 u32 abort_code;
91 unsigned request_size;
92 unsigned reply_max;
93 unsigned first_offset;
94 union {
95 unsigned last_to;
96 unsigned count2;
97 };
98 unsigned char unmarshall;
99 bool incoming;
100 bool send_pages;
101 bool need_attention;
102 bool async;
103 u16 service_id;
104 __be16 port;
105 u32 operation_ID;
106 u32 count;
107 __be32 tmp;
108 afs_dataversion_t store_version;
109};
110
111struct afs_call_type {
112 const char *name;
113
114
115
116
117 int (*deliver)(struct afs_call *call);
118
119
120 int (*abort_to_error)(u32 abort_code);
121
122
123 void (*destructor)(struct afs_call *call);
124
125
126 void (*work)(struct work_struct *work);
127};
128
129
130
131
132struct afs_read {
133 loff_t pos;
134 loff_t len;
135 loff_t actual_len;
136 loff_t remain;
137 atomic_t usage;
138 unsigned int index;
139 unsigned int nr_pages;
140 void (*page_done)(struct afs_call *, struct afs_read *);
141 struct page *pages[];
142};
143
144
145
146
147struct afs_writeback {
148 struct list_head link;
149 struct work_struct writer;
150 struct afs_vnode *vnode;
151 struct key *key;
152 wait_queue_head_t waitq;
153 pgoff_t first;
154 pgoff_t point;
155 pgoff_t last;
156 unsigned offset_first;
157 unsigned to_last;
158 int num_conflicts;
159 int usage;
160 bool conflicts;
161 enum {
162 AFS_WBACK_SYNCING,
163 AFS_WBACK_PENDING,
164 AFS_WBACK_CONFLICTING,
165 AFS_WBACK_WRITING,
166 AFS_WBACK_COMPLETE
167 } state __attribute__((packed));
168};
169
170
171
172
173
174struct afs_super_info {
175 struct afs_volume *volume;
176 char rwparent;
177};
178
179static inline struct afs_super_info *AFS_FS_S(struct super_block *sb)
180{
181 return sb->s_fs_info;
182}
183
184extern struct file_system_type afs_fs_type;
185
186
187
188
189struct afs_cache_cell {
190 char name[AFS_MAXCELLNAME];
191 struct in_addr vl_servers[15];
192};
193
194
195
196
197struct afs_cell {
198 atomic_t usage;
199 struct list_head link;
200 struct key *anonymous_key;
201 struct list_head proc_link;
202#ifdef CONFIG_AFS_FSCACHE
203 struct fscache_cookie *cache;
204#endif
205
206
207 rwlock_t servers_lock;
208 struct list_head servers;
209
210
211 struct rw_semaphore vl_sem;
212 struct list_head vl_list;
213 spinlock_t vl_lock;
214 unsigned short vl_naddrs;
215 unsigned short vl_curr_svix;
216 struct in_addr vl_addrs[AFS_CELL_MAX_ADDRS];
217
218 char name[0];
219};
220
221
222
223
224struct afs_cache_vlocation {
225
226 uint8_t name[AFS_MAXVOLNAME + 1];
227
228 uint8_t nservers;
229 uint8_t vidmask;
230 uint8_t srvtmask[8];
231#define AFS_VOL_VTM_RW 0x01
232#define AFS_VOL_VTM_RO 0x02
233#define AFS_VOL_VTM_BAK 0x04
234
235 afs_volid_t vid[3];
236 struct in_addr servers[8];
237 time_t rtime;
238};
239
240
241
242
243struct afs_cache_vhash {
244 afs_voltype_t vtype;
245 uint8_t hash_bucket;
246} __attribute__((packed));
247
248
249
250
251struct afs_vlocation {
252 atomic_t usage;
253 time64_t time_of_death;
254 struct list_head link;
255 struct list_head grave;
256 struct list_head update;
257 struct afs_cell *cell;
258#ifdef CONFIG_AFS_FSCACHE
259 struct fscache_cookie *cache;
260#endif
261 struct afs_cache_vlocation vldb;
262 struct afs_volume *vols[3];
263 wait_queue_head_t waitq;
264 time64_t update_at;
265 spinlock_t lock;
266 afs_vlocation_state_t state;
267 unsigned short upd_rej_cnt;
268 unsigned short upd_busy_cnt;
269 bool valid;
270};
271
272
273
274
275struct afs_server {
276 atomic_t usage;
277 time64_t time_of_death;
278 struct in_addr addr;
279 struct afs_cell *cell;
280 struct list_head link;
281 struct list_head grave;
282 struct rb_node master_rb;
283 struct rw_semaphore sem;
284
285
286 struct rb_root fs_vnodes;
287 unsigned long fs_act_jif;
288 unsigned long fs_dead_jif;
289 spinlock_t fs_lock;
290 int fs_state;
291
292
293 struct rb_root cb_promises;
294 struct delayed_work cb_updater;
295 struct delayed_work cb_break_work;
296 wait_queue_head_t cb_break_waitq;
297 spinlock_t cb_lock;
298 struct afs_callback cb_break[64];
299 atomic_t cb_break_n;
300 u8 cb_break_head;
301 u8 cb_break_tail;
302};
303
304
305
306
307struct afs_volume {
308 atomic_t usage;
309 struct afs_cell *cell;
310 struct afs_vlocation *vlocation;
311#ifdef CONFIG_AFS_FSCACHE
312 struct fscache_cookie *cache;
313#endif
314 afs_volid_t vid;
315 afs_voltype_t type;
316 char type_force;
317 unsigned short nservers;
318 unsigned short rjservers;
319 struct afs_server *servers[8];
320 struct rw_semaphore server_sem;
321};
322
323
324
325
326struct afs_cache_vnode {
327 afs_vnodeid_t vnode_id;
328 unsigned vnode_unique;
329 afs_dataversion_t data_version;
330};
331
332
333
334
335struct afs_vnode {
336 struct inode vfs_inode;
337
338 struct afs_volume *volume;
339 struct afs_server *server;
340 struct afs_fid fid;
341 struct afs_file_status status;
342#ifdef CONFIG_AFS_FSCACHE
343 struct fscache_cookie *cache;
344#endif
345 struct afs_permits *permits;
346 struct mutex permits_lock;
347 struct mutex validate_lock;
348 wait_queue_head_t update_waitq;
349 int update_cnt;
350
351 spinlock_t writeback_lock;
352 spinlock_t lock;
353 unsigned long flags;
354#define AFS_VNODE_CB_BROKEN 0
355#define AFS_VNODE_UNSET 1
356#define AFS_VNODE_MODIFIED 2
357#define AFS_VNODE_ZAP_DATA 3
358#define AFS_VNODE_DELETED 4
359#define AFS_VNODE_MOUNTPOINT 5
360#define AFS_VNODE_LOCKING 6
361#define AFS_VNODE_READLOCKED 7
362#define AFS_VNODE_WRITELOCKED 8
363#define AFS_VNODE_UNLOCKING 9
364#define AFS_VNODE_AUTOCELL 10
365#define AFS_VNODE_PSEUDODIR 11
366
367 long acl_order;
368
369 struct list_head writebacks;
370 struct list_head pending_locks;
371 struct list_head granted_locks;
372 struct delayed_work lock_work;
373 struct key *unlock_key;
374
375
376 struct rb_node server_rb;
377 struct rb_node cb_promise;
378 struct work_struct cb_broken_work;
379 time64_t cb_expires;
380 time64_t cb_expires_at;
381 unsigned cb_version;
382 unsigned cb_expiry;
383 afs_callback_type_t cb_type;
384 bool cb_promised;
385};
386
387
388
389
390struct afs_permit {
391 struct key *key;
392 afs_access_t access_mask;
393};
394
395
396
397
398struct afs_permits {
399 struct rcu_head rcu;
400 int count;
401 struct afs_permit permits[0];
402};
403
404
405
406
407struct afs_interface {
408 struct in_addr address;
409 struct in_addr netmask;
410 unsigned mtu;
411};
412
413struct afs_uuid {
414 __be32 time_low;
415 __be16 time_mid;
416 __be16 time_hi_and_version;
417 __u8 clock_seq_hi_and_reserved;
418 __u8 clock_seq_low;
419 __u8 node[6];
420};
421
422
423
424
425
426#ifdef CONFIG_AFS_FSCACHE
427extern struct fscache_netfs afs_cache_netfs;
428extern struct fscache_cookie_def afs_cell_cache_index_def;
429extern struct fscache_cookie_def afs_vlocation_cache_index_def;
430extern struct fscache_cookie_def afs_volume_cache_index_def;
431extern struct fscache_cookie_def afs_vnode_cache_index_def;
432#else
433#define afs_cell_cache_index_def (*(struct fscache_cookie_def *) NULL)
434#define afs_vlocation_cache_index_def (*(struct fscache_cookie_def *) NULL)
435#define afs_volume_cache_index_def (*(struct fscache_cookie_def *) NULL)
436#define afs_vnode_cache_index_def (*(struct fscache_cookie_def *) NULL)
437#endif
438
439
440
441
442extern void afs_init_callback_state(struct afs_server *);
443extern void afs_broken_callback_work(struct work_struct *);
444extern void afs_break_callbacks(struct afs_server *, size_t,
445 struct afs_callback[]);
446extern void afs_discard_callback_on_delete(struct afs_vnode *);
447extern void afs_give_up_callback(struct afs_vnode *);
448extern void afs_dispatch_give_up_callbacks(struct work_struct *);
449extern void afs_flush_callback_breaks(struct afs_server *);
450extern int __init afs_callback_update_init(void);
451extern void afs_callback_update_kill(void);
452
453
454
455
456extern struct rw_semaphore afs_proc_cells_sem;
457extern struct list_head afs_proc_cells;
458
459#define afs_get_cell(C) do { atomic_inc(&(C)->usage); } while(0)
460extern int afs_cell_init(char *);
461extern struct afs_cell *afs_cell_create(const char *, unsigned, char *, bool);
462extern struct afs_cell *afs_cell_lookup(const char *, unsigned, bool);
463extern struct afs_cell *afs_grab_cell(struct afs_cell *);
464extern void afs_put_cell(struct afs_cell *);
465extern void afs_cell_purge(void);
466
467
468
469
470extern bool afs_cm_incoming_call(struct afs_call *);
471
472
473
474
475extern const struct inode_operations afs_dir_inode_operations;
476extern const struct dentry_operations afs_fs_dentry_operations;
477extern const struct file_operations afs_dir_file_operations;
478
479
480
481
482extern const struct address_space_operations afs_fs_aops;
483extern const struct inode_operations afs_file_inode_operations;
484extern const struct file_operations afs_file_operations;
485
486extern int afs_open(struct inode *, struct file *);
487extern int afs_release(struct inode *, struct file *);
488extern int afs_page_filler(void *, struct page *);
489extern void afs_put_read(struct afs_read *);
490
491
492
493
494extern void __exit afs_kill_lock_manager(void);
495extern void afs_lock_work(struct work_struct *);
496extern void afs_lock_may_be_available(struct afs_vnode *);
497extern int afs_lock(struct file *, int, struct file_lock *);
498extern int afs_flock(struct file *, int, struct file_lock *);
499
500
501
502
503extern int afs_fs_fetch_file_status(struct afs_server *, struct key *,
504 struct afs_vnode *, struct afs_volsync *,
505 bool);
506extern int afs_fs_give_up_callbacks(struct afs_server *, bool);
507extern int afs_fs_fetch_data(struct afs_server *, struct key *,
508 struct afs_vnode *, struct afs_read *, bool);
509extern int afs_fs_create(struct afs_server *, struct key *,
510 struct afs_vnode *, const char *, umode_t,
511 struct afs_fid *, struct afs_file_status *,
512 struct afs_callback *, bool);
513extern int afs_fs_remove(struct afs_server *, struct key *,
514 struct afs_vnode *, const char *, bool, bool);
515extern int afs_fs_link(struct afs_server *, struct key *, struct afs_vnode *,
516 struct afs_vnode *, const char *, bool);
517extern int afs_fs_symlink(struct afs_server *, struct key *,
518 struct afs_vnode *, const char *, const char *,
519 struct afs_fid *, struct afs_file_status *, bool);
520extern int afs_fs_rename(struct afs_server *, struct key *,
521 struct afs_vnode *, const char *,
522 struct afs_vnode *, const char *, bool);
523extern int afs_fs_store_data(struct afs_server *, struct afs_writeback *,
524 pgoff_t, pgoff_t, unsigned, unsigned, bool);
525extern int afs_fs_setattr(struct afs_server *, struct key *,
526 struct afs_vnode *, struct iattr *, bool);
527extern int afs_fs_get_volume_status(struct afs_server *, struct key *,
528 struct afs_vnode *,
529 struct afs_volume_status *, bool);
530extern int afs_fs_set_lock(struct afs_server *, struct key *,
531 struct afs_vnode *, afs_lock_type_t, bool);
532extern int afs_fs_extend_lock(struct afs_server *, struct key *,
533 struct afs_vnode *, bool);
534extern int afs_fs_release_lock(struct afs_server *, struct key *,
535 struct afs_vnode *, bool);
536
537
538
539
540extern struct inode *afs_iget_autocell(struct inode *, const char *, int,
541 struct key *);
542extern struct inode *afs_iget(struct super_block *, struct key *,
543 struct afs_fid *, struct afs_file_status *,
544 struct afs_callback *);
545extern void afs_zap_data(struct afs_vnode *);
546extern int afs_validate(struct afs_vnode *, struct key *);
547extern int afs_getattr(const struct path *, struct kstat *, u32, unsigned int);
548extern int afs_setattr(struct dentry *, struct iattr *);
549extern void afs_evict_inode(struct inode *);
550extern int afs_drop_inode(struct inode *);
551
552
553
554
555extern struct workqueue_struct *afs_wq;
556extern struct afs_uuid afs_uuid;
557
558
559
560
561extern int afs_abort_to_error(u32);
562
563
564
565
566extern const struct inode_operations afs_mntpt_inode_operations;
567extern const struct inode_operations afs_autocell_inode_operations;
568extern const struct file_operations afs_mntpt_file_operations;
569
570extern struct vfsmount *afs_d_automount(struct path *);
571extern void afs_mntpt_kill_timer(void);
572
573
574
575
576extern int afs_get_ipv4_interfaces(struct afs_interface *, size_t, bool);
577
578
579
580
581extern int afs_proc_init(void);
582extern void afs_proc_cleanup(void);
583extern int afs_proc_cell_setup(struct afs_cell *);
584extern void afs_proc_cell_remove(struct afs_cell *);
585
586
587
588
589extern struct socket *afs_socket;
590extern atomic_t afs_outstanding_calls;
591
592extern int afs_open_socket(void);
593extern void afs_close_socket(void);
594extern void afs_put_call(struct afs_call *);
595extern int afs_queue_call_work(struct afs_call *);
596extern int afs_make_call(struct in_addr *, struct afs_call *, gfp_t, bool);
597extern struct afs_call *afs_alloc_flat_call(const struct afs_call_type *,
598 size_t, size_t);
599extern void afs_flat_call_destructor(struct afs_call *);
600extern void afs_send_empty_reply(struct afs_call *);
601extern void afs_send_simple_reply(struct afs_call *, const void *, size_t);
602extern int afs_extract_data(struct afs_call *, void *, size_t, bool);
603
604static inline int afs_transfer_reply(struct afs_call *call)
605{
606 return afs_extract_data(call, call->buffer, call->reply_max, false);
607}
608
609
610
611
612extern void afs_clear_permits(struct afs_vnode *);
613extern void afs_cache_permit(struct afs_vnode *, struct key *, long);
614extern void afs_zap_permits(struct rcu_head *);
615extern struct key *afs_request_key(struct afs_cell *);
616extern int afs_permission(struct inode *, int);
617
618
619
620
621extern spinlock_t afs_server_peer_lock;
622
623#define afs_get_server(S) \
624do { \
625 _debug("GET SERVER %d", atomic_read(&(S)->usage)); \
626 atomic_inc(&(S)->usage); \
627} while(0)
628
629extern struct afs_server *afs_lookup_server(struct afs_cell *,
630 const struct in_addr *);
631extern struct afs_server *afs_find_server(const struct sockaddr_rxrpc *);
632extern void afs_put_server(struct afs_server *);
633extern void __exit afs_purge_servers(void);
634
635
636
637
638extern int afs_fs_init(void);
639extern void afs_fs_exit(void);
640
641
642
643
644extern int afs_vl_get_entry_by_name(struct in_addr *, struct key *,
645 const char *, struct afs_cache_vlocation *,
646 bool);
647extern int afs_vl_get_entry_by_id(struct in_addr *, struct key *,
648 afs_volid_t, afs_voltype_t,
649 struct afs_cache_vlocation *, bool);
650
651
652
653
654#define afs_get_vlocation(V) do { atomic_inc(&(V)->usage); } while(0)
655
656extern int __init afs_vlocation_update_init(void);
657extern struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *,
658 struct key *,
659 const char *, size_t);
660extern void afs_put_vlocation(struct afs_vlocation *);
661extern void afs_vlocation_purge(void);
662
663
664
665
666static inline struct afs_vnode *AFS_FS_I(struct inode *inode)
667{
668 return container_of(inode, struct afs_vnode, vfs_inode);
669}
670
671static inline struct inode *AFS_VNODE_TO_I(struct afs_vnode *vnode)
672{
673 return &vnode->vfs_inode;
674}
675
676extern void afs_vnode_finalise_status_update(struct afs_vnode *,
677 struct afs_server *);
678extern int afs_vnode_fetch_status(struct afs_vnode *, struct afs_vnode *,
679 struct key *);
680extern int afs_vnode_fetch_data(struct afs_vnode *, struct key *,
681 struct afs_read *);
682extern int afs_vnode_create(struct afs_vnode *, struct key *, const char *,
683 umode_t, struct afs_fid *, struct afs_file_status *,
684 struct afs_callback *, struct afs_server **);
685extern int afs_vnode_remove(struct afs_vnode *, struct key *, const char *,
686 bool);
687extern int afs_vnode_link(struct afs_vnode *, struct afs_vnode *, struct key *,
688 const char *);
689extern int afs_vnode_symlink(struct afs_vnode *, struct key *, const char *,
690 const char *, struct afs_fid *,
691 struct afs_file_status *, struct afs_server **);
692extern int afs_vnode_rename(struct afs_vnode *, struct afs_vnode *,
693 struct key *, const char *, const char *);
694extern int afs_vnode_store_data(struct afs_writeback *, pgoff_t, pgoff_t,
695 unsigned, unsigned);
696extern int afs_vnode_setattr(struct afs_vnode *, struct key *, struct iattr *);
697extern int afs_vnode_get_volume_status(struct afs_vnode *, struct key *,
698 struct afs_volume_status *);
699extern int afs_vnode_set_lock(struct afs_vnode *, struct key *,
700 afs_lock_type_t);
701extern int afs_vnode_extend_lock(struct afs_vnode *, struct key *);
702extern int afs_vnode_release_lock(struct afs_vnode *, struct key *);
703
704
705
706
707#define afs_get_volume(V) do { atomic_inc(&(V)->usage); } while(0)
708
709extern void afs_put_volume(struct afs_volume *);
710extern struct afs_volume *afs_volume_lookup(struct afs_mount_params *);
711extern struct afs_server *afs_volume_pick_fileserver(struct afs_vnode *);
712extern int afs_volume_release_fileserver(struct afs_vnode *,
713 struct afs_server *, int);
714
715
716
717
718extern int afs_set_page_dirty(struct page *);
719extern void afs_put_writeback(struct afs_writeback *);
720extern int afs_write_begin(struct file *file, struct address_space *mapping,
721 loff_t pos, unsigned len, unsigned flags,
722 struct page **pagep, void **fsdata);
723extern int afs_write_end(struct file *file, struct address_space *mapping,
724 loff_t pos, unsigned len, unsigned copied,
725 struct page *page, void *fsdata);
726extern int afs_writepage(struct page *, struct writeback_control *);
727extern int afs_writepages(struct address_space *, struct writeback_control *);
728extern void afs_pages_written_back(struct afs_vnode *, struct afs_call *);
729extern ssize_t afs_file_write(struct kiocb *, struct iov_iter *);
730extern int afs_writeback_all(struct afs_vnode *);
731extern int afs_flush(struct file *, fl_owner_t);
732extern int afs_fsync(struct file *, loff_t, loff_t, int);
733
734
735
736
737extern const struct xattr_handler *afs_xattr_handlers[];
738extern ssize_t afs_listxattr(struct dentry *, char *, size_t);
739
740
741
742
743
744#include <trace/events/afs.h>
745
746extern unsigned afs_debug;
747
748#define dbgprintk(FMT,...) \
749 printk("[%-6.6s] "FMT"\n", current->comm ,##__VA_ARGS__)
750
751#define kenter(FMT,...) dbgprintk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
752#define kleave(FMT,...) dbgprintk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
753#define kdebug(FMT,...) dbgprintk(" "FMT ,##__VA_ARGS__)
754
755
756#if defined(__KDEBUG)
757#define _enter(FMT,...) kenter(FMT,##__VA_ARGS__)
758#define _leave(FMT,...) kleave(FMT,##__VA_ARGS__)
759#define _debug(FMT,...) kdebug(FMT,##__VA_ARGS__)
760
761#elif defined(CONFIG_AFS_DEBUG)
762#define AFS_DEBUG_KENTER 0x01
763#define AFS_DEBUG_KLEAVE 0x02
764#define AFS_DEBUG_KDEBUG 0x04
765
766#define _enter(FMT,...) \
767do { \
768 if (unlikely(afs_debug & AFS_DEBUG_KENTER)) \
769 kenter(FMT,##__VA_ARGS__); \
770} while (0)
771
772#define _leave(FMT,...) \
773do { \
774 if (unlikely(afs_debug & AFS_DEBUG_KLEAVE)) \
775 kleave(FMT,##__VA_ARGS__); \
776} while (0)
777
778#define _debug(FMT,...) \
779do { \
780 if (unlikely(afs_debug & AFS_DEBUG_KDEBUG)) \
781 kdebug(FMT,##__VA_ARGS__); \
782} while (0)
783
784#else
785#define _enter(FMT,...) no_printk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
786#define _leave(FMT,...) no_printk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
787#define _debug(FMT,...) no_printk(" "FMT ,##__VA_ARGS__)
788#endif
789
790
791
792
793#if 1
794
795#define ASSERT(X) \
796do { \
797 if (unlikely(!(X))) { \
798 printk(KERN_ERR "\n"); \
799 printk(KERN_ERR "AFS: Assertion failed\n"); \
800 BUG(); \
801 } \
802} while(0)
803
804#define ASSERTCMP(X, OP, Y) \
805do { \
806 if (unlikely(!((X) OP (Y)))) { \
807 printk(KERN_ERR "\n"); \
808 printk(KERN_ERR "AFS: Assertion failed\n"); \
809 printk(KERN_ERR "%lu " #OP " %lu is false\n", \
810 (unsigned long)(X), (unsigned long)(Y)); \
811 printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
812 (unsigned long)(X), (unsigned long)(Y)); \
813 BUG(); \
814 } \
815} while(0)
816
817#define ASSERTRANGE(L, OP1, N, OP2, H) \
818do { \
819 if (unlikely(!((L) OP1 (N)) || !((N) OP2 (H)))) { \
820 printk(KERN_ERR "\n"); \
821 printk(KERN_ERR "AFS: Assertion failed\n"); \
822 printk(KERN_ERR "%lu "#OP1" %lu "#OP2" %lu is false\n", \
823 (unsigned long)(L), (unsigned long)(N), \
824 (unsigned long)(H)); \
825 printk(KERN_ERR "0x%lx "#OP1" 0x%lx "#OP2" 0x%lx is false\n", \
826 (unsigned long)(L), (unsigned long)(N), \
827 (unsigned long)(H)); \
828 BUG(); \
829 } \
830} while(0)
831
832#define ASSERTIF(C, X) \
833do { \
834 if (unlikely((C) && !(X))) { \
835 printk(KERN_ERR "\n"); \
836 printk(KERN_ERR "AFS: Assertion failed\n"); \
837 BUG(); \
838 } \
839} while(0)
840
841#define ASSERTIFCMP(C, X, OP, Y) \
842do { \
843 if (unlikely((C) && !((X) OP (Y)))) { \
844 printk(KERN_ERR "\n"); \
845 printk(KERN_ERR "AFS: Assertion failed\n"); \
846 printk(KERN_ERR "%lu " #OP " %lu is false\n", \
847 (unsigned long)(X), (unsigned long)(Y)); \
848 printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n", \
849 (unsigned long)(X), (unsigned long)(Y)); \
850 BUG(); \
851 } \
852} while(0)
853
854#else
855
856#define ASSERT(X) \
857do { \
858} while(0)
859
860#define ASSERTCMP(X, OP, Y) \
861do { \
862} while(0)
863
864#define ASSERTRANGE(L, OP1, N, OP2, H) \
865do { \
866} while(0)
867
868#define ASSERTIF(C, X) \
869do { \
870} while(0)
871
872#define ASSERTIFCMP(C, X, OP, Y) \
873do { \
874} while(0)
875
876#endif
877