]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFS: More readdir cleanups
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 1 Nov 2020 20:24:41 +0000 (15:24 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 2 Dec 2020 19:05:52 +0000 (14:05 -0500)
Remove the redundant caching of the credential in struct
nfs_open_dir_context.
Pass the buffer size as an argument to nfs_readdir_xdr_filler().

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Tested-by: Benjamin Coddington <bcodding@redhat.com>
Tested-by: Dave Wysochanski <dwysocha@redhat.com>
fs/nfs/dir.c
include/linux/nfs_fs.h

index 438906dae08331c9be8d54aff3f78e8171ed1cc9..bc366bd8e8f31af40da02e96123a6f2752412d4e 100644 (file)
@@ -68,7 +68,7 @@ const struct address_space_operations nfs_dir_aops = {
        .freepage = nfs_readdir_clear_array,
 };
 
-static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir, const struct cred *cred)
+static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir)
 {
        struct nfs_inode *nfsi = NFS_I(dir);
        struct nfs_open_dir_context *ctx;
@@ -78,7 +78,6 @@ static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir
                ctx->attr_gencount = nfsi->attr_gencount;
                ctx->dir_cookie = 0;
                ctx->dup_cookie = 0;
-               ctx->cred = get_cred(cred);
                spin_lock(&dir->i_lock);
                if (list_empty(&nfsi->open_files) &&
                    (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
@@ -96,7 +95,6 @@ static void put_nfs_open_dir_context(struct inode *dir, struct nfs_open_dir_cont
        spin_lock(&dir->i_lock);
        list_del(&ctx->list);
        spin_unlock(&dir->i_lock);
-       put_cred(ctx->cred);
        kfree(ctx);
 }
 
@@ -113,7 +111,7 @@ nfs_opendir(struct inode *inode, struct file *filp)
 
        nfs_inc_stats(inode, NFSIOS_VFSOPEN);
 
-       ctx = alloc_nfs_open_dir_context(inode, current_cred());
+       ctx = alloc_nfs_open_dir_context(inode);
        if (IS_ERR(ctx)) {
                res = PTR_ERR(ctx);
                goto out;
@@ -468,12 +466,12 @@ int nfs_readdir_search_array(nfs_readdir_descriptor_t *desc)
 }
 
 /* Fill a page with xdr information before transferring to the cache page */
-static
-int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc,
-                       struct nfs_entry *entry, struct file *file, struct inode *inode)
+static int nfs_readdir_xdr_filler(struct nfs_readdir_descriptor *desc,
+                                 u64 cookie, struct page **pages,
+                                 size_t bufsize)
 {
-       struct nfs_open_dir_context *ctx = file->private_data;
-       const struct cred *cred = ctx->cred;
+       struct file *file = desc->file;
+       struct inode *inode = file_inode(file);
        unsigned long   timestamp, gencount;
        int             error;
 
@@ -481,8 +479,8 @@ int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc,
        timestamp = jiffies;
        gencount = nfs_inc_attr_generation_counter();
        desc->dir_verifier = nfs_save_change_attribute(inode);
-       error = NFS_PROTO(inode)->readdir(file_dentry(file), cred, entry->cookie, pages,
-                                         NFS_SERVER(inode)->dtsize, desc->plus);
+       error = NFS_PROTO(inode)->readdir(file_dentry(file), file->f_cred,
+                                         cookie, pages, bufsize, desc->plus);
        if (error < 0) {
                /* We requested READDIRPLUS, but the server doesn't grok it */
                if (error == -ENOTSUPP && desc->plus) {
@@ -764,7 +762,6 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page,
 {
        struct page **pages;
        struct nfs_entry entry;
-       struct file     *file = desc->file;
        size_t array_size;
        size_t dtsize = NFS_SERVER(inode)->dtsize;
        int status = -ENOMEM;
@@ -791,8 +788,8 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page,
 
        do {
                unsigned int pglen;
-               status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode);
-
+               status = nfs_readdir_xdr_filler(desc, entry.cookie,
+                                               pages, dtsize);
                if (status < 0)
                        break;
 
index a2c6455ea3fae92a7bf44ae5089e47d06b7c0148..dd6b463dda809784e0563f5b0fc695e2a36e885c 100644 (file)
@@ -88,7 +88,6 @@ struct nfs_open_context {
 
 struct nfs_open_dir_context {
        struct list_head list;
-       const struct cred *cred;
        unsigned long attr_gencount;
        __u64 dir_cookie;
        __u64 dup_cookie;