Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
dcache.h
Go to the documentation of this file.
1
#ifndef __LINUX_DCACHE_H
2
#define __LINUX_DCACHE_H
3
4
#include <
linux/atomic.h
>
5
#include <linux/list.h>
6
#include <
linux/rculist.h
>
7
#include <
linux/rculist_bl.h
>
8
#include <
linux/spinlock.h
>
9
#include <
linux/seqlock.h
>
10
#include <
linux/cache.h
>
11
#include <
linux/rcupdate.h
>
12
13
struct
nameidata
;
14
struct
path
;
15
struct
vfsmount
;
16
17
/*
18
* linux/include/linux/dcache.h
19
*
20
* Dirent cache data structures
21
*
22
* (C) Copyright 1997 Thomas Schoebel-Theuer,
23
* with heavy changes by Linus Torvalds
24
*/
25
26
#define IS_ROOT(x) ((x) == (x)->d_parent)
27
28
/* The hash is always the low bits of hash_len */
29
#ifdef __LITTLE_ENDIAN
30
#define HASH_LEN_DECLARE u32 hash; u32 len;
31
#else
32
#define HASH_LEN_DECLARE u32 len; u32 hash;
33
#endif
34
35
/*
36
* "quick string" -- eases parameter passing, but more importantly
37
* saves "metadata" about the string (ie length and the hash).
38
*
39
* hash comes first so it snuggles against d_parent in the
40
* dentry.
41
*/
42
struct
qstr
{
43
union
{
44
struct
{
45
HASH_LEN_DECLARE
;
46
};
47
u64
hash_len
;
48
};
49
const
unsigned
char
*
name
;
50
};
51
52
#define QSTR_INIT(n,l) { { { .len = l } }, .name = n }
53
#define hashlen_hash(hashlen) ((u32) (hashlen))
54
#define hashlen_len(hashlen) ((u32)((hashlen) >> 32))
55
56
struct
dentry_stat_t
{
57
int
nr_dentry
;
58
int
nr_unused
;
59
int
age_limit
;
/* age in seconds */
60
int
want_pages
;
/* pages requested by system */
61
int
dummy
[2];
62
};
63
extern
struct
dentry_stat_t
dentry_stat
;
64
65
/* Name hashing routines. Initial hash value */
66
/* Hash courtesy of the R5 hash in reiserfs modulo sign bits */
67
#define init_name_hash() 0
68
69
/* partial hash update function. Assume roughly 4 bits per character */
70
static
inline
unsigned
long
71
partial_name_hash(
unsigned
long
c
,
unsigned
long
prevhash)
72
{
73
return
(prevhash + (c << 4) + (c >> 4)) * 11;
74
}
75
76
/*
77
* Finally: cut down the number of bits to a int value (and try to avoid
78
* losing bits)
79
*/
80
static
inline
unsigned
long
end_name_hash(
unsigned
long
hash
)
81
{
82
return
(
unsigned
int
)
hash
;
83
}
84
85
/* Compute the hash for a name string. */
86
extern
unsigned
int
full_name_hash
(
const
unsigned
char
*,
unsigned
int
);
87
88
/*
89
* Try to keep struct dentry aligned on 64 byte cachelines (this will
90
* give reasonable cacheline footprint with larger lines without the
91
* large memory footprint increase).
92
*/
93
#ifdef CONFIG_64BIT
94
# define DNAME_INLINE_LEN 32
/* 192 bytes */
95
#else
96
# ifdef CONFIG_SMP
97
# define DNAME_INLINE_LEN 36
/* 128 bytes */
98
# else
99
# define DNAME_INLINE_LEN 40
/* 128 bytes */
100
# endif
101
#endif
102
103
struct
dentry
{
104
/* RCU lookup touched fields */
105
unsigned
int
d_flags
;
/* protected by d_lock */
106
seqcount_t
d_seq
;
/* per dentry seqlock */
107
struct
hlist_bl_node
d_hash
;
/* lookup hash list */
108
struct
dentry
*
d_parent
;
/* parent directory */
109
struct
qstr
d_name
;
110
struct
inode
*
d_inode
;
/* Where the name belongs to - NULL is
111
* negative */
112
unsigned
char
d_iname
[
DNAME_INLINE_LEN
];
/* small names */
113
114
/* Ref lookup also touches following */
115
unsigned
int
d_count
;
/* protected by d_lock */
116
spinlock_t
d_lock
;
/* per dentry lock */
117
const
struct
dentry_operations
*
d_op
;
118
struct
super_block
*
d_sb
;
/* The root of the dentry tree */
119
unsigned
long
d_time
;
/* used by d_revalidate */
120
void
*
d_fsdata
;
/* fs-specific data */
121
122
struct
list_head
d_lru
;
/* LRU list */
123
/*
124
* d_child and d_rcu can share memory
125
*/
126
union
{
127
struct
list_head
d_child
;
/* child of parent list */
128
struct
rcu_head
d_rcu
;
129
}
d_u
;
130
struct
list_head
d_subdirs
;
/* our children */
131
struct
hlist_node
d_alias
;
/* inode alias list */
132
};
133
134
/*
135
* dentry->d_lock spinlock nesting subclasses:
136
*
137
* 0: normal
138
* 1: nested
139
*/
140
enum
dentry_d_lock_class
141
{
142
DENTRY_D_LOCK_NORMAL
,
/* implicitly used by plain spin_lock() APIs. */
143
DENTRY_D_LOCK_NESTED
144
};
145
146
struct
dentry_operations
{
147
int
(*
d_revalidate
)(
struct
dentry
*,
unsigned
int
);
148
int
(*
d_hash
)(
const
struct
dentry
*,
const
struct
inode
*,
149
struct
qstr
*);
150
int
(*
d_compare
)(
const
struct
dentry
*,
const
struct
inode
*,
151
const
struct
dentry
*,
const
struct
inode
*,
152
unsigned
int
,
const
char
*,
const
struct
qstr
*);
153
int
(*
d_delete
)(
const
struct
dentry
*);
154
void
(*
d_release
)(
struct
dentry
*);
155
void
(*
d_prune
)(
struct
dentry
*);
156
void
(*
d_iput
)(
struct
dentry
*,
struct
inode
*);
157
char
*(*d_dname)(
struct
dentry
*,
char
*,
int
);
158
struct
vfsmount
*(*d_automount)(
struct
path
*);
159
int
(*
d_manage
)(
struct
dentry
*,
bool
);
160
}
____cacheline_aligned
;
161
162
/*
163
* Locking rules for dentry_operations callbacks are to be found in
164
* Documentation/filesystems/Locking. Keep it updated!
165
*
166
* FUrther descriptions are found in Documentation/filesystems/vfs.txt.
167
* Keep it updated too!
168
*/
169
170
/* d_flags entries */
171
#define DCACHE_OP_HASH 0x0001
172
#define DCACHE_OP_COMPARE 0x0002
173
#define DCACHE_OP_REVALIDATE 0x0004
174
#define DCACHE_OP_DELETE 0x0008
175
#define DCACHE_OP_PRUNE 0x0010
176
177
#define DCACHE_DISCONNECTED 0x0020
178
/* This dentry is possibly not currently connected to the dcache tree, in
179
* which case its parent will either be itself, or will have this flag as
180
* well. nfsd will not use a dentry with this bit set, but will first
181
* endeavour to clear the bit either by discovering that it is connected,
182
* or by performing lookup operations. Any filesystem which supports
183
* nfsd_operations MUST have a lookup function which, if it finds a
184
* directory inode with a DCACHE_DISCONNECTED dentry, will d_move that
185
* dentry into place and return that dentry rather than the passed one,
186
* typically using d_splice_alias. */
187
188
#define DCACHE_REFERENCED 0x0040
/* Recently used, don't discard. */
189
#define DCACHE_RCUACCESS 0x0080
/* Entry has ever been RCU-visible */
190
191
#define DCACHE_CANT_MOUNT 0x0100
192
#define DCACHE_GENOCIDE 0x0200
193
#define DCACHE_SHRINK_LIST 0x0400
194
195
#define DCACHE_NFSFS_RENAMED 0x1000
196
/* this dentry has been "silly renamed" and has to be deleted on the last
197
* dput() */
198
#define DCACHE_COOKIE 0x2000
/* For use by dcookie subsystem */
199
#define DCACHE_FSNOTIFY_PARENT_WATCHED 0x4000
200
/* Parent inode is watched by some fsnotify listener */
201
202
#define DCACHE_MOUNTED 0x10000
/* is a mountpoint */
203
#define DCACHE_NEED_AUTOMOUNT 0x20000
/* handle automount on this dir */
204
#define DCACHE_MANAGE_TRANSIT 0x40000
/* manage transit from this dirent */
205
#define DCACHE_NEED_LOOKUP 0x80000
/* dentry requires i_op->lookup */
206
#define DCACHE_MANAGED_DENTRY \
207
(DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT)
208
209
#define DCACHE_DENTRY_KILLED 0x100000
210
211
extern
seqlock_t
rename_lock
;
212
213
static
inline
int
dname_external(
struct
dentry
*
dentry
)
214
{
215
return
dentry->
d_name
.name != dentry->
d_iname
;
216
}
217
218
/*
219
* These are the low-level FS interfaces to the dcache..
220
*/
221
extern
void
d_instantiate
(
struct
dentry
*,
struct
inode
*);
222
extern
struct
dentry
*
d_instantiate_unique
(
struct
dentry
*,
struct
inode
*);
223
extern
struct
dentry
*
d_materialise_unique
(
struct
dentry
*,
struct
inode
*);
224
extern
void
__d_drop
(
struct
dentry
*
dentry
);
225
extern
void
d_drop
(
struct
dentry
*
dentry
);
226
extern
void
d_delete
(
struct
dentry
*);
227
extern
void
d_set_d_op
(
struct
dentry
*
dentry
,
const
struct
dentry_operations
*
op
);
228
229
/* allocate/de-allocate */
230
extern
struct
dentry
*
d_alloc
(
struct
dentry
*,
const
struct
qstr
*);
231
extern
struct
dentry
*
d_alloc_pseudo
(
struct
super_block
*,
const
struct
qstr
*);
232
extern
struct
dentry
*
d_splice_alias
(
struct
inode
*,
struct
dentry
*);
233
extern
struct
dentry
*
d_add_ci
(
struct
dentry
*,
struct
inode
*,
struct
qstr
*);
234
extern
struct
dentry
*
d_find_any_alias
(
struct
inode
*
inode
);
235
extern
struct
dentry
*
d_obtain_alias
(
struct
inode
*);
236
extern
void
shrink_dcache_sb
(
struct
super_block
*);
237
extern
void
shrink_dcache_parent
(
struct
dentry
*);
238
extern
void
shrink_dcache_for_umount
(
struct
super_block
*);
239
extern
int
d_invalidate
(
struct
dentry
*);
240
241
/* only used at mount-time */
242
extern
struct
dentry
*
d_make_root
(
struct
inode
*);
243
244
/* <clickety>-<click> the ramfs-type tree */
245
extern
void
d_genocide
(
struct
dentry
*);
246
247
extern
struct
dentry
*
d_find_alias
(
struct
inode
*);
248
extern
void
d_prune_aliases
(
struct
inode
*);
249
250
/* test whether we have any submounts in a subdir tree */
251
extern
int
have_submounts
(
struct
dentry
*);
252
253
/*
254
* This adds the entry to the hash queues.
255
*/
256
extern
void
d_rehash
(
struct
dentry
*);
257
267
static
inline
void
d_add(
struct
dentry
*
entry
,
struct
inode
*
inode
)
268
{
269
d_instantiate
(entry, inode);
270
d_rehash
(entry);
271
}
272
281
static
inline
struct
dentry
*d_add_unique(
struct
dentry
*
entry
,
struct
inode
*
inode
)
282
{
283
struct
dentry
*
res
;
284
285
res =
d_instantiate_unique
(entry, inode);
286
d_rehash
(res !=
NULL
? res : entry);
287
return
res
;
288
}
289
290
extern
void
dentry_update_name_case
(
struct
dentry
*,
struct
qstr
*);
291
292
/* used for rename() and baskets */
293
extern
void
d_move
(
struct
dentry
*,
struct
dentry
*);
294
extern
struct
dentry
*
d_ancestor
(
struct
dentry
*,
struct
dentry
*);
295
296
/* appendix may either be NULL or be used for transname suffixes */
297
extern
struct
dentry
*
d_lookup
(
struct
dentry
*,
struct
qstr
*);
298
extern
struct
dentry
*
d_hash_and_lookup
(
struct
dentry
*,
struct
qstr
*);
299
extern
struct
dentry
*
__d_lookup
(
struct
dentry
*,
struct
qstr
*);
300
extern
struct
dentry
*
__d_lookup_rcu
(
const
struct
dentry
*parent,
301
const
struct
qstr
*
name
,
302
unsigned
*seq,
struct
inode
*
inode
);
303
313
static
inline
int
__d_rcu_to_refcount(
struct
dentry
*
dentry
,
unsigned
seq)
314
{
315
int
ret
= 0;
316
317
assert_spin_locked
(&dentry->
d_lock
);
318
if
(!read_seqcount_retry(&dentry->
d_seq
, seq)) {
319
ret = 1;
320
dentry->
d_count
++;
321
}
322
323
return
ret
;
324
}
325
326
/* validate "insecure" dentry pointer */
327
extern
int
d_validate
(
struct
dentry *,
struct
dentry *);
328
329
/*
330
* helper function for dentry_operations.d_dname() members
331
*/
332
extern
char
*
dynamic_dname
(
struct
dentry *,
char
*,
int
,
const
char
*, ...);
333
334
extern
char
*
__d_path
(
const
struct
path
*,
const
struct
path
*,
char
*,
int
);
335
extern
char
*
d_absolute_path
(
const
struct
path
*,
char
*,
int
);
336
extern
char
*
d_path
(
const
struct
path
*,
char
*,
int
);
337
extern
char
*
d_path_with_unreachable
(
const
struct
path
*,
char
*,
int
);
338
extern
char
*
dentry_path_raw
(
struct
dentry *,
char
*,
int
);
339
extern
char
*
dentry_path
(
struct
dentry *,
char
*,
int
);
340
341
/* Allocation counts.. */
342
351
static
inline
struct
dentry *dget_dlock(
struct
dentry *dentry)
352
{
353
if
(dentry)
354
dentry->
d_count
++;
355
return
dentry;
356
}
357
358
static
inline
struct
dentry *dget(
struct
dentry *dentry)
359
{
360
if
(dentry) {
361
spin_lock(&dentry->
d_lock
);
362
dget_dlock(dentry);
363
spin_unlock(&dentry->
d_lock
);
364
}
365
return
dentry;
366
}
367
368
extern
struct
dentry *
dget_parent
(
struct
dentry *dentry);
369
377
static
inline
int
d_unhashed(
struct
dentry *dentry)
378
{
379
return
hlist_bl_unhashed(&dentry->
d_hash
);
380
}
381
382
static
inline
int
d_unlinked(
struct
dentry *dentry)
383
{
384
return
d_unhashed(dentry) && !
IS_ROOT
(dentry);
385
}
386
387
static
inline
int
cant_mount(
struct
dentry *dentry)
388
{
389
return
(dentry->
d_flags
&
DCACHE_CANT_MOUNT
);
390
}
391
392
static
inline
void
dont_mount(
struct
dentry *dentry)
393
{
394
spin_lock(&dentry->
d_lock
);
395
dentry->
d_flags
|=
DCACHE_CANT_MOUNT
;
396
spin_unlock(&dentry->
d_lock
);
397
}
398
399
extern
void
dput
(
struct
dentry *);
400
401
static
inline
bool
d_managed(
struct
dentry *dentry)
402
{
403
return
dentry->
d_flags
&
DCACHE_MANAGED_DENTRY
;
404
}
405
406
static
inline
bool
d_mountpoint(
struct
dentry *dentry)
407
{
408
return
dentry->
d_flags
&
DCACHE_MOUNTED
;
409
}
410
411
static
inline
bool
d_need_lookup(
struct
dentry *dentry)
412
{
413
return
dentry->
d_flags
&
DCACHE_NEED_LOOKUP
;
414
}
415
416
extern
void
d_clear_need_lookup
(
struct
dentry *dentry);
417
418
extern
int
sysctl_vfs_cache_pressure
;
419
420
#endif
/* __LINUX_DCACHE_H */
Generated on Thu Jan 10 2013 14:49:21 for Linux Kernel by
1.8.2