xref: /OK3568_Linux_fs/kernel/fs/fscache/internal.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /* Internal definitions for FS-Cache
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2004-2007 Red Hat, Inc. All Rights Reserved.
5*4882a593Smuzhiyun  * Written by David Howells (dhowells@redhat.com)
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun /*
9*4882a593Smuzhiyun  * Lock order, in the order in which multiple locks should be obtained:
10*4882a593Smuzhiyun  * - fscache_addremove_sem
11*4882a593Smuzhiyun  * - cookie->lock
12*4882a593Smuzhiyun  * - cookie->parent->lock
13*4882a593Smuzhiyun  * - cache->object_list_lock
14*4882a593Smuzhiyun  * - object->lock
15*4882a593Smuzhiyun  * - object->parent->lock
16*4882a593Smuzhiyun  * - cookie->stores_lock
17*4882a593Smuzhiyun  * - fscache_thread_lock
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  */
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #ifdef pr_fmt
22*4882a593Smuzhiyun #undef pr_fmt
23*4882a593Smuzhiyun #endif
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define pr_fmt(fmt) "FS-Cache: " fmt
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include <linux/fscache-cache.h>
28*4882a593Smuzhiyun #include <trace/events/fscache.h>
29*4882a593Smuzhiyun #include <linux/sched.h>
30*4882a593Smuzhiyun #include <linux/seq_file.h>
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define FSCACHE_MIN_THREADS	4
33*4882a593Smuzhiyun #define FSCACHE_MAX_THREADS	32
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /*
36*4882a593Smuzhiyun  * cache.c
37*4882a593Smuzhiyun  */
38*4882a593Smuzhiyun extern struct list_head fscache_cache_list;
39*4882a593Smuzhiyun extern struct rw_semaphore fscache_addremove_sem;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun extern struct fscache_cache *fscache_select_cache_for_object(
42*4882a593Smuzhiyun 	struct fscache_cookie *);
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun  * cookie.c
46*4882a593Smuzhiyun  */
47*4882a593Smuzhiyun extern struct kmem_cache *fscache_cookie_jar;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun extern void fscache_free_cookie(struct fscache_cookie *);
50*4882a593Smuzhiyun extern struct fscache_cookie *fscache_alloc_cookie(struct fscache_cookie *,
51*4882a593Smuzhiyun 						   const struct fscache_cookie_def *,
52*4882a593Smuzhiyun 						   const void *, size_t,
53*4882a593Smuzhiyun 						   const void *, size_t,
54*4882a593Smuzhiyun 						   void *, loff_t);
55*4882a593Smuzhiyun extern struct fscache_cookie *fscache_hash_cookie(struct fscache_cookie *);
56*4882a593Smuzhiyun extern void fscache_cookie_put(struct fscache_cookie *,
57*4882a593Smuzhiyun 			       enum fscache_cookie_trace);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /*
60*4882a593Smuzhiyun  * fsdef.c
61*4882a593Smuzhiyun  */
62*4882a593Smuzhiyun extern struct fscache_cookie fscache_fsdef_index;
63*4882a593Smuzhiyun extern struct fscache_cookie_def fscache_fsdef_netfs_def;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /*
66*4882a593Smuzhiyun  * histogram.c
67*4882a593Smuzhiyun  */
68*4882a593Smuzhiyun #ifdef CONFIG_FSCACHE_HISTOGRAM
69*4882a593Smuzhiyun extern atomic_t fscache_obj_instantiate_histogram[HZ];
70*4882a593Smuzhiyun extern atomic_t fscache_objs_histogram[HZ];
71*4882a593Smuzhiyun extern atomic_t fscache_ops_histogram[HZ];
72*4882a593Smuzhiyun extern atomic_t fscache_retrieval_delay_histogram[HZ];
73*4882a593Smuzhiyun extern atomic_t fscache_retrieval_histogram[HZ];
74*4882a593Smuzhiyun 
fscache_hist(atomic_t histogram[],unsigned long start_jif)75*4882a593Smuzhiyun static inline void fscache_hist(atomic_t histogram[], unsigned long start_jif)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	unsigned long jif = jiffies - start_jif;
78*4882a593Smuzhiyun 	if (jif >= HZ)
79*4882a593Smuzhiyun 		jif = HZ - 1;
80*4882a593Smuzhiyun 	atomic_inc(&histogram[jif]);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun extern const struct seq_operations fscache_histogram_ops;
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #else
86*4882a593Smuzhiyun #define fscache_hist(hist, start_jif) do {} while (0)
87*4882a593Smuzhiyun #endif
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /*
90*4882a593Smuzhiyun  * main.c
91*4882a593Smuzhiyun  */
92*4882a593Smuzhiyun extern unsigned fscache_defer_lookup;
93*4882a593Smuzhiyun extern unsigned fscache_defer_create;
94*4882a593Smuzhiyun extern unsigned fscache_debug;
95*4882a593Smuzhiyun extern struct kobject *fscache_root;
96*4882a593Smuzhiyun extern struct workqueue_struct *fscache_object_wq;
97*4882a593Smuzhiyun extern struct workqueue_struct *fscache_op_wq;
98*4882a593Smuzhiyun DECLARE_PER_CPU(wait_queue_head_t, fscache_object_cong_wait);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun extern unsigned int fscache_hash(unsigned int salt, unsigned int *data, unsigned int n);
101*4882a593Smuzhiyun 
fscache_object_congested(void)102*4882a593Smuzhiyun static inline bool fscache_object_congested(void)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	return workqueue_congested(WORK_CPU_UNBOUND, fscache_object_wq);
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /*
108*4882a593Smuzhiyun  * object.c
109*4882a593Smuzhiyun  */
110*4882a593Smuzhiyun extern void fscache_enqueue_object(struct fscache_object *);
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /*
113*4882a593Smuzhiyun  * object-list.c
114*4882a593Smuzhiyun  */
115*4882a593Smuzhiyun #ifdef CONFIG_FSCACHE_OBJECT_LIST
116*4882a593Smuzhiyun extern const struct proc_ops fscache_objlist_proc_ops;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun extern void fscache_objlist_add(struct fscache_object *);
119*4882a593Smuzhiyun extern void fscache_objlist_remove(struct fscache_object *);
120*4882a593Smuzhiyun #else
121*4882a593Smuzhiyun #define fscache_objlist_add(object) do {} while(0)
122*4882a593Smuzhiyun #define fscache_objlist_remove(object) do {} while(0)
123*4882a593Smuzhiyun #endif
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun /*
126*4882a593Smuzhiyun  * operation.c
127*4882a593Smuzhiyun  */
128*4882a593Smuzhiyun extern int fscache_submit_exclusive_op(struct fscache_object *,
129*4882a593Smuzhiyun 				       struct fscache_operation *);
130*4882a593Smuzhiyun extern int fscache_submit_op(struct fscache_object *,
131*4882a593Smuzhiyun 			     struct fscache_operation *);
132*4882a593Smuzhiyun extern int fscache_cancel_op(struct fscache_operation *, bool);
133*4882a593Smuzhiyun extern void fscache_cancel_all_ops(struct fscache_object *);
134*4882a593Smuzhiyun extern void fscache_abort_object(struct fscache_object *);
135*4882a593Smuzhiyun extern void fscache_start_operations(struct fscache_object *);
136*4882a593Smuzhiyun extern void fscache_operation_gc(struct work_struct *);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /*
139*4882a593Smuzhiyun  * page.c
140*4882a593Smuzhiyun  */
141*4882a593Smuzhiyun extern int fscache_wait_for_deferred_lookup(struct fscache_cookie *);
142*4882a593Smuzhiyun extern int fscache_wait_for_operation_activation(struct fscache_object *,
143*4882a593Smuzhiyun 						 struct fscache_operation *,
144*4882a593Smuzhiyun 						 atomic_t *,
145*4882a593Smuzhiyun 						 atomic_t *);
146*4882a593Smuzhiyun extern void fscache_invalidate_writes(struct fscache_cookie *);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /*
149*4882a593Smuzhiyun  * proc.c
150*4882a593Smuzhiyun  */
151*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
152*4882a593Smuzhiyun extern int __init fscache_proc_init(void);
153*4882a593Smuzhiyun extern void fscache_proc_cleanup(void);
154*4882a593Smuzhiyun #else
155*4882a593Smuzhiyun #define fscache_proc_init()	(0)
156*4882a593Smuzhiyun #define fscache_proc_cleanup()	do {} while (0)
157*4882a593Smuzhiyun #endif
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /*
160*4882a593Smuzhiyun  * stats.c
161*4882a593Smuzhiyun  */
162*4882a593Smuzhiyun #ifdef CONFIG_FSCACHE_STATS
163*4882a593Smuzhiyun extern atomic_t fscache_n_ops_processed[FSCACHE_MAX_THREADS];
164*4882a593Smuzhiyun extern atomic_t fscache_n_objs_processed[FSCACHE_MAX_THREADS];
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun extern atomic_t fscache_n_op_pend;
167*4882a593Smuzhiyun extern atomic_t fscache_n_op_run;
168*4882a593Smuzhiyun extern atomic_t fscache_n_op_enqueue;
169*4882a593Smuzhiyun extern atomic_t fscache_n_op_deferred_release;
170*4882a593Smuzhiyun extern atomic_t fscache_n_op_initialised;
171*4882a593Smuzhiyun extern atomic_t fscache_n_op_release;
172*4882a593Smuzhiyun extern atomic_t fscache_n_op_gc;
173*4882a593Smuzhiyun extern atomic_t fscache_n_op_cancelled;
174*4882a593Smuzhiyun extern atomic_t fscache_n_op_rejected;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun extern atomic_t fscache_n_attr_changed;
177*4882a593Smuzhiyun extern atomic_t fscache_n_attr_changed_ok;
178*4882a593Smuzhiyun extern atomic_t fscache_n_attr_changed_nobufs;
179*4882a593Smuzhiyun extern atomic_t fscache_n_attr_changed_nomem;
180*4882a593Smuzhiyun extern atomic_t fscache_n_attr_changed_calls;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun extern atomic_t fscache_n_allocs;
183*4882a593Smuzhiyun extern atomic_t fscache_n_allocs_ok;
184*4882a593Smuzhiyun extern atomic_t fscache_n_allocs_wait;
185*4882a593Smuzhiyun extern atomic_t fscache_n_allocs_nobufs;
186*4882a593Smuzhiyun extern atomic_t fscache_n_allocs_intr;
187*4882a593Smuzhiyun extern atomic_t fscache_n_allocs_object_dead;
188*4882a593Smuzhiyun extern atomic_t fscache_n_alloc_ops;
189*4882a593Smuzhiyun extern atomic_t fscache_n_alloc_op_waits;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun extern atomic_t fscache_n_retrievals;
192*4882a593Smuzhiyun extern atomic_t fscache_n_retrievals_ok;
193*4882a593Smuzhiyun extern atomic_t fscache_n_retrievals_wait;
194*4882a593Smuzhiyun extern atomic_t fscache_n_retrievals_nodata;
195*4882a593Smuzhiyun extern atomic_t fscache_n_retrievals_nobufs;
196*4882a593Smuzhiyun extern atomic_t fscache_n_retrievals_intr;
197*4882a593Smuzhiyun extern atomic_t fscache_n_retrievals_nomem;
198*4882a593Smuzhiyun extern atomic_t fscache_n_retrievals_object_dead;
199*4882a593Smuzhiyun extern atomic_t fscache_n_retrieval_ops;
200*4882a593Smuzhiyun extern atomic_t fscache_n_retrieval_op_waits;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun extern atomic_t fscache_n_stores;
203*4882a593Smuzhiyun extern atomic_t fscache_n_stores_ok;
204*4882a593Smuzhiyun extern atomic_t fscache_n_stores_again;
205*4882a593Smuzhiyun extern atomic_t fscache_n_stores_nobufs;
206*4882a593Smuzhiyun extern atomic_t fscache_n_stores_oom;
207*4882a593Smuzhiyun extern atomic_t fscache_n_store_ops;
208*4882a593Smuzhiyun extern atomic_t fscache_n_store_calls;
209*4882a593Smuzhiyun extern atomic_t fscache_n_store_pages;
210*4882a593Smuzhiyun extern atomic_t fscache_n_store_radix_deletes;
211*4882a593Smuzhiyun extern atomic_t fscache_n_store_pages_over_limit;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun extern atomic_t fscache_n_store_vmscan_not_storing;
214*4882a593Smuzhiyun extern atomic_t fscache_n_store_vmscan_gone;
215*4882a593Smuzhiyun extern atomic_t fscache_n_store_vmscan_busy;
216*4882a593Smuzhiyun extern atomic_t fscache_n_store_vmscan_cancelled;
217*4882a593Smuzhiyun extern atomic_t fscache_n_store_vmscan_wait;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun extern atomic_t fscache_n_marks;
220*4882a593Smuzhiyun extern atomic_t fscache_n_uncaches;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun extern atomic_t fscache_n_acquires;
223*4882a593Smuzhiyun extern atomic_t fscache_n_acquires_null;
224*4882a593Smuzhiyun extern atomic_t fscache_n_acquires_no_cache;
225*4882a593Smuzhiyun extern atomic_t fscache_n_acquires_ok;
226*4882a593Smuzhiyun extern atomic_t fscache_n_acquires_nobufs;
227*4882a593Smuzhiyun extern atomic_t fscache_n_acquires_oom;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun extern atomic_t fscache_n_invalidates;
230*4882a593Smuzhiyun extern atomic_t fscache_n_invalidates_run;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun extern atomic_t fscache_n_updates;
233*4882a593Smuzhiyun extern atomic_t fscache_n_updates_null;
234*4882a593Smuzhiyun extern atomic_t fscache_n_updates_run;
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun extern atomic_t fscache_n_relinquishes;
237*4882a593Smuzhiyun extern atomic_t fscache_n_relinquishes_null;
238*4882a593Smuzhiyun extern atomic_t fscache_n_relinquishes_waitcrt;
239*4882a593Smuzhiyun extern atomic_t fscache_n_relinquishes_retire;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun extern atomic_t fscache_n_cookie_index;
242*4882a593Smuzhiyun extern atomic_t fscache_n_cookie_data;
243*4882a593Smuzhiyun extern atomic_t fscache_n_cookie_special;
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun extern atomic_t fscache_n_object_alloc;
246*4882a593Smuzhiyun extern atomic_t fscache_n_object_no_alloc;
247*4882a593Smuzhiyun extern atomic_t fscache_n_object_lookups;
248*4882a593Smuzhiyun extern atomic_t fscache_n_object_lookups_negative;
249*4882a593Smuzhiyun extern atomic_t fscache_n_object_lookups_positive;
250*4882a593Smuzhiyun extern atomic_t fscache_n_object_lookups_timed_out;
251*4882a593Smuzhiyun extern atomic_t fscache_n_object_created;
252*4882a593Smuzhiyun extern atomic_t fscache_n_object_avail;
253*4882a593Smuzhiyun extern atomic_t fscache_n_object_dead;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun extern atomic_t fscache_n_checkaux_none;
256*4882a593Smuzhiyun extern atomic_t fscache_n_checkaux_okay;
257*4882a593Smuzhiyun extern atomic_t fscache_n_checkaux_update;
258*4882a593Smuzhiyun extern atomic_t fscache_n_checkaux_obsolete;
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun extern atomic_t fscache_n_cop_alloc_object;
261*4882a593Smuzhiyun extern atomic_t fscache_n_cop_lookup_object;
262*4882a593Smuzhiyun extern atomic_t fscache_n_cop_lookup_complete;
263*4882a593Smuzhiyun extern atomic_t fscache_n_cop_grab_object;
264*4882a593Smuzhiyun extern atomic_t fscache_n_cop_invalidate_object;
265*4882a593Smuzhiyun extern atomic_t fscache_n_cop_update_object;
266*4882a593Smuzhiyun extern atomic_t fscache_n_cop_drop_object;
267*4882a593Smuzhiyun extern atomic_t fscache_n_cop_put_object;
268*4882a593Smuzhiyun extern atomic_t fscache_n_cop_sync_cache;
269*4882a593Smuzhiyun extern atomic_t fscache_n_cop_attr_changed;
270*4882a593Smuzhiyun extern atomic_t fscache_n_cop_read_or_alloc_page;
271*4882a593Smuzhiyun extern atomic_t fscache_n_cop_read_or_alloc_pages;
272*4882a593Smuzhiyun extern atomic_t fscache_n_cop_allocate_page;
273*4882a593Smuzhiyun extern atomic_t fscache_n_cop_allocate_pages;
274*4882a593Smuzhiyun extern atomic_t fscache_n_cop_write_page;
275*4882a593Smuzhiyun extern atomic_t fscache_n_cop_uncache_page;
276*4882a593Smuzhiyun extern atomic_t fscache_n_cop_dissociate_pages;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun extern atomic_t fscache_n_cache_no_space_reject;
279*4882a593Smuzhiyun extern atomic_t fscache_n_cache_stale_objects;
280*4882a593Smuzhiyun extern atomic_t fscache_n_cache_retired_objects;
281*4882a593Smuzhiyun extern atomic_t fscache_n_cache_culled_objects;
282*4882a593Smuzhiyun 
fscache_stat(atomic_t * stat)283*4882a593Smuzhiyun static inline void fscache_stat(atomic_t *stat)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun 	atomic_inc(stat);
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun 
fscache_stat_d(atomic_t * stat)288*4882a593Smuzhiyun static inline void fscache_stat_d(atomic_t *stat)
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun 	atomic_dec(stat);
291*4882a593Smuzhiyun }
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun #define __fscache_stat(stat) (stat)
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun int fscache_stats_show(struct seq_file *m, void *v);
296*4882a593Smuzhiyun #else
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun #define __fscache_stat(stat) (NULL)
299*4882a593Smuzhiyun #define fscache_stat(stat) do {} while (0)
300*4882a593Smuzhiyun #define fscache_stat_d(stat) do {} while (0)
301*4882a593Smuzhiyun #endif
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun /*
304*4882a593Smuzhiyun  * raise an event on an object
305*4882a593Smuzhiyun  * - if the event is not masked for that object, then the object is
306*4882a593Smuzhiyun  *   queued for attention by the thread pool.
307*4882a593Smuzhiyun  */
fscache_raise_event(struct fscache_object * object,unsigned event)308*4882a593Smuzhiyun static inline void fscache_raise_event(struct fscache_object *object,
309*4882a593Smuzhiyun 				       unsigned event)
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun 	BUG_ON(event >= NR_FSCACHE_OBJECT_EVENTS);
312*4882a593Smuzhiyun #if 0
313*4882a593Smuzhiyun 	printk("*** fscache_raise_event(OBJ%d{%lx},%x)\n",
314*4882a593Smuzhiyun 	       object->debug_id, object->event_mask, (1 << event));
315*4882a593Smuzhiyun #endif
316*4882a593Smuzhiyun 	if (!test_and_set_bit(event, &object->events) &&
317*4882a593Smuzhiyun 	    test_bit(event, &object->event_mask))
318*4882a593Smuzhiyun 		fscache_enqueue_object(object);
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun 
fscache_cookie_get(struct fscache_cookie * cookie,enum fscache_cookie_trace where)321*4882a593Smuzhiyun static inline void fscache_cookie_get(struct fscache_cookie *cookie,
322*4882a593Smuzhiyun 				      enum fscache_cookie_trace where)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun 	int usage = atomic_inc_return(&cookie->usage);
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	trace_fscache_cookie(cookie, where, usage);
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun /*
330*4882a593Smuzhiyun  * get an extra reference to a netfs retrieval context
331*4882a593Smuzhiyun  */
332*4882a593Smuzhiyun static inline
fscache_get_context(struct fscache_cookie * cookie,void * context)333*4882a593Smuzhiyun void *fscache_get_context(struct fscache_cookie *cookie, void *context)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun 	if (cookie->def->get_context)
336*4882a593Smuzhiyun 		cookie->def->get_context(cookie->netfs_data, context);
337*4882a593Smuzhiyun 	return context;
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun /*
341*4882a593Smuzhiyun  * release a reference to a netfs retrieval context
342*4882a593Smuzhiyun  */
343*4882a593Smuzhiyun static inline
fscache_put_context(struct fscache_cookie * cookie,void * context)344*4882a593Smuzhiyun void fscache_put_context(struct fscache_cookie *cookie, void *context)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun 	if (cookie->def->put_context)
347*4882a593Smuzhiyun 		cookie->def->put_context(cookie->netfs_data, context);
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun /*
351*4882a593Smuzhiyun  * Update the auxiliary data on a cookie.
352*4882a593Smuzhiyun  */
353*4882a593Smuzhiyun static inline
fscache_update_aux(struct fscache_cookie * cookie,const void * aux_data)354*4882a593Smuzhiyun void fscache_update_aux(struct fscache_cookie *cookie, const void *aux_data)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun 	void *p;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	if (!aux_data)
359*4882a593Smuzhiyun 		return;
360*4882a593Smuzhiyun 	if (cookie->aux_len <= sizeof(cookie->inline_aux))
361*4882a593Smuzhiyun 		p = cookie->inline_aux;
362*4882a593Smuzhiyun 	else
363*4882a593Smuzhiyun 		p = cookie->aux;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	if (memcmp(p, aux_data, cookie->aux_len) != 0) {
366*4882a593Smuzhiyun 		memcpy(p, aux_data, cookie->aux_len);
367*4882a593Smuzhiyun 		set_bit(FSCACHE_COOKIE_AUX_UPDATED, &cookie->flags);
368*4882a593Smuzhiyun 	}
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun /*****************************************************************************/
372*4882a593Smuzhiyun /*
373*4882a593Smuzhiyun  * debug tracing
374*4882a593Smuzhiyun  */
375*4882a593Smuzhiyun #define dbgprintk(FMT, ...) \
376*4882a593Smuzhiyun 	printk(KERN_DEBUG "[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun #define kenter(FMT, ...) dbgprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
379*4882a593Smuzhiyun #define kleave(FMT, ...) dbgprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
380*4882a593Smuzhiyun #define kdebug(FMT, ...) dbgprintk(FMT, ##__VA_ARGS__)
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun #define kjournal(FMT, ...) no_printk(FMT, ##__VA_ARGS__)
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun #ifdef __KDEBUG
385*4882a593Smuzhiyun #define _enter(FMT, ...) kenter(FMT, ##__VA_ARGS__)
386*4882a593Smuzhiyun #define _leave(FMT, ...) kleave(FMT, ##__VA_ARGS__)
387*4882a593Smuzhiyun #define _debug(FMT, ...) kdebug(FMT, ##__VA_ARGS__)
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun #elif defined(CONFIG_FSCACHE_DEBUG)
390*4882a593Smuzhiyun #define _enter(FMT, ...)			\
391*4882a593Smuzhiyun do {						\
392*4882a593Smuzhiyun 	if (__do_kdebug(ENTER))			\
393*4882a593Smuzhiyun 		kenter(FMT, ##__VA_ARGS__);	\
394*4882a593Smuzhiyun } while (0)
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun #define _leave(FMT, ...)			\
397*4882a593Smuzhiyun do {						\
398*4882a593Smuzhiyun 	if (__do_kdebug(LEAVE))			\
399*4882a593Smuzhiyun 		kleave(FMT, ##__VA_ARGS__);	\
400*4882a593Smuzhiyun } while (0)
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun #define _debug(FMT, ...)			\
403*4882a593Smuzhiyun do {						\
404*4882a593Smuzhiyun 	if (__do_kdebug(DEBUG))			\
405*4882a593Smuzhiyun 		kdebug(FMT, ##__VA_ARGS__);	\
406*4882a593Smuzhiyun } while (0)
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun #else
409*4882a593Smuzhiyun #define _enter(FMT, ...) no_printk("==> %s("FMT")", __func__, ##__VA_ARGS__)
410*4882a593Smuzhiyun #define _leave(FMT, ...) no_printk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
411*4882a593Smuzhiyun #define _debug(FMT, ...) no_printk(FMT, ##__VA_ARGS__)
412*4882a593Smuzhiyun #endif
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun /*
415*4882a593Smuzhiyun  * determine whether a particular optional debugging point should be logged
416*4882a593Smuzhiyun  * - we need to go through three steps to persuade cpp to correctly join the
417*4882a593Smuzhiyun  *   shorthand in FSCACHE_DEBUG_LEVEL with its prefix
418*4882a593Smuzhiyun  */
419*4882a593Smuzhiyun #define ____do_kdebug(LEVEL, POINT) \
420*4882a593Smuzhiyun 	unlikely((fscache_debug & \
421*4882a593Smuzhiyun 		  (FSCACHE_POINT_##POINT << (FSCACHE_DEBUG_ ## LEVEL * 3))))
422*4882a593Smuzhiyun #define ___do_kdebug(LEVEL, POINT) \
423*4882a593Smuzhiyun 	____do_kdebug(LEVEL, POINT)
424*4882a593Smuzhiyun #define __do_kdebug(POINT) \
425*4882a593Smuzhiyun 	___do_kdebug(FSCACHE_DEBUG_LEVEL, POINT)
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun #define FSCACHE_DEBUG_CACHE	0
428*4882a593Smuzhiyun #define FSCACHE_DEBUG_COOKIE	1
429*4882a593Smuzhiyun #define FSCACHE_DEBUG_PAGE	2
430*4882a593Smuzhiyun #define FSCACHE_DEBUG_OPERATION	3
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun #define FSCACHE_POINT_ENTER	1
433*4882a593Smuzhiyun #define FSCACHE_POINT_LEAVE	2
434*4882a593Smuzhiyun #define FSCACHE_POINT_DEBUG	4
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun #ifndef FSCACHE_DEBUG_LEVEL
437*4882a593Smuzhiyun #define FSCACHE_DEBUG_LEVEL CACHE
438*4882a593Smuzhiyun #endif
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun /*
441*4882a593Smuzhiyun  * assertions
442*4882a593Smuzhiyun  */
443*4882a593Smuzhiyun #if 1 /* defined(__KDEBUGALL) */
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun #define ASSERT(X)							\
446*4882a593Smuzhiyun do {									\
447*4882a593Smuzhiyun 	if (unlikely(!(X))) {						\
448*4882a593Smuzhiyun 		pr_err("\n");					\
449*4882a593Smuzhiyun 		pr_err("Assertion failed\n");	\
450*4882a593Smuzhiyun 		BUG();							\
451*4882a593Smuzhiyun 	}								\
452*4882a593Smuzhiyun } while (0)
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun #define ASSERTCMP(X, OP, Y)						\
455*4882a593Smuzhiyun do {									\
456*4882a593Smuzhiyun 	if (unlikely(!((X) OP (Y)))) {					\
457*4882a593Smuzhiyun 		pr_err("\n");					\
458*4882a593Smuzhiyun 		pr_err("Assertion failed\n");	\
459*4882a593Smuzhiyun 		pr_err("%lx " #OP " %lx is false\n",		\
460*4882a593Smuzhiyun 		       (unsigned long)(X), (unsigned long)(Y));		\
461*4882a593Smuzhiyun 		BUG();							\
462*4882a593Smuzhiyun 	}								\
463*4882a593Smuzhiyun } while (0)
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun #define ASSERTIF(C, X)							\
466*4882a593Smuzhiyun do {									\
467*4882a593Smuzhiyun 	if (unlikely((C) && !(X))) {					\
468*4882a593Smuzhiyun 		pr_err("\n");					\
469*4882a593Smuzhiyun 		pr_err("Assertion failed\n");	\
470*4882a593Smuzhiyun 		BUG();							\
471*4882a593Smuzhiyun 	}								\
472*4882a593Smuzhiyun } while (0)
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun #define ASSERTIFCMP(C, X, OP, Y)					\
475*4882a593Smuzhiyun do {									\
476*4882a593Smuzhiyun 	if (unlikely((C) && !((X) OP (Y)))) {				\
477*4882a593Smuzhiyun 		pr_err("\n");					\
478*4882a593Smuzhiyun 		pr_err("Assertion failed\n");	\
479*4882a593Smuzhiyun 		pr_err("%lx " #OP " %lx is false\n",		\
480*4882a593Smuzhiyun 		       (unsigned long)(X), (unsigned long)(Y));		\
481*4882a593Smuzhiyun 		BUG();							\
482*4882a593Smuzhiyun 	}								\
483*4882a593Smuzhiyun } while (0)
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun #else
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun #define ASSERT(X)			do {} while (0)
488*4882a593Smuzhiyun #define ASSERTCMP(X, OP, Y)		do {} while (0)
489*4882a593Smuzhiyun #define ASSERTIF(C, X)			do {} while (0)
490*4882a593Smuzhiyun #define ASSERTIFCMP(C, X, OP, Y)	do {} while (0)
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun #endif /* assert or not */
493