2005-04-16 15:20:36 -07:00
|
|
|
#ifndef _LINUX_NAMEI_H
|
|
|
|
|
#define _LINUX_NAMEI_H
|
|
|
|
|
|
2015-05-13 09:12:02 -04:00
|
|
|
#include <linux/kernel.h>
|
2008-02-14 19:34:31 -08:00
|
|
|
#include <linux/path.h>
|
2015-05-13 09:12:02 -04:00
|
|
|
#include <linux/fcntl.h>
|
|
|
|
|
#include <linux/errno.h>
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2006-07-14 00:24:29 -07:00
|
|
|
enum { MAX_NESTED_LINKS = 8 };
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2015-05-02 07:16:16 -04:00
|
|
|
#define MAXSYMLINKS 40
|
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
/*
|
|
|
|
|
* 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
|
2009-06-16 12:17:53 +03:00
|
|
|
* - internal "there are more path components" flag
|
2005-04-16 15:20:36 -07:00
|
|
|
* - dentry cache is untrusted; force a real lookup
|
2011-01-14 18:45:31 +00:00
|
|
|
* - suppress terminal automount
|
2005-04-16 15:20:36 -07:00
|
|
|
*/
|
2011-01-07 17:49:52 +11:00
|
|
|
#define LOOKUP_FOLLOW 0x0001
|
|
|
|
|
#define LOOKUP_DIRECTORY 0x0002
|
2011-09-26 17:44:55 -07:00
|
|
|
#define LOOKUP_AUTOMOUNT 0x0004
|
2011-01-07 17:49:52 +11:00
|
|
|
|
|
|
|
|
#define LOOKUP_PARENT 0x0010
|
|
|
|
|
#define LOOKUP_REVAL 0x0020
|
|
|
|
|
#define LOOKUP_RCU 0x0040
|
2016-03-06 14:20:52 -05:00
|
|
|
#define LOOKUP_NO_REVAL 0x0080
|
2011-09-27 08:12:33 -07:00
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
/*
|
|
|
|
|
* Intent data
|
|
|
|
|
*/
|
2008-08-05 03:00:49 -04:00
|
|
|
#define LOOKUP_OPEN 0x0100
|
|
|
|
|
#define LOOKUP_CREATE 0x0200
|
|
|
|
|
#define LOOKUP_EXCL 0x0400
|
2008-10-16 07:50:29 +09:00
|
|
|
#define LOOKUP_RENAME_TARGET 0x0800
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2011-02-22 15:50:10 -05:00
|
|
|
#define LOOKUP_JUMPED 0x1000
|
2011-03-09 23:04:47 -05:00
|
|
|
#define LOOKUP_ROOT 0x2000
|
2011-03-14 18:56:51 -04:00
|
|
|
#define LOOKUP_EMPTY 0x4000
|
2011-02-22 15:50:10 -05:00
|
|
|
|
2011-11-02 09:44:39 +01:00
|
|
|
extern int user_path_at_empty(int, const char __user *, unsigned, struct path *, int *empty);
|
2008-07-22 09:59:21 -04:00
|
|
|
|
2015-05-13 09:12:02 -04:00
|
|
|
static inline int user_path_at(int dfd, const char __user *name, unsigned flags,
|
|
|
|
|
struct path *path)
|
|
|
|
|
{
|
|
|
|
|
return user_path_at_empty(dfd, name, flags, path, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int user_path(const char __user *name, struct path *path)
|
|
|
|
|
{
|
|
|
|
|
return user_path_at_empty(AT_FDCWD, name, LOOKUP_FOLLOW, path, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int user_lpath(const char __user *name, struct path *path)
|
|
|
|
|
{
|
|
|
|
|
return user_path_at_empty(AT_FDCWD, name, 0, path, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int user_path_dir(const char __user *name, struct path *path)
|
|
|
|
|
{
|
|
|
|
|
return user_path_at_empty(AT_FDCWD, name,
|
|
|
|
|
LOOKUP_FOLLOW | LOOKUP_DIRECTORY, path, NULL);
|
|
|
|
|
}
|
2008-07-22 09:59:21 -04:00
|
|
|
|
2008-08-02 00:49:18 -04:00
|
|
|
extern int kern_path(const char *, unsigned, struct path *);
|
|
|
|
|
|
2012-12-11 12:10:06 -05:00
|
|
|
extern struct dentry *kern_path_create(int, const char *, struct path *, unsigned int);
|
|
|
|
|
extern struct dentry *user_path_create(int, const char __user *, struct path *, unsigned int);
|
2012-07-20 01:15:31 +04:00
|
|
|
extern void done_path_create(struct path *, struct dentry *);
|
2012-06-15 03:01:42 +04:00
|
|
|
extern struct dentry *kern_path_locked(const char *, struct path *);
|
2013-09-08 20:18:44 -04:00
|
|
|
extern int kern_path_mountpoint(int, const char *, struct path *, unsigned int);
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2007-10-16 23:25:38 -07:00
|
|
|
extern struct dentry *lookup_one_len(const char *, struct dentry *, int);
|
2016-01-07 16:08:20 -05:00
|
|
|
extern struct dentry *lookup_one_len_unlocked(const char *, struct dentry *, int);
|
2016-05-11 01:16:37 +02:00
|
|
|
struct qstr;
|
|
|
|
|
extern struct dentry *lookup_hash(const struct qstr *, struct dentry *);
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2011-01-14 18:45:26 +00:00
|
|
|
extern int follow_down_one(struct path *);
|
2011-03-18 09:04:20 -04:00
|
|
|
extern int follow_down(struct path *);
|
2009-04-18 03:26:48 -04:00
|
|
|
extern int follow_up(struct path *);
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
|
extern struct dentry *lock_rename(struct dentry *, struct dentry *);
|
|
|
|
|
extern void unlock_rename(struct dentry *, struct dentry *);
|
|
|
|
|
|
2015-05-02 13:37:52 -04:00
|
|
|
extern void nd_jump_link(struct path *path);
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2008-12-19 20:47:11 +00:00
|
|
|
static inline void nd_terminate_link(void *name, size_t len, size_t maxlen)
|
|
|
|
|
{
|
|
|
|
|
((char *) name)[min(len, maxlen)] = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-20 14:59:40 -05:00
|
|
|
/**
|
|
|
|
|
* retry_estale - determine whether the caller should retry an operation
|
|
|
|
|
* @error: the error that would currently be returned
|
|
|
|
|
* @flags: flags being used for next lookup attempt
|
|
|
|
|
*
|
|
|
|
|
* Check to see if the error code was -ESTALE, and then determine whether
|
|
|
|
|
* to retry the call based on whether "flags" already has LOOKUP_REVAL set.
|
|
|
|
|
*
|
|
|
|
|
* Returns true if the caller should try the operation again.
|
|
|
|
|
*/
|
|
|
|
|
static inline bool
|
|
|
|
|
retry_estale(const long error, const unsigned int flags)
|
|
|
|
|
{
|
|
|
|
|
return error == -ESTALE && !(flags & LOOKUP_REVAL);
|
|
|
|
|
}
|
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
#endif /* _LINUX_NAMEI_H */
|