From c5a998d4f45884dc21ec39a756e431ce594c9d32 Mon Sep 17 00:00:00 2001 From: "Alfeiks Kaanoken (madtirra)" Date: Mon, 16 Apr 2012 22:50:34 +0300 Subject: [PATCH] returning value fixed in message read; --- kernel/ipc/ipc_buffer.c | 2 +- kernel/ipc/port_core.c | 35 +++++++++++++++++++---------------- kernel/ipc/toplevel.c | 3 ++- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/kernel/ipc/ipc_buffer.c b/kernel/ipc/ipc_buffer.c index 04d6f75..f44b5b8 100644 --- a/kernel/ipc/ipc_buffer.c +++ b/kernel/ipc/ipc_buffer.c @@ -180,7 +180,7 @@ long ipc_transfer_buffer_data_iov(ipc_buffer_t *bufs, uint32_t numbufs, iovec_t long r, processed, buf_offset = offset; ipc_buffer_t *start_buf = NULL; - processed=0; + processed = 0; for (bufsize = 0, to_copy = 0; to_copy < numbufs; to_copy++) { bufsize += bufs[to_copy].length; if (offset) { diff --git a/kernel/ipc/port_core.c b/kernel/ipc/port_core.c index 5a891d0..c554ee3 100644 --- a/kernel/ipc/port_core.c +++ b/kernel/ipc/port_core.c @@ -416,7 +416,7 @@ static long __transfer_message_data_to_receiver(ipc_port_message_t *msg, long r; size_t recv_len; size_t extra_size = 0; - + *sz = 0; if( iovec ) { @@ -447,7 +447,7 @@ static long __transfer_message_data_to_receiver(ipc_port_message_t *msg, if(msg->extra_data_tail && offset) offset-=extra_size; if( !iovec->iov_len ) { - r=0; + r = 0; goto out; } @@ -455,21 +455,23 @@ static long __transfer_message_data_to_receiver(ipc_port_message_t *msg, if( msg->data_size <= IPC_BUFFERED_PORT_LENGTH ) { /* Short message - copy it from the send buffer. */ - r=copy_to_user((void *)iovec->iov_base,msg->send_buffer+offset,recv_len); + r = copy_to_user((void *)iovec->iov_base, msg->send_buffer + offset, + recv_len); if( r > 0 ) { - r=-EFAULT; + r = -EFAULT; } else *sz += recv_len; } else { /* Long message - process it via IPC buffers. */ - r=ipc_transfer_buffer_data_iov(msg->snd_buf,msg->num_send_bufs, - iovec,numvecs,offset,false); + r = ipc_transfer_buffer_data_iov(msg->snd_buf, msg->num_send_bufs, + iovec, numvecs, offset, false); if( r > 0 ) { - r=0; + *sz += r; + r = 0; } } } else { - r=0; + r = 0; } out: @@ -492,7 +494,7 @@ out: #endif if( copy_to_user(stats,&info,sizeof(info)) ) { - r=-EFAULT; + r = -EFAULT; } } @@ -636,19 +638,19 @@ long ipc_port_msg_read(struct __ipc_gen_port *port,ulong_t msg_id, if( !(port->flags & IPC_PORT_SHUTDOWN) ) { msg=port->msg_ops->lookup_message(port,msg_id); if( msg == __MSG_WAS_DEQUEUED ) { /* Client got lost. */ - r=-ENXIO; + r = -ENXIO; } else if( msg ) { msg->state=MSG_STATE_DATA_UNDER_ACCESS; - r=0; + r = 0; } else { - r=-EINVAL; + r = -EINVAL; } } IPC_UNLOCK_PORT_W(port); if( !r ) { - r=__transfer_message_data_to_receiver(msg,rcv_iov,numvecs,NULL,offset, &sz); - POST_MESSAGE_DATA_ACCESS_STEP(port,msg,r,false); + r = __transfer_message_data_to_receiver(msg,rcv_iov,numvecs,NULL,offset, &sz); + POST_MESSAGE_DATA_ACCESS_STEP(port, msg, r, false); } return sz; @@ -905,6 +907,7 @@ long ipc_port_send_iov(ipc_channel_t *channel, iovec_t snd_kiovecs[], ulong_t sn msg->rcv_knumvecs = rcv_numvecs; ret = ipc_port_send_iov_core(port, msg, channel_in_blocked_mode(channel), rcv_kiovecs, rcv_numvecs, rcv_size); + out: if (port) { ipc_put_port(port); @@ -925,13 +928,13 @@ long ipc_port_send_iov_core(ipc_gen_port_t *port, if( !msg_ops->insert_message || (sync_send && !msg_ops->dequeue_message) ) { - return ERR(-EINVAL); + return ERR(-EINVAL); } event_set_task(&msg->event,sender); IPC_LOCK_PORT_W(port); - r=(port->flags & IPC_BLOCKED_ACCESS) | sync_send; + r = (port->flags & IPC_BLOCKED_ACCESS) | sync_send; if( r ) { /* In case of synchronous message passing both channel and port * must be in synchronous mode. diff --git a/kernel/ipc/toplevel.c b/kernel/ipc/toplevel.c index 0690639..057ad51 100644 --- a/kernel/ipc/toplevel.c +++ b/kernel/ipc/toplevel.c @@ -143,7 +143,7 @@ long sys_create_port( ulong_t flags, ulong_t queue_size ) if( !s_check_system_capability(SYS_CAP_IPC_PORT) ) { return ERR(-EPERM); - } + } /* TODO: [mt] Check if caller can create unblocked ports. */ //flags |= IPC_BLOCKED_ACCESS; @@ -225,6 +225,7 @@ long sys_port_send_iov_v(ulong_t channel, ret = ipc_port_send_iov(c, snd_kiovecs, snd_numvecs, rcv_kiovecs, rcv_numvecs); ipc_put_channel(c); + return ERR(ret); } -- 2.11.4.GIT