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(desc->file->f_path.dentry, entry); in nfs_readdir_page_filler()
623 int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode) in nfs_readdir_xdr_to_array() argument
628 struct file *file = desc->file; in nfs_readdir_xdr_to_array()
634 entry.cookie = desc->last_cookie; in nfs_readdir_xdr_to_array()
661 status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode); in nfs_readdir_xdr_to_array()
666 status = nfs_readdir_page_filler(desc, &entry, pages, page, pglen); in nfs_readdir_xdr_to_array()
692 int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page* page) in nfs_readdir_filler() argument
694 struct inode *inode = file_inode(desc->file); in nfs_readdir_filler()
697 ret = nfs_readdir_xdr_to_array(desc, page, inode); in nfs_readdir_filler()
714 void cache_page_release(nfs_readdir_descriptor_t *desc) in cache_page_release() argument
716 if (!desc->page->mapping) in cache_page_release()
717 nfs_readdir_clear_array(desc->page); in cache_page_release()
718 page_cache_release(desc->page); in cache_page_release()
719 desc->page = NULL; in cache_page_release()
723 struct page *get_cache_page(nfs_readdir_descriptor_t *desc) in get_cache_page() argument
725 return read_cache_page(file_inode(desc->file)->i_mapping, in get_cache_page()
726 desc->page_index, (filler_t *)nfs_readdir_filler, desc); in get_cache_page()
733 int find_cache_page(nfs_readdir_descriptor_t *desc) in find_cache_page() argument
737 desc->page = get_cache_page(desc); in find_cache_page()
738 if (IS_ERR(desc->page)) in find_cache_page()
739 return PTR_ERR(desc->page); in find_cache_page()
741 res = nfs_readdir_search_array(desc); in find_cache_page()
743 cache_page_release(desc); in find_cache_page()
749 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) in readdir_search_pagecache() argument
753 if (desc->page_index == 0) { in readdir_search_pagecache()
754 desc->current_index = 0; in readdir_search_pagecache()
755 desc->last_cookie = 0; in readdir_search_pagecache()
758 res = find_cache_page(desc); in readdir_search_pagecache()
767 int nfs_do_filldir(nfs_readdir_descriptor_t *desc) in nfs_do_filldir() argument
769 struct file *file = desc->file; in nfs_do_filldir()
775 array = nfs_readdir_get_array(desc->page); in nfs_do_filldir()
781 for (i = desc->cache_entry_index; i < array->size; i++) { in nfs_do_filldir()
785 if (!dir_emit(desc->ctx, ent->string.name, ent->string.len, in nfs_do_filldir()
787 desc->eof = 1; in nfs_do_filldir()
790 desc->ctx->pos++; in nfs_do_filldir()
792 *desc->dir_cookie = array->array[i+1].cookie; in nfs_do_filldir()
794 *desc->dir_cookie = array->last_cookie; in nfs_do_filldir()
799 desc->eof = 1; in nfs_do_filldir()
801 nfs_readdir_release_array(desc->page); in nfs_do_filldir()
803 cache_page_release(desc); in nfs_do_filldir()
805 (unsigned long long)*desc->dir_cookie, res); in nfs_do_filldir()
822 int uncached_readdir(nfs_readdir_descriptor_t *desc) in uncached_readdir() argument
826 struct inode *inode = file_inode(desc->file); in uncached_readdir()
827 struct nfs_open_dir_context *ctx = desc->file->private_data; in uncached_readdir()
830 (unsigned long long)*desc->dir_cookie); in uncached_readdir()
838 desc->page_index = 0; in uncached_readdir()
839 desc->last_cookie = *desc->dir_cookie; in uncached_readdir()
840 desc->page = page; in uncached_readdir()
843 status = nfs_readdir_xdr_to_array(desc, page, inode); in uncached_readdir()
847 status = nfs_do_filldir(desc); in uncached_readdir()
854 cache_page_release(desc); in uncached_readdir()
878 *desc = &my_desc; in nfs_readdir() local
892 memset(desc, 0, sizeof(*desc)); in nfs_readdir()
894 desc->file = file; in nfs_readdir()
895 desc->ctx = ctx; in nfs_readdir()
896 desc->dir_cookie = &dir_ctx->dir_cookie; in nfs_readdir()
897 desc->decode = NFS_PROTO(inode)->decode_dirent; in nfs_readdir()
898 desc->plus = nfs_use_readdirplus(inode, ctx) ? 1 : 0; in nfs_readdir()
907 res = readdir_search_pagecache(desc); in nfs_readdir()
912 if (*desc->dir_cookie && desc->eof == 0) { in nfs_readdir()
914 res = uncached_readdir(desc); in nfs_readdir()
920 if (res == -ETOOSMALL && desc->plus) { in nfs_readdir()
923 desc->page_index = 0; in nfs_readdir()
924 desc->plus = 0; in nfs_readdir()
925 desc->eof = 0; in nfs_readdir()
931 res = nfs_do_filldir(desc); in nfs_readdir()
934 } while (!desc->eof); in nfs_readdir()