diff options
| author | Trond Myklebust <trond.myklebust@fys.uio.no> | 2002-07-28 02:45:27 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-07-28 02:45:27 -0700 |
| commit | 4fe70049be610ecee92c13b985a8925a4a49d68f (patch) | |
| tree | 86f5ff69fb8bb2e2a654a5515cf8b7342542e40f | |
| parent | 4102986dc24d6cbba19674098c817f415a746bab (diff) | |
[PATCH] Support for cached lookups via readdirplus [1/6]
Cleanup for the readdirplus code. Make struct nfs_entry take pointers
to the filehandle and file attributes.
| -rw-r--r-- | fs/nfs/dir.c | 13 | ||||
| -rw-r--r-- | fs/nfs/nfs3xdr.c | 12 | ||||
| -rw-r--r-- | include/linux/nfs_xdr.h | 4 |
3 files changed, 17 insertions, 12 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index c03054d0e721..a929bef49bdf 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -333,7 +333,8 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent, /* Reset read descriptor so it searches the page cache from * the start upon the next call to readdir_search_pagecache() */ desc->page_index = 0; - memset(desc->entry, 0, sizeof(*desc->entry)); + desc->entry->cookie = desc->entry->prev_cookie = 0; + desc->entry->eof = 0; out: dfprintk(VFS, "NFS: uncached_readdir() returns %d\n", status); return status; @@ -352,6 +353,8 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir) nfs_readdir_descriptor_t my_desc, *desc = &my_desc; struct nfs_entry my_entry; + struct nfs_fh fh; + struct nfs_fattr fattr; long res; lock_kernel(); @@ -369,13 +372,17 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir) * itself. */ memset(desc, 0, sizeof(*desc)); - memset(&my_entry, 0, sizeof(my_entry)); desc->file = filp; desc->target = filp->f_pos; - desc->entry = &my_entry; desc->decode = NFS_PROTO(inode)->decode_dirent; + my_entry.cookie = my_entry.prev_cookie = 0; + my_entry.eof = 0; + my_entry.fh = &fh; + my_entry.fattr = &fattr; + desc->entry = &my_entry; + while(!desc->entry->eof) { res = readdir_search_pagecache(desc); if (res == -EBADCOOKIE) { diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c index d25de78172ae..8a4f1051c692 100644 --- a/fs/nfs/nfs3xdr.c +++ b/fs/nfs/nfs3xdr.c @@ -603,21 +603,19 @@ nfs3_decode_dirent(u32 *p, struct nfs_entry *entry, int plus) p = xdr_decode_hyper(p, &entry->cookie); if (plus) { - p = xdr_decode_post_op_attr(p, &entry->fattr); + entry->fattr->valid = 0; + p = xdr_decode_post_op_attr(p, entry->fattr); /* In fact, a post_op_fh3: */ if (*p++) { - p = xdr_decode_fhandle(p, &entry->fh); + p = xdr_decode_fhandle(p, entry->fh); /* Ugh -- server reply was truncated */ if (p == NULL) { dprintk("NFS: FH truncated\n"); *entry = old; return ERR_PTR(-EAGAIN); } - } else { - /* If we don't get a file handle, the attrs - * aren't worth a lot. */ - entry->fattr.valid = 0; - } + } else + memset((u8*)(entry->fh), 0, sizeof(*entry->fh)); } entry->eof = !p[0] && p[1]; diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 53ec9c0b94d0..2548bd6b85d9 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -109,8 +109,8 @@ struct nfs_entry { const char * name; unsigned int len; int eof; - struct nfs_fh fh; - struct nfs_fattr fattr; + struct nfs_fh * fh; + struct nfs_fattr * fattr; }; /* |
