]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
NFS: Create a new nfs_alloc_fattr_with_label() function
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 22 Oct 2021 17:11:00 +0000 (13:11 -0400)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 10 Aug 2022 07:25:04 +0000 (09:25 +0200)
BugLink: https://bugs.launchpad.net/bugs/1981864
[ Upstream commit d755ad8dc752d44545613ea04d660aed674e540d ]

For creating fattrs with the label field already allocated for us. I
also update nfs_free_fattr() to free the label in the end.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
fs/nfs/getroot.c
fs/nfs/inode.c
fs/nfs/internal.h
include/linux/nfs_fs.h

index 59355c106eceb5fb0d72d61834b385ffd3fe93d5..7604cb6a0ac2382f970d5b01e1262ead6841e476 100644 (file)
@@ -80,18 +80,15 @@ int nfs_get_root(struct super_block *s, struct fs_context *fc)
                goto out;
 
        /* get the actual root for this mount */
-       fsinfo.fattr = nfs_alloc_fattr();
+       fsinfo.fattr = nfs_alloc_fattr_with_label(server);
        if (fsinfo.fattr == NULL)
                goto out_name;
 
-       fsinfo.fattr->label = nfs4_label_alloc(server, GFP_KERNEL);
-       if (IS_ERR(fsinfo.fattr->label))
-               goto out_fattr;
        error = server->nfs_client->rpc_ops->getroot(server, ctx->mntfh, &fsinfo);
        if (error < 0) {
                dprintk("nfs_get_root: getattr error = %d\n", -error);
                nfs_errorf(fc, "NFS: Couldn't getattr on root");
-               goto out_label;
+               goto out_fattr;
        }
 
        inode = nfs_fhget(s, ctx->mntfh, fsinfo.fattr, NULL);
@@ -99,12 +96,12 @@ int nfs_get_root(struct super_block *s, struct fs_context *fc)
                dprintk("nfs_get_root: get root inode failed\n");
                error = PTR_ERR(inode);
                nfs_errorf(fc, "NFS: Couldn't get root inode");
-               goto out_label;
+               goto out_fattr;
        }
 
        error = nfs_superblock_set_dummy_root(s, inode);
        if (error != 0)
-               goto out_label;
+               goto out_fattr;
 
        /* root dentries normally start off anonymous and get spliced in later
         * if the dentry tree reaches them; however if the dentry already
@@ -115,7 +112,7 @@ int nfs_get_root(struct super_block *s, struct fs_context *fc)
                dprintk("nfs_get_root: get root dentry failed\n");
                error = PTR_ERR(root);
                nfs_errorf(fc, "NFS: Couldn't get root dentry");
-               goto out_label;
+               goto out_fattr;
        }
 
        security_d_instantiate(root, inode);
@@ -154,8 +151,6 @@ int nfs_get_root(struct super_block *s, struct fs_context *fc)
        nfs_setsecurity(inode, fsinfo.fattr, fsinfo.fattr->label);
        error = 0;
 
-out_label:
-       nfs4_label_free(fsinfo.fattr->label);
 out_fattr:
        nfs_free_fattr(fsinfo.fattr);
 out_name:
@@ -165,5 +160,5 @@ out:
 error_splat_root:
        dput(fc->root);
        fc->root = NULL;
-       goto out_label;
+       goto out_fattr;
 }
index 04a0cf42c1e8db7db437bb9b9597f40b5956907e..ca724a75f31d70ddae61f859f36fd2caa4bad42c 100644 (file)
@@ -1589,6 +1589,23 @@ struct nfs_fattr *nfs_alloc_fattr(void)
 }
 EXPORT_SYMBOL_GPL(nfs_alloc_fattr);
 
+struct nfs_fattr *nfs_alloc_fattr_with_label(struct nfs_server *server)
+{
+       struct nfs_fattr *fattr = nfs_alloc_fattr();
+
+       if (!fattr)
+               return NULL;
+
+       fattr->label = nfs4_label_alloc(server, GFP_NOFS);
+       if (IS_ERR(fattr->label)) {
+               kfree(fattr);
+               return NULL;
+       }
+
+       return fattr;
+}
+EXPORT_SYMBOL_GPL(nfs_alloc_fattr_with_label);
+
 struct nfs_fh *nfs_alloc_fhandle(void)
 {
        struct nfs_fh *fh;
index fbfe293af72c9cc212b26e080389903ac3e49a28..2ceb4b98ec15fb2db1599da6fcf51457b76b3503 100644 (file)
@@ -351,14 +351,6 @@ nfs4_label_copy(struct nfs4_label *dst, struct nfs4_label *src)
 
        return dst;
 }
-static inline void nfs4_label_free(struct nfs4_label *label)
-{
-       if (label) {
-               kfree(label->label);
-               kfree(label);
-       }
-       return;
-}
 
 static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
 {
@@ -367,7 +359,6 @@ static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
 }
 #else
 static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; }
-static inline void nfs4_label_free(void *label) {}
 static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
 {
 }
index af8fe97474bc54260acc3605e9484e1df6e9ff3a..2ddd273d583a73b72e1e8e0dafb454c05bd50a4c 100644 (file)
@@ -421,9 +421,22 @@ extern void nfs_fattr_set_barrier(struct nfs_fattr *fattr);
 extern unsigned long nfs_inc_attr_generation_counter(void);
 
 extern struct nfs_fattr *nfs_alloc_fattr(void);
+extern struct nfs_fattr *nfs_alloc_fattr_with_label(struct nfs_server *server);
+
+static inline void nfs4_label_free(struct nfs4_label *label)
+{
+#ifdef CONFIG_NFS_V4_SECURITY_LABEL
+       if (label) {
+               kfree(label->label);
+               kfree(label);
+       }
+#endif
+}
 
 static inline void nfs_free_fattr(const struct nfs_fattr *fattr)
 {
+       if (fattr)
+               nfs4_label_free(fattr->label);
        kfree(fattr);
 }