Commit c8f0523b authored by Trond Myklebust's avatar Trond Myklebust

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: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 728dd0ab
...@@ -417,6 +417,18 @@ bool nfs_readdir_use_cookie(const struct file *filp) ...@@ -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, ...@@ -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 @@ static int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, ...@@ -500,7 +513,8 @@ static int nfs_readdir_search_for_cookie(struct nfs_cache_array *array,
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) ...@@ -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, ...@@ -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, ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment