• Home
  • Raw
  • Download

Lines Matching refs:desc

231 int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc)  in nfs_readdir_search_for_pos()  argument
233 loff_t diff = desc->ctx->pos - desc->current_index; in nfs_readdir_search_for_pos()
245 *desc->dir_cookie = array->array[index].cookie; in nfs_readdir_search_for_pos()
246 desc->cache_entry_index = index; in nfs_readdir_search_for_pos()
249 desc->eof = true; in nfs_readdir_search_for_pos()
263 int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc) in nfs_readdir_search_for_cookie() argument
270 if (array->array[i].cookie == *desc->dir_cookie) { in nfs_readdir_search_for_cookie()
271 struct nfs_inode *nfsi = NFS_I(file_inode(desc->file)); in nfs_readdir_search_for_cookie()
272 struct nfs_open_dir_context *ctx = desc->file->private_data; in nfs_readdir_search_for_cookie()
274 new_pos = desc->current_index + i; in nfs_readdir_search_for_cookie()
279 } else if (new_pos < desc->ctx->pos) { in nfs_readdir_search_for_cookie()
281 && ctx->dup_cookie == *desc->dir_cookie) { in nfs_readdir_search_for_cookie()
286 desc->file, array->array[i].string.len, in nfs_readdir_search_for_cookie()
287 array->array[i].string.name, *desc->dir_cookie); in nfs_readdir_search_for_cookie()
292 ctx->dup_cookie = *desc->dir_cookie; in nfs_readdir_search_for_cookie()
295 desc->ctx->pos = new_pos; in nfs_readdir_search_for_cookie()
296 desc->cache_entry_index = i; in nfs_readdir_search_for_cookie()
302 if (*desc->dir_cookie == array->last_cookie) in nfs_readdir_search_for_cookie()
303 desc->eof = true; in nfs_readdir_search_for_cookie()
310 int nfs_readdir_search_array(nfs_readdir_descriptor_t *desc) in nfs_readdir_search_array() argument
315 array = kmap(desc->page); in nfs_readdir_search_array()
317 if (*desc->dir_cookie == 0) in nfs_readdir_search_array()
318 status = nfs_readdir_search_for_pos(array, desc); in nfs_readdir_search_array()
320 status = nfs_readdir_search_for_cookie(array, desc); in nfs_readdir_search_array()
323 desc->last_cookie = array->last_cookie; in nfs_readdir_search_array()
324 desc->current_index += array->size; in nfs_readdir_search_array()
325 desc->page_index++; in nfs_readdir_search_array()
327 kunmap(desc->page); in nfs_readdir_search_array()
333 int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc, in nfs_readdir_xdr_filler() argument
345 NFS_SERVER(inode)->dtsize, desc->plus); in nfs_readdir_xdr_filler()
348 if (error == -ENOTSUPP && desc->plus) { in nfs_readdir_xdr_filler()
351 desc->plus = false; in nfs_readdir_xdr_filler()
356 desc->timestamp = timestamp; in nfs_readdir_xdr_filler()
357 desc->gencount = gencount; in nfs_readdir_xdr_filler()
362 static int xdr_decode(nfs_readdir_descriptor_t *desc, in xdr_decode() argument
367 error = desc->decode(xdr, entry, desc->plus); in xdr_decode()
370 entry->fattr->time_start = desc->timestamp; in xdr_decode()
371 entry->fattr->gencount = desc->gencount; in xdr_decode()
523 int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *entry, in nfs_readdir_page_filler() argument
544 status = xdr_decode(desc, entry, &stream); in nfs_readdir_page_filler()
553 if (desc->plus) in nfs_readdir_page_filler()
554 nfs_prime_dcache(file_dentry(desc->file), entry); in nfs_readdir_page_filler()
604 int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode) in nfs_readdir_xdr_to_array() argument
608 struct file *file = desc->file; in nfs_readdir_xdr_to_array()
614 entry.cookie = desc->last_cookie; in nfs_readdir_xdr_to_array()
637 status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode); in nfs_readdir_xdr_to_array()
642 status = nfs_readdir_page_filler(desc, &entry, pages, page, pglen); in nfs_readdir_xdr_to_array()
669 nfs_readdir_descriptor_t *desc = data; in nfs_readdir_filler() local
670 struct inode *inode = file_inode(desc->file); in nfs_readdir_filler()
673 ret = nfs_readdir_xdr_to_array(desc, page, inode); in nfs_readdir_filler()
690 void cache_page_release(nfs_readdir_descriptor_t *desc) in cache_page_release() argument
692 if (!desc->page->mapping) in cache_page_release()
693 nfs_readdir_clear_array(desc->page); in cache_page_release()
694 put_page(desc->page); in cache_page_release()
695 desc->page = NULL; in cache_page_release()
699 struct page *get_cache_page(nfs_readdir_descriptor_t *desc) in get_cache_page() argument
701 return read_cache_page(desc->file->f_mapping, desc->page_index, in get_cache_page()
702 nfs_readdir_filler, desc); in get_cache_page()
709 int find_cache_page(nfs_readdir_descriptor_t *desc) in find_cache_page() argument
713 desc->page = get_cache_page(desc); in find_cache_page()
714 if (IS_ERR(desc->page)) in find_cache_page()
715 return PTR_ERR(desc->page); in find_cache_page()
717 res = nfs_readdir_search_array(desc); in find_cache_page()
719 cache_page_release(desc); in find_cache_page()
725 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) in readdir_search_pagecache() argument
729 if (desc->page_index == 0) { in readdir_search_pagecache()
730 desc->current_index = 0; in readdir_search_pagecache()
731 desc->last_cookie = 0; in readdir_search_pagecache()
734 res = find_cache_page(desc); in readdir_search_pagecache()
743 int nfs_do_filldir(nfs_readdir_descriptor_t *desc) in nfs_do_filldir() argument
745 struct file *file = desc->file; in nfs_do_filldir()
751 array = kmap(desc->page); in nfs_do_filldir()
752 for (i = desc->cache_entry_index; i < array->size; i++) { in nfs_do_filldir()
756 if (!dir_emit(desc->ctx, ent->string.name, ent->string.len, in nfs_do_filldir()
758 desc->eof = true; in nfs_do_filldir()
761 desc->ctx->pos++; in nfs_do_filldir()
763 *desc->dir_cookie = array->array[i+1].cookie; in nfs_do_filldir()
765 *desc->dir_cookie = array->last_cookie; in nfs_do_filldir()
770 desc->eof = true; in nfs_do_filldir()
772 kunmap(desc->page); in nfs_do_filldir()
773 cache_page_release(desc); in nfs_do_filldir()
775 (unsigned long long)*desc->dir_cookie, res); in nfs_do_filldir()
792 int uncached_readdir(nfs_readdir_descriptor_t *desc) in uncached_readdir() argument
796 struct inode *inode = file_inode(desc->file); in uncached_readdir()
797 struct nfs_open_dir_context *ctx = desc->file->private_data; in uncached_readdir()
800 (unsigned long long)*desc->dir_cookie); in uncached_readdir()
808 desc->page_index = 0; in uncached_readdir()
809 desc->last_cookie = *desc->dir_cookie; in uncached_readdir()
810 desc->page = page; in uncached_readdir()
813 status = nfs_readdir_xdr_to_array(desc, page, inode); in uncached_readdir()
817 status = nfs_do_filldir(desc); in uncached_readdir()
824 cache_page_release(desc); in uncached_readdir()
837 *desc = &my_desc; in nfs_readdir() local
851 memset(desc, 0, sizeof(*desc)); in nfs_readdir()
853 desc->file = file; in nfs_readdir()
854 desc->ctx = ctx; in nfs_readdir()
855 desc->dir_cookie = &dir_ctx->dir_cookie; in nfs_readdir()
856 desc->decode = NFS_PROTO(inode)->decode_dirent; in nfs_readdir()
857 desc->plus = nfs_use_readdirplus(inode, ctx); in nfs_readdir()
865 res = readdir_search_pagecache(desc); in nfs_readdir()
870 if (*desc->dir_cookie && !desc->eof) { in nfs_readdir()
872 res = uncached_readdir(desc); in nfs_readdir()
878 if (res == -ETOOSMALL && desc->plus) { in nfs_readdir()
881 desc->page_index = 0; in nfs_readdir()
882 desc->plus = false; in nfs_readdir()
883 desc->eof = false; in nfs_readdir()
889 res = nfs_do_filldir(desc); in nfs_readdir()
892 } while (!desc->eof); in nfs_readdir()