hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/s390/appldata/appldata_base.c
....@@ -51,10 +51,9 @@
5151 */
5252 static const char appldata_proc_name[APPLDATA_PROC_NAME_LENGTH] = "appldata";
5353 static int appldata_timer_handler(struct ctl_table *ctl, int write,
54
- void __user *buffer, size_t *lenp, loff_t *ppos);
54
+ void *buffer, size_t *lenp, loff_t *ppos);
5555 static int appldata_interval_handler(struct ctl_table *ctl, int write,
56
- void __user *buffer,
57
- size_t *lenp, loff_t *ppos);
56
+ void *buffer, size_t *lenp, loff_t *ppos);
5857
5958 static struct ctl_table_header *appldata_sysctl_header;
6059 static struct ctl_table appldata_table[] = {
....@@ -137,6 +136,14 @@
137136 mutex_unlock(&appldata_ops_mutex);
138137 }
139138
139
+static struct appldata_product_id appldata_id = {
140
+ .prod_nr = {0xD3, 0xC9, 0xD5, 0xE4,
141
+ 0xE7, 0xD2, 0xD9}, /* "LINUXKR" */
142
+ .prod_fn = 0xD5D3, /* "NL" */
143
+ .version_nr = 0xF2F6, /* "26" */
144
+ .release_nr = 0xF0F1, /* "01" */
145
+};
146
+
140147 /*
141148 * appldata_diag()
142149 *
....@@ -145,17 +152,22 @@
145152 int appldata_diag(char record_nr, u16 function, unsigned long buffer,
146153 u16 length, char *mod_lvl)
147154 {
148
- struct appldata_product_id id = {
149
- .prod_nr = {0xD3, 0xC9, 0xD5, 0xE4,
150
- 0xE7, 0xD2, 0xD9}, /* "LINUXKR" */
151
- .prod_fn = 0xD5D3, /* "NL" */
152
- .version_nr = 0xF2F6, /* "26" */
153
- .release_nr = 0xF0F1, /* "01" */
154
- };
155
+ struct appldata_parameter_list *parm_list;
156
+ struct appldata_product_id *id;
157
+ int rc;
155158
156
- id.record_nr = record_nr;
157
- id.mod_lvl = (mod_lvl[0]) << 8 | mod_lvl[1];
158
- return appldata_asm(&id, function, (void *) buffer, length);
159
+ parm_list = kmalloc(sizeof(*parm_list), GFP_KERNEL);
160
+ id = kmemdup(&appldata_id, sizeof(appldata_id), GFP_KERNEL);
161
+ rc = -ENOMEM;
162
+ if (parm_list && id) {
163
+ id->record_nr = record_nr;
164
+ id->mod_lvl = (mod_lvl[0]) << 8 | mod_lvl[1];
165
+ rc = appldata_asm(parm_list, id, function,
166
+ (void *) buffer, length);
167
+ }
168
+ kfree(id);
169
+ kfree(parm_list);
170
+ return rc;
159171 }
160172 /************************ timer, work, DIAG <END> ****************************/
161173
....@@ -204,18 +216,16 @@
204216 */
205217 static int
206218 appldata_timer_handler(struct ctl_table *ctl, int write,
207
- void __user *buffer, size_t *lenp, loff_t *ppos)
219
+ void *buffer, size_t *lenp, loff_t *ppos)
208220 {
209221 int timer_active = appldata_timer_active;
210
- int zero = 0;
211
- int one = 1;
212222 int rc;
213223 struct ctl_table ctl_entry = {
214224 .procname = ctl->procname,
215225 .data = &timer_active,
216226 .maxlen = sizeof(int),
217
- .extra1 = &zero,
218
- .extra2 = &one,
227
+ .extra1 = SYSCTL_ZERO,
228
+ .extra2 = SYSCTL_ONE,
219229 };
220230
221231 rc = proc_douintvec_minmax(&ctl_entry, write, buffer, lenp, ppos);
....@@ -239,16 +249,15 @@
239249 */
240250 static int
241251 appldata_interval_handler(struct ctl_table *ctl, int write,
242
- void __user *buffer, size_t *lenp, loff_t *ppos)
252
+ void *buffer, size_t *lenp, loff_t *ppos)
243253 {
244254 int interval = appldata_interval;
245
- int one = 1;
246255 int rc;
247256 struct ctl_table ctl_entry = {
248257 .procname = ctl->procname,
249258 .data = &interval,
250259 .maxlen = sizeof(int),
251
- .extra1 = &one,
260
+ .extra1 = SYSCTL_ONE,
252261 };
253262
254263 rc = proc_dointvec_minmax(&ctl_entry, write, buffer, lenp, ppos);
....@@ -270,19 +279,17 @@
270279 */
271280 static int
272281 appldata_generic_handler(struct ctl_table *ctl, int write,
273
- void __user *buffer, size_t *lenp, loff_t *ppos)
282
+ void *buffer, size_t *lenp, loff_t *ppos)
274283 {
275284 struct appldata_ops *ops = NULL, *tmp_ops;
276285 struct list_head *lh;
277286 int rc, found;
278287 int active;
279
- int zero = 0;
280
- int one = 1;
281288 struct ctl_table ctl_entry = {
282289 .data = &active,
283290 .maxlen = sizeof(int),
284
- .extra1 = &zero,
285
- .extra2 = &one,
291
+ .extra1 = SYSCTL_ZERO,
292
+ .extra2 = SYSCTL_ONE,
286293 };
287294
288295 found = 0;