mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 05:06:29 +00:00
namei: move link/cookie pairs into nameidata
Array of MAX_NESTED_LINKS + 1 elements put into nameidata; what used to be a local array in link_path_walk() occupies entries 1 .. MAX_NESTED_LINKS in it, link and cookie from the trailing symlink handling loops - entry 0. This is _not_ the final arrangement; just an easily verified incremental step. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
9e18f10a30
commit
697fc6ca66
35
fs/namei.c
35
fs/namei.c
@ -505,6 +505,11 @@ struct nameidata {
|
|||||||
int last_type;
|
int last_type;
|
||||||
unsigned depth;
|
unsigned depth;
|
||||||
struct file *base;
|
struct file *base;
|
||||||
|
struct saved {
|
||||||
|
struct path link;
|
||||||
|
void *cookie;
|
||||||
|
const char *name;
|
||||||
|
} stack[MAX_NESTED_LINKS + 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1711,11 +1716,7 @@ static inline u64 hash_name(const char *name)
|
|||||||
*/
|
*/
|
||||||
static int link_path_walk(const char *name, struct nameidata *nd)
|
static int link_path_walk(const char *name, struct nameidata *nd)
|
||||||
{
|
{
|
||||||
struct saved {
|
struct saved *last = nd->stack;
|
||||||
struct path link;
|
|
||||||
void *cookie;
|
|
||||||
const char *name;
|
|
||||||
} stack[MAX_NESTED_LINKS], *last = stack + nd->depth - 1;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
while (*name=='/')
|
while (*name=='/')
|
||||||
@ -2030,13 +2031,13 @@ static int path_lookupat(int dfd, const struct filename *name,
|
|||||||
if (!err && !(flags & LOOKUP_PARENT)) {
|
if (!err && !(flags & LOOKUP_PARENT)) {
|
||||||
err = lookup_last(nd);
|
err = lookup_last(nd);
|
||||||
while (err > 0) {
|
while (err > 0) {
|
||||||
void *cookie;
|
nd->stack[0].link = nd->link;
|
||||||
struct path link = nd->link;
|
err = trailing_symlink(&nd->stack[0].link,
|
||||||
err = trailing_symlink(&link, nd, &cookie);
|
nd, &nd->stack[0].cookie);
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
err = lookup_last(nd);
|
err = lookup_last(nd);
|
||||||
put_link(nd, &link, cookie);
|
put_link(nd, &nd->stack[0].link, nd->stack[0].cookie);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2376,13 +2377,13 @@ path_mountpoint(int dfd, const struct filename *name, struct path *path,
|
|||||||
|
|
||||||
err = mountpoint_last(nd, path);
|
err = mountpoint_last(nd, path);
|
||||||
while (err > 0) {
|
while (err > 0) {
|
||||||
void *cookie;
|
nd->stack[0].link = nd->link;
|
||||||
struct path link = *path;
|
err = trailing_symlink(&nd->stack[0].link,
|
||||||
err = trailing_symlink(&link, nd, &cookie);
|
nd, &nd->stack[0].cookie);
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
err = mountpoint_last(nd, path);
|
err = mountpoint_last(nd, path);
|
||||||
put_link(nd, &link, cookie);
|
put_link(nd, &nd->stack[0].link, nd->stack[0].cookie);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
path_cleanup(nd);
|
path_cleanup(nd);
|
||||||
@ -3259,14 +3260,14 @@ static struct file *path_openat(int dfd, struct filename *pathname,
|
|||||||
|
|
||||||
error = do_last(nd, file, op, &opened, pathname);
|
error = do_last(nd, file, op, &opened, pathname);
|
||||||
while (unlikely(error > 0)) { /* trailing symlink */
|
while (unlikely(error > 0)) { /* trailing symlink */
|
||||||
struct path link = nd->link;
|
|
||||||
void *cookie;
|
|
||||||
nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL);
|
nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL);
|
||||||
error = trailing_symlink(&link, nd, &cookie);
|
nd->stack[0].link = nd->link;
|
||||||
|
error= trailing_symlink(&nd->stack[0].link,
|
||||||
|
nd, &nd->stack[0].cookie);
|
||||||
if (unlikely(error))
|
if (unlikely(error))
|
||||||
break;
|
break;
|
||||||
error = do_last(nd, file, op, &opened, pathname);
|
error = do_last(nd, file, op, &opened, pathname);
|
||||||
put_link(nd, &link, cookie);
|
put_link(nd, &nd->stack[0].link, nd->stack[0].cookie);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
path_cleanup(nd);
|
path_cleanup(nd);
|
||||||
|
Loading…
Reference in New Issue
Block a user