powerpc/pseries: fix plpks_read_var() code for different consumers
authorNayna Jain <nayna@linux.ibm.com>
Sun, 6 Nov 2022 20:58:39 +0000 (15:58 -0500)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 24 Nov 2022 12:31:50 +0000 (23:31 +1100)
Even though plpks_read_var() is currently called to read variables
owned by different consumers, it internally supports only OS consumer.

Fix plpks_read_var() to handle different consumers correctly.

Fixes: 2454a7af0f2a ("powerpc/pseries: define driver for Platform KeyStore")
Signed-off-by: Nayna Jain <nayna@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221106205839.600442-7-nayna@linux.ibm.com
arch/powerpc/platforms/pseries/plpks.c

index e8c02735b7021421623d4f88fe3a3fe51348463c..4edd1585e24573b384ee8948f579646d4376aecf 100644 (file)
@@ -354,22 +354,24 @@ static int plpks_read_var(u8 consumer, struct plpks_var *var)
 {
        unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
        struct plpks_auth *auth;
-       struct label *label;
+       struct label *label = NULL;
        u8 *output;
        int rc;
 
        if (var->namelen > MAX_NAME_SIZE)
                return -EINVAL;
 
-       auth = construct_auth(PKS_OS_OWNER);
+       auth = construct_auth(consumer);
        if (IS_ERR(auth))
                return PTR_ERR(auth);
 
-       label = construct_label(var->component, var->os, var->name,
-                               var->namelen);
-       if (IS_ERR(label)) {
-               rc = PTR_ERR(label);
-               goto out_free_auth;
+       if (consumer == PKS_OS_OWNER) {
+               label = construct_label(var->component, var->os, var->name,
+                                       var->namelen);
+               if (IS_ERR(label)) {
+                       rc = PTR_ERR(label);
+                       goto out_free_auth;
+               }
        }
 
        output = kzalloc(maxobjsize, GFP_KERNEL);
@@ -378,9 +380,15 @@ static int plpks_read_var(u8 consumer, struct plpks_var *var)
                goto out_free_label;
        }
 
-       rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
-                        virt_to_phys(label), label->size, virt_to_phys(output),
-                        maxobjsize);
+       if (consumer == PKS_OS_OWNER)
+               rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
+                                virt_to_phys(label), label->size, virt_to_phys(output),
+                                maxobjsize);
+       else
+               rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
+                                virt_to_phys(var->name), var->namelen, virt_to_phys(output),
+                                maxobjsize);
+
 
        if (rc != H_SUCCESS) {
                rc = pseries_status_to_err(rc);