• Home
  • Raw
  • Download

Lines Matching refs:desc

176 int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page)  in nfs_readdir_filler()  argument
178 struct file *file = desc->file; in nfs_readdir_filler()
185 __func__, (long long)desc->entry->cookie, in nfs_readdir_filler()
191 error = NFS_PROTO(inode)->readdir(file->f_path.dentry, cred, desc->entry->cookie, page, in nfs_readdir_filler()
192 NFS_SERVER(inode)->dtsize, desc->plus); in nfs_readdir_filler()
195 if (error == -ENOTSUPP && desc->plus) { in nfs_readdir_filler()
198 desc->plus = 0; in nfs_readdir_filler()
203 desc->timestamp = timestamp; in nfs_readdir_filler()
204 desc->gencount = gencount; in nfs_readdir_filler()
205 desc->timestamp_valid = 1; in nfs_readdir_filler()
223 int dir_decode(nfs_readdir_descriptor_t *desc) in dir_decode() argument
225 __be32 *p = desc->ptr; in dir_decode()
226 p = desc->decode(p, desc->entry, desc->plus); in dir_decode()
229 desc->ptr = p; in dir_decode()
230 if (desc->timestamp_valid) { in dir_decode()
231 desc->entry->fattr->time_start = desc->timestamp; in dir_decode()
232 desc->entry->fattr->gencount = desc->gencount; in dir_decode()
234 desc->entry->fattr->valid &= ~NFS_ATTR_FATTR; in dir_decode()
239 void dir_page_release(nfs_readdir_descriptor_t *desc) in dir_page_release() argument
241 kunmap(desc->page); in dir_page_release()
242 page_cache_release(desc->page); in dir_page_release()
243 desc->page = NULL; in dir_page_release()
244 desc->ptr = NULL; in dir_page_release()
256 int find_dirent(nfs_readdir_descriptor_t *desc) in find_dirent() argument
258 struct nfs_entry *entry = desc->entry; in find_dirent()
262 while((status = dir_decode(desc)) == 0) { in find_dirent()
265 if (entry->prev_cookie == *desc->dir_cookie) in find_dirent()
284 int find_dirent_index(nfs_readdir_descriptor_t *desc) in find_dirent_index() argument
286 struct nfs_entry *entry = desc->entry; in find_dirent_index()
291 status = dir_decode(desc); in find_dirent_index()
296 (unsigned long long)entry->cookie, desc->current_index); in find_dirent_index()
298 if (desc->file->f_pos == desc->current_index) { in find_dirent_index()
299 *desc->dir_cookie = entry->cookie; in find_dirent_index()
302 desc->current_index++; in find_dirent_index()
316 int find_dirent_page(nfs_readdir_descriptor_t *desc) in find_dirent_page() argument
318 struct inode *inode = desc->file->f_path.dentry->d_inode; in find_dirent_page()
323 __func__, desc->page_index, in find_dirent_page()
324 (long long) *desc->dir_cookie); in find_dirent_page()
329 desc->timestamp_valid = 0; in find_dirent_page()
330 page = read_cache_page(inode->i_mapping, desc->page_index, in find_dirent_page()
331 (filler_t *)nfs_readdir_filler, desc); in find_dirent_page()
338 desc->page = page; in find_dirent_page()
339 desc->ptr = kmap(page); /* matching kunmap in nfs_do_filldir */ in find_dirent_page()
340 if (*desc->dir_cookie != 0) in find_dirent_page()
341 status = find_dirent(desc); in find_dirent_page()
343 status = find_dirent_index(desc); in find_dirent_page()
345 dir_page_release(desc); in find_dirent_page()
359 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) in readdir_search_pagecache() argument
365 if (*desc->dir_cookie == 0) { in readdir_search_pagecache()
367 (long long)desc->file->f_pos); in readdir_search_pagecache()
368 desc->page_index = 0; in readdir_search_pagecache()
369 desc->entry->cookie = desc->entry->prev_cookie = 0; in readdir_search_pagecache()
370 desc->entry->eof = 0; in readdir_search_pagecache()
371 desc->current_index = 0; in readdir_search_pagecache()
374 (unsigned long long)*desc->dir_cookie); in readdir_search_pagecache()
377 res = find_dirent_page(desc); in readdir_search_pagecache()
381 desc->page_index ++; in readdir_search_pagecache()
397 static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc);
403 int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, in nfs_do_filldir() argument
406 struct file *file = desc->file; in nfs_do_filldir()
407 struct nfs_entry *entry = desc->entry; in nfs_do_filldir()
425 dentry = nfs_readdir_lookup(desc); in nfs_do_filldir()
439 *desc->dir_cookie = entry->cookie; in nfs_do_filldir()
440 if (dir_decode(desc) != 0) { in nfs_do_filldir()
441 desc->page_index ++; in nfs_do_filldir()
449 dir_page_release(desc); in nfs_do_filldir()
453 (unsigned long long)*desc->dir_cookie, res); in nfs_do_filldir()
470 int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent, in uncached_readdir() argument
473 struct file *file = desc->file; in uncached_readdir()
481 (unsigned long long)*desc->dir_cookie); in uncached_readdir()
491 *desc->dir_cookie, page, in uncached_readdir()
493 desc->plus); in uncached_readdir()
494 desc->page = page; in uncached_readdir()
495 desc->ptr = kmap(page); /* matching kunmap in nfs_do_filldir */ in uncached_readdir()
497 desc->timestamp = timestamp; in uncached_readdir()
498 desc->gencount = gencount; in uncached_readdir()
499 desc->timestamp_valid = 1; in uncached_readdir()
500 if ((status = dir_decode(desc)) == 0) in uncached_readdir()
501 desc->entry->prev_cookie = *desc->dir_cookie; in uncached_readdir()
507 status = nfs_do_filldir(desc, dirent, filldir); in uncached_readdir()
511 desc->page_index = 0; in uncached_readdir()
512 desc->entry->cookie = desc->entry->prev_cookie = 0; in uncached_readdir()
513 desc->entry->eof = 0; in uncached_readdir()
519 dir_page_release(desc); in uncached_readdir()
532 *desc = &my_desc; in nfs_readdir() local
549 memset(desc, 0, sizeof(*desc)); in nfs_readdir()
551 desc->file = filp; in nfs_readdir()
552 desc->dir_cookie = &nfs_file_open_context(filp)->dir_cookie; in nfs_readdir()
553 desc->decode = NFS_PROTO(inode)->decode_dirent; in nfs_readdir()
554 desc->plus = NFS_USE_READDIRPLUS(inode); in nfs_readdir()
561 desc->entry = &my_entry; in nfs_readdir()
568 while(!desc->entry->eof) { in nfs_readdir()
569 res = readdir_search_pagecache(desc); in nfs_readdir()
573 if (*desc->dir_cookie && desc->entry->cookie != *desc->dir_cookie) { in nfs_readdir()
575 res = uncached_readdir(desc, dirent, filldir); in nfs_readdir()
582 if (res == -ETOOSMALL && desc->plus) { in nfs_readdir()
585 desc->plus = 0; in nfs_readdir()
586 desc->entry->eof = 0; in nfs_readdir()
592 res = nfs_do_filldir(desc, dirent, filldir); in nfs_readdir()
1095 static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc) in nfs_readdir_lookup() argument
1097 struct dentry *parent = desc->file->f_path.dentry; in nfs_readdir_lookup()
1099 struct nfs_entry *entry = desc->entry; in nfs_readdir_lookup()
1132 if (!desc->plus || entry->fh->size == 0) in nfs_readdir_lookup()
1142 if (!desc->plus || !(entry->fattr->valid & NFS_ATTR_FATTR)) in nfs_readdir_lookup()