diff options
author | Max Asbock <masbock@us.ibm.com> | 2005-06-21 20:16:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-21 22:07:35 -0400 |
commit | 8818760512424f60ad9fafb7a087b007a9274eb3 (patch) | |
tree | fb49ce398750f42803d4631a24e4a2ffe35d79d7 /drivers/misc/ibmasm/dot_command.c | |
parent | 278d72ae8803ffcd16070c95fe1d53f4466dc741 (diff) |
[PATCH] ibmasm driver: fix race in command refcount logic
This patch fixes a race in the command reference counting logic by putting
spinlocks around kobject_put() in the command_put function.
- Also added debug messages.
- Changed a memcpy to memcpy_fromio since we are reading from io space.
Signed-off-by: Max Asbock <masbock@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/misc/ibmasm/dot_command.c')
-rw-r--r-- | drivers/misc/ibmasm/dot_command.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/misc/ibmasm/dot_command.c b/drivers/misc/ibmasm/dot_command.c index 478a8d898fc1..13c52f866e2e 100644 --- a/drivers/misc/ibmasm/dot_command.c +++ b/drivers/misc/ibmasm/dot_command.c | |||
@@ -33,7 +33,13 @@ void ibmasm_receive_message(struct service_processor *sp, void *message, int mes | |||
33 | u32 size; | 33 | u32 size; |
34 | struct dot_command_header *header = (struct dot_command_header *)message; | 34 | struct dot_command_header *header = (struct dot_command_header *)message; |
35 | 35 | ||
36 | if (message_size == 0) | ||
37 | return; | ||
38 | |||
36 | size = get_dot_command_size(message); | 39 | size = get_dot_command_size(message); |
40 | if (size == 0) | ||
41 | return; | ||
42 | |||
37 | if (size > message_size) | 43 | if (size > message_size) |
38 | size = message_size; | 44 | size = message_size; |
39 | 45 | ||
@@ -67,7 +73,7 @@ int ibmasm_send_driver_vpd(struct service_processor *sp) | |||
67 | u8 *vpd_data; | 73 | u8 *vpd_data; |
68 | int result = 0; | 74 | int result = 0; |
69 | 75 | ||
70 | command = ibmasm_new_command(INIT_BUFFER_SIZE); | 76 | command = ibmasm_new_command(sp, INIT_BUFFER_SIZE); |
71 | if (command == NULL) | 77 | if (command == NULL) |
72 | return -ENOMEM; | 78 | return -ENOMEM; |
73 | 79 | ||
@@ -121,7 +127,7 @@ int ibmasm_send_os_state(struct service_processor *sp, int os_state) | |||
121 | struct os_state_command *os_state_cmd; | 127 | struct os_state_command *os_state_cmd; |
122 | int result = 0; | 128 | int result = 0; |
123 | 129 | ||
124 | cmd = ibmasm_new_command(sizeof(struct os_state_command)); | 130 | cmd = ibmasm_new_command(sp, sizeof(struct os_state_command)); |
125 | if (cmd == NULL) | 131 | if (cmd == NULL) |
126 | return -ENOMEM; | 132 | return -ENOMEM; |
127 | 133 | ||