aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/cio/device.c
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2007-08-14 09:15:12 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-10-12 17:51:01 -0400
commit7eff2e7a8b65c25920207324e56611150eb1cd9a (patch)
tree02a0eeba9d25d996233e30c18f258dfae0ae2139 /drivers/s390/cio/device.c
parent8380770c842faef3001e44662953d64ad9a93663 (diff)
Driver core: change add_uevent_var to use a struct
This changes the uevent buffer functions to use a struct instead of a long list of parameters. It does no longer require the caller to do the proper buffer termination and size accounting, which is currently wrong in some places. It fixes a known bug where parts of the uevent environment are overwritten because of wrong index calculations. Many thanks to Mathieu Desnoyers for finding bugs and improving the error handling. Signed-off-by: Kay Sievers <kay.sievers@vrfy.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Cc: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/s390/cio/device.c')
-rw-r--r--drivers/s390/cio/device.c25
1 files changed, 7 insertions, 18 deletions
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index e44d92eac8e9..606bb53e9fae 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -78,49 +78,38 @@ static int snprint_alias(char *buf, size_t size,
78 78
79/* Set up environment variables for ccw device uevent. Return 0 on success, 79/* Set up environment variables for ccw device uevent. Return 0 on success,
80 * non-zero otherwise. */ 80 * non-zero otherwise. */
81static int ccw_uevent(struct device *dev, char **envp, int num_envp, 81static int ccw_uevent(struct device *dev, struct kobj_uevent_env *env)
82 char *buffer, int buffer_size)
83{ 82{
84 struct ccw_device *cdev = to_ccwdev(dev); 83 struct ccw_device *cdev = to_ccwdev(dev);
85 struct ccw_device_id *id = &(cdev->id); 84 struct ccw_device_id *id = &(cdev->id);
86 int i = 0;
87 int len = 0;
88 int ret; 85 int ret;
89 char modalias_buf[30]; 86 char modalias_buf[30];
90 87
91 /* CU_TYPE= */ 88 /* CU_TYPE= */
92 ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, 89 ret = add_uevent_var(env, "CU_TYPE=%04X", id->cu_type);
93 "CU_TYPE=%04X", id->cu_type);
94 if (ret) 90 if (ret)
95 return ret; 91 return ret;
96 92
97 /* CU_MODEL= */ 93 /* CU_MODEL= */
98 ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, 94 ret = add_uevent_var(env, "CU_MODEL=%02X", id->cu_model);
99 "CU_MODEL=%02X", id->cu_model);
100 if (ret) 95 if (ret)
101 return ret; 96 return ret;
102 97
103 /* The next two can be zero, that's ok for us */ 98 /* The next two can be zero, that's ok for us */
104 /* DEV_TYPE= */ 99 /* DEV_TYPE= */
105 ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, 100 ret = add_uevent_var(env, "DEV_TYPE=%04X", id->dev_type);
106 "DEV_TYPE=%04X", id->dev_type);
107 if (ret) 101 if (ret)
108 return ret; 102 return ret;
109 103
110 /* DEV_MODEL= */ 104 /* DEV_MODEL= */
111 ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, 105 ret = add_uevent_var(env, "DEV_MODEL=%02X", id->dev_model);
112 "DEV_MODEL=%02X", id->dev_model);
113 if (ret) 106 if (ret)
114 return ret; 107 return ret;
115 108
116 /* MODALIAS= */ 109 /* MODALIAS= */
117 snprint_alias(modalias_buf, sizeof(modalias_buf), id, ""); 110 snprint_alias(modalias_buf, sizeof(modalias_buf), id, "");
118 ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, 111 ret = add_uevent_var(env, "MODALIAS=%s", modalias_buf);
119 "MODALIAS=%s", modalias_buf); 112 return ret;
120 if (ret)
121 return ret;
122 envp[i] = NULL;
123 return 0;
124} 113}
125 114
126struct bus_type ccw_bus_type; 115struct bus_type ccw_bus_type;