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