dir.c (fa3c9f3de2504bb09f8ad512f89837751a3eb741) | dir.c (0aded708d125a3ff7e5abaea9c2d9c6d7ebbfdcd) |
---|---|
1/* 2 * linux/fs/nfs/dir.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * nfs directory handling functions 7 * 8 * 10 Apr 1996 Added silly rename for unlink --okir --- 164 unchanged lines hidden (view full) --- 173}; 174 175typedef __be32 * (*decode_dirent_t)(struct xdr_stream *, struct nfs_entry *, struct nfs_server *, int); 176typedef struct { 177 struct file *file; 178 struct page *page; 179 unsigned long page_index; 180 u64 *dir_cookie; | 1/* 2 * linux/fs/nfs/dir.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * nfs directory handling functions 7 * 8 * 10 Apr 1996 Added silly rename for unlink --okir --- 164 unchanged lines hidden (view full) --- 173}; 174 175typedef __be32 * (*decode_dirent_t)(struct xdr_stream *, struct nfs_entry *, struct nfs_server *, int); 176typedef struct { 177 struct file *file; 178 struct page *page; 179 unsigned long page_index; 180 u64 *dir_cookie; |
181 u64 last_cookie; |
|
181 loff_t current_index; 182 decode_dirent_t decode; 183 184 unsigned long timestamp; 185 unsigned long gencount; 186 unsigned int cache_entry_index; 187 unsigned int plus:1; 188 unsigned int eof:1; --- 150 unchanged lines hidden (view full) --- 339 goto out; 340 } 341 342 if (*desc->dir_cookie == 0) 343 status = nfs_readdir_search_for_pos(array, desc); 344 else 345 status = nfs_readdir_search_for_cookie(array, desc); 346 | 182 loff_t current_index; 183 decode_dirent_t decode; 184 185 unsigned long timestamp; 186 unsigned long gencount; 187 unsigned int cache_entry_index; 188 unsigned int plus:1; 189 unsigned int eof:1; --- 150 unchanged lines hidden (view full) --- 340 goto out; 341 } 342 343 if (*desc->dir_cookie == 0) 344 status = nfs_readdir_search_for_pos(array, desc); 345 else 346 status = nfs_readdir_search_for_cookie(array, desc); 347 |
348 if (status == -EAGAIN) 349 desc->last_cookie = array->last_cookie; |
|
347 nfs_readdir_release_array(desc->page); 348out: 349 return status; 350} 351 352/* Fill a page with xdr information before transferring to the cache page */ 353static 354int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc, --- 203 unchanged lines hidden (view full) --- 558 void *pages_ptr = NULL; 559 struct nfs_entry entry; 560 struct file *file = desc->file; 561 struct nfs_cache_array *array; 562 int status = -ENOMEM; 563 unsigned int array_size = ARRAY_SIZE(pages); 564 565 entry.prev_cookie = 0; | 350 nfs_readdir_release_array(desc->page); 351out: 352 return status; 353} 354 355/* Fill a page with xdr information before transferring to the cache page */ 356static 357int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc, --- 203 unchanged lines hidden (view full) --- 561 void *pages_ptr = NULL; 562 struct nfs_entry entry; 563 struct file *file = desc->file; 564 struct nfs_cache_array *array; 565 int status = -ENOMEM; 566 unsigned int array_size = ARRAY_SIZE(pages); 567 568 entry.prev_cookie = 0; |
566 entry.cookie = *desc->dir_cookie; | 569 entry.cookie = desc->last_cookie; |
567 entry.eof = 0; 568 entry.fh = nfs_alloc_fhandle(); 569 entry.fattr = nfs_alloc_fattr(); 570 if (entry.fh == NULL || entry.fattr == NULL) 571 goto out; 572 573 array = nfs_readdir_get_array(page); 574 if (IS_ERR(array)) { --- 92 unchanged lines hidden (view full) --- 667} 668 669/* Search for desc->dir_cookie from the beginning of the page cache */ 670static inline 671int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) 672{ 673 int res; 674 | 570 entry.eof = 0; 571 entry.fh = nfs_alloc_fhandle(); 572 entry.fattr = nfs_alloc_fattr(); 573 if (entry.fh == NULL || entry.fattr == NULL) 574 goto out; 575 576 array = nfs_readdir_get_array(page); 577 if (IS_ERR(array)) { --- 92 unchanged lines hidden (view full) --- 670} 671 672/* Search for desc->dir_cookie from the beginning of the page cache */ 673static inline 674int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) 675{ 676 int res; 677 |
675 if (desc->page_index == 0) | 678 if (desc->page_index == 0) { |
676 desc->current_index = 0; | 679 desc->current_index = 0; |
680 desc->last_cookie = 0; 681 } |
|
677 while (1) { 678 res = find_cache_page(desc); 679 if (res != -EAGAIN) 680 break; 681 desc->page_index++; 682 } 683 return res; 684} --- 74 unchanged lines hidden (view full) --- 759 760 page = alloc_page(GFP_HIGHUSER); 761 if (!page) { 762 status = -ENOMEM; 763 goto out; 764 } 765 766 desc->page_index = 0; | 682 while (1) { 683 res = find_cache_page(desc); 684 if (res != -EAGAIN) 685 break; 686 desc->page_index++; 687 } 688 return res; 689} --- 74 unchanged lines hidden (view full) --- 764 765 page = alloc_page(GFP_HIGHUSER); 766 if (!page) { 767 status = -ENOMEM; 768 goto out; 769 } 770 771 desc->page_index = 0; |
772 desc->last_cookie = *desc->dir_cookie; |
|
767 desc->page = page; 768 769 status = nfs_readdir_xdr_to_array(desc, page, inode); 770 if (status < 0) 771 goto out_release; 772 773 status = nfs_do_filldir(desc, dirent, filldir); 774 --- 1484 unchanged lines hidden --- | 773 desc->page = page; 774 775 status = nfs_readdir_xdr_to_array(desc, page, inode); 776 if (status < 0) 777 goto out_release; 778 779 status = nfs_do_filldir(desc, dirent, filldir); 780 --- 1484 unchanged lines hidden --- |