mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
nfs: fix redundant readdir request after get eof
When a directory contains 17 files (except . and ..), nfs client sends
a redundant readdir request after get eof.
A simple reproduce,
At NFS server, create a directory with 17 files under exported directory.
# mkdir test
# cd test
# for i in {0..16} ; do touch $i; done
At NFS client, no matter mounting through nfsv3 or nfsv4,
does ls (or ll) at the created test directory.
A tshark output likes following (for nfsv4),
# tshark -i eth0 tcp port 2049 -Tfields -e ip.src -e ip.dst -e nfs -e nfs.cookie4
srcip dstip SEQUENCE, PUTFH, READDIR 0
dstip srcip SEQUENCE PUTFH READDIR 909539109313539306,2108391201987888856,2305312124304486544,2566335452463141496,2978225129081509984,4263037479923412583,4304697173036510679,4666703455469210097,4759208201298769007,4776701232145978803,5338408478512081262,5949498658935544804,5971526429894832903,6294060338267709855,6528840566229532529,8600463293536422524,9223372036854775807
srcip dstip
srcip dstip SEQUENCE, PUTFH, READDIR 9223372036854775807
dstip srcip SEQUENCE PUTFH READDIR
The READDIR with cookie 9223372036854775807(0x7FFFFFFFFFFFFFFF) is redundant.
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
08b45fcb2d
commit
14e7316a3c
15
fs/nfs/dir.c
15
fs/nfs/dir.c
|
|
@ -1089,6 +1089,17 @@ static void nfs_do_filldir(struct nfs_readdir_descriptor *desc,
|
|||
for (i = desc->cache_entry_index; i < array->size; i++) {
|
||||
struct nfs_cache_array_entry *ent;
|
||||
|
||||
/*
|
||||
* nfs_readdir_handle_cache_misses return force clear at
|
||||
* (cache_misses > NFS_READDIR_CACHE_MISS_THRESHOLD) for
|
||||
* readdir heuristic, NFS_READDIR_CACHE_MISS_THRESHOLD + 1
|
||||
* entries need be emitted here.
|
||||
*/
|
||||
if (first_emit && i > NFS_READDIR_CACHE_MISS_THRESHOLD + 2) {
|
||||
desc->eob = true;
|
||||
break;
|
||||
}
|
||||
|
||||
ent = &array->array[i];
|
||||
if (!dir_emit(desc->ctx, ent->name, ent->name_len,
|
||||
nfs_compat_user_ino64(ent->ino), ent->d_type)) {
|
||||
|
|
@ -1107,10 +1118,6 @@ static void nfs_do_filldir(struct nfs_readdir_descriptor *desc,
|
|||
desc->ctx->pos = desc->dir_cookie;
|
||||
else
|
||||
desc->ctx->pos++;
|
||||
if (first_emit && i > NFS_READDIR_CACHE_MISS_THRESHOLD + 1) {
|
||||
desc->eob = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (array->folio_is_eof)
|
||||
desc->eof = !desc->eob;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user