namei.h 2.6 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;
N
Nick Piggin 已提交
22 23
	struct file	*file;
	struct inode	*inode; /* path.dentry.d_inode */
L
Linus Torvalds 已提交
24
	unsigned int	flags;
N
Nick Piggin 已提交
25
	unsigned	seq;
L
Linus Torvalds 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
	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
46
 *  - internal "there are more path components" flag
L
Linus Torvalds 已提交
47 48
 *  - dentry cache is untrusted; force a real lookup
 */
N
Nick Piggin 已提交
49 50 51 52 53 54 55
#define LOOKUP_FOLLOW		0x0001
#define LOOKUP_DIRECTORY	0x0002
#define LOOKUP_CONTINUE		0x0004

#define LOOKUP_PARENT		0x0010
#define LOOKUP_REVAL		0x0020
#define LOOKUP_RCU		0x0040
L
Linus Torvalds 已提交
56 57 58
/*
 * Intent data
 */
59 60 61
#define LOOKUP_OPEN		0x0100
#define LOOKUP_CREATE		0x0200
#define LOOKUP_EXCL		0x0400
62
#define LOOKUP_RENAME_TARGET	0x0800
L
Linus Torvalds 已提交
63

64 65 66 67 68 69 70
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 已提交
71 72
extern int kern_path(const char *, unsigned, struct path *);

73
extern int path_lookup(const char *, unsigned, struct nameidata *);
74 75
extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
			   const char *, unsigned int, struct nameidata *);
L
Linus Torvalds 已提交
76

77 78 79
extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
		int (*open)(struct inode *, struct file *));

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

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

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

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

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