## Upstream status: In mm-tree. diff -u b/drivers/s390/cio/device.c b/drivers/s390/cio/device.c --- b/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c @@ -53,6 +53,22 @@ return 1; } +static ssize_t +modalias_print (struct ccw_device *cdev, char *buf, size_t size) +{ + struct ccw_device_id *id = &(cdev->id); + ssize_t len; + + len = snprintf(buf, size, "ccw:t%04Xm%02X", + id->cu_type, id->cu_model); + if (id->dev_type != 0) + len += snprintf(buf + len, size - len, "dt%04Xdm%02X", + id->dev_type, id->dev_model); + else + len += snprintf(buf + len, size - len, "dtdm"); + return len; +} + /* * Hotplugging interface for ccw devices. * Heavily modeled on pci and usb hotplug. @@ -63,7 +79,7 @@ { struct ccw_device *cdev = to_ccwdev(dev); int i = 0; - int length = 0; + int length = 0, tmp_length = 0; if (!cdev) return -ENODEV; @@ -100,6 +116,14 @@ cdev->id.dev_model); if ((buffer_size - length <= 0) || (i >= num_envp)) return -ENOMEM; + ++length; + buffer += length; + + envp[i++] = buffer; + length += tmp_length = scnprintf(buffer, buffer_size - length, "MODALIAS="); + length += modalias_print(cdev, buffer + tmp_length, buffer_size - length); + if ((buffer_size - length <= 0) || (i >= num_envp)) + return -ENOMEM; envp[i] = NULL; @@ -251,17 +275,11 @@ modalias_show (struct device *dev, struct device_attribute *attr, char *buf) { struct ccw_device *cdev = to_ccwdev(dev); - struct ccw_device_id *id = &(cdev->id); - int ret; + ssize_t len; - ret = sprintf(buf, "ccw:t%04Xm%02X", - id->cu_type, id->cu_model); - if (id->dev_type != 0) - ret += sprintf(buf + ret, "dt%04Xdm%02X\n", - id->dev_type, id->dev_model); - else - ret += sprintf(buf + ret, "dtdm\n"); - return ret; + len = modalias_print(cdev, buf, PAGE_SIZE); + len += snprintf(buf + len, PAGE_SIZE - len, "\n"); + return len; } static ssize_t