namei.h 2.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
#ifndef _LINUX_NAMEI_H
#define _LINUX_NAMEI_H

A
Alexey Dobriyan 已提交
4
#include <linux/dcache.h>
L
Linus Torvalds 已提交
5
#include <linux/linkage.h>
6
#include <linux/path.h>
L
Linus Torvalds 已提交
7 8 9 10 11 12

struct vfsmount;

struct open_intent {
	int	flags;
	int	create_mode;
13
	struct file *file;
L
Linus Torvalds 已提交
14 15
};

A
Al Viro 已提交
16
enum { MAX_NESTED_LINKS = 8 };
L
Linus Torvalds 已提交
17 18

struct nameidata {
19
	struct path	path;
L
Linus Torvalds 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
	struct qstr	last;
	unsigned int	flags;
	int		last_type;
	unsigned	depth;
	char *saved_names[MAX_NESTED_LINKS + 1];

	/* Intent data */
	union {
		struct open_intent open;
	} intent;
};

/*
 * Type of the last component on LOOKUP_PARENT
 */
enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND};

/*
 * The bitmask for a lookup event:
 *  - follow links at the end
 *  - require a directory
 *  - ending slashes ok even for nonexistent files
 *  - internal "there are more path compnents" flag
 *  - locked when lookup done with dcache_lock held
 *  - dentry cache is untrusted; force a real lookup
 */
#define LOOKUP_FOLLOW		 1
#define LOOKUP_DIRECTORY	 2
#define LOOKUP_CONTINUE		 4
#define LOOKUP_PARENT		16
#define LOOKUP_REVAL		64
/*
 * Intent data
 */
#define LOOKUP_OPEN		(0x0100)
#define LOOKUP_CREATE		(0x0200)

57 58
extern int __user_walk(const char __user *, unsigned, struct nameidata *);
extern int __user_walk_fd(int dfd, const char __user *, unsigned, struct nameidata *);
L
Linus Torvalds 已提交
59
#define user_path_walk(name,nd) \
60
	__user_walk_fd(AT_FDCWD, name, LOOKUP_FOLLOW, nd)
L
Linus Torvalds 已提交
61
#define user_path_walk_link(name,nd) \
62
	__user_walk_fd(AT_FDCWD, name, 0, nd)
63
extern int path_lookup(const char *, unsigned, struct nameidata *);
64 65
extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
			   const char *, unsigned int, struct nameidata *);
L
Linus Torvalds 已提交
66

67
extern int __user_path_lookup_open(const char __user *, unsigned lookup_flags, struct nameidata *nd, int open_flags);
68
extern int path_lookup_open(int dfd, const char *name, unsigned lookup_flags, struct nameidata *, int open_flags);
69 70 71 72 73
extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
		int (*open)(struct inode *, struct file *));
extern struct file *nameidata_to_filp(struct nameidata *nd, int flags);
extern void release_open_intent(struct nameidata *);

74 75
extern struct dentry *lookup_one_len(const char *, struct dentry *, int);
extern struct dentry *lookup_one_noperm(const char *, struct dentry *);
L
Linus Torvalds 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

extern int follow_down(struct vfsmount **, struct dentry **);
extern int follow_up(struct vfsmount **, struct dentry **);

extern struct dentry *lock_rename(struct dentry *, struct dentry *);
extern void unlock_rename(struct dentry *, struct dentry *);

static inline void nd_set_link(struct nameidata *nd, char *path)
{
	nd->saved_names[nd->depth] = path;
}

static inline char *nd_get_link(struct nameidata *nd)
{
	return nd->saved_names[nd->depth];
}

#endif /* _LINUX_NAMEI_H */