Hi Mario,

[auto build test WARNING on platform-drivers-x86/for-next]
[also build test WARNING on next-20171009]
[cannot apply to v4.14-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Mario-Limonciello/Introduce-support-for-Dell-SMBIOS-over-WMI/20171012-082742
base:   git://git.infradead.org/users/dvhart/linux-platform-drivers-x86.git 
for-next
config: x86_64-randconfig-x018-201741 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

   In file included from include/linux/kobject.h:21:0,
                    from include/linux/dmi.h:5,
                    from drivers/platform/x86/dell-smbios-wmi.c:12:
   drivers/platform/x86/dell-smbios-wmi.c: In function 'dell_smbios_wmi_probe':
   include/linux/sysfs.h:54:8: error: 'struct device_attribute' has no member 
named 'key'
     (attr)->key = &__key;    \
           ^
>> drivers/platform/x86/dell-smbios-wmi.c:207:2: note: in expansion of macro 
>> 'sysfs_attr_init'
     sysfs_attr_init(&priv->req_buf_size_attr);
     ^~~~~~~~~~~~~~~

vim +/sysfs_attr_init +207 drivers/platform/x86/dell-smbios-wmi.c

    11  
  > 12  #include <linux/dmi.h>
    13  #include <linux/list.h>
    14  #include <linux/module.h>
    15  #include <linux/mutex.h>
    16  #include <linux/uaccess.h>
    17  #include <linux/wmi.h>
    18  #include <uapi/linux/dell-smbios.h>
    19  #include "dell-smbios.h"
    20  #include "dell-wmi-descriptor.h"
    21  static DEFINE_MUTEX(call_mutex);
    22  static DEFINE_MUTEX(list_mutex);
    23  static int wmi_supported;
    24  
    25  struct misc_bios_flags_structure {
    26          struct dmi_header header;
    27          u16 flags0;
    28  } __packed;
    29  #define FLAG_HAS_ACPI_WMI 0x02
    30  
    31  #define DELL_WMI_SMBIOS_GUID "A80593CE-A997-11DA-B012-B622A1EF5492"
    32  
    33  struct wmi_smbios_priv {
    34          struct wmi_smbios_buffer *buf;
    35          struct device_attribute req_buf_size_attr;
    36          struct list_head list;
    37          struct wmi_device *wdev;
    38          struct device *child;
    39          u32 req_buf_size;
    40  };
    41  static LIST_HEAD(wmi_list);
    42  
    43  static inline struct wmi_smbios_priv *get_first_smbios_priv(void)
    44  {
    45          return list_first_entry_or_null(&wmi_list,
    46                                          struct wmi_smbios_priv,
    47                                          list);
    48  }
    49  
    50  static int run_smbios_call(struct wmi_device *wdev)
    51  {
    52          struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
    53          struct wmi_smbios_priv *priv;
    54          struct acpi_buffer input;
    55          union acpi_object *obj;
    56          acpi_status status;
    57  
    58          priv = dev_get_drvdata(&wdev->dev);
    59          input.length = priv->req_buf_size;
    60          input.pointer = &priv->buf->std;
    61  
    62          dev_dbg(&wdev->dev, "evaluating: %x/%x [%x,%x,%x,%x]\n",
    63                  priv->buf->std.class, priv->buf->std.select,
    64                  priv->buf->std.input[0], priv->buf->std.input[1],
    65                  priv->buf->std.input[2], priv->buf->std.input[3]);
    66  
    67          status = wmidev_evaluate_method(wdev, 0, 1, &input, &output);
    68          if (ACPI_FAILURE(status))
    69                  return -EIO;
    70          obj = (union acpi_object *)output.pointer;
    71          if (obj->type != ACPI_TYPE_BUFFER) {
    72                  dev_dbg(&wdev->dev, "received type: %d\n", obj->type);
    73                  if (obj->type == ACPI_TYPE_INTEGER)
    74                          dev_dbg(&wdev->dev, "SMBIOS call failed: 
%llu\n",
    75                                  obj->integer.value);
    76                  return -EIO;
    77          }
    78          memcpy(&priv->buf->std, obj->buffer.pointer, 
obj->buffer.length);
    79  
    80          return 0;
    81  }
    82  
    83  int dell_smbios_wmi_call(struct calling_interface_buffer *buffer)
    84  {
    85          struct wmi_smbios_priv *priv;
    86          size_t difference;
    87          size_t size;
    88          int ret;
    89  
    90          priv = get_first_smbios_priv();
    91          if (!priv)
    92                  return -ENODEV;
    93  
    94          size = sizeof(struct calling_interface_buffer);
    95          difference = priv->req_buf_size - sizeof(u64) - size;
    96  
    97          mutex_lock(&call_mutex);
    98          memset(&priv->buf->ext, 0, difference);
    99          memcpy(&priv->buf->std, buffer, size);
   100          ret = run_smbios_call(priv->wdev);
   101          memcpy(buffer, &priv->buf->std, size);
   102          mutex_unlock(&call_mutex);
   103  
   104          return ret;
   105  }
   106  
   107  static long dell_smbios_wmi_ioctl(struct wmi_device *wdev, unsigned int 
cmd,
   108                                    unsigned long arg)
   109  {
   110          struct wmi_smbios_buffer __user *input =
   111                  (struct wmi_smbios_buffer __user *) arg;
   112          struct wmi_smbios_priv *priv;
   113          int ret = 0;
   114          u64 size;
   115  
   116          switch (cmd) {
   117          case DELL_WMI_SMBIOS_CMD:
   118                  priv = dev_get_drvdata(&wdev->dev);
   119                  if (!priv)
   120                          return -ENODEV;
   121                  mutex_lock(&call_mutex);
   122                  /* read the size that userspace is sending */
   123                  if (get_user(size, &input->length)) {
   124                          dev_dbg(&wdev->dev, "Read length from user 
failed\n");
   125                          ret = -EFAULT;
   126                          goto fail_smbios_cmd;
   127                  }
   128                  /* if it's too big, this is OK, we'll only use what we 
need */
   129                  if (size > priv->req_buf_size)
   130                          dev_warn(&wdev->dev,
   131                                  "Buffer %lld is bigger than required 
%d\n",
   132                                  size, priv->req_buf_size);
   133                  /* if it's too small, abort */
   134                  if (size < priv->req_buf_size) {
   135                          dev_err(&wdev->dev,
   136                                  "Buffer %lld too small, need at least 
%d\n",
   137                                  size, priv->req_buf_size);
   138                          ret = -EINVAL;
   139                          goto fail_smbios_cmd;
   140                  }
   141                  /* read the structure from userspace */
   142                  if (copy_from_user(priv->buf, input, 
priv->req_buf_size)) {
   143                          dev_dbg(&wdev->dev, "Copy %llu from user 
failed\n",
   144                                  size);
   145                          ret = -EFAULT;
   146                          goto fail_smbios_cmd;
   147                  }
   148                  /* check for any calls we should avoid */
   149                  if (dell_smbios_call_filter(&wdev->dev, 
&priv->buf->std)) {
   150                          dev_err(&wdev->dev, "Invalid call %d/%d:%8x\n",
   151                                  priv->buf->std.class, 
priv->buf->std.select,
   152                                  priv->buf->std.input[0]);
   153                          ret = -EFAULT;
   154                          goto fail_smbios_cmd;
   155                  }
   156                  ret = run_smbios_call(priv->wdev);
   157                  if (ret != 0)
   158                          goto fail_smbios_cmd;
   159                  /* return the result (only up to our internal buffer 
size) */
   160                  if (copy_to_user(input, priv->buf, priv->req_buf_size)) 
{
   161                          dev_dbg(&wdev->dev, "Copy %d to user failed\n",
   162                          priv->req_buf_size);
   163                          ret = -EFAULT;
   164                  }
   165  fail_smbios_cmd:
   166                  mutex_unlock(&call_mutex);
   167                  break;
   168          default:
   169                  dev_dbg(&wdev->dev, "unsupported ioctl: %d [%d, %d, %d, 
%d].\n",
   170                          cmd, _IOC_DIR(cmd), _IOC_TYPE(cmd), 
_IOC_NR(cmd),
   171                          _IOC_SIZE(cmd));
   172                  ret = -ENOIOCTLCMD;
   173          }
   174          return ret;
   175  }
   176  
   177  static ssize_t req_buf_size_show(struct device *dev,
   178                                  struct device_attribute *attr, char 
*buf)
   179  {
   180          struct wmi_smbios_priv *priv = dev_get_drvdata(dev);
   181  
   182          return sprintf(buf, "%d\n", priv->req_buf_size);
   183  }
   184  
   185  static int dell_smbios_wmi_probe(struct wmi_device *wdev)
   186  {
   187          struct wmi_smbios_priv *priv;
   188          int count;
   189          int ret;
   190  
   191          priv = devm_kzalloc(&wdev->dev, sizeof(struct wmi_smbios_priv),
   192                              GFP_KERNEL);
   193          if (!priv)
   194                  return -ENOMEM;
   195  
   196          /* WMI buffer size will be either 4k or 32k depending on 
machine */
   197          if (!dell_wmi_get_size(&priv->req_buf_size))
   198                  return -EINVAL;
   199          /* add in the length object we will use internally with ioctl */
   200          priv->req_buf_size += sizeof(u64);
   201  
   202          count = get_order(priv->req_buf_size);
   203          priv->buf = (void *)__get_free_pages(GFP_KERNEL, count);
   204          if (!priv->buf)
   205                  return -ENOMEM;
   206  
 > 207          sysfs_attr_init(&priv->req_buf_size_attr);
   208          priv->req_buf_size_attr.attr.name = "required_buffer_size";
   209          priv->req_buf_size_attr.attr.mode = 0444;
   210          priv->req_buf_size_attr.show = req_buf_size_show;
   211  
   212          ret = device_create_file(&wdev->dev, &priv->req_buf_size_attr);
   213          if (ret)
   214                  goto fail_create_sysfs;
   215  
   216          /* ID is used by dell-smbios to set priority of drivers */
   217          wdev->dev.id = 1;
   218          ret = dell_smbios_register_device(&wdev->dev, 
&dell_smbios_wmi_call);
   219          if (ret)
   220                  goto fail_register;
   221  
   222          priv->wdev = wdev;
   223          dev_set_drvdata(&wdev->dev, priv);
   224          mutex_lock(&list_mutex);
   225          list_add_tail(&priv->list, &wmi_list);
   226          mutex_unlock(&list_mutex);
   227  
   228          return 0;
   229  
   230  fail_register:
   231          device_remove_file(&wdev->dev, &priv->req_buf_size_attr);
   232  
   233  fail_create_sysfs:
   234          free_pages((unsigned long)priv->buf, count);
   235          return ret;
   236  }
   237  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to