summaryrefslogtreecommitdiffstats
path: root/fs/namei.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-05-13 07:28:08 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-05-15 01:10:45 -0400
commit9883d1855ecfafc60045a93abcee6c42e0a5f571 (patch)
tree2d1bca0b3c73c0bc749f440fc9b06d2511a14167 /fs/namei.c
parent520ae6874726dbfdf52c779d387b584d95cfed7f (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.c46
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
517static struct nameidata *set_nameidata(struct nameidata *p, int dfd, 519static 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
529static void restore_nameidata(struct nameidata *old) 530static 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
2445filename_mountpoint(int dfd, struct filename *name, struct path *path, 2446filename_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:
3327struct file *do_filp_open(int dfd, struct filename *pathname, 3328struct 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
3343struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, 3345struct 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}