Lines Matching refs:desc

262 int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc)  in nfs_readdir_search_for_pos()  argument
264 loff_t diff = desc->ctx->pos - desc->current_index; in nfs_readdir_search_for_pos()
276 *desc->dir_cookie = array->array[index].cookie; in nfs_readdir_search_for_pos()
277 desc->cache_entry_index = index; in nfs_readdir_search_for_pos()
280 desc->eof = 1; in nfs_readdir_search_for_pos()
294 int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc) in nfs_readdir_search_for_cookie() argument
301 if (array->array[i].cookie == *desc->dir_cookie) { in nfs_readdir_search_for_cookie()
302 struct nfs_inode *nfsi = NFS_I(file_inode(desc->file)); in nfs_readdir_search_for_cookie()
303 struct nfs_open_dir_context *ctx = desc->file->private_data; in nfs_readdir_search_for_cookie()
305 new_pos = desc->current_index + i; in nfs_readdir_search_for_cookie()
310 } else if (new_pos < desc->ctx->pos) { in nfs_readdir_search_for_cookie()
312 && ctx->dup_cookie == *desc->dir_cookie) { in nfs_readdir_search_for_cookie()
317 desc->file, array->array[i].string.len, in nfs_readdir_search_for_cookie()
318 array->array[i].string.name, *desc->dir_cookie); in nfs_readdir_search_for_cookie()
323 ctx->dup_cookie = *desc->dir_cookie; in nfs_readdir_search_for_cookie()
326 desc->ctx->pos = new_pos; in nfs_readdir_search_for_cookie()
327 desc->cache_entry_index = i; in nfs_readdir_search_for_cookie()
333 if (*desc->dir_cookie == array->last_cookie) in nfs_readdir_search_for_cookie()
334 desc->eof = 1; in nfs_readdir_search_for_cookie()
341 int nfs_readdir_search_array(nfs_readdir_descriptor_t *desc) in nfs_readdir_search_array() argument
346 array = nfs_readdir_get_array(desc->page); in nfs_readdir_search_array()
352 if (*desc->dir_cookie == 0) in nfs_readdir_search_array()
353 status = nfs_readdir_search_for_pos(array, desc); in nfs_readdir_search_array()
355 status = nfs_readdir_search_for_cookie(array, desc); in nfs_readdir_search_array()
358 desc->last_cookie = array->last_cookie; in nfs_readdir_search_array()
359 desc->current_index += array->size; in nfs_readdir_search_array()
360 desc->page_index++; in nfs_readdir_search_array()
362 nfs_readdir_release_array(desc->page); in nfs_readdir_search_array()
369 int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc, in nfs_readdir_xdr_filler() argument
381 NFS_SERVER(inode)->dtsize, desc->plus); in nfs_readdir_xdr_filler()
384 if (error == -ENOTSUPP && desc->plus) { in nfs_readdir_xdr_filler()
387 desc->plus = 0; in nfs_readdir_xdr_filler()
392 desc->timestamp = timestamp; in nfs_readdir_xdr_filler()
393 desc->gencount = gencount; in nfs_readdir_xdr_filler()
398 static int xdr_decode(nfs_readdir_descriptor_t *desc, in xdr_decode() argument
403 error = desc->decode(xdr, entry, desc->plus); in xdr_decode()
406 entry->fattr->time_start = desc->timestamp; in xdr_decode()
407 entry->fattr->gencount = desc->gencount; in xdr_decode()
532 int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *entry, in nfs_readdir_page_filler() argument
553 status = xdr_decode(desc, entry, &stream); in nfs_readdir_page_filler()
562 if (desc->plus != 0) in nfs_readdir_page_filler()
563 nfs_prime_dcache(file_dentry(desc->file), entry); in nfs_readdir_page_filler()
616 int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode) in nfs_readdir_xdr_to_array() argument
620 struct file *file = desc->file; in nfs_readdir_xdr_to_array()
626 entry.cookie = desc->last_cookie; in nfs_readdir_xdr_to_array()
653 status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode); in nfs_readdir_xdr_to_array()
658 status = nfs_readdir_page_filler(desc, &entry, pages, page, pglen); in nfs_readdir_xdr_to_array()
684 int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page* page) in nfs_readdir_filler() argument
686 struct inode *inode = file_inode(desc->file); in nfs_readdir_filler()
689 ret = nfs_readdir_xdr_to_array(desc, page, inode); in nfs_readdir_filler()
706 void cache_page_release(nfs_readdir_descriptor_t *desc) in cache_page_release() argument
708 if (!desc->page->mapping) in cache_page_release()
709 nfs_readdir_clear_array(desc->page); in cache_page_release()
710 page_cache_release(desc->page); in cache_page_release()
711 desc->page = NULL; in cache_page_release()
715 struct page *get_cache_page(nfs_readdir_descriptor_t *desc) in get_cache_page() argument
717 return read_cache_page(file_inode(desc->file)->i_mapping, in get_cache_page()
718 desc->page_index, (filler_t *)nfs_readdir_filler, desc); in get_cache_page()
725 int find_cache_page(nfs_readdir_descriptor_t *desc) in find_cache_page() argument
729 desc->page = get_cache_page(desc); in find_cache_page()
730 if (IS_ERR(desc->page)) in find_cache_page()
731 return PTR_ERR(desc->page); in find_cache_page()
733 res = nfs_readdir_search_array(desc); in find_cache_page()
735 cache_page_release(desc); in find_cache_page()
741 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) in readdir_search_pagecache() argument
745 if (desc->page_index == 0) { in readdir_search_pagecache()
746 desc->current_index = 0; in readdir_search_pagecache()
747 desc->last_cookie = 0; in readdir_search_pagecache()
750 res = find_cache_page(desc); in readdir_search_pagecache()
759 int nfs_do_filldir(nfs_readdir_descriptor_t *desc) in nfs_do_filldir() argument
761 struct file *file = desc->file; in nfs_do_filldir()
767 array = nfs_readdir_get_array(desc->page); in nfs_do_filldir()
773 for (i = desc->cache_entry_index; i < array->size; i++) { in nfs_do_filldir()
777 if (!dir_emit(desc->ctx, ent->string.name, ent->string.len, in nfs_do_filldir()
779 desc->eof = 1; in nfs_do_filldir()
782 desc->ctx->pos++; in nfs_do_filldir()
784 *desc->dir_cookie = array->array[i+1].cookie; in nfs_do_filldir()
786 *desc->dir_cookie = array->last_cookie; in nfs_do_filldir()
791 desc->eof = 1; in nfs_do_filldir()
793 nfs_readdir_release_array(desc->page); in nfs_do_filldir()
795 cache_page_release(desc); in nfs_do_filldir()
797 (unsigned long long)*desc->dir_cookie, res); in nfs_do_filldir()
814 int uncached_readdir(nfs_readdir_descriptor_t *desc) in uncached_readdir() argument
818 struct inode *inode = file_inode(desc->file); in uncached_readdir()
819 struct nfs_open_dir_context *ctx = desc->file->private_data; in uncached_readdir()
822 (unsigned long long)*desc->dir_cookie); in uncached_readdir()
830 desc->page_index = 0; in uncached_readdir()
831 desc->last_cookie = *desc->dir_cookie; in uncached_readdir()
832 desc->page = page; in uncached_readdir()
835 status = nfs_readdir_xdr_to_array(desc, page, inode); in uncached_readdir()
839 status = nfs_do_filldir(desc); in uncached_readdir()
846 cache_page_release(desc); in uncached_readdir()
870 *desc = &my_desc; in nfs_readdir() local
884 memset(desc, 0, sizeof(*desc)); in nfs_readdir()
886 desc->file = file; in nfs_readdir()
887 desc->ctx = ctx; in nfs_readdir()
888 desc->dir_cookie = &dir_ctx->dir_cookie; in nfs_readdir()
889 desc->decode = NFS_PROTO(inode)->decode_dirent; in nfs_readdir()
890 desc->plus = nfs_use_readdirplus(inode, ctx) ? 1 : 0; in nfs_readdir()
899 res = readdir_search_pagecache(desc); in nfs_readdir()
904 if (*desc->dir_cookie && desc->eof == 0) { in nfs_readdir()
906 res = uncached_readdir(desc); in nfs_readdir()
912 if (res == -ETOOSMALL && desc->plus) { in nfs_readdir()
915 desc->page_index = 0; in nfs_readdir()
916 desc->plus = 0; in nfs_readdir()
917 desc->eof = 0; in nfs_readdir()
923 res = nfs_do_filldir(desc); in nfs_readdir()
926 } while (!desc->eof); in nfs_readdir()