Whamcloud - gitweb
LU-11385 odbclass: Handle gracefully if nsproxy is NULL
[fs/lustre-release.git] / lustre / ptlrpc / gss / gss_cli_upcall.c
index b36c99a..70d4711 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2012, Intel Corporation.
+ * Copyright (c) 2011, 2016, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
  */
 
 #define DEBUG_SUBSYSTEM S_SEC
-#ifdef __KERNEL__
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/dcache.h>
 #include <linux/fs.h>
 #include <linux/mutex.h>
-#else
-#include <liblustre.h>
-#endif
 
 #include <obd.h>
 #include <obd_class.h>
 #include <obd_support.h>
-#include <lustre/lustre_idl.h>
 #include <lustre_net.h>
 #include <lustre_import.h>
 #include <lustre_sec.h>
 
 static
 int ctx_init_pack_request(struct obd_import *imp,
-                          struct ptlrpc_request *req,
-                          int lustre_srv,
-                          uid_t uid, gid_t gid,
-                          long token_size,
-                          char __user *token)
+                         struct ptlrpc_request *req,
+                         int lustre_srv,
+                         uid_t uid, gid_t gid,
+                         long token_size,
+                         char __user *token)
 {
-        struct lustre_msg       *msg = req->rq_reqbuf;
-        struct gss_sec          *gsec;
-        struct gss_header       *ghdr;
-        struct ptlrpc_user_desc *pud;
-        __u32                   *p, size, offset = 2;
-        rawobj_t                 obj;
-
-        LASSERT(msg->lm_bufcount <= 4);
-        LASSERT(req->rq_cli_ctx);
-        LASSERT(req->rq_cli_ctx->cc_sec);
-
-        /* gss hdr */
-        ghdr = lustre_msg_buf(msg, 0, sizeof(*ghdr));
-        ghdr->gh_version = PTLRPC_GSS_VERSION;
-        ghdr->gh_sp = (__u8) imp->imp_sec->ps_part;
-        ghdr->gh_flags = 0;
-        ghdr->gh_proc = PTLRPC_GSS_PROC_INIT;
-        ghdr->gh_seq = 0;
-        ghdr->gh_svc = SPTLRPC_SVC_NULL;
-        ghdr->gh_handle.len = 0;
-
-        /* fix the user desc */
-        if (req->rq_pack_udesc) {
-                ghdr->gh_flags |= LUSTRE_GSS_PACK_USER;
-
-                pud = lustre_msg_buf(msg, offset, sizeof(*pud));
-                LASSERT(pud);
-                pud->pud_uid = pud->pud_fsuid = uid;
-                pud->pud_gid = pud->pud_fsgid = gid;
-                pud->pud_cap = 0;
-                pud->pud_ngroups = 0;
-                offset++;
-        }
+       struct lustre_msg       *msg = req->rq_reqbuf;
+       struct gss_sec          *gsec;
+       struct gss_header       *ghdr;
+       struct ptlrpc_user_desc *pud;
+       __u32                   *p, size, offset = 2;
+       rawobj_t                 obj;
+
+       LASSERT(msg->lm_bufcount <= 4);
+       LASSERT(req->rq_cli_ctx);
+       LASSERT(req->rq_cli_ctx->cc_sec);
+
+       /* gss hdr */
+       ghdr = lustre_msg_buf(msg, 0, sizeof(*ghdr));
+       ghdr->gh_version = PTLRPC_GSS_VERSION;
+       ghdr->gh_sp = (__u8) imp->imp_sec->ps_part;
+       ghdr->gh_flags = 0;
+       ghdr->gh_proc = PTLRPC_GSS_PROC_INIT;
+       ghdr->gh_seq = 0;
+       ghdr->gh_svc = SPTLRPC_SVC_NULL;
+       ghdr->gh_handle.len = 0;
+
+       /* fix the user desc */
+       if (req->rq_pack_udesc) {
+               ghdr->gh_flags |= LUSTRE_GSS_PACK_USER;
+
+               pud = lustre_msg_buf(msg, offset, sizeof(*pud));
+               LASSERT(pud);
+               pud->pud_uid = pud->pud_fsuid = uid;
+               pud->pud_gid = pud->pud_fsgid = gid;
+               pud->pud_cap = 0;
+               pud->pud_ngroups = 0;
+               offset++;
+       }
 
-        /* security payload */
-        p = lustre_msg_buf(msg, offset, 0);
-        size = msg->lm_buflens[offset];
-        LASSERT(p);
-
-        /* 1. lustre svc type */
-        LASSERT(size > 4);
-        *p++ = cpu_to_le32(lustre_srv);
-        size -= 4;
-
-        /* 2. target uuid */
-        obj.len = strlen(imp->imp_obd->u.cli.cl_target_uuid.uuid) + 1;
-        obj.data = imp->imp_obd->u.cli.cl_target_uuid.uuid;
-        if (rawobj_serialize(&obj, &p, &size))
-                LBUG();
-
-        /* 3. reverse context handle. actually only needed by root user,
-         *    but we send it anyway. */
-        gsec = sec2gsec(req->rq_cli_ctx->cc_sec);
-        obj.len = sizeof(gsec->gs_rvs_hdl);
-        obj.data = (__u8 *) &gsec->gs_rvs_hdl;
-        if (rawobj_serialize(&obj, &p, &size))
-                LBUG();
-
-        /* 4. now the token */
-        LASSERT(size >= (sizeof(__u32) + token_size));
-        *p++ = cpu_to_le32(((__u32) token_size));
+       /* new clients are expected to set KCSUM flag */
+       ghdr->gh_flags |= LUSTRE_GSS_PACK_KCSUM;
+
+       /* security payload */
+       p = lustre_msg_buf(msg, offset, 0);
+       size = msg->lm_buflens[offset];
+       LASSERT(p);
+
+       /* 1. lustre svc type */
+       LASSERT(size > 4);
+       *p++ = cpu_to_le32(lustre_srv);
+       size -= 4;
+
+       /* 2. target uuid */
+       obj.len = strlen(imp->imp_obd->u.cli.cl_target_uuid.uuid) + 1;
+       obj.data = imp->imp_obd->u.cli.cl_target_uuid.uuid;
+       if (rawobj_serialize(&obj, &p, &size))
+               LBUG();
+
+       /* 3. reverse context handle. actually only needed by root user,
+        *    but we send it anyway. */
+       gsec = sec2gsec(req->rq_cli_ctx->cc_sec);
+       obj.len = sizeof(gsec->gs_rvs_hdl);
+       obj.data = (__u8 *) &gsec->gs_rvs_hdl;
+       if (rawobj_serialize(&obj, &p, &size))
+               LBUG();
+
+       /* 4. now the token */
+       LASSERT(size >= (sizeof(__u32) + token_size));
+       *p++ = cpu_to_le32(((__u32) token_size));
        if (copy_from_user(p, token, token_size)) {
-                CERROR("can't copy token\n");
-                return -EFAULT;
-        }
-        size -= sizeof(__u32) + cfs_size_round4(token_size);
+               CERROR("can't copy token\n");
+               return -EFAULT;
+       }
+       size -= sizeof(__u32) + cfs_size_round4(token_size);
 
