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 ---