.. | .. |
---|
58 | 58 | |
---|
59 | 59 | static int monwrite_diag(struct monwrite_hdr *myhdr, char *buffer, int fcn) |
---|
60 | 60 | { |
---|
61 | | - struct appldata_product_id id; |
---|
| 61 | + struct appldata_parameter_list *parm_list; |
---|
| 62 | + struct appldata_product_id *id; |
---|
62 | 63 | int rc; |
---|
63 | 64 | |
---|
64 | | - memcpy(id.prod_nr, "LNXAPPL", 7); |
---|
65 | | - id.prod_fn = myhdr->applid; |
---|
66 | | - id.record_nr = myhdr->record_num; |
---|
67 | | - id.version_nr = myhdr->version; |
---|
68 | | - id.release_nr = myhdr->release; |
---|
69 | | - id.mod_lvl = myhdr->mod_level; |
---|
70 | | - rc = appldata_asm(&id, fcn, (void *) buffer, myhdr->datalen); |
---|
| 65 | + id = kmalloc(sizeof(*id), GFP_KERNEL); |
---|
| 66 | + parm_list = kmalloc(sizeof(*parm_list), GFP_KERNEL); |
---|
| 67 | + rc = -ENOMEM; |
---|
| 68 | + if (!id || !parm_list) |
---|
| 69 | + goto out; |
---|
| 70 | + memcpy(id->prod_nr, "LNXAPPL", 7); |
---|
| 71 | + id->prod_fn = myhdr->applid; |
---|
| 72 | + id->record_nr = myhdr->record_num; |
---|
| 73 | + id->version_nr = myhdr->version; |
---|
| 74 | + id->release_nr = myhdr->release; |
---|
| 75 | + id->mod_lvl = myhdr->mod_level; |
---|
| 76 | + rc = appldata_asm(parm_list, id, fcn, |
---|
| 77 | + (void *) buffer, myhdr->datalen); |
---|
71 | 78 | if (rc <= 0) |
---|
72 | | - return rc; |
---|
| 79 | + goto out; |
---|
73 | 80 | pr_err("Writing monitor data failed with rc=%i\n", rc); |
---|
74 | | - if (rc == 5) |
---|
75 | | - return -EPERM; |
---|
76 | | - return -EINVAL; |
---|
| 81 | + rc = (rc == 5) ? -EPERM : -EINVAL; |
---|
| 82 | +out: |
---|
| 83 | + kfree(id); |
---|
| 84 | + kfree(parm_list); |
---|
| 85 | + return rc; |
---|
77 | 86 | } |
---|
78 | 87 | |
---|
79 | 88 | static struct mon_buf *monwrite_find_hdr(struct mon_private *monpriv, |
---|