diff mbox series

[4/4] arch_vars: create arch specific permanent store

Message ID 20220706023935.875994-5-gjoyce@linux.vnet.ibm.com (mailing list archive)
State New
Headers show
Series sed-opal: keyrings, discovery, revert and key store | expand

Commit Message

Greg Joyce July 6, 2022, 2:39 a.m. UTC
From: Greg Joyce <gjoyce@linux.vnet.ibm.com>

Platforms that have a permanent key store may provide unique
platform dependent functions to read/write variables. The
default (weak) functions return -EOPNOTSUPP unless overridden
by architecture/platform versions.
---
 include/linux/arch_vars.h | 23 +++++++++++++++++++++++
 lib/Makefile              |  2 +-
 lib/arch_vars.c           | 25 +++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 include/linux/arch_vars.h
 create mode 100644 lib/arch_vars.c

Comments

Christoph Hellwig July 6, 2022, 8:11 a.m. UTC | #1
On Tue, Jul 05, 2022 at 09:39:35PM -0500, gjoyce@linux.vnet.ibm.com wrote:
> From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
> 
> Platforms that have a permanent key store may provide unique
> platform dependent functions to read/write variables. The
> default (weak) functions return -EOPNOTSUPP unless overridden
> by architecture/platform versions.

Which is none as of this patch set, as is the number of of users of
this API.  Did this slip in by accident?
Greg Joyce July 6, 2022, 2:28 p.m. UTC | #2
On Wed, 2022-07-06 at 01:11 -0700, Christoph Hellwig wrote:
> On Tue, Jul 05, 2022 at 09:39:35PM -0500, gjoyce@linux.vnet.ibm.com
> wrote:
> > From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
> > 
> > Platforms that have a permanent key store may provide unique
> > platform dependent functions to read/write variables. The
> > default (weak) functions return -EOPNOTSUPP unless overridden
> > by architecture/platform versions.
> 
> Which is none as of this patch set, as is the number of of users of
> this API.  Did this slip in by accident?

