diff options
Diffstat (limited to 'include/linux/namei.h')
-rw-r--r-- | include/linux/namei.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/include/linux/namei.h b/include/linux/namei.h new file mode 100644 index 000000000000..7db67b008cac --- /dev/null +++ b/include/linux/namei.h | |||
@@ -0,0 +1,87 @@ | |||
1 | #ifndef _LINUX_NAMEI_H | ||
2 | #define _LINUX_NAMEI_H | ||
3 | |||
4 | #include <linux/linkage.h> | ||
5 | |||
6 | struct vfsmount; | ||
7 | |||
8 | struct open_intent { | ||
9 | int flags; | ||
10 | int create_mode; | ||
11 | }; | ||
12 | |||
13 | enum { MAX_NESTED_LINKS = 5 }; | ||
14 | |||
15 | struct nameidata { | ||
16 | struct dentry *dentry; | ||
17 | struct vfsmount *mnt; | ||
18 | struct qstr last; | ||
19 | unsigned int flags; | ||
20 | int last_type; | ||
21 | unsigned depth; | ||
22 | char *saved_names[MAX_NESTED_LINKS + 1]; | ||
23 | |||
24 | /* Intent data */ | ||
25 | union { | ||
26 | struct open_intent open; | ||
27 | } intent; | ||
28 | }; | ||
29 | |||
30 | /* | ||
31 | * Type of the last component on LOOKUP_PARENT | ||
32 | */ | ||
33 | enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND}; | ||
34 | |||
35 | /* | ||
36 | * The bitmask for a lookup event: | ||
37 | * - follow links at the end | ||
38 | * - require a directory | ||
39 | * - ending slashes ok even for nonexistent files | ||
40 | * - internal "there are more path compnents" flag | ||
41 | * - locked when lookup done with dcache_lock held | ||
42 | * - dentry cache is untrusted; force a real lookup | ||
43 | */ | ||
44 | #define LOOKUP_FOLLOW 1 | ||
45 | #define LOOKUP_DIRECTORY 2 | ||
46 | #define LOOKUP_CONTINUE 4 | ||
47 | #define LOOKUP_PARENT 16 | ||
48 | #define LOOKUP_NOALT 32 | ||
49 | #define LOOKUP_REVAL 64 | ||
50 | /* | ||
51 | * Intent data | ||
52 | */ | ||
53 | #define LOOKUP_OPEN (0x0100) | ||
54 | #define LOOKUP_CREATE (0x0200) | ||
55 | #define LOOKUP_ACCESS (0x0400) | ||
56 | |||
57 | extern int FASTCALL(__user_walk(const char __user *, unsigned, struct nameidata *)); | ||
58 | #define user_path_walk(name,nd) \ | ||
59 | __user_walk(name, LOOKUP_FOLLOW, nd) | ||
60 | #define user_path_walk_link(name,nd) \ | ||
61 | __user_walk(name, 0, nd) | ||
62 | extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *)); | ||
63 | extern int FASTCALL(path_walk(const char *, struct nameidata *)); | ||
64 | extern int FASTCALL(link_path_walk(const char *, struct nameidata *)); | ||
65 | extern void path_release(struct nameidata *); | ||
66 | extern void path_release_on_umount(struct nameidata *); | ||
67 | |||
68 | extern struct dentry * lookup_one_len(const char *, struct dentry *, int); | ||
69 | extern struct dentry * lookup_hash(struct qstr *, struct dentry *); | ||
70 | |||
71 | extern int follow_down(struct vfsmount **, struct dentry **); | ||
72 | extern int follow_up(struct vfsmount **, struct dentry **); | ||
73 | |||
74 | extern struct dentry *lock_rename(struct dentry *, struct dentry *); | ||
75 | extern void unlock_rename(struct dentry *, struct dentry *); | ||
76 | |||
77 | static inline void nd_set_link(struct nameidata *nd, char *path) | ||
78 | { | ||
79 | nd->saved_names[nd->depth] = path; | ||
80 | } | ||
81 | |||
82 | static inline char *nd_get_link(struct nameidata *nd) | ||
83 | { | ||
84 | return nd->saved_names[nd->depth]; | ||
85 | } | ||
86 | |||
87 | #endif /* _LINUX_NAMEI_H */ | ||