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
	struct qstr	last;
A
Al Viro 已提交
21
	struct path	root;
L
Linus Torvalds 已提交
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
	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
 */
55 56 57
#define LOOKUP_OPEN		0x0100
#define LOOKUP_CREATE		0x0200
#define LOOKUP_EXCL		0x0400
58
#define LOOKUP_RENAME_TARGET	0x0800
L
Linus Torvalds 已提交
59

60 61 62 63 64 65 66
extern int user_path_at(int, const char __user *, unsigned, struct path *);

#define user_path(name, path) user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW, path)
#define user_lpath(name, path) user_path_at(AT_FDCWD, name, 0, path)
#define user_path_dir(name, path) \
	user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, path)

A
Al Viro 已提交
67 68
extern int kern_path(const char *, unsigned, struct path *);

69
extern int path_lookup(const char *, unsigned, struct nameidata *);
70 71
extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
			   const char *, unsigned int, struct nameidata *);
L
Linus Torvalds 已提交
72

73 74 75 76 77
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 *);

78 79
extern struct dentry *lookup_one_len(const char *, struct dentry *, int);
extern struct dentry *lookup_one_noperm(const char *, struct dentry *);
L
Linus Torvalds 已提交
80 81

extern int follow_down(struct vfsmount **, struct dentry **);
A
Al Viro 已提交
82
extern int follow_up(struct path *);
L
Linus Torvalds 已提交
83 84 85 86 87 88 89 90 91 92 93 94 95 96

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];
}

97 98 99 100 101
static inline void nd_terminate_link(void *name, size_t len, size_t maxlen)
{
	((char *) name)[min(len, maxlen)] = '\0';
}

L
Linus Torvalds 已提交
102
#endif /* _LINUX_NAMEI_H */