diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-05-13 07:28:08 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-05-15 01:10:45 -0400 |
commit | 9883d1855ecfafc60045a93abcee6c42e0a5f571 (patch) | |
tree | 2d1bca0b3c73c0bc749f440fc9b06d2511a14167 /fs/namei.c | |
parent | 520ae6874726dbfdf52c779d387b584d95cfed7f (diff) |
namei: move saved_nd pointer into struct nameidata
these guys are always declared next to each other; might as well put
the former (pointer to previous instance) into the latter and simplify
the calling conventions for {set,restore}_nameidata()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/fs/namei.c b/fs/namei.c index 22814d067fed..1a117c0d13c5 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -498,10 +498,8 @@ struct nameidata { | |||
498 | struct qstr last; | 498 | struct qstr last; |
499 | struct path root; | 499 | struct path root; |
500 | struct inode *inode; /* path.dentry.d_inode */ | 500 | struct inode *inode; /* path.dentry.d_inode */ |
501 | struct filename *name; | ||
502 | int dfd; | ||
503 | unsigned int flags; | 501 | unsigned int flags; |
504 | unsigned seq, m_seq, root_seq; | 502 | unsigned seq, m_seq; |
505 | int last_type; | 503 | int last_type; |
506 | unsigned depth; | 504 | unsigned depth; |
507 | int total_link_count; | 505 | int total_link_count; |
@@ -512,23 +510,26 @@ struct nameidata { | |||
512 | struct inode *inode; | 510 | struct inode *inode; |
513 | unsigned seq; | 511 | unsigned seq; |
514 | } *stack, internal[EMBEDDED_LEVELS]; | 512 | } *stack, internal[EMBEDDED_LEVELS]; |
513 | struct filename *name; | ||
514 | struct nameidata *saved; | ||
515 | unsigned root_seq; | ||
516 | int dfd; | ||
515 | }; | 517 | }; |
516 | 518 | ||
517 | static struct nameidata *set_nameidata(struct nameidata *p, int dfd, | 519 | static void set_nameidata(struct nameidata *p, int dfd, struct filename *name) |
518 | struct filename *name) | ||
519 | { | 520 | { |
520 | struct nameidata *old = current->nameidata; | 521 | struct nameidata *old = current->nameidata; |
521 | p->stack = p->internal; | 522 | p->stack = p->internal; |
522 | p->dfd = dfd; | 523 | p->dfd = dfd; |
523 | p->name = name; | 524 | p->name = name; |
524 | p->total_link_count = old ? old->total_link_count : 0; | 525 | p->total_link_count = old ? old->total_link_count : 0; |
526 | p->saved = old; | ||
525 | current->nameidata = p; | 527 | current->nameidata = p; |
526 | return old; | ||
527 | } | 528 | } |
528 | 529 | ||
529 | static void restore_nameidata(struct nameidata *old) | 530 | static void restore_nameidata(void) |
530 | { | 531 | { |
531 | struct nameidata *now = current->nameidata; | 532 | struct nameidata *now = current->nameidata, *old = now->saved; |
532 | 533 | ||
533 | current->nameidata = old; | 534 | current->nameidata = old; |
534 | if (old) | 535 | if (old) |
@@ -2120,14 +2121,14 @@ static int filename_lookup(int dfd, struct filename *name, unsigned flags, | |||
2120 | struct path *path, struct path *root) | 2121 | struct path *path, struct path *root) |
2121 | { | 2122 | { |
2122 | int retval; | 2123 | int retval; |
2123 | struct nameidata nd, *saved_nd; | 2124 | struct nameidata nd; |
2124 | if (IS_ERR(name)) | 2125 | if (IS_ERR(name)) |
2125 | return PTR_ERR(name); | 2126 | return PTR_ERR(name); |
2126 | saved_nd = set_nameidata(&nd, dfd, name); | ||
2127 | if (unlikely(root)) { | 2127 | if (unlikely(root)) { |
2128 | nd.root = *root; | 2128 | nd.root = *root; |
2129 | flags |= LOOKUP_ROOT; | 2129 | flags |= LOOKUP_ROOT; |
2130 | } | 2130 | } |
2131 | set_nameidata(&nd, dfd, name); | ||
2131 | retval = path_lookupat(&nd, flags | LOOKUP_RCU, path); | 2132 | retval = path_lookupat(&nd, flags | LOOKUP_RCU, path); |
2132 | if (unlikely(retval == -ECHILD)) | 2133 | if (unlikely(retval == -ECHILD)) |
2133 | retval = path_lookupat(&nd, flags, path); | 2134 | retval = path_lookupat(&nd, flags, path); |
@@ -2136,7 +2137,7 @@ static int filename_lookup(int dfd, struct filename *name, unsigned flags, | |||
2136 | 2137 | ||
2137 | if (likely(!retval)) | 2138 | if (likely(!retval)) |
2138 | audit_inode(name, path->dentry, flags & LOOKUP_PARENT); | 2139 | audit_inode(name, path->dentry, flags & LOOKUP_PARENT); |
2139 | restore_nameidata(saved_nd); | 2140 | restore_nameidata(); |
2140 | putname(name); | 2141 | putname(name); |
2141 | return retval; | 2142 | return retval; |
2142 | } | 2143 | } |
@@ -2166,11 +2167,11 @@ static struct filename *filename_parentat(int dfd, struct filename *name, | |||
2166 | struct qstr *last, int *type) | 2167 | struct qstr *last, int *type) |
2167 | { | 2168 | { |
2168 | int retval; | 2169 | int retval; |
2169 | struct nameidata nd, *saved_nd; | 2170 | struct nameidata nd; |
2170 | 2171 | ||
2171 | if (IS_ERR(name)) | 2172 | if (IS_ERR(name)) |
2172 | return name; | 2173 | return name; |
2173 | saved_nd = set_nameidata(&nd, dfd, name); | 2174 | set_nameidata(&nd, dfd, name); |
2174 | retval = path_parentat(&nd, flags | LOOKUP_RCU, parent); | 2175 | retval = path_parentat(&nd, flags | LOOKUP_RCU, parent); |
2175 | if (unlikely(retval == -ECHILD)) | 2176 | if (unlikely(retval == -ECHILD)) |
2176 | retval = path_parentat(&nd, flags, parent); | 2177 | retval = path_parentat(&nd, flags, parent); |
@@ -2184,7 +2185,7 @@ static struct filename *filename_parentat(int dfd, struct filename *name, | |||
2184 | putname(name); | 2185 | putname(name); |
2185 | name = ERR_PTR(retval); | 2186 | name = ERR_PTR(retval); |
2186 | } | 2187 | } |
2187 | restore_nameidata(saved_nd); | 2188 | restore_nameidata(); |
2188 | return name; | 2189 | return name; |
2189 | } | 2190 | } |
2190 | 2191 | ||
@@ -2445,11 +2446,11 @@ static int | |||
2445 | filename_mountpoint(int dfd, struct filename *name, struct path *path, | 2446 | filename_mountpoint(int dfd, struct filename *name, struct path *path, |
2446 | unsigned int flags) | 2447 | unsigned int flags) |
2447 | { | 2448 | { |
2448 | struct nameidata nd, *saved; | 2449 | struct nameidata nd; |
2449 | int error; | 2450 | int error; |
2450 | if (IS_ERR(name)) | 2451 | if (IS_ERR(name)) |
2451 | return PTR_ERR(name); | 2452 | return PTR_ERR(name); |
2452 | saved = set_nameidata(&nd, dfd, name); | 2453 | set_nameidata(&nd, dfd, name); |
2453 | error = path_mountpoint(&nd, flags | LOOKUP_RCU, path); | 2454 | error = path_mountpoint(&nd, flags | LOOKUP_RCU, path); |
2454 | if (unlikely(error == -ECHILD)) | 2455 | if (unlikely(error == -ECHILD)) |
2455 | error = path_mountpoint(&nd, flags, path); | 2456 | error = path_mountpoint(&nd, flags, path); |
@@ -2457,7 +2458,7 @@ filename_mountpoint(int dfd, struct filename *name, struct path *path, | |||
2457 | error = path_mountpoint(&nd, flags | LOOKUP_REVAL, path); | 2458 | error = path_mountpoint(&nd, flags | LOOKUP_REVAL, path); |
2458 | if (likely(!error)) | 2459 | if (likely(!error)) |
2459 | audit_inode(name, path->dentry, 0); | 2460 | audit_inode(name, path->dentry, 0); |
2460 | restore_nameidata(saved); | 2461 | restore_nameidata(); |
2461 | putname(name); | 2462 | putname(name); |
2462 | return error; | 2463 | return error; |
2463 | } | 2464 | } |
@@ -3327,23 +3328,24 @@ out2: | |||
3327 | struct file *do_filp_open(int dfd, struct filename *pathname, | 3328 | struct file *do_filp_open(int dfd, struct filename *pathname, |
3328 | const struct open_flags *op) | 3329 | const struct open_flags *op) |
3329 | { | 3330 | { |
3330 | struct nameidata nd, *saved_nd = set_nameidata(&nd, dfd, pathname); | 3331 | struct nameidata nd; |
3331 | int flags = op->lookup_flags; | 3332 | int flags = op->lookup_flags; |
3332 | struct file *filp; | 3333 | struct file *filp; |
3333 | 3334 | ||
3335 | set_nameidata(&nd, dfd, pathname); | ||
3334 | filp = path_openat(&nd, op, flags | LOOKUP_RCU); | 3336 | filp = path_openat(&nd, op, flags | LOOKUP_RCU); |
3335 | if (unlikely(filp == ERR_PTR(-ECHILD))) | 3337 | if (unlikely(filp == ERR_PTR(-ECHILD))) |
3336 | filp = path_openat(&nd, op, flags); | 3338 | filp = path_openat(&nd, op, flags); |
3337 | if (unlikely(filp == ERR_PTR(-ESTALE))) | 3339 | if (unlikely(filp == ERR_PTR(-ESTALE))) |
3338 | filp = path_openat(&nd, op, flags | LOOKUP_REVAL); | 3340 | filp = path_openat(&nd, op, flags | LOOKUP_REVAL); |
3339 | restore_nameidata(saved_nd); | 3341 | restore_nameidata(); |
3340 | return filp; | 3342 | return filp; |
3341 | } | 3343 | } |
3342 | 3344 | ||
3343 | struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, | 3345 | struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, |
3344 | const char *name, const struct open_flags *op) | 3346 | const char *name, const struct open_flags *op) |
3345 | { | 3347 | { |
3346 | struct nameidata nd, *saved_nd; | 3348 | struct nameidata nd; |
3347 | struct file *file; | 3349 | struct file *file; |
3348 | struct filename *filename; | 3350 | struct filename *filename; |
3349 | int flags = op->lookup_flags | LOOKUP_ROOT; | 3351 | int flags = op->lookup_flags | LOOKUP_ROOT; |
@@ -3358,13 +3360,13 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, | |||
3358 | if (unlikely(IS_ERR(filename))) | 3360 | if (unlikely(IS_ERR(filename))) |
3359 | return ERR_CAST(filename); | 3361 | return ERR_CAST(filename); |
3360 | 3362 | ||
3361 | saved_nd = set_nameidata(&nd, -1, filename); | 3363 | set_nameidata(&nd, -1, filename); |
3362 | file = path_openat(&nd, op, flags | LOOKUP_RCU); | 3364 | file = path_openat(&nd, op, flags | LOOKUP_RCU); |
3363 | if (unlikely(file == ERR_PTR(-ECHILD))) | 3365 | if (unlikely(file == ERR_PTR(-ECHILD))) |
3364 | file = path_openat(&nd, op, flags); | 3366 | file = path_openat(&nd, op, flags); |
3365 | if (unlikely(file == ERR_PTR(-ESTALE))) | 3367 | if (unlikely(file == ERR_PTR(-ESTALE))) |
3366 | file = path_openat(&nd, op, flags | LOOKUP_REVAL); | 3368 | file = path_openat(&nd, op, flags | LOOKUP_REVAL); |
3367 | restore_nameidata(saved_nd); | 3369 | restore_nameidata(); |
3368 | putname(filename); | 3370 | putname(filename); |
3369 | return file; | 3371 | return file; |
3370 | } | 3372 | } |