Whamcloud - gitweb
LU-7845 gss: support namespace in lgss_keyring
[fs/lustre-release.git] / lustre / ptlrpc / gss / gss_keyring.c
index 2ebaeca..6186c5f 100644 (file)
@@ -817,19 +817,27 @@ struct ptlrpc_cli_ctx * gss_sec_lookup_ctx_kr(struct ptlrpc_sec *sec,
        construct_key_desc(desc, sizeof(desc), sec, vcred->vc_uid);
 
        /* callout info format:
-        * secid:mech:uid:gid:sec_flags:svc_flag:svc_type:peer_nid:target_uuid
+        * secid:mech:uid:gid:sec_flags:svc_flag:svc_type:peer_nid:target_uuid:
+        * self_nid:pid
         */
-        coinfo_size = sizeof(struct obd_uuid) + MAX_OBD_NAME + 64;
-        OBD_ALLOC(coinfo, coinfo_size);
-        if (coinfo == NULL)
-                goto out;
-
-       snprintf(coinfo, coinfo_size, "%d:%s:%u:%u:%s:%c:%d:%#llx:%s:%#llx",
+       coinfo_size = sizeof(struct obd_uuid) + MAX_OBD_NAME + 64;
+       OBD_ALLOC(coinfo, coinfo_size);
+       if (coinfo == NULL)
+               goto out;
+
+       /* Last callout parameter is pid of process whose namespace will be used
+        * for credentials' retrieval.
+        * For user's credentials (in which case sec_part_flags is empty), use
+        * current PID instead of import's reference PID to get reference
+        * namespace. */
+       snprintf(coinfo, coinfo_size, "%d:%s:%u:%u:%s:%c:%d:%#llx:%s:%#llx:%d",
                 sec->ps_id, sec2gsec(sec)->gs_mech->gm_name,
                 vcred->vc_uid, vcred->vc_gid,
                 sec_part_flags, svc_flag, import_to_gss_svc(imp),
                 imp->imp_connection->c_peer.nid, imp->imp_obd->obd_name,
-                imp->imp_connection->c_self);
+                imp->imp_connection->c_self,
+                sec_part_flags[0] == '\0' ?
+                      current_pid() : imp->imp_sec_refpid);
 
         CDEBUG(D_SEC, "requesting key for %s\n", desc);