linux/debian/patches/s390-drivers-ccw-uevent-mod...

75 lines
1.8 KiB
Diff

## 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