@@ -607,19 +607,19 @@ static bool afs_lookup_one_filldir(struct dir_context *ctx, const char *name,
607
607
* Do a lookup of a single name in a directory
608
608
* - just returns the FID the dentry name maps to if found
609
609
*/
610
- static int afs_do_lookup_one (struct inode * dir , struct dentry * dentry ,
610
+ static int afs_do_lookup_one (struct inode * dir , const struct qstr * name ,
611
611
struct afs_fid * fid , struct key * key ,
612
612
afs_dataversion_t * _dir_version )
613
613
{
614
614
struct afs_super_info * as = dir -> i_sb -> s_fs_info ;
615
615
struct afs_lookup_one_cookie cookie = {
616
616
.ctx .actor = afs_lookup_one_filldir ,
617
- .name = dentry -> d_name ,
617
+ .name = * name ,
618
618
.fid .vid = as -> volume -> vid
619
619
};
620
620
int ret ;
621
621
622
- _enter ("{%lu},%p{%pd }," , dir -> i_ino , dentry , dentry );
622
+ _enter ("{%lu},{%.*s }," , dir -> i_ino , name -> len , name -> name );
623
623
624
624
/* search the directory */
625
625
ret = afs_dir_iterate (dir , & cookie .ctx , key , _dir_version );
@@ -1052,21 +1052,12 @@ static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
1052
1052
/*
1053
1053
* Check the validity of a dentry under RCU conditions.
1054
1054
*/
1055
- static int afs_d_revalidate_rcu (struct dentry * dentry )
1055
+ static int afs_d_revalidate_rcu (struct afs_vnode * dvnode , struct dentry * dentry )
1056
1056
{
1057
- struct afs_vnode * dvnode ;
1058
- struct dentry * parent ;
1059
- struct inode * dir ;
1060
1057
long dir_version , de_version ;
1061
1058
1062
1059
_enter ("%p" , dentry );
1063
1060
1064
- /* Check the parent directory is still valid first. */
1065
- parent = READ_ONCE (dentry -> d_parent );
1066
- dir = d_inode_rcu (parent );
1067
- if (!dir )
1068
- return - ECHILD ;
1069
- dvnode = AFS_FS_I (dir );
1070
1061
if (test_bit (AFS_VNODE_DELETED , & dvnode -> flags ))
1071
1062
return - ECHILD ;
1072
1063
@@ -1097,17 +1088,16 @@ static int afs_d_revalidate_rcu(struct dentry *dentry)
1097
1088
static int afs_d_revalidate (struct inode * parent_dir , const struct qstr * name ,
1098
1089
struct dentry * dentry , unsigned int flags )
1099
1090
{
1100
- struct afs_vnode * vnode , * dir ;
1091
+ struct afs_vnode * vnode , * dir = AFS_FS_I ( parent_dir ) ;
1101
1092
struct afs_fid fid ;
1102
- struct dentry * parent ;
1103
1093
struct inode * inode ;
1104
1094
struct key * key ;
1105
1095
afs_dataversion_t dir_version , invalid_before ;
1106
1096
long de_version ;
1107
1097
int ret ;
1108
1098
1109
1099
if (flags & LOOKUP_RCU )
1110
- return afs_d_revalidate_rcu (dentry );
1100
+ return afs_d_revalidate_rcu (dir , dentry );
1111
1101
1112
1102
if (d_really_is_positive (dentry )) {
1113
1103
vnode = AFS_FS_I (d_inode (dentry ));
@@ -1122,14 +1112,9 @@ static int afs_d_revalidate(struct inode *parent_dir, const struct qstr *name,
1122
1112
if (IS_ERR (key ))
1123
1113
key = NULL ;
1124
1114
1125
- /* Hold the parent dentry so we can peer at it */
1126
- parent = dget_parent (dentry );
1127
- dir = AFS_FS_I (d_inode (parent ));
1128
-
1129
1115
/* validate the parent directory */
1130
1116
ret = afs_validate (dir , key );
1131
1117
if (ret == - ERESTARTSYS ) {
1132
- dput (parent );
1133
1118
key_put (key );
1134
1119
return ret ;
1135
1120
}
@@ -1157,7 +1142,7 @@ static int afs_d_revalidate(struct inode *parent_dir, const struct qstr *name,
1157
1142
afs_stat_v (dir , n_reval );
1158
1143
1159
1144
/* search the directory for this vnode */
1160
- ret = afs_do_lookup_one (& dir -> netfs .inode , dentry , & fid , key , & dir_version );
1145
+ ret = afs_do_lookup_one (& dir -> netfs .inode , name , & fid , key , & dir_version );
1161
1146
switch (ret ) {
1162
1147
case 0 :
1163
1148
/* the filename maps to something */
@@ -1201,22 +1186,19 @@ static int afs_d_revalidate(struct inode *parent_dir, const struct qstr *name,
1201
1186
goto out_valid ;
1202
1187
1203
1188
default :
1204
- _debug ("failed to iterate dir %pd: %d" ,
1205
- parent , ret );
1189
+ _debug ("failed to iterate parent %pd2: %d" , dentry , ret );
1206
1190
goto not_found ;
1207
1191
}
1208
1192
1209
1193
out_valid :
1210
1194
dentry -> d_fsdata = (void * )(unsigned long )dir_version ;
1211
1195
out_valid_noupdate :
1212
- dput (parent );
1213
1196
key_put (key );
1214
1197
_leave (" = 1 [valid]" );
1215
1198
return 1 ;
1216
1199
1217
1200
not_found :
1218
1201
_debug ("dropping dentry %pd2" , dentry );
1219
- dput (parent );
1220
1202
key_put (key );
1221
1203
1222
1204
_leave (" = 0 [bad]" );
0 commit comments