-        req->rq_reqdata_len = lustre_shrink_msg(req->rq_reqbuf, offset,
-                                                msg->lm_buflens[offset] - size, 0);
-        return 0;
+       req->rq_reqdata_len = lustre_shrink_msg(req->rq_reqbuf, offset,
+                                            msg->lm_buflens[offset] - size, 0);
+       return 0;
 }
 
 static
@@ -222,19 +216,19 @@ int ctx_init_parse_reply(struct lustre_msg *msg, int swabbed,
 struct lgssd_ioctl_param {
         int             version;        /* in   */
         int             secid;          /* in   */
-        char           *uuid;           /* in   */
+       char __user    *uuid;           /* in   */
         int             lustre_svc;     /* in   */
         uid_t           uid;            /* in   */
         gid_t           gid;            /* in   */
         long            send_token_size;/* in   */
-        char           *send_token;     /* in   */
+       char __user    *send_token;     /* in   */
         long            reply_buf_size; /* in   */
-        char           *reply_buf;      /* in   */
+       char __user    *reply_buf;      /* in   */
         long            status;         /* out  */
         long            reply_length;   /* out  */
 };
 
-int gss_do_ctx_init_rpc(__user char *buffer, unsigned long count)
+int gss_do_ctx_init_rpc(char __user *buffer, unsigned long count)
 {
         struct obd_import        *imp;
         struct ptlrpc_request    *req;
@@ -286,7 +280,9 @@ int gss_do_ctx_init_rpc(__user char *buffer, unsigned long count)
 
        if (strcmp(obd->obd_type->typ_name, LUSTRE_MDC_NAME) &&
            strcmp(obd->obd_type->typ_name, LUSTRE_OSC_NAME) &&
-           strcmp(obd->obd_type->typ_name, LUSTRE_MGC_NAME)) {
+           strcmp(obd->obd_type->typ_name, LUSTRE_MGC_NAME) &&
+           strcmp(obd->obd_type->typ_name, LUSTRE_LWP_NAME) &&
+           strcmp(obd->obd_type->typ_name, LUSTRE_OSP_NAME)) {
                CERROR("obd %s is not a client device\n", obdname);
                spin_unlock(&obd->obd_dev_lock);
                RETURN(-EINVAL);
@@ -377,14 +373,14 @@ out_copy:
 
 int gss_do_ctx_fini_rpc(struct gss_cli_ctx *gctx)
 {
-        struct ptlrpc_cli_ctx   *ctx = &gctx->gc_base;
-        struct obd_import       *imp = ctx->cc_sec->ps_import;
-        struct ptlrpc_request   *req;
-        struct ptlrpc_user_desc *pud;
-        int                      rc;
-        ENTRY;
+       struct ptlrpc_cli_ctx   *ctx = &gctx->gc_base;
+       struct obd_import       *imp = ctx->cc_sec->ps_import;
+       struct ptlrpc_request   *req;
+       struct ptlrpc_user_desc *pud;
+       int                      rc;
+       ENTRY;
 
-        LASSERT(cfs_atomic_read(&ctx->cc_refcount) > 0);
+       LASSERT(atomic_read(&ctx->cc_refcount) > 0);
 
        if (cli_ctx_is_error(ctx) || !cli_ctx_is_uptodate(ctx)) {
                CDEBUG(D_SEC, "ctx %p(%u->%s) not uptodate, "
@@ -395,7 +391,7 @@ int gss_do_ctx_fini_rpc(struct gss_cli_ctx *gctx)
 
        might_sleep();
 
-       CWARN("%s ctx %p idx "LPX64" (%u->%s)\n",
+       CWARN("%s ctx %p idx %#llx (%u->%s)\n",
              sec_is_reverse(ctx->cc_sec) ?
              "server finishing reverse" : "client finishing forward",
              ctx, gss_handle_to_u64(&gctx->gc_handle),
@@ -412,10 +408,8 @@ int gss_do_ctx_fini_rpc(struct gss_cli_ctx *gctx)
 
         rc = ptlrpc_request_bufs_pack(req, LUSTRE_OBD_VERSION, SEC_CTX_FINI,
                                       NULL, ctx);
-        if (rc) {
-                ptlrpc_request_free(req);
-                GOTO(out_ref, rc);
-        }
+       if (rc)
+               GOTO(out_ref, rc);
 
         /* fix the user desc */
         if (req->rq_pack_udesc) {
@@ -446,6 +440,6 @@ int __init gss_init_cli_upcall(void)
         return 0;
 }
 
-void __exit gss_exit_cli_upcall(void)
+void gss_exit_cli_upcall(void)
 {
 }