diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2012-06-26 14:10:04 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-22 15:57:54 -0400 |
| commit | 41f9d29f09ca0b22c3631e8a39676e74cda9bcc0 (patch) | |
| tree | 7ab5ed25f14466471fb55536e1cf71c514fb7fe9 /security/keys/keyctl.c | |
| parent | 7266702805f9d824f92ce5c4069eca65d0f21d28 (diff) | |
trimming task_work: kill ->data
get rid of the only user of ->data; this is _not_ the final variant - in the
end we'll have task_work and rcu_head identical and just use cred->rcu,
at which point the separate allocation will be gone completely.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'security/keys/keyctl.c')
| -rw-r--r-- | security/keys/keyctl.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index 0f5b3f027299..26723caaad05 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c | |||
| @@ -1456,7 +1456,8 @@ long keyctl_session_to_parent(void) | |||
| 1456 | { | 1456 | { |
| 1457 | struct task_struct *me, *parent; | 1457 | struct task_struct *me, *parent; |
| 1458 | const struct cred *mycred, *pcred; | 1458 | const struct cred *mycred, *pcred; |
| 1459 | struct task_work *newwork, *oldwork; | 1459 | struct kludge *newwork; |
| 1460 | struct task_work *oldwork; | ||
| 1460 | key_ref_t keyring_r; | 1461 | key_ref_t keyring_r; |
| 1461 | struct cred *cred; | 1462 | struct cred *cred; |
| 1462 | int ret; | 1463 | int ret; |
| @@ -1466,7 +1467,7 @@ long keyctl_session_to_parent(void) | |||
| 1466 | return PTR_ERR(keyring_r); | 1467 | return PTR_ERR(keyring_r); |
| 1467 | 1468 | ||
| 1468 | ret = -ENOMEM; | 1469 | ret = -ENOMEM; |
| 1469 | newwork = kmalloc(sizeof(struct task_work), GFP_KERNEL); | 1470 | newwork = kmalloc(sizeof(struct kludge), GFP_KERNEL); |
| 1470 | if (!newwork) | 1471 | if (!newwork) |
| 1471 | goto error_keyring; | 1472 | goto error_keyring; |
| 1472 | 1473 | ||
| @@ -1478,7 +1479,8 @@ long keyctl_session_to_parent(void) | |||
| 1478 | goto error_newwork; | 1479 | goto error_newwork; |
| 1479 | 1480 | ||
| 1480 | cred->tgcred->session_keyring = key_ref_to_ptr(keyring_r); | 1481 | cred->tgcred->session_keyring = key_ref_to_ptr(keyring_r); |
| 1481 | init_task_work(newwork, key_change_session_keyring, cred); | 1482 | init_task_work(&newwork->twork, key_change_session_keyring); |
| 1483 | newwork->cred = cred; | ||
| 1482 | 1484 | ||
| 1483 | me = current; | 1485 | me = current; |
| 1484 | rcu_read_lock(); | 1486 | rcu_read_lock(); |
| @@ -1527,18 +1529,18 @@ long keyctl_session_to_parent(void) | |||
| 1527 | 1529 | ||
| 1528 | /* the replacement session keyring is applied just prior to userspace | 1530 | /* the replacement session keyring is applied just prior to userspace |
| 1529 | * restarting */ | 1531 | * restarting */ |
| 1530 | ret = task_work_add(parent, newwork, true); | 1532 | ret = task_work_add(parent, &newwork->twork, true); |
| 1531 | if (!ret) | 1533 | if (!ret) |
| 1532 | newwork = NULL; | 1534 | newwork = NULL; |
| 1533 | unlock: | 1535 | unlock: |
| 1534 | write_unlock_irq(&tasklist_lock); | 1536 | write_unlock_irq(&tasklist_lock); |
| 1535 | rcu_read_unlock(); | 1537 | rcu_read_unlock(); |
| 1536 | if (oldwork) { | 1538 | if (oldwork) { |
| 1537 | put_cred(oldwork->data); | 1539 | put_cred(container_of(oldwork, struct kludge, twork)->cred); |
| 1538 | kfree(oldwork); | 1540 | kfree(oldwork); |
| 1539 | } | 1541 | } |
| 1540 | if (newwork) { | 1542 | if (newwork) { |
| 1541 | put_cred(newwork->data); | 1543 | put_cred(newwork->cred); |
| 1542 | kfree(newwork); | 1544 | kfree(newwork); |
| 1543 | } | 1545 | } |
| 1544 | return ret; | 1546 | return ret; |
