| .. | .. |
|---|
| 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, |
|---|