dir.c (dbeaf8c984ca689c2c0966c41bd78dee178b5dfe) | dir.c (6b75cf9e309d18664f964889ac026096ba0d1919) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/fs/nfs/dir.c 4 * 5 * Copyright (C) 1992 Rick Sladkey 6 * 7 * nfs directory handling functions 8 * --- 747 unchanged lines hidden (view full) --- 756 nfs_readdir_free_pages(pages, i); 757 return NULL; 758} 759 760static 761int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode) 762{ 763 struct page **pages; | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/fs/nfs/dir.c 4 * 5 * Copyright (C) 1992 Rick Sladkey 6 * 7 * nfs directory handling functions 8 * --- 747 unchanged lines hidden (view full) --- 756 nfs_readdir_free_pages(pages, i); 757 return NULL; 758} 759 760static 761int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode) 762{ 763 struct page **pages; |
764 struct nfs_entry entry; | 764 struct nfs_entry *entry; |
765 size_t array_size; 766 size_t dtsize = NFS_SERVER(inode)->dtsize; 767 int status = -ENOMEM; 768 | 765 size_t array_size; 766 size_t dtsize = NFS_SERVER(inode)->dtsize; 767 int status = -ENOMEM; 768 |
769 entry.prev_cookie = 0; 770 entry.cookie = nfs_readdir_page_last_cookie(page); 771 entry.eof = 0; 772 entry.fh = nfs_alloc_fhandle(); 773 entry.fattr = nfs_alloc_fattr(); 774 entry.server = NFS_SERVER(inode); 775 if (entry.fh == NULL || entry.fattr == NULL) | 769 entry = kzalloc(sizeof(*entry), GFP_KERNEL); 770 if (!entry) 771 return -ENOMEM; 772 entry->cookie = nfs_readdir_page_last_cookie(page); 773 entry->fh = nfs_alloc_fhandle(); 774 entry->fattr = nfs_alloc_fattr(); 775 entry->server = NFS_SERVER(inode); 776 if (entry->fh == NULL || entry->fattr == NULL) |
776 goto out; 777 | 777 goto out; 778 |
778 entry.label = nfs4_label_alloc(NFS_SERVER(inode), GFP_NOWAIT); 779 if (IS_ERR(entry.label)) { 780 status = PTR_ERR(entry.label); | 779 entry->label = nfs4_label_alloc(NFS_SERVER(inode), GFP_NOWAIT); 780 if (IS_ERR(entry->label)) { 781 status = PTR_ERR(entry->label); |
781 goto out; 782 } 783 784 array_size = (dtsize + PAGE_SIZE - 1) >> PAGE_SHIFT; 785 pages = nfs_readdir_alloc_pages(array_size); 786 if (!pages) 787 goto out_release_label; 788 789 do { 790 unsigned int pglen; | 782 goto out; 783 } 784 785 array_size = (dtsize + PAGE_SIZE - 1) >> PAGE_SHIFT; 786 pages = nfs_readdir_alloc_pages(array_size); 787 if (!pages) 788 goto out_release_label; 789 790 do { 791 unsigned int pglen; |
791 status = nfs_readdir_xdr_filler(desc, entry.cookie, | 792 status = nfs_readdir_xdr_filler(desc, entry->cookie, |
792 pages, dtsize); 793 if (status < 0) 794 break; 795 796 pglen = status; 797 if (pglen == 0) { 798 nfs_readdir_page_set_eof(page); 799 break; 800 } 801 | 793 pages, dtsize); 794 if (status < 0) 795 break; 796 797 pglen = status; 798 if (pglen == 0) { 799 nfs_readdir_page_set_eof(page); 800 break; 801 } 802 |
802 status = nfs_readdir_page_filler(desc, &entry, pages, page, pglen); | 803 status = nfs_readdir_page_filler(desc, entry, pages, page, pglen); |
803 } while (!status && nfs_readdir_page_needs_filling(page)); 804 805 nfs_readdir_free_pages(pages, array_size); 806out_release_label: | 804 } while (!status && nfs_readdir_page_needs_filling(page)); 805 806 nfs_readdir_free_pages(pages, array_size); 807out_release_label: |
807 nfs4_label_free(entry.label); | 808 nfs4_label_free(entry->label); |
808out: | 809out: |
809 nfs_free_fattr(entry.fattr); 810 nfs_free_fhandle(entry.fh); | 810 nfs_free_fattr(entry->fattr); 811 nfs_free_fhandle(entry->fh); 812 kfree(entry); |
811 return status; 812} 813 814static void nfs_readdir_page_put(struct nfs_readdir_descriptor *desc) 815{ 816 put_page(desc->page); 817 desc->page = NULL; 818} --- 150 unchanged lines hidden (view full) --- 969 last cookie cache takes care of the common case of reading the 970 whole directory. 971 */ 972static int nfs_readdir(struct file *file, struct dir_context *ctx) 973{ 974 struct dentry *dentry = file_dentry(file); 975 struct inode *inode = d_inode(dentry); 976 struct nfs_open_dir_context *dir_ctx = file->private_data; | 813 return status; 814} 815 816static void nfs_readdir_page_put(struct nfs_readdir_descriptor *desc) 817{ 818 put_page(desc->page); 819 desc->page = NULL; 820} --- 150 unchanged lines hidden (view full) --- 971 last cookie cache takes care of the common case of reading the 972 whole directory. 973 */ 974static int nfs_readdir(struct file *file, struct dir_context *ctx) 975{ 976 struct dentry *dentry = file_dentry(file); 977 struct inode *inode = d_inode(dentry); 978 struct nfs_open_dir_context *dir_ctx = file->private_data; |
977 nfs_readdir_descriptor_t my_desc = { 978 .file = file, 979 .ctx = ctx, 980 .plus = nfs_use_readdirplus(inode, ctx), 981 }, 982 *desc = &my_desc; 983 int res = 0; | 979 struct nfs_readdir_descriptor *desc; 980 int res; |
984 985 dfprintk(FILE, "NFS: readdir(%pD2) starting at cookie %llu\n", 986 file, (long long)ctx->pos); 987 nfs_inc_stats(inode, NFSIOS_VFSGETDENTS); 988 989 /* 990 * ctx->pos points to the dirent entry number. 991 * *desc->dir_cookie has the cookie for the next entry. We have 992 * to either find the entry with the appropriate number or 993 * revalidate the cookie. 994 */ | 981 982 dfprintk(FILE, "NFS: readdir(%pD2) starting at cookie %llu\n", 983 file, (long long)ctx->pos); 984 nfs_inc_stats(inode, NFSIOS_VFSGETDENTS); 985 986 /* 987 * ctx->pos points to the dirent entry number. 988 * *desc->dir_cookie has the cookie for the next entry. We have 989 * to either find the entry with the appropriate number or 990 * revalidate the cookie. 991 */ |
995 if (ctx->pos == 0 || nfs_attribute_cache_expired(inode)) | 992 if (ctx->pos == 0 || nfs_attribute_cache_expired(inode)) { |
996 res = nfs_revalidate_mapping(inode, file->f_mapping); | 993 res = nfs_revalidate_mapping(inode, file->f_mapping); |
997 if (res < 0) | 994 if (res < 0) 995 goto out; 996 } 997 998 res = -ENOMEM; 999 desc = kzalloc(sizeof(*desc), GFP_KERNEL); 1000 if (!desc) |
998 goto out; | 1001 goto out; |
1002 desc->file = file; 1003 desc->ctx = ctx; 1004 desc->plus = nfs_use_readdirplus(inode, ctx); |
|
999 1000 spin_lock(&file->f_lock); 1001 desc->dir_cookie = dir_ctx->dir_cookie; 1002 desc->dup_cookie = dir_ctx->dup_cookie; 1003 desc->duped = dir_ctx->duped; 1004 desc->attr_gencount = dir_ctx->attr_gencount; 1005 spin_unlock(&file->f_lock); 1006 --- 28 unchanged lines hidden (view full) --- 1035 1036 spin_lock(&file->f_lock); 1037 dir_ctx->dir_cookie = desc->dir_cookie; 1038 dir_ctx->dup_cookie = desc->dup_cookie; 1039 dir_ctx->duped = desc->duped; 1040 dir_ctx->attr_gencount = desc->attr_gencount; 1041 spin_unlock(&file->f_lock); 1042 | 1005 1006 spin_lock(&file->f_lock); 1007 desc->dir_cookie = dir_ctx->dir_cookie; 1008 desc->dup_cookie = dir_ctx->dup_cookie; 1009 desc->duped = dir_ctx->duped; 1010 desc->attr_gencount = dir_ctx->attr_gencount; 1011 spin_unlock(&file->f_lock); 1012 --- 28 unchanged lines hidden (view full) --- 1041 1042 spin_lock(&file->f_lock); 1043 dir_ctx->dir_cookie = desc->dir_cookie; 1044 dir_ctx->dup_cookie = desc->dup_cookie; 1045 dir_ctx->duped = desc->duped; 1046 dir_ctx->attr_gencount = desc->attr_gencount; 1047 spin_unlock(&file->f_lock); 1048 |
1049 kfree(desc); 1050 |
|
1043out: 1044 dfprintk(FILE, "NFS: readdir(%pD2) returns %d\n", file, res); 1045 return res; 1046} 1047 1048static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence) 1049{ 1050 struct nfs_open_dir_context *dir_ctx = filp->private_data; --- 1843 unchanged lines hidden --- | 1051out: 1052 dfprintk(FILE, "NFS: readdir(%pD2) returns %d\n", file, res); 1053 return res; 1054} 1055 1056static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence) 1057{ 1058 struct nfs_open_dir_context *dir_ctx = filp->private_data; --- 1843 unchanged lines hidden --- |