diff options
author | Arnd Bergmann <arnd@arndb.de> | 2005-12-05 22:52:23 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-01-08 22:52:48 -0500 |
commit | b41305a39a6966d8e8b1449d6b7c194923bfb451 (patch) | |
tree | e8d3368d06a3b900e16700481183bd92ec9c7d4f | |
parent | d88cfffac0002c56c1a7a813cb885fa6b5fdcd0e (diff) |
[PATCH] spufs: Fix oops when spufs module is not loaded
try_module_get returns true when NULL arguments, so
we first need to check if there is a module loaded before
getting the reference count.
Signed-off-by: Arnd Bergmann <arndb@de.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/platforms/cell/spu_syscalls.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/powerpc/platforms/cell/spu_syscalls.c b/arch/powerpc/platforms/cell/spu_syscalls.c index 43e0b187ffde..91d564df944e 100644 --- a/arch/powerpc/platforms/cell/spu_syscalls.c +++ b/arch/powerpc/platforms/cell/spu_syscalls.c | |||
@@ -37,11 +37,12 @@ asmlinkage long sys_spu_create(const char __user *name, | |||
37 | unsigned int flags, mode_t mode) | 37 | unsigned int flags, mode_t mode) |
38 | { | 38 | { |
39 | long ret; | 39 | long ret; |
40 | struct module *owner = spufs_calls.owner; | ||
40 | 41 | ||
41 | ret = -ENOSYS; | 42 | ret = -ENOSYS; |
42 | if (try_module_get(spufs_calls.owner)) { | 43 | if (owner && try_module_get(spufs_calls.owner)) { |
43 | ret = spufs_calls.create_thread(name, flags, mode); | 44 | ret = spufs_calls.create_thread(name, flags, mode); |
44 | module_put(spufs_calls.owner); | 45 | module_put(owner); |
45 | } | 46 | } |
46 | return ret; | 47 | return ret; |
47 | } | 48 | } |
@@ -51,16 +52,17 @@ asmlinkage long sys_spu_run(int fd, __u32 __user *unpc, __u32 __user *ustatus) | |||
51 | long ret; | 52 | long ret; |
52 | struct file *filp; | 53 | struct file *filp; |
53 | int fput_needed; | 54 | int fput_needed; |
55 | struct module *owner = spufs_calls.owner; | ||
54 | 56 | ||
55 | ret = -ENOSYS; | 57 | ret = -ENOSYS; |
56 | if (try_module_get(spufs_calls.owner)) { | 58 | if (owner && try_module_get(owner)) { |
57 | ret = -EBADF; | 59 | ret = -EBADF; |
58 | filp = fget_light(fd, &fput_needed); | 60 | filp = fget_light(fd, &fput_needed); |
59 | if (filp) { | 61 | if (filp) { |
60 | ret = spufs_calls.spu_run(filp, unpc, ustatus); | 62 | ret = spufs_calls.spu_run(filp, unpc, ustatus); |
61 | fput_light(filp, fput_needed); | 63 | fput_light(filp, fput_needed); |
62 | } | 64 | } |
63 | module_put(spufs_calls.owner); | 65 | module_put(owner); |
64 | } | 66 | } |
65 | return ret; | 67 | return ret; |
66 | } | 68 | } |