mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-10 00:17:18 +00:00
NFS: Don't advance the page pointer unless the page is full
When we hit the end of the data in the readdir page, we don't want to start filling a new page, unless this one is full. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
728dd0ab37
commit
c8f0523ba3
32
fs/nfs/dir.c
32
fs/nfs/dir.c
@ -417,6 +417,18 @@ bool nfs_readdir_use_cookie(const struct file *filp)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nfs_readdir_seek_next_array(struct nfs_cache_array *array,
|
||||||
|
struct nfs_readdir_descriptor *desc)
|
||||||
|
{
|
||||||
|
if (array->page_full) {
|
||||||
|
desc->last_cookie = array->last_cookie;
|
||||||
|
desc->current_index += array->size;
|
||||||
|
desc->cache_entry_index = 0;
|
||||||
|
desc->page_index++;
|
||||||
|
} else
|
||||||
|
desc->last_cookie = array->array[0].cookie;
|
||||||
|
}
|
||||||
|
|
||||||
static int nfs_readdir_search_for_pos(struct nfs_cache_array *array,
|
static int nfs_readdir_search_for_pos(struct nfs_cache_array *array,
|
||||||
struct nfs_readdir_descriptor *desc)
|
struct nfs_readdir_descriptor *desc)
|
||||||
{
|
{
|
||||||
@ -428,6 +440,7 @@ static int nfs_readdir_search_for_pos(struct nfs_cache_array *array,
|
|||||||
if (diff >= array->size) {
|
if (diff >= array->size) {
|
||||||
if (array->page_is_eof)
|
if (array->page_is_eof)
|
||||||
goto out_eof;
|
goto out_eof;
|
||||||
|
nfs_readdir_seek_next_array(array, desc);
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -500,7 +513,8 @@ check_eof:
|
|||||||
status = -EBADCOOKIE;
|
status = -EBADCOOKIE;
|
||||||
if (desc->dir_cookie == array->last_cookie)
|
if (desc->dir_cookie == array->last_cookie)
|
||||||
desc->eof = true;
|
desc->eof = true;
|
||||||
}
|
} else
|
||||||
|
nfs_readdir_seek_next_array(array, desc);
|
||||||
out:
|
out:
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -517,11 +531,6 @@ static int nfs_readdir_search_array(struct nfs_readdir_descriptor *desc)
|
|||||||
else
|
else
|
||||||
status = nfs_readdir_search_for_cookie(array, desc);
|
status = nfs_readdir_search_for_cookie(array, desc);
|
||||||
|
|
||||||
if (status == -EAGAIN) {
|
|
||||||
desc->last_cookie = array->last_cookie;
|
|
||||||
desc->current_index += array->size;
|
|
||||||
desc->page_index++;
|
|
||||||
}
|
|
||||||
kunmap_atomic(array);
|
kunmap_atomic(array);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -998,7 +1007,7 @@ static void nfs_do_filldir(struct nfs_readdir_descriptor *desc,
|
|||||||
{
|
{
|
||||||
struct file *file = desc->file;
|
struct file *file = desc->file;
|
||||||
struct nfs_cache_array *array;
|
struct nfs_cache_array *array;
|
||||||
unsigned int i = 0;
|
unsigned int i;
|
||||||
|
|
||||||
array = kmap(desc->page);
|
array = kmap(desc->page);
|
||||||
for (i = desc->cache_entry_index; i < array->size; i++) {
|
for (i = desc->cache_entry_index; i < array->size; i++) {
|
||||||
@ -1011,10 +1020,13 @@ static void nfs_do_filldir(struct nfs_readdir_descriptor *desc,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy(desc->verf, verf, sizeof(desc->verf));
|
memcpy(desc->verf, verf, sizeof(desc->verf));
|
||||||
if (i < (array->size-1))
|
if (i == array->size - 1) {
|
||||||
desc->dir_cookie = array->array[i+1].cookie;
|
|
||||||
else
|
|
||||||
desc->dir_cookie = array->last_cookie;
|
desc->dir_cookie = array->last_cookie;
|
||||||
|
nfs_readdir_seek_next_array(array, desc);
|
||||||
|
} else {
|
||||||
|
desc->dir_cookie = array->array[i + 1].cookie;
|
||||||
|
desc->last_cookie = array->array[0].cookie;
|
||||||
|
}
|
||||||
if (nfs_readdir_use_cookie(file))
|
if (nfs_readdir_use_cookie(file))
|
||||||
desc->ctx->pos = desc->dir_cookie;
|
desc->ctx->pos = desc->dir_cookie;
|
||||||
else
|
else
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user