@@ -155,6 +155,7 @@ typedef struct {
155
155
loff_t current_index ;
156
156
decode_dirent_t decode ;
157
157
158
+ unsigned long dir_verifier ;
158
159
unsigned long timestamp ;
159
160
unsigned long gencount ;
160
161
unsigned int cache_entry_index ;
@@ -353,6 +354,7 @@ int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc,
353
354
again :
354
355
timestamp = jiffies ;
355
356
gencount = nfs_inc_attr_generation_counter ();
357
+ desc -> dir_verifier = nfs_save_change_attribute (inode );
356
358
error = NFS_PROTO (inode )-> readdir (file_dentry (file ), cred , entry -> cookie , pages ,
357
359
NFS_SERVER (inode )-> dtsize , desc -> plus );
358
360
if (error < 0 ) {
@@ -455,13 +457,13 @@ void nfs_force_use_readdirplus(struct inode *dir)
455
457
}
456
458
457
459
static
458
- void nfs_prime_dcache (struct dentry * parent , struct nfs_entry * entry )
460
+ void nfs_prime_dcache (struct dentry * parent , struct nfs_entry * entry ,
461
+ unsigned long dir_verifier )
459
462
{
460
463
struct qstr filename = QSTR_INIT (entry -> name , entry -> len );
461
464
DECLARE_WAIT_QUEUE_HEAD_ONSTACK (wq );
462
465
struct dentry * dentry ;
463
466
struct dentry * alias ;
464
- struct inode * dir = d_inode (parent );
465
467
struct inode * inode ;
466
468
int status ;
467
469
@@ -500,7 +502,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
500
502
if (nfs_same_file (dentry , entry )) {
501
503
if (!entry -> fh -> size )
502
504
goto out ;
503
- nfs_set_verifier (dentry , nfs_save_change_attribute ( dir ) );
505
+ nfs_set_verifier (dentry , dir_verifier );
504
506
status = nfs_refresh_inode (d_inode (dentry ), entry -> fattr );
505
507
if (!status )
506
508
nfs_setsecurity (d_inode (dentry ), entry -> fattr , entry -> label );
@@ -526,7 +528,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
526
528
dput (dentry );
527
529
dentry = alias ;
528
530
}
529
- nfs_set_verifier (dentry , nfs_save_change_attribute ( dir ) );
531
+ nfs_set_verifier (dentry , dir_verifier );
530
532
out :
531
533
dput (dentry );
532
534
}
@@ -564,7 +566,8 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en
564
566
count ++ ;
565
567
566
568
if (desc -> plus )
567
- nfs_prime_dcache (file_dentry (desc -> file ), entry );
569
+ nfs_prime_dcache (file_dentry (desc -> file ), entry ,
570
+ desc -> dir_verifier );
568
571
569
572
status = nfs_readdir_add_to_array (entry , page );
570
573
if (status != 0 )
@@ -1159,6 +1162,7 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
1159
1162
struct nfs_fh * fhandle ;
1160
1163
struct nfs_fattr * fattr ;
1161
1164
struct nfs4_label * label ;
1165
+ unsigned long dir_verifier ;
1162
1166
int ret ;
1163
1167
1164
1168
ret = - ENOMEM ;
@@ -1168,6 +1172,7 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
1168
1172
if (fhandle == NULL || fattr == NULL || IS_ERR (label ))
1169
1173
goto out ;
1170
1174
1175
+ dir_verifier = nfs_save_change_attribute (dir );
1171
1176
ret = NFS_PROTO (dir )-> lookup (dir , dentry , fhandle , fattr , label );
1172
1177
if (ret < 0 ) {
1173
1178
switch (ret ) {
@@ -1188,7 +1193,7 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
1188
1193
goto out ;
1189
1194
1190
1195
nfs_setsecurity (inode , fattr , label );
1191
- nfs_set_verifier (dentry , nfs_save_change_attribute ( dir ) );
1196
+ nfs_set_verifier (dentry , dir_verifier );
1192
1197
1193
1198
/* set a readdirplus hint that we had a cache miss */
1194
1199
nfs_force_use_readdirplus (dir );
@@ -1415,6 +1420,7 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
1415
1420
struct nfs_fh * fhandle = NULL ;
1416
1421
struct nfs_fattr * fattr = NULL ;
1417
1422
struct nfs4_label * label = NULL ;
1423
+ unsigned long dir_verifier ;
1418
1424
int error ;
1419
1425
1420
1426
dfprintk (VFS , "NFS: lookup(%pd2)\n" , dentry );
@@ -1440,6 +1446,7 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
1440
1446
if (IS_ERR (label ))
1441
1447
goto out ;
1442
1448
1449
+ dir_verifier = nfs_save_change_attribute (dir );
1443
1450
trace_nfs_lookup_enter (dir , dentry , flags );
1444
1451
error = NFS_PROTO (dir )-> lookup (dir , dentry , fhandle , fattr , label );
1445
1452
if (error == - ENOENT )
@@ -1463,7 +1470,7 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
1463
1470
goto out_label ;
1464
1471
dentry = res ;
1465
1472
}
1466
- nfs_set_verifier (dentry , nfs_save_change_attribute ( dir ) );
1473
+ nfs_set_verifier (dentry , dir_verifier );
1467
1474
out_label :
1468
1475
trace_nfs_lookup_exit (dir , dentry , flags , error );
1469
1476
nfs4_label_free (label );
0 commit comments