/*===========================================================================* * blockdriver_reply * *===========================================================================*/ void blockdriver_reply(message *m_ptr, int ipc_status, int reply) { /* Reply to a block request sent to the driver. */ endpoint_t caller_e; long id; int r; if (reply == EDONTREPLY) return; caller_e = m_ptr->m_source; id = m_ptr->BDEV_ID; memset(m_ptr, 0, sizeof(*m_ptr)); m_ptr->m_type = BDEV_REPLY; m_ptr->BDEV_STATUS = reply; m_ptr->BDEV_ID = id; /* If we would block sending the message, send it asynchronously. The NOREPLY * flag is set because the caller may also issue a SENDREC (mixing sync and * async comm), and the asynchronous reply could otherwise end up satisfying * the SENDREC's receive part, after which our next SENDNB call would fail. */ if (IPC_STATUS_CALL(ipc_status) == SENDREC) r = sendnb(caller_e, m_ptr); else r = asynsend3(caller_e, m_ptr, AMF_NOREPLY); if (r != OK) printf("blockdriver_reply: unable to send reply to %d: %d\n", caller_e, r); }
/*===========================================================================* * send_reply * *===========================================================================*/ static void send_reply(endpoint_t endpt, message *m_ptr, int ipc_status) { /* Send a reply message to a request. */ int r; /* If we would block sending the message, send it asynchronously. The NOREPLY * flag is set because the caller may also issue a SENDREC (mixing sync and * async comm), and the asynchronous reply could otherwise end up satisfying * the SENDREC's receive part, after which our next SENDNB call would fail. */ if (IPC_STATUS_CALL(ipc_status) == SENDREC) r = ipc_sendnb(endpt, m_ptr); else r = asynsend3(endpt, m_ptr, AMF_NOREPLY); if (r != OK) printf("blockdriver: unable to send reply to %d: %d\n", endpt, r); }
/*===========================================================================* * sync_reply * *===========================================================================*/ static void sync_reply(message *m_ptr, int ipc_status, int reply) { /* Reply to a message sent to the driver. */ endpoint_t caller_e, user_e; int r; caller_e = m_ptr->m_source; user_e = m_ptr->USER_ENDPT; m_ptr->m_type = TASK_REPLY; m_ptr->REP_ENDPT = user_e; m_ptr->REP_STATUS = reply; /* If we would block sending the message, send it asynchronously. */ if (IPC_STATUS_CALL(ipc_status) == SENDREC) r = sendnb(caller_e, m_ptr); else r = asynsend(caller_e, m_ptr); if (r != OK) printf("driver_reply: unable to send reply to %d: %d\n", caller_e, r); }