diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-03-16 19:28:15 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-03-16 19:28:15 -0700 |
commit | 47455911674d65fba28d43f4135c28ee40c75bac (patch) | |
tree | bb109710af11a8e499e971a230fff7316cc49095 /arch/mips/kernel/kspd.c | |
parent | 5379058b718ac6354ba99cc74d10c28d632dc28a (diff) | |
parent | f510aa3bdb095c5253f6bee9e0f5a3a9ac69ded4 (diff) |
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus:
[MIPS] Kconfig: Move missplaced NR_CPUS default from SMTC to VSMP.
[MIPS] Lockdep: Fix recursion bug.
[MIPS] RTLX: Handle copy_*_user return values.
[MIPS] RTLX: Protect rtlx_{read,write} with mutex.
[MIPS] RTLX: Harden against compiler reordering and optimization.
[MIPS] RTLX: Don't use volatile; it's fragile.
[MIPS] Lasat: Downgrade 64-bit kernel from experimental to broken.
[MIPS] Compat: Fix build if CONFIG_SYSVIPC is disabled.
[CHAR] lcd: Fix two warnings.
[MIPS] FPU ownership management & preemption fixes
[MIPS] Check FCSR for pending interrupts, alternative version
[MIPS] IP27, IP35: Fix warnings.
Diffstat (limited to 'arch/mips/kernel/kspd.c')
-rw-r--r-- | arch/mips/kernel/kspd.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c index 241ee7a2906e..29eadd404fa5 100644 --- a/arch/mips/kernel/kspd.c +++ b/arch/mips/kernel/kspd.c @@ -191,6 +191,8 @@ void sp_work_handle_request(void) struct mtsp_syscall_generic generic; struct mtsp_syscall_ret ret; struct kspd_notifications *n; + unsigned long written; + mm_segment_t old_fs; struct timeval tv; struct timezone tz; int cmd; @@ -201,7 +203,11 @@ void sp_work_handle_request(void) ret.retval = -1; - if (!rtlx_read(RTLX_CHANNEL_SYSIO, &sc, sizeof(struct mtsp_syscall), 0)) { + old_fs = get_fs(); + set_fs(KERNEL_DS); + + if (!rtlx_read(RTLX_CHANNEL_SYSIO, &sc, sizeof(struct mtsp_syscall))) { + set_fs(old_fs); printk(KERN_ERR "Expected request but nothing to read\n"); return; } @@ -209,7 +215,8 @@ void sp_work_handle_request(void) size = sc.size; if (size) { - if (!rtlx_read(RTLX_CHANNEL_SYSIO, &generic, size, 0)) { + if (!rtlx_read(RTLX_CHANNEL_SYSIO, &generic, size)) { + set_fs(old_fs); printk(KERN_ERR "Expected request but nothing to read\n"); return; } @@ -282,8 +289,11 @@ void sp_work_handle_request(void) if (vpe_getuid(SP_VPE)) sp_setfsuidgid( 0, 0); - if ((rtlx_write(RTLX_CHANNEL_SYSIO, &ret, sizeof(struct mtsp_syscall_ret), 0)) - < sizeof(struct mtsp_syscall_ret)) + old_fs = get_fs(); + set_fs(KERNEL_DS); + written = rtlx_write(RTLX_CHANNEL_SYSIO, &ret, sizeof(ret)); + set_fs(old_fs); + if (written < sizeof(ret)) printk("KSPD: sp_work_handle_request failed to send to SP\n"); } |