You are correct, there are currently no platforms that utilize this
key store interface. However, there is a pseries platform store that 
has a driver that will provide the interfaces. This is in a separate
patchset that is currently being submitted.
kernel test robot July 6, 2022, 5:10 p.m. UTC | #3
Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on axboe-block/for-next]
[also build test ERROR on linus/master v5.19-rc5 next-20220706]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/gjoyce-linux-vnet-ibm-com/sed-opal-keyrings-discovery-revert-and-key-store/20220706-104204
base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
config: sparc64-randconfig-r002-20220703 (https://download.01.org/0day-ci/archive/20220707/202207070041.gf2Xgary-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/b984dda112cdbda6b41045bf63f790a3c2903c7a
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review gjoyce-linux-vnet-ibm-com/sed-opal-keyrings-discovery-revert-and-key-store/20220706-104204
        git checkout b984dda112cdbda6b41045bf63f790a3c2903c7a
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=sparc64 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

All error/warnings (new ones prefixed by >>):

   block/sed-opal.c: In function 'update_sed_opal_key':
>> block/sed-opal.c:286:15: error: implicit declaration of function 'key_alloc'; did you mean 'bdev_alloc'? [-Werror=implicit-function-declaration]
     286 |         key = key_alloc(&key_type_user, desc, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
         |               ^~~~~~~~~
         |               bdev_alloc
>> block/sed-opal.c:286:26: error: 'key_type_user' undeclared (first use in this function)
     286 |         key = key_alloc(&key_type_user, desc, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
         |                          ^~~~~~~~~~~~~
   block/sed-opal.c:286:26: note: each undeclared identifier is reported only once for each function it appears in
>> block/sed-opal.c:288:33: error: 'KEY_USR_VIEW' undeclared (first use in this function)
     288 |                                 KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
         |                                 ^~~~~~~~~~~~
>> block/sed-opal.c:288:48: error: 'KEY_USR_SEARCH' undeclared (first use in this function)
     288 |                                 KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
         |                                                ^~~~~~~~~~~~~~
>> block/sed-opal.c:288:65: error: 'KEY_USR_WRITE' undeclared (first use in this function)
     288 |                                 KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
         |                                                                 ^~~~~~~~~~~~~
>> block/sed-opal.c:294:15: error: implicit declaration of function 'key_instantiate_and_link'; did you mean 'd_instantiate_anon'? [-Werror=implicit-function-declaration]
     294 |         ret = key_instantiate_and_link(key, key_data, keylen,
         |               ^~~~~~~~~~~~~~~~~~~~~~~~
         |               d_instantiate_anon
   block/sed-opal.c: In function 'read_sed_opal_key':
>> block/sed-opal.c:307:9: error: unknown type name 'key_ref_t'; did you mean 'key_ref_put'?
     307 |         key_ref_t kref;
         |         ^~~~~~~~~
         |         key_ref_put
>> block/sed-opal.c:313:16: error: implicit declaration of function 'keyring_search' [-Werror=implicit-function-declaration]
     313 |         kref = keyring_search(make_key_ref(sed_opal_keyring, true),
         |                ^~~~~~~~~~~~~~
   block/sed-opal.c:314:18: error: 'key_type_user' undeclared (first use in this function)
     314 |                 &key_type_user,
         |                  ^~~~~~~~~~~~~
>> block/sed-opal.c:318:20: warning: passing argument 1 of 'IS_ERR' makes pointer from integer without a cast [-Wint-conversion]
     318 |         if (IS_ERR(kref)) {
         |                    ^~~~
         |                    |
         |                    int
   In file included from include/linux/container_of.h:6,
                    from include/linux/list.h:5,
                    from include/linux/rculist.h:10,
                    from include/linux/pid.h:5,
                    from include/linux/sched.h:14,
                    from include/linux/delay.h:23,
                    from block/sed-opal.c:12:
   include/linux/err.h:34:60: note: expected 'const void *' but argument is of type 'int'
      34 | static inline bool __must_check IS_ERR(__force const void *ptr)
         |                                                ~~~~~~~~~~~~^~~
>> block/sed-opal.c:319:31: warning: passing argument 1 of 'PTR_ERR' makes pointer from integer without a cast [-Wint-conversion]
     319 |                 ret = PTR_ERR(kref);
         |                               ^~~~
         |                               |
         |                               int
   In file included from include/linux/container_of.h:6,
                    from include/linux/list.h:5,
                    from include/linux/rculist.h:10,
                    from include/linux/pid.h:5,
                    from include/linux/sched.h:14,
                    from include/linux/delay.h:23,
                    from block/sed-opal.c:12:
   include/linux/err.h:29:61: note: expected 'const void *' but argument is of type 'int'
      29 | static inline long __must_check PTR_ERR(__force const void *ptr)
         |                                                 ~~~~~~~~~~~~^~~
>> block/sed-opal.c:322:31: error: invalid use of undefined type 'struct key'
     322 |                 down_read(&key->sem);
         |                               ^~
   block/sed-opal.c:325:41: error: invalid use of undefined type 'struct key'
     325 |                         if (buflen > key->datalen)
         |                                         ^~
   block/sed-opal.c:326:45: error: invalid use of undefined type 'struct key'
     326 |                                 buflen = key->datalen;
         |                                             ^~
   block/sed-opal.c:328:34: error: invalid use of undefined type 'struct key'
     328 |                         ret = key->type->read(key, (char *)buffer, buflen);
         |                                  ^~
   block/sed-opal.c:330:29: error: invalid use of undefined type 'struct key'
     330 |                 up_read(&key->sem);
         |                             ^~
   block/sed-opal.c: In function 'sed_opal_init':
>> block/sed-opal.c:2938:14: error: implicit declaration of function 'keyring_alloc'; did you mean 'warn_alloc'? [-Werror=implicit-function-declaration]
    2938 |         kr = keyring_alloc(".sed_opal",
         |              ^~~~~~~~~~~~~
         |              warn_alloc
>> block/sed-opal.c:2940:18: error: 'KEY_POS_ALL' undeclared (first use in this function)
    2940 |                 (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
         |                  ^~~~~~~~~~~
>> block/sed-opal.c:2940:33: error: 'KEY_POS_SETATTR' undeclared (first use in this function)
    2940 |                 (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
         |                                 ^~~~~~~~~~~~~~~
   block/sed-opal.c:2940:52: error: 'KEY_USR_VIEW' undeclared (first use in this function)
    2940 |                 (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
         |                                                    ^~~~~~~~~~~~
>> block/sed-opal.c:2941:17: error: 'KEY_USR_READ' undeclared (first use in this function)
    2941 |                 KEY_USR_READ | KEY_USR_SEARCH | KEY_USR_WRITE,
         |                 ^~~~~~~~~~~~
   block/sed-opal.c:2941:32: error: 'KEY_USR_SEARCH' undeclared (first use in this function)
    2941 |                 KEY_USR_READ | KEY_USR_SEARCH | KEY_USR_WRITE,
         |                                ^~~~~~~~~~~~~~
   block/sed-opal.c:2941:49: error: 'KEY_USR_WRITE' undeclared (first use in this function)
    2941 |                 KEY_USR_READ | KEY_USR_SEARCH | KEY_USR_WRITE,
         |                                                 ^~~~~~~~~~~~~
>> block/sed-opal.c:2942:17: error: 'KEY_ALLOC_NOT_IN_QUOTA' undeclared (first use in this function)
    2942 |                 KEY_ALLOC_NOT_IN_QUOTA,
         |                 ^~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +286 block/sed-opal.c

455a7b238cd6bc Scott Bauer 2017-02-03  274  
8a2b115580e8f7 Greg Joyce  2022-07-05  275  /*
8a2b115580e8f7 Greg Joyce  2022-07-05  276   * Allocate/update a SED Opal key and add it to the SED Opal keyring.
8a2b115580e8f7 Greg Joyce  2022-07-05  277   */
8a2b115580e8f7 Greg Joyce  2022-07-05  278  static int update_sed_opal_key(const char *desc, u_char *key_data, int keylen)
8a2b115580e8f7 Greg Joyce  2022-07-05  279  {
8a2b115580e8f7 Greg Joyce  2022-07-05  280  	int ret;
8a2b115580e8f7 Greg Joyce  2022-07-05  281  	struct key *key;
8a2b115580e8f7 Greg Joyce  2022-07-05  282  
8a2b115580e8f7 Greg Joyce  2022-07-05  283  	if (!sed_opal_keyring)
8a2b115580e8f7 Greg Joyce  2022-07-05  284  		return -ENOKEY;
8a2b115580e8f7 Greg Joyce  2022-07-05  285  
8a2b115580e8f7 Greg Joyce  2022-07-05 @286  	key = key_alloc(&key_type_user, desc, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
8a2b115580e8f7 Greg Joyce  2022-07-05  287  				current_cred(),
8a2b115580e8f7 Greg Joyce  2022-07-05 @288  				KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
8a2b115580e8f7 Greg Joyce  2022-07-05  289  				0,
8a2b115580e8f7 Greg Joyce  2022-07-05  290  				NULL);
8a2b115580e8f7 Greg Joyce  2022-07-05  291  	if (IS_ERR(key))
8a2b115580e8f7 Greg Joyce  2022-07-05  292  		return PTR_ERR(key);
8a2b115580e8f7 Greg Joyce  2022-07-05  293  
8a2b115580e8f7 Greg Joyce  2022-07-05 @294  	ret = key_instantiate_and_link(key, key_data, keylen,
8a2b115580e8f7 Greg Joyce  2022-07-05  295  			sed_opal_keyring, NULL);
8a2b115580e8f7 Greg Joyce  2022-07-05  296  	key_put(key);
8a2b115580e8f7 Greg Joyce  2022-07-05  297  
8a2b115580e8f7 Greg Joyce  2022-07-05  298  	return ret;
8a2b115580e8f7 Greg Joyce  2022-07-05  299  }
8a2b115580e8f7 Greg Joyce  2022-07-05  300  
8a2b115580e8f7 Greg Joyce  2022-07-05  301  /*
8a2b115580e8f7 Greg Joyce  2022-07-05  302   * Read a SED Opal key from the SED Opal keyring.
8a2b115580e8f7 Greg Joyce  2022-07-05  303   */
8a2b115580e8f7 Greg Joyce  2022-07-05  304  static int read_sed_opal_key(const char *key_name, u_char *buffer, int buflen)
8a2b115580e8f7 Greg Joyce  2022-07-05  305  {
8a2b115580e8f7 Greg Joyce  2022-07-05  306  	int ret;
8a2b115580e8f7 Greg Joyce  2022-07-05 @307  	key_ref_t kref;
8a2b115580e8f7 Greg Joyce  2022-07-05  308  	struct key *key;
8a2b115580e8f7 Greg Joyce  2022-07-05  309  
8a2b115580e8f7 Greg Joyce  2022-07-05  310  	if (!sed_opal_keyring)
8a2b115580e8f7 Greg Joyce  2022-07-05  311  		return -ENOKEY;
8a2b115580e8f7 Greg Joyce  2022-07-05  312  
8a2b115580e8f7 Greg Joyce  2022-07-05 @313  	kref = keyring_search(make_key_ref(sed_opal_keyring, true),
8a2b115580e8f7 Greg Joyce  2022-07-05  314  		&key_type_user,
8a2b115580e8f7 Greg Joyce  2022-07-05  315  		key_name,
8a2b115580e8f7 Greg Joyce  2022-07-05  316  		true);
8a2b115580e8f7 Greg Joyce  2022-07-05  317  
8a2b115580e8f7 Greg Joyce  2022-07-05 @318  	if (IS_ERR(kref)) {
8a2b115580e8f7 Greg Joyce  2022-07-05 @319  		ret = PTR_ERR(kref);
8a2b115580e8f7 Greg Joyce  2022-07-05  320  	} else {
8a2b115580e8f7 Greg Joyce  2022-07-05  321  		key = key_ref_to_ptr(kref);
8a2b115580e8f7 Greg Joyce  2022-07-05 @322  		down_read(&key->sem);
8a2b115580e8f7 Greg Joyce  2022-07-05  323  		ret = key_validate(key);
8a2b115580e8f7 Greg Joyce  2022-07-05  324  		if (ret == 0) {
8a2b115580e8f7 Greg Joyce  2022-07-05  325  			if (buflen > key->datalen)
8a2b115580e8f7 Greg Joyce  2022-07-05  326  				buflen = key->datalen;
8a2b115580e8f7 Greg Joyce  2022-07-05  327  
8a2b115580e8f7 Greg Joyce  2022-07-05  328  			ret = key->type->read(key, (char *)buffer, buflen);
8a2b115580e8f7 Greg Joyce  2022-07-05  329  		}
8a2b115580e8f7 Greg Joyce  2022-07-05  330  		up_read(&key->sem);
8a2b115580e8f7 Greg Joyce  2022-07-05  331  
8a2b115580e8f7 Greg Joyce  2022-07-05  332  		key_ref_put(kref);
8a2b115580e8f7 Greg Joyce  2022-07-05  333  	}
8a2b115580e8f7 Greg Joyce  2022-07-05  334  
8a2b115580e8f7 Greg Joyce  2022-07-05  335  	return ret;
8a2b115580e8f7 Greg Joyce  2022-07-05  336  }
8a2b115580e8f7 Greg Joyce  2022-07-05  337
kernel test robot July 8, 2022, 2:35 a.m. UTC | #4
Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on axboe-block/for-next]
[also build test ERROR on linus/master v5.19-rc5 next-20220707]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/gjoyce-linux-vnet-ibm-com/sed-opal-keyrings-discovery-revert-and-key-store/20220706-104204
base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
config: arm-randconfig-r036-20220706 (https://download.01.org/0day-ci/archive/20220708/202207081010.mn8e8rca-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project f553287b588916de09c66e3e32bf75e5060f967f)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm cross compiling tool for clang build
        # apt-get install binutils-arm-linux-gnueabi
        # https://github.com/intel-lab-lkp/linux/commit/b984dda112cdbda6b41045bf63f790a3c2903c7a
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review gjoyce-linux-vnet-ibm-com/sed-opal-keyrings-discovery-revert-and-key-store/20220706-104204
        git checkout b984dda112cdbda6b41045bf63f790a3c2903c7a
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

All error/warnings (new ones prefixed by >>):

>> block/sed-opal.c:286:8: error: call to undeclared function 'key_alloc'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
           key = key_alloc(&key_type_user, desc, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
                 ^
>> block/sed-opal.c:286:19: error: use of undeclared identifier 'key_type_user'
           key = key_alloc(&key_type_user, desc, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
                            ^
>> block/sed-opal.c:288:5: error: use of undeclared identifier 'KEY_USR_VIEW'
                                   KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
                                   ^
>> block/sed-opal.c:288:20: error: use of undeclared identifier 'KEY_USR_SEARCH'
                                   KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
                                                  ^
>> block/sed-opal.c:288:37: error: use of undeclared identifier 'KEY_USR_WRITE'
                                   KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
                                                                   ^
>> block/sed-opal.c:294:8: error: call to undeclared function 'key_instantiate_and_link'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
           ret = key_instantiate_and_link(key, key_data, keylen,
                 ^
   block/sed-opal.c:294:8: note: did you mean 'd_instantiate_anon'?
   include/linux/dcache.h:223:24: note: 'd_instantiate_anon' declared here
   extern struct dentry * d_instantiate_anon(struct dentry *, struct inode *);
                          ^
   block/sed-opal.c:307:2: error: unknown type name 'key_ref_t'; did you mean 'key_perm_t'?
           key_ref_t kref;
           ^~~~~~~~~
           key_perm_t
   include/linux/key.h:31:18: note: 'key_perm_t' declared here
   typedef uint32_t key_perm_t;
                    ^
>> block/sed-opal.c:313:9: error: call to undeclared function 'keyring_search'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
           kref = keyring_search(make_key_ref(sed_opal_keyring, true),
                  ^
   block/sed-opal.c:314:4: error: use of undeclared identifier 'key_type_user'
                   &key_type_user,
                    ^
>> block/sed-opal.c:318:13: warning: incompatible integer to pointer conversion passing 'key_perm_t' (aka 'unsigned int') to parameter of type 'const void *' [-Wint-conversion]
           if (IS_ERR(kref)) {
                      ^~~~
   include/linux/err.h:34:60: note: passing argument to parameter 'ptr' here
   static inline bool __must_check IS_ERR(__force const void *ptr)
                                                              ^
   block/sed-opal.c:319:17: warning: incompatible integer to pointer conversion passing 'key_perm_t' (aka 'unsigned int') to parameter of type 'const void *' [-Wint-conversion]
                   ret = PTR_ERR(kref);
                                 ^~~~
   include/linux/err.h:29:61: note: passing argument to parameter 'ptr' here
   static inline long __must_check PTR_ERR(__force const void *ptr)
                                                               ^
>> block/sed-opal.c:322:17: error: incomplete definition of type 'struct key'
                   down_read(&key->sem);
                              ~~~^
   include/linux/key.h:33:8: note: forward declaration of 'struct key'
   struct key;
          ^
   block/sed-opal.c:325:20: error: incomplete definition of type 'struct key'
                           if (buflen > key->datalen)
                                        ~~~^
   include/linux/key.h:33:8: note: forward declaration of 'struct key'
   struct key;
          ^
   block/sed-opal.c:326:17: error: incomplete definition of type 'struct key'
                                   buflen = key->datalen;
                                            ~~~^
   include/linux/key.h:33:8: note: forward declaration of 'struct key'
   struct key;
          ^
   block/sed-opal.c:328:13: error: incomplete definition of type 'struct key'
                           ret = key->type->read(key, (char *)buffer, buflen);
                                 ~~~^
   include/linux/key.h:33:8: note: forward declaration of 'struct key'
   struct key;
          ^
   block/sed-opal.c:330:15: error: incomplete definition of type 'struct key'
                   up_read(&key->sem);
                            ~~~^
   include/linux/key.h:33:8: note: forward declaration of 'struct key'
   struct key;
          ^
>> block/sed-opal.c:2938:7: error: call to undeclared function 'keyring_alloc'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
           kr = keyring_alloc(".sed_opal",
                ^
>> block/sed-opal.c:2940:4: error: use of undeclared identifier 'KEY_POS_ALL'
                   (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
                    ^
>> block/sed-opal.c:2940:19: error: use of undeclared identifier 'KEY_POS_SETATTR'
                   (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
                                   ^
   block/sed-opal.c:2940:38: error: use of undeclared identifier 'KEY_USR_VIEW'
                   (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
                                                      ^
>> block/sed-opal.c:2941:3: error: use of undeclared identifier 'KEY_USR_READ'
                   KEY_USR_READ | KEY_USR_SEARCH | KEY_USR_WRITE,
                   ^
   fatal error: too many errors emitted, stopping now [-ferror-limit=]
   2 warnings and 20 errors generated.


vim +/key_alloc +286 block/sed-opal.c

455a7b238cd6bc6 Scott Bauer 2017-02-03  274  
8a2b115580e8f7c Greg Joyce  2022-07-05  275  /*
8a2b115580e8f7c Greg Joyce  2022-07-05  276   * Allocate/update a SED Opal key and add it to the SED Opal keyring.
8a2b115580e8f7c Greg Joyce  2022-07-05  277   */
8a2b115580e8f7c Greg Joyce  2022-07-05  278  static int update_sed_opal_key(const char *desc, u_char *key_data, int keylen)
8a2b115580e8f7c Greg Joyce  2022-07-05  279  {
8a2b115580e8f7c Greg Joyce  2022-07-05  280  	int ret;
8a2b115580e8f7c Greg Joyce  2022-07-05  281  	struct key *key;
8a2b115580e8f7c Greg Joyce  2022-07-05  282  
8a2b115580e8f7c Greg Joyce  2022-07-05  283  	if (!sed_opal_keyring)
8a2b115580e8f7c Greg Joyce  2022-07-05  284  		return -ENOKEY;
8a2b115580e8f7c Greg Joyce  2022-07-05  285  
8a2b115580e8f7c Greg Joyce  2022-07-05 @286  	key = key_alloc(&key_type_user, desc, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
8a2b115580e8f7c Greg Joyce  2022-07-05  287  				current_cred(),
8a2b115580e8f7c Greg Joyce  2022-07-05 @288  				KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
8a2b115580e8f7c Greg Joyce  2022-07-05  289  				0,
8a2b115580e8f7c Greg Joyce  2022-07-05  290  				NULL);
8a2b115580e8f7c Greg Joyce  2022-07-05  291  	if (IS_ERR(key))
8a2b115580e8f7c Greg Joyce  2022-07-05  292  		return PTR_ERR(key);
8a2b115580e8f7c Greg Joyce  2022-07-05  293  
8a2b115580e8f7c Greg Joyce  2022-07-05 @294  	ret = key_instantiate_and_link(key, key_data, keylen,
8a2b115580e8f7c Greg Joyce  2022-07-05  295  			sed_opal_keyring, NULL);
8a2b115580e8f7c Greg Joyce  2022-07-05  296  	key_put(key);
8a2b115580e8f7c Greg Joyce  2022-07-05  297  
8a2b115580e8f7c Greg Joyce  2022-07-05  298  	return ret;
8a2b115580e8f7c Greg Joyce  2022-07-05  299  }
8a2b115580e8f7c Greg Joyce  2022-07-05  300  
8a2b115580e8f7c Greg Joyce  2022-07-05  301  /*
8a2b115580e8f7c Greg Joyce  2022-07-05  302   * Read a SED Opal key from the SED Opal keyring.
8a2b115580e8f7c Greg Joyce  2022-07-05  303   */
8a2b115580e8f7c Greg Joyce  2022-07-05  304  static int read_sed_opal_key(const char *key_name, u_char *buffer, int buflen)
8a2b115580e8f7c Greg Joyce  2022-07-05  305  {
8a2b115580e8f7c Greg Joyce  2022-07-05  306  	int ret;
8a2b115580e8f7c Greg Joyce  2022-07-05  307  	key_ref_t kref;
8a2b115580e8f7c Greg Joyce  2022-07-05  308  	struct key *key;
8a2b115580e8f7c Greg Joyce  2022-07-05  309  
8a2b115580e8f7c Greg Joyce  2022-07-05  310  	if (!sed_opal_keyring)
8a2b115580e8f7c Greg Joyce  2022-07-05  311  		return -ENOKEY;
8a2b115580e8f7c Greg Joyce  2022-07-05  312  
8a2b115580e8f7c Greg Joyce  2022-07-05 @313  	kref = keyring_search(make_key_ref(sed_opal_keyring, true),
8a2b115580e8f7c Greg Joyce  2022-07-05  314  		&key_type_user,
8a2b115580e8f7c Greg Joyce  2022-07-05  315  		key_name,
8a2b115580e8f7c Greg Joyce  2022-07-05  316  		true);
8a2b115580e8f7c Greg Joyce  2022-07-05  317  
8a2b115580e8f7c Greg Joyce  2022-07-05 @318  	if (IS_ERR(kref)) {
8a2b115580e8f7c Greg Joyce  2022-07-05  319  		ret = PTR_ERR(kref);
8a2b115580e8f7c Greg Joyce  2022-07-05  320  	} else {
8a2b115580e8f7c Greg Joyce  2022-07-05  321  		key = key_ref_to_ptr(kref);
8a2b115580e8f7c Greg Joyce  2022-07-05 @322  		down_read(&key->sem);
8a2b115580e8f7c Greg Joyce  2022-07-05  323  		ret = key_validate(key);
8a2b115580e8f7c Greg Joyce  2022-07-05  324  		if (ret == 0) {
8a2b115580e8f7c Greg Joyce  2022-07-05  325  			if (buflen > key->datalen)
8a2b115580e8f7c Greg Joyce  2022-07-05  326  				buflen = key->datalen;
8a2b115580e8f7c Greg Joyce  2022-07-05  327  
8a2b115580e8f7c Greg Joyce  2022-07-05  328  			ret = key->type->read(key, (char *)buffer, buflen);
8a2b115580e8f7c Greg Joyce  2022-07-05  329  		}
8a2b115580e8f7c Greg Joyce  2022-07-05  330  		up_read(&key->sem);
8a2b115580e8f7c Greg Joyce  2022-07-05  331  
8a2b115580e8f7c Greg Joyce  2022-07-05  332  		key_ref_put(kref);
8a2b115580e8f7c Greg Joyce  2022-07-05  333  	}
8a2b115580e8f7c Greg Joyce  2022-07-05  334  
8a2b115580e8f7c Greg Joyce  2022-07-05  335  	return ret;
8a2b115580e8f7c Greg Joyce  2022-07-05  336  }
8a2b115580e8f7c Greg Joyce  2022-07-05  337
diff mbox series

Patch

diff --git a/include/linux/arch_vars.h b/include/linux/arch_vars.h
new file mode 100644
index 000000000000..b5eb5fcfb2ca
--- /dev/null
+++ b/include/linux/arch_vars.h
@@ -0,0 +1,23 @@ 
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Platform variable opearations.
+ *
+ * Copyright (C) 2022 IBM Corporation
+ *
+ * These are the accessor functions (read/write) for architecture specific
+ * variables. Specific architectures can provide overrides.
+ *
+ */
+
+#include <linux/kernel.h>
+
+enum arch_variable_type {
+	ARCH_VAR_OPAL_KEY      = 0,     /* SED Opal Authentication Key */
+	ARCH_VAR_OTHER         = 1,     /* Other type of variable */
+	ARCH_VAR_MAX           = 1,     /* Maximum type value */
+};
+
+int arch_read_variable(enum arch_variable_type type, char *varname,
+		void *varbuf, u_int *varlen);
+int arch_write_variable(enum arch_variable_type type, char *varname,
+		void *varbuf, u_int varlen);
diff --git a/lib/Makefile b/lib/Makefile
index f99bf61f8bbc..b90c4cb0dbbb 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -48,7 +48,7 @@  obj-y += bcd.o sort.o parser.o debug_locks.o random32.o \
 	 bsearch.o find_bit.o llist.o memweight.o kfifo.o \
 	 percpu-refcount.o rhashtable.o \
 	 once.o refcount.o usercopy.o errseq.o bucket_locks.o \
-	 generic-radix-tree.o
+	 generic-radix-tree.o arch_vars.o
 obj-$(CONFIG_STRING_SELFTEST) += test_string.o
 obj-y += string_helpers.o
 obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o
diff --git a/lib/arch_vars.c b/lib/arch_vars.c
new file mode 100644
index 000000000000..b5362ef933dc
--- /dev/null
+++ b/lib/arch_vars.c
@@ -0,0 +1,25 @@ 
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Platform variable operations.
+ *
+ * Copyright (C) 2022 IBM Corporation
+ *
+ * These are the accessor functions (read/write) for architecture specific
+ * variables. Specific architectures can provide overrides.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/arch_vars.h>
+
+int __weak arch_read_variable(enum arch_variable_type type, char *varname,
+		void *varbuf, u_int *varlen)
+{
+	return -EOPNOTSUPP;
+}
+
+int __weak arch_write_variable(enum arch_variable_type type, char *varname,
+		void *varbuf, u_int varlen)
+{
+	return -EOPNOTSUPP;
+}