projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ARM: at91: add clocks for spi dt entries
[firefly-linux-kernel-4.4.55.git]
/
fs
/
namei.c
diff --git
a/fs/namei.c
b/fs/namei.c
index 43a97ee1d4c864e4053f86aec5830e037721d125..57ae9c8c66bfc6d98ae96643874710cdc3de321a 100644
(file)
--- a/
fs/namei.c
+++ b/
fs/namei.c
@@
-451,7
+451,7
@@
int inode_permission(struct inode *inode, int mask)
*
* Given a path increment the reference count to the dentry and the vfsmount.
*/
*
* Given a path increment the reference count to the dentry and the vfsmount.
*/
-void path_get(struct path *path)
+void path_get(
const
struct path *path)
{
mntget(path->mnt);
dget(path->dentry);
{
mntget(path->mnt);
dget(path->dentry);
@@
-464,7
+464,7
@@
EXPORT_SYMBOL(path_get);
*
* Given a path decrement the reference count to the dentry and the vfsmount.
*/
*
* Given a path decrement the reference count to the dentry and the vfsmount.
*/
-void path_put(struct path *path)
+void path_put(
const
struct path *path)
{
dput(path->dentry);
mntput(path->mnt);
{
dput(path->dentry);
mntput(path->mnt);
@@
-600,14
+600,10
@@
static int complete_walk(struct nameidata *nd)
if (likely(!(nd->flags & LOOKUP_JUMPED)))
return 0;
if (likely(!(nd->flags & LOOKUP_JUMPED)))
return 0;
- if (likely(!(dentry->d_flags & DCACHE_OP_REVALIDATE)))
+ if (likely(!(dentry->d_flags & DCACHE_OP_
WEAK_
REVALIDATE)))
return 0;
return 0;
- if (likely(!(dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT)))
- return 0;
-
- /* Note: we do not d_invalidate() */
- status = d_revalidate(dentry, nd->flags);
+ status = dentry->d_op->d_weak_revalidate(dentry, nd->flags);
if (status > 0)
return 0;
if (status > 0)
return 0;
@@
-693,8
+689,6
@@
void nd_jump_link(struct nameidata *nd, struct path *path)
nd->path = *path;
nd->inode = nd->path.dentry->d_inode;
nd->flags |= LOOKUP_JUMPED;
nd->path = *path;
nd->inode = nd->path.dentry->d_inode;
nd->flags |= LOOKUP_JUMPED;
-
- BUG_ON(nd->inode->i_op->follow_link);
}
static inline void put_link(struct nameidata *nd, struct path *link, void *cookie)
}
static inline void put_link(struct nameidata *nd, struct path *link, void *cookie)
@@
-1342,7
+1336,7
@@
static struct dentry *__lookup_hash(struct qstr *name,
* small and for now I'd prefer to have fast path as straight as possible.
* It _is_ time-critical.
*/
* small and for now I'd prefer to have fast path as straight as possible.
* It _is_ time-critical.
*/
-static int lookup_fast(struct nameidata *nd,
struct qstr *name,
+static int lookup_fast(struct nameidata *nd,
struct path *path, struct inode **inode)
{
struct vfsmount *mnt = nd->path.mnt;
struct path *path, struct inode **inode)
{
struct vfsmount *mnt = nd->path.mnt;
@@
-1358,7
+1352,7
@@
static int lookup_fast(struct nameidata *nd, struct qstr *name,
*/
if (nd->flags & LOOKUP_RCU) {
unsigned seq;
*/
if (nd->flags & LOOKUP_RCU) {
unsigned seq;
- dentry = __d_lookup_rcu(parent,
name
, &seq, nd->inode);
+ dentry = __d_lookup_rcu(parent,
&nd->last
, &seq, nd->inode);
if (!dentry)
goto unlazy;
if (!dentry)
goto unlazy;
@@
-1400,7
+1394,7
@@
unlazy:
if (unlazy_walk(nd, dentry))
return -ECHILD;
} else {
if (unlazy_walk(nd, dentry))
return -ECHILD;
} else {
- dentry = __d_lookup(parent,
name
);
+ dentry = __d_lookup(parent,
&nd->last
);
}
if (unlikely(!dentry))
}
if (unlikely(!dentry))
@@
-1436,8
+1430,7
@@
need_lookup:
}
/* Fast lookup failed, do it the slow way */
}
/* Fast lookup failed, do it the slow way */
-static int lookup_slow(struct nameidata *nd, struct qstr *name,
- struct path *path)
+static int lookup_slow(struct nameidata *nd, struct path *path)
{
struct dentry *dentry, *parent;
int err;
{
struct dentry *dentry, *parent;
int err;
@@
-1446,7
+1439,7
@@
static int lookup_slow(struct nameidata *nd, struct qstr *name,
BUG_ON(nd->inode != parent->d_inode);
mutex_lock(&parent->d_inode->i_mutex);
BUG_ON(nd->inode != parent->d_inode);
mutex_lock(&parent->d_inode->i_mutex);
- dentry = __lookup_hash(
name
, parent, nd->flags);
+ dentry = __lookup_hash(
&nd->last
, parent, nd->flags);
mutex_unlock(&parent->d_inode->i_mutex);
if (IS_ERR(dentry))
return PTR_ERR(dentry);
mutex_unlock(&parent->d_inode->i_mutex);
if (IS_ERR(dentry))
return PTR_ERR(dentry);
@@
-1519,7
+1512,7
@@
static inline int should_follow_link(struct inode *inode, int follow)
}
static inline int walk_component(struct nameidata *nd, struct path *path,
}
static inline int walk_component(struct nameidata *nd, struct path *path,
-
struct qstr *name, int type,
int follow)
+ int follow)
{
struct inode *inode;
int err;
{
struct inode *inode;
int err;
@@
-1528,14
+1521,14
@@
static inline int walk_component(struct nameidata *nd, struct path *path,
* to be able to know about the current root directory and
* parent relationships.
*/
* to be able to know about the current root directory and
* parent relationships.
*/
- if (unlikely(type != LAST_NORM))
- return handle_dots(nd, type);
- err = lookup_fast(nd,
name,
path, &inode);
+ if (unlikely(
nd->last_
type != LAST_NORM))
+ return handle_dots(nd,
nd->last_
type);
+ err = lookup_fast(nd, path, &inode);
if (unlikely(err)) {
if (err < 0)
goto out_err;
if (unlikely(err)) {
if (err < 0)
goto out_err;
- err = lookup_slow(nd,
name,
path);
+ err = lookup_slow(nd, path);
if (err < 0)
goto out_err;
if (err < 0)
goto out_err;
@@
-1594,8
+1587,7
@@
static inline int nested_symlink(struct path *path, struct nameidata *nd)
res = follow_link(&link, nd, &cookie);
if (res)
break;
res = follow_link(&link, nd, &cookie);
if (res)
break;
- res = walk_component(nd, path, &nd->last,
- nd->last_type, LOOKUP_FOLLOW);
+ res = walk_component(nd, path, LOOKUP_FOLLOW);
put_link(nd, &link, cookie);
} while (res > 0);
put_link(nd, &link, cookie);
} while (res > 0);
@@
-1802,8
+1794,11
@@
static int link_path_walk(const char *name, struct nameidata *nd)
}
}
}
}
+ nd->last = this;
+ nd->last_type = type;
+
if (!name[len])
if (!name[len])
-
goto last_component
;
+
return 0
;
/*
* If it wasn't NUL, we know it was '/'. Skip that
* slash, and continue until no more slashes.
/*
* If it wasn't NUL, we know it was '/'. Skip that
* slash, and continue until no more slashes.
@@
-1812,10
+1807,11
@@
static int link_path_walk(const char *name, struct nameidata *nd)
len++;
} while (unlikely(name[len] == '/'));
if (!name[len])
len++;
} while (unlikely(name[len] == '/'));
if (!name[len])
- goto last_component;
+ return 0;
+
name += len;
name += len;
- err = walk_component(nd, &next,
&this, type,
LOOKUP_FOLLOW);
+ err = walk_component(nd, &next, LOOKUP_FOLLOW);
if (err < 0)
return err;
if (err < 0)
return err;
@@
-1824,16
+1820,10
@@
static int link_path_walk(const char *name, struct nameidata *nd)
if (err)
return err;
}
if (err)
return err;
}
- if (can_lookup(nd->inode))
- continue;
- err = -ENOTDIR;
- break;
- /* here ends the main loop */
-
-last_component:
- nd->last = this;
- nd->last_type = type;
- return 0;
+ if (!can_lookup(nd->inode)) {
+ err = -ENOTDIR;
+ break;
+ }
}
terminate_walk(nd);
return err;
}
terminate_walk(nd);
return err;
@@
-1932,8
+1922,7
@@
static inline int lookup_last(struct nameidata *nd, struct path *path)
nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
nd->flags &= ~LOOKUP_PARENT;
nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
nd->flags &= ~LOOKUP_PARENT;
- return walk_component(nd, path, &nd->last, nd->last_type,
- nd->flags & LOOKUP_FOLLOW);
+ return walk_component(nd, path, nd->flags & LOOKUP_FOLLOW);
}
/* Returns 0 and nd will be valid on success; Retuns error, otherwise. */
}
/* Returns 0 and nd will be valid on success; Retuns error, otherwise. */
@@
-2732,7
+2721,7
@@
static int do_last(struct nameidata *nd, struct path *path,
if (open_flag & O_PATH && !(nd->flags & LOOKUP_FOLLOW))
symlink_ok = true;
/* we _can_ be in RCU mode here */
if (open_flag & O_PATH && !(nd->flags & LOOKUP_FOLLOW))
symlink_ok = true;
/* we _can_ be in RCU mode here */
- error = lookup_fast(nd,
&nd->last,
path, &inode);
+ error = lookup_fast(nd, path, &inode);
if (likely(!error))
goto finish_lookup;
if (likely(!error))
goto finish_lookup;
@@
-2778,7
+2767,7
@@
retry_lookup:
goto out;
if ((*opened & FILE_CREATED) ||
goto out;
if ((*opened & FILE_CREATED) ||
- !S_ISREG(file
->f_path.dentry->d_inode
->i_mode))
+ !S_ISREG(file
_inode(file)
->i_mode))
will_truncate = false;
audit_inode(name, file->f_path.dentry, 0);
will_truncate = false;
audit_inode(name, file->f_path.dentry, 0);
@@
-2941,8
+2930,8
@@
static struct file *path_openat(int dfd, struct filename *pathname,
int error;
file = get_empty_filp();
int error;
file = get_empty_filp();
- if (
!file
)
- return
ERR_PTR(-ENFILE)
;
+ if (
IS_ERR(file)
)
+ return
file
;
file->f_flags = op->open_flag;
file->f_flags = op->open_flag;