Commit 0b2662b7 authored by Trond Myklebust's avatar Trond Myklebust

NFS: Calculate page offsets algorithmically

Instead of relying on counting the page offsets as we walk through the
page cache, switch to calculating them algorithmically.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 281f31b2
...@@ -249,17 +249,20 @@ static const char *nfs_readdir_copy_name(const char *name, unsigned int len) ...@@ -249,17 +249,20 @@ static const char *nfs_readdir_copy_name(const char *name, unsigned int len)
return ret; return ret;
} }
static size_t nfs_readdir_array_maxentries(void)
{
return (PAGE_SIZE - sizeof(struct nfs_cache_array)) /
sizeof(struct nfs_cache_array_entry);
}
/* /*
* Check that the next array entry lies entirely within the page bounds * Check that the next array entry lies entirely within the page bounds
*/ */
static int nfs_readdir_array_can_expand(struct nfs_cache_array *array) static int nfs_readdir_array_can_expand(struct nfs_cache_array *array)
{ {
struct nfs_cache_array_entry *cache_entry;
if (array->page_full) if (array->page_full)
return -ENOSPC; return -ENOSPC;
cache_entry = &array->array[array->size + 1]; if (array->size == nfs_readdir_array_maxentries()) {
if ((char *)cache_entry - (char *)array > PAGE_SIZE) {
array->page_full = 1; array->page_full = 1;
return -ENOSPC; return -ENOSPC;
} }
...@@ -318,6 +321,11 @@ static struct page *nfs_readdir_page_get_locked(struct address_space *mapping, ...@@ -318,6 +321,11 @@ static struct page *nfs_readdir_page_get_locked(struct address_space *mapping,
return page; return page;
} }
static loff_t nfs_readdir_page_offset(struct page *page)
{
return (loff_t)page->index * (loff_t)nfs_readdir_array_maxentries();
}
static u64 nfs_readdir_page_last_cookie(struct page *page) static u64 nfs_readdir_page_last_cookie(struct page *page)
{ {
struct nfs_cache_array *array; struct nfs_cache_array *array;
...@@ -448,7 +456,7 @@ static int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, ...@@ -448,7 +456,7 @@ static int nfs_readdir_search_for_cookie(struct nfs_cache_array *array,
if (array->array[i].cookie == desc->dir_cookie) { if (array->array[i].cookie == desc->dir_cookie) {
struct nfs_inode *nfsi = NFS_I(file_inode(desc->file)); struct nfs_inode *nfsi = NFS_I(file_inode(desc->file));
new_pos = desc->current_index + i; new_pos = nfs_readdir_page_offset(desc->page) + i;
if (desc->attr_gencount != nfsi->attr_gencount || if (desc->attr_gencount != nfsi->attr_gencount ||
!nfs_readdir_inode_mapping_valid(nfsi)) { !nfs_readdir_inode_mapping_valid(nfsi)) {
desc->duped = 0; desc->duped = 0;
......
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