mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 05:34:13 +08:00
NFS: Simplify nfs_readdir_xdr_to_array()
Recent changes to readdir mean that we can cope with partially filled page cache entries, so we no longer need to rely on looping in nfs_readdir_xdr_to_array(). Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
6c34f05b75
commit
9ff89c25d8
29
fs/nfs/dir.c
29
fs/nfs/dir.c
@ -889,6 +889,7 @@ static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
|
||||
size_t array_size;
|
||||
struct inode *inode = file_inode(desc->file);
|
||||
unsigned int dtsize = desc->dtsize;
|
||||
unsigned int pglen;
|
||||
int status = -ENOMEM;
|
||||
|
||||
entry = kzalloc(sizeof(*entry), GFP_KERNEL);
|
||||
@ -906,28 +907,20 @@ static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
|
||||
if (!pages)
|
||||
goto out;
|
||||
|
||||
do {
|
||||
unsigned int pglen;
|
||||
status = nfs_readdir_xdr_filler(desc, verf_arg, entry->cookie,
|
||||
pages, dtsize,
|
||||
verf_res);
|
||||
if (status < 0)
|
||||
break;
|
||||
|
||||
pglen = status;
|
||||
if (pglen == 0) {
|
||||
nfs_readdir_page_set_eof(page);
|
||||
break;
|
||||
}
|
||||
|
||||
verf_arg = verf_res;
|
||||
status = nfs_readdir_xdr_filler(desc, verf_arg, entry->cookie, pages,
|
||||
dtsize, verf_res);
|
||||
if (status < 0)
|
||||
goto free_pages;
|
||||
|
||||
pglen = status;
|
||||
if (pglen != 0)
|
||||
status = nfs_readdir_page_filler(desc, entry, pages, pglen,
|
||||
arrays, narrays);
|
||||
desc->buffer_fills++;
|
||||
} while (!status && nfs_readdir_page_needs_filling(page) &&
|
||||
page_mapping(page));
|
||||
else
|
||||
nfs_readdir_page_set_eof(page);
|
||||
desc->buffer_fills++;
|
||||
|
||||
free_pages:
|
||||
nfs_readdir_free_pages(pages, array_size);
|
||||
out:
|
||||
nfs_free_fattr(entry->fattr);
|
||||
|
Loading…
Reference in New Issue
Block a user