]> git.karo-electronics.de Git - linux-beck.git/commitdiff
NFSv4: Introduce new label structure
authorSteve Dickson <steved@redhat.com>
Wed, 22 May 2013 16:50:40 +0000 (12:50 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Sat, 8 Jun 2013 20:20:14 +0000 (16:20 -0400)
In order to mimic the way that NFSv4 ACLs are implemented we have created a
structure to be used to pass label data up and down the call chain. This patch
adds the new structure and new members to the required NFSv4 call structures.

Signed-off-by: Matthew N. Dodd <Matthew.Dodd@sparta.com>
Signed-off-by: Miguel Rodel Felipe <Rodel_FM@dsi.a-star.edu.sg>
Signed-off-by: Phua Eu Gene <PHUA_Eu_Gene@dsi.a-star.edu.sg>
Signed-off-by: Khin Mi Mi Aung <Mi_Mi_AUNG@dsi.a-star.edu.sg>
Signed-off-by: Steve Dickson <steved@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/inode.c
include/linux/nfs4.h
include/linux/nfs_fs.h
include/linux/nfs_xdr.h

index c1c7a9d78722257867846f39c74780536b28d0c5..07fcf0b90669d3b99713c9deb5414c3b2f636fac 100644 (file)
@@ -257,6 +257,34 @@ nfs_init_locked(struct inode *inode, void *opaque)
        return 0;
 }
 
+#ifdef CONFIG_NFS_V4_SECURITY_LABEL
+struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags)
+{
+       struct nfs4_label *label = NULL;
+       int minor_version = server->nfs_client->cl_minorversion;
+
+       if (minor_version < 2)
+               return label;
+
+       if (!(server->caps & NFS_CAP_SECURITY_LABEL))
+               return label;
+
+       label = kzalloc(sizeof(struct nfs4_label), flags);
+       if (label == NULL)
+               return ERR_PTR(-ENOMEM);
+
+       label->label = kzalloc(NFS4_MAXLABELLEN, flags);
+       if (label->label == NULL) {
+               kfree(label);
+               return ERR_PTR(-ENOMEM);
+       }
+       label->len = NFS4_MAXLABELLEN;
+
+       return label;
+}
+EXPORT_SYMBOL_GPL(nfs4_label_alloc);
+#endif
+
 /*
  * This is our front-end to iget that looks up inodes by file handle
  * instead of inode number.
index 42046004a2f6ab70ac3f718f3f0d73ae8095f830..e36dee52f224f146805b58a48008012dc68602a8 100644 (file)
@@ -32,6 +32,15 @@ struct nfs4_acl {
        struct nfs4_ace aces[0];
 };
 
+#define NFS4_MAXLABELLEN       2048
+
+struct nfs4_label {
+       uint32_t        lfs;
+       uint32_t        pi;
+       u32             len;
+       char    *label;
+};
+
 typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
 
 struct nfs_stateid4 {
index fc01d5cb4cf1e013afc41f42f9f9f9b6da6908b7..39b24041a4c773a6c33af13d6a0a2c90338ba509 100644 (file)
@@ -496,6 +496,24 @@ extern const struct inode_operations nfs_referral_inode_operations;
 extern int nfs_mountpoint_expiry_timeout;
 extern void nfs_release_automount_timer(void);
 
+/*
+ * linux/fs/nfs/nfs4proc.c
+ */
+#ifdef CONFIG_NFS_V4_SECURITY_LABEL
+extern struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags);
+static inline void nfs4_label_free(struct nfs4_label *label)
+{
+       if (label) {
+               kfree(label->label);
+               kfree(label);
+       }
+       return;
+}
+#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) {}
+#endif
+
 /*
  * linux/fs/nfs/unlink.c
  */
index bfdf6e042838724dbd9965f6ae4ebc86775be392..d799b9f86820049298baab8d9734511ee8ea3652 100644 (file)
@@ -349,6 +349,7 @@ struct nfs_openargs {
        const u32 *             open_bitmap;
        __u32                   claim;
        enum createmode4        createmode;
+       const struct nfs4_label *label;
 };
 
 struct nfs_openres {
@@ -358,6 +359,7 @@ struct nfs_openres {
        struct nfs4_change_info cinfo;
        __u32                   rflags;
        struct nfs_fattr *      f_attr;
+       struct nfs4_label       *f_label;
        struct nfs_seqid *      seqid;
        const struct nfs_server *server;
        fmode_t                 delegation_type;
@@ -600,6 +602,7 @@ struct nfs_entry {
        int                     eof;
        struct nfs_fh *         fh;
        struct nfs_fattr *      fattr;
+       struct nfs4_label  *label;
        unsigned char           d_type;
        struct nfs_server *     server;
 };
@@ -632,6 +635,7 @@ struct nfs_setattrargs {
        struct iattr *                  iap;
        const struct nfs_server *       server; /* Needed for name mapping */
        const u32 *                     bitmask;
+       const struct nfs4_label         *label;
 };
 
 struct nfs_setaclargs {
@@ -667,6 +671,7 @@ struct nfs_getaclres {
 struct nfs_setattrres {
        struct nfs4_sequence_res        seq_res;
        struct nfs_fattr *              fattr;
+       struct nfs4_label               *label;
        const struct nfs_server *       server;
 };
 
@@ -864,6 +869,7 @@ struct nfs4_create_arg {
        const struct iattr *            attrs;
        const struct nfs_fh *           dir_fh;
        const u32 *                     bitmask;
+       const struct nfs4_label         *label;
 };
 
 struct nfs4_create_res {
@@ -871,6 +877,7 @@ struct nfs4_create_res {
        const struct nfs_server *       server;
        struct nfs_fh *                 fh;
        struct nfs_fattr *              fattr;
+       struct nfs4_label               *label;
        struct nfs4_change_info         dir_cinfo;
 };
 
@@ -895,6 +902,7 @@ struct nfs4_getattr_res {
        struct nfs4_sequence_res        seq_res;
        const struct nfs_server *       server;
        struct nfs_fattr *              fattr;
+       struct nfs4_label               *label;
 };
 
 struct nfs4_link_arg {
@@ -909,6 +917,7 @@ struct nfs4_link_res {
        struct nfs4_sequence_res        seq_res;
        const struct nfs_server *       server;
        struct nfs_fattr *              fattr;
+       struct nfs4_label               *label;
        struct nfs4_change_info         cinfo;
        struct nfs_fattr *              dir_attr;
 };
@@ -926,6 +935,7 @@ struct nfs4_lookup_res {
        const struct nfs_server *       server;
        struct nfs_fattr *              fattr;
        struct nfs_fh *                 fh;
+       struct nfs4_label               *label;
 };
 
 struct nfs4_lookup_root_arg {