]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/nfs/dir.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
[linux.git] / fs / nfs / dir.c
index d95c2c94bd8764229669af8082451468d84881e8..1320288ff9ec9c7d50d207908d77f3899c7def3b 100644 (file)
@@ -58,7 +58,7 @@ static void nfs_readdir_clear_array(struct page*);
 const struct file_operations nfs_dir_operations = {
        .llseek         = nfs_llseek_dir,
        .read           = generic_read_dir,
-       .iterate        = nfs_readdir,
+       .iterate_shared = nfs_readdir,
        .open           = nfs_opendir,
        .release        = nfs_closedir,
        .fsync          = nfs_fsync_dir,
@@ -198,7 +198,7 @@ static
 int nfs_readdir_make_qstr(struct qstr *string, const char *name, unsigned int len)
 {
        string->len = len;
-       string->name = kmemdup(name, len, GFP_KERNEL);
+       string->name = kmemdup_nul(name, len, GFP_KERNEL);
        if (string->name == NULL)
                return -ENOMEM;
        /*
@@ -449,7 +449,8 @@ void nfs_force_use_readdirplus(struct inode *dir)
        if (nfs_server_capable(dir, NFS_CAP_READDIRPLUS) &&
            !list_empty(&nfsi->open_files)) {
                set_bit(NFS_INO_ADVISE_RDPLUS, &nfsi->flags);
-               invalidate_mapping_pages(dir->i_mapping, 0, -1);
+               invalidate_mapping_pages(dir->i_mapping,
+                       nfsi->page_index + 1, -1);
        }
 }
 
@@ -720,6 +721,8 @@ struct page *get_cache_page(nfs_readdir_descriptor_t *desc)
 static
 int find_and_lock_cache_page(nfs_readdir_descriptor_t *desc)
 {
+       struct inode *inode = file_inode(desc->file);
+       struct nfs_inode *nfsi = NFS_I(inode);
        int res;
 
        desc->page = get_cache_page(desc);
@@ -731,8 +734,10 @@ int find_and_lock_cache_page(nfs_readdir_descriptor_t *desc)
        res = -EAGAIN;
        if (desc->page->mapping != NULL) {
                res = nfs_readdir_search_array(desc);
-               if (res == 0)
+               if (res == 0) {
+                       nfsi->page_index = desc->page_index;
                        return 0;
+               }
        }
        unlock_page(desc->page);
 error: