@@ -498,10 +498,8 @@ struct nameidata {
498
498
struct qstr last ;
499
499
struct path root ;
500
500
struct inode * inode ; /* path.dentry.d_inode */
501
- struct filename * name ;
502
- int dfd ;
503
501
unsigned int flags ;
504
- unsigned seq , m_seq , root_seq ;
502
+ unsigned seq , m_seq ;
505
503
int last_type ;
506
504
unsigned depth ;
507
505
int total_link_count ;
@@ -512,23 +510,26 @@ struct nameidata {
512
510
struct inode * inode ;
513
511
unsigned seq ;
514
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 ,
518
- struct filename * name )
519
+ static void set_nameidata (struct nameidata * p , int dfd , struct filename * name )
519
520
{
520
521
struct nameidata * old = current -> nameidata ;
521
522
p -> stack = p -> internal ;
522
523
p -> dfd = dfd ;
523
524
p -> name = name ;
524
525
p -> total_link_count = old ? old -> total_link_count : 0 ;
526
+ p -> saved = old ;
525
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
534
current -> nameidata = old ;
534
535
if (old )
@@ -2120,14 +2121,14 @@ static int filename_lookup(int dfd, struct filename *name, unsigned flags,
2120
2121
struct path * path , struct path * root )
2121
2122
{
2122
2123
int retval ;
2123
- struct nameidata nd , * saved_nd ;
2124
+ struct nameidata nd ;
2124
2125
if (IS_ERR (name ))
2125
2126
return PTR_ERR (name );
2126
- saved_nd = set_nameidata (& nd , dfd , name );
2127
2127
if (unlikely (root )) {
2128
2128
nd .root = * root ;
2129
2129
flags |= LOOKUP_ROOT ;
2130
2130
}
2131
+ set_nameidata (& nd , dfd , name );
2131
2132
retval = path_lookupat (& nd , flags | LOOKUP_RCU , path );
2132
2133
if (unlikely (retval == - ECHILD ))
2133
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
2138
if (likely (!retval ))
2138
2139
audit_inode (name , path -> dentry , flags & LOOKUP_PARENT );
2139
- restore_nameidata (saved_nd );
2140
+ restore_nameidata ();
2140
2141
putname (name );
2141
2142
return retval ;
2142
2143
}
@@ -2166,11 +2167,11 @@ static struct filename *filename_parentat(int dfd, struct filename *name,
2166
2167
struct qstr * last , int * type )
2167
2168
{
2168
2169
int retval ;
2169
- struct nameidata nd , * saved_nd ;
2170
+ struct nameidata nd ;
2170
2171
2171
2172
if (IS_ERR (name ))
2172
2173
return name ;
2173
- saved_nd = set_nameidata (& nd , dfd , name );
2174
+ set_nameidata (& nd , dfd , name );
2174
2175
retval = path_parentat (& nd , flags | LOOKUP_RCU , parent );
2175
2176
if (unlikely (retval == - ECHILD ))
2176
2177
retval = path_parentat (& nd , flags , parent );
@@ -2184,7 +2185,7 @@ static struct filename *filename_parentat(int dfd, struct filename *name,
2184
2185
putname (name );
2185
2186
name = ERR_PTR (retval );
2186
2187
}
2187
- restore_nameidata (saved_nd );
2188
+ restore_nameidata ();
2188
2189
return name ;
2189
2190
}
2190
2191
@@ -2445,19 +2446,19 @@ static int
2445
2446
filename_mountpoint (int dfd , struct filename * name , struct path * path ,
2446
2447
unsigned int flags )
2447
2448
{
2448
- struct nameidata nd , * saved ;
2449
+ struct nameidata nd ;
2449
2450
int error ;
2450
2451
if (IS_ERR (name ))
2451
2452
return PTR_ERR (name );
2452
- saved = set_nameidata (& nd , dfd , name );
2453
+ set_nameidata (& nd , dfd , name );
2453
2454
error = path_mountpoint (& nd , flags | LOOKUP_RCU , path );
2454
2455
if (unlikely (error == - ECHILD ))
2455
2456
error = path_mountpoint (& nd , flags , path );
2456
2457
if (unlikely (error == - ESTALE ))
2457
2458
error = path_mountpoint (& nd , flags | LOOKUP_REVAL , path );
2458
2459
if (likely (!error ))
2459
2460
audit_inode (name , path -> dentry , 0 );
2460
- restore_nameidata (saved );
2461
+ restore_nameidata ();
2461
2462
putname (name );
2462
2463
return error ;
2463
2464
}
@@ -3327,23 +3328,24 @@ static struct file *path_openat(struct nameidata *nd,
3327
3328
struct file * do_filp_open (int dfd , struct filename * pathname ,
3328
3329
const struct open_flags * op )
3329
3330
{
3330
- struct nameidata nd , * saved_nd = set_nameidata ( & nd , dfd , pathname ) ;
3331
+ struct nameidata nd ;
3331
3332
int flags = op -> lookup_flags ;
3332
3333
struct file * filp ;
3333
3334
3335
+ set_nameidata (& nd , dfd , pathname );
3334
3336
filp = path_openat (& nd , op , flags | LOOKUP_RCU );
3335
3337
if (unlikely (filp == ERR_PTR (- ECHILD )))
3336
3338
filp = path_openat (& nd , op , flags );
3337
3339
if (unlikely (filp == ERR_PTR (- ESTALE )))
3338
3340
filp = path_openat (& nd , op , flags | LOOKUP_REVAL );
3339
- restore_nameidata (saved_nd );
3341
+ restore_nameidata ();
3340
3342
return filp ;
3341
3343
}
3342
3344
3343
3345
struct file * do_file_open_root (struct dentry * dentry , struct vfsmount * mnt ,
3344
3346
const char * name , const struct open_flags * op )
3345
3347
{
3346
- struct nameidata nd , * saved_nd ;
3348
+ struct nameidata nd ;
3347
3349
struct file * file ;
3348
3350
struct filename * filename ;
3349
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
3360
if (unlikely (IS_ERR (filename )))
3359
3361
return ERR_CAST (filename );
3360
3362
3361
- saved_nd = set_nameidata (& nd , -1 , filename );
3363
+ set_nameidata (& nd , -1 , filename );
3362
3364
file = path_openat (& nd , op , flags | LOOKUP_RCU );
3363
3365
if (unlikely (file == ERR_PTR (- ECHILD )))
3364
3366
file = path_openat (& nd , op , flags );
3365
3367
if (unlikely (file == ERR_PTR (- ESTALE )))
3366
3368
file = path_openat (& nd , op , flags | LOOKUP_REVAL );
3367
- restore_nameidata (saved_nd );
3369
+ restore_nameidata ();
3368
3370
putname (filename );
3369
3371
return file ;
3370
3372
}
0 commit comments