Use one message type for all BDEV request.
There are missing field assignements, and/or messsages being re-used without re-initializations, which allows for fields to be implicitly forwarded. This prevents me from creating per request message types, as I can't spend currently any more time debugging this issue.
This commit is contained in:
@@ -68,8 +68,8 @@ static int bdev_opcl(int req, dev_t dev, int access)
|
||||
do {
|
||||
memset(&m, 0, sizeof(m));
|
||||
m.m_type = req;
|
||||
m.BDEV_MINOR = minor(dev);
|
||||
m.BDEV_ACCESS = access;
|
||||
m.m_lbdev_lblockdriver_msg.minor = minor(dev);
|
||||
m.m_lbdev_lblockdriver_msg.access = access;
|
||||
|
||||
r = bdev_sendrec(dev, &m);
|
||||
} while (bdev_retry(&driver_tries, NULL, &r));
|
||||
@@ -134,11 +134,11 @@ static int bdev_rdwt_setup(int req, dev_t dev, u64_t pos, char *buf,
|
||||
|
||||
memset(m, 0, sizeof(*m));
|
||||
m->m_type = req;
|
||||
m->BDEV_MINOR = minor(dev);
|
||||
m->BDEV_POS = pos;
|
||||
m->BDEV_COUNT = count;
|
||||
m->BDEV_GRANT = grant;
|
||||
m->BDEV_FLAGS = flags;
|
||||
m->m_lbdev_lblockdriver_msg.minor = minor(dev);
|
||||
m->m_lbdev_lblockdriver_msg.pos = pos;
|
||||
m->m_lbdev_lblockdriver_msg.count = count;
|
||||
m->m_lbdev_lblockdriver_msg.grant = grant;
|
||||
m->m_lbdev_lblockdriver_msg.flags = flags;
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -148,7 +148,7 @@ static void bdev_rdwt_cleanup(const message *m)
|
||||
/* Clean up a single-buffer read/write request.
|
||||
*/
|
||||
|
||||
cpf_revoke(m->BDEV_GRANT);
|
||||
cpf_revoke(m->m_lbdev_lblockdriver_msg.grant);
|
||||
}
|
||||
|
||||
static ssize_t bdev_rdwt(int req, dev_t dev, u64_t pos, char *buf,
|
||||
@@ -225,11 +225,11 @@ static int bdev_vrdwt_setup(int req, dev_t dev, u64_t pos, iovec_t *vec,
|
||||
|
||||
memset(m, 0, sizeof(*m));
|
||||
m->m_type = req;
|
||||
m->BDEV_MINOR = minor(dev);
|
||||
m->BDEV_POS = pos;
|
||||
m->BDEV_COUNT = count;
|
||||
m->BDEV_GRANT = grant;
|
||||
m->BDEV_FLAGS = flags;
|
||||
m->m_lbdev_lblockdriver_msg.minor = minor(dev);
|
||||
m->m_lbdev_lblockdriver_msg.pos = pos;
|
||||
m->m_lbdev_lblockdriver_msg.count = count;
|
||||
m->m_lbdev_lblockdriver_msg.grant = grant;
|
||||
m->m_lbdev_lblockdriver_msg.flags = flags;
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -241,11 +241,11 @@ static void bdev_vrdwt_cleanup(const message *m, iovec_s_t *gvec)
|
||||
cp_grant_id_t grant;
|
||||
int i;
|
||||
|
||||
grant = m->BDEV_GRANT;
|
||||
grant = m->m_lbdev_lblockdriver_msg.grant;
|
||||
|
||||
cpf_revoke(grant);
|
||||
|
||||
for (i = m->BDEV_COUNT - 1; i >= 0; i--)
|
||||
for (i = m->m_lbdev_lblockdriver_msg.count - 1; i >= 0; i--)
|
||||
cpf_revoke(gvec[i].iov_grant);
|
||||
}
|
||||
|
||||
@@ -335,10 +335,10 @@ static int bdev_ioctl_setup(dev_t dev, int request, void *buf,
|
||||
|
||||
memset(m, 0, sizeof(*m));
|
||||
m->m_type = BDEV_IOCTL;
|
||||
m->BDEV_MINOR = minor(dev);
|
||||
m->BDEV_REQUEST = request;
|
||||
m->BDEV_GRANT = grant;
|
||||
m->BDEV_USER = user_endpt;
|
||||
m->m_lbdev_lblockdriver_msg.minor = minor(dev);
|
||||
m->m_lbdev_lblockdriver_msg.request = request;
|
||||
m->m_lbdev_lblockdriver_msg.grant = grant;
|
||||
m->m_lbdev_lblockdriver_msg.user = user_endpt;
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -348,7 +348,7 @@ static void bdev_ioctl_cleanup(const message *m)
|
||||
/* Clean up an I/O control request.
|
||||
*/
|
||||
|
||||
cpf_revoke(m->BDEV_GRANT);
|
||||
cpf_revoke(m->m_lbdev_lblockdriver_msg.grant);
|
||||
}
|
||||
|
||||
int bdev_ioctl(dev_t dev, int request, void *buf, endpoint_t user_endpt)
|
||||
@@ -603,9 +603,9 @@ int bdev_restart_asyn(bdev_call_t *call)
|
||||
bdev_rdwt_cleanup(&call->msg);
|
||||
|
||||
r = bdev_rdwt_setup(type, call->dev,
|
||||
call->msg.BDEV_POS,
|
||||
(char *) call->vec[0].iov_addr, call->msg.BDEV_COUNT,
|
||||
call->msg.BDEV_FLAGS, &call->msg);
|
||||
call->msg.m_lbdev_lblockdriver_msg.pos,
|
||||
(char *) call->vec[0].iov_addr, call->msg.m_lbdev_lblockdriver_msg.count,
|
||||
call->msg.m_lbdev_lblockdriver_msg.flags, &call->msg);
|
||||
|
||||
break;
|
||||
|
||||
@@ -614,8 +614,8 @@ int bdev_restart_asyn(bdev_call_t *call)
|
||||
bdev_vrdwt_cleanup(&call->msg, call->gvec);
|
||||
|
||||
r = bdev_vrdwt_setup(type, call->dev,
|
||||
call->msg.BDEV_POS,
|
||||
call->vec, call->msg.BDEV_COUNT, call->msg.BDEV_FLAGS,
|
||||
call->msg.m_lbdev_lblockdriver_msg.pos,
|
||||
call->vec, call->msg.m_lbdev_lblockdriver_msg.count, call->msg.m_lbdev_lblockdriver_msg.flags,
|
||||
&call->msg, call->gvec);
|
||||
|
||||
break;
|
||||
@@ -623,8 +623,8 @@ int bdev_restart_asyn(bdev_call_t *call)
|
||||
case BDEV_IOCTL:
|
||||
bdev_ioctl_cleanup(&call->msg);
|
||||
|
||||
r = bdev_ioctl_setup(call->dev, call->msg.BDEV_REQUEST,
|
||||
(char *) call->vec[0].iov_addr, call->msg.BDEV_USER,
|
||||
r = bdev_ioctl_setup(call->dev, call->msg.m_lbdev_lblockdriver_msg.request,
|
||||
(char *) call->vec[0].iov_addr, call->msg.m_lbdev_lblockdriver_msg.user,
|
||||
&call->msg);
|
||||
|
||||
break;
|
||||
|
||||
@@ -131,7 +131,7 @@ int bdev_senda(dev_t dev, const message *m_orig, bdev_id_t id)
|
||||
return EDEADSRCDST;
|
||||
|
||||
m = *m_orig;
|
||||
m.BDEV_ID = id;
|
||||
m.m_lbdev_lblockdriver_msg.id = id;
|
||||
|
||||
r = asynsend(endpt, &m);
|
||||
|
||||
@@ -156,7 +156,7 @@ int bdev_sendrec(dev_t dev, const message *m_orig)
|
||||
|
||||
/* Send the request and block until we receive a reply. */
|
||||
m = *m_orig;
|
||||
m.BDEV_ID = NO_ID;
|
||||
m.m_lbdev_lblockdriver_msg.id = NO_ID;
|
||||
|
||||
r = ipc_sendrec(endpt, &m);
|
||||
|
||||
|
||||
@@ -42,9 +42,9 @@ int bdev_minor_reopen(dev_t dev)
|
||||
for (j = 0; j < open_dev[i].count; j++) {
|
||||
memset(&m, 0, sizeof(m));
|
||||
m.m_type = BDEV_OPEN;
|
||||
m.BDEV_MINOR = minor(open_dev[i].dev);
|
||||
m.BDEV_ACCESS = open_dev[i].access;
|
||||
m.BDEV_ID = NO_ID;
|
||||
m.m_lbdev_lblockdriver_msg.minor = minor(open_dev[i].dev);
|
||||
m.m_lbdev_lblockdriver_msg.access = open_dev[i].access;
|
||||
m.m_lbdev_lblockdriver_msg.id = NO_ID;
|
||||
|
||||
if ((r = ipc_sendrec(endpt, &m)) != OK) {
|
||||
printf("bdev: IPC to driver (%d) failed (%d)\n",
|
||||
|
||||
@@ -162,7 +162,7 @@ void blockdriver_reply(message *m_ptr, int ipc_status, int reply)
|
||||
|
||||
m_reply.m_type = BDEV_REPLY;
|
||||
m_reply.m_lblockdriver_lbdev_reply.status = reply;
|
||||
m_reply.m_lblockdriver_lbdev_reply.id = m_ptr->BDEV_ID;
|
||||
m_reply.m_lblockdriver_lbdev_reply.id = m_ptr->m_lbdev_lblockdriver_msg.id;
|
||||
|
||||
send_reply(m_ptr->m_source, &m_reply, ipc_status);
|
||||
}
|
||||
@@ -174,7 +174,7 @@ static int do_open(struct blockdriver *bdp, message *mp)
|
||||
{
|
||||
/* Open a minor device. */
|
||||
|
||||
return (*bdp->bdr_open)(mp->BDEV_MINOR, mp->BDEV_ACCESS);
|
||||
return (*bdp->bdr_open)(mp->m_lbdev_lblockdriver_msg.minor, mp->m_lbdev_lblockdriver_msg.access);
|
||||
}
|
||||
|
||||
/*===========================================================================*
|
||||
@@ -184,7 +184,7 @@ static int do_close(struct blockdriver *bdp, message *mp)
|
||||
{
|
||||
/* Close a minor device. */
|
||||
|
||||
return (*bdp->bdr_close)(mp->BDEV_MINOR);
|
||||
return (*bdp->bdr_close)(mp->m_lbdev_lblockdriver_msg.minor);
|
||||
}
|
||||
|
||||
/*===========================================================================*
|
||||
@@ -199,18 +199,18 @@ static int do_rdwt(struct blockdriver *bdp, message *mp)
|
||||
ssize_t r;
|
||||
|
||||
/* Disk address? Address and length of the user buffer? */
|
||||
if (mp->BDEV_COUNT < 0) return EINVAL;
|
||||
if (mp->m_lbdev_lblockdriver_msg.count < 0) return EINVAL;
|
||||
|
||||
/* Create a one element scatter/gather vector for the buffer. */
|
||||
iovec1.iov_addr = mp->BDEV_GRANT;
|
||||
iovec1.iov_size = mp->BDEV_COUNT;
|
||||
iovec1.iov_addr = mp->m_lbdev_lblockdriver_msg.grant;
|
||||
iovec1.iov_size = mp->m_lbdev_lblockdriver_msg.count;
|
||||
|
||||
/* Transfer bytes from/to the device. */
|
||||
do_write = (mp->m_type == BDEV_WRITE);
|
||||
position = mp->BDEV_POS;
|
||||
position = mp->m_lbdev_lblockdriver_msg.pos;
|
||||
|
||||
r = (*bdp->bdr_transfer)(mp->BDEV_MINOR, do_write, position, mp->m_source,
|
||||
&iovec1, 1, mp->BDEV_FLAGS);
|
||||
r = (*bdp->bdr_transfer)(mp->m_lbdev_lblockdriver_msg.minor, do_write, position, mp->m_source,
|
||||
&iovec1, 1, mp->m_lbdev_lblockdriver_msg.flags);
|
||||
|
||||
/* Return the number of bytes transferred or an error code. */
|
||||
return r;
|
||||
@@ -229,10 +229,10 @@ static int do_vrdwt(struct blockdriver *bdp, message *mp, thread_id_t id)
|
||||
ssize_t r, size;
|
||||
|
||||
/* Copy the vector from the caller to kernel space. */
|
||||
nr_req = mp->BDEV_COUNT; /* Length of I/O vector */
|
||||
nr_req = mp->m_lbdev_lblockdriver_msg.count; /* Length of I/O vector */
|
||||
if (nr_req > NR_IOREQS) nr_req = NR_IOREQS;
|
||||
|
||||
if (OK != sys_safecopyfrom(mp->m_source, (vir_bytes) mp->BDEV_GRANT,
|
||||
if (OK != sys_safecopyfrom(mp->m_source, (vir_bytes) mp->m_lbdev_lblockdriver_msg.grant,
|
||||
0, (vir_bytes) iovec, nr_req * sizeof(iovec[0]))) {
|
||||
printf("blockdriver: bad I/O vector by: %d\n", mp->m_source);
|
||||
return EINVAL;
|
||||
@@ -248,10 +248,10 @@ static int do_vrdwt(struct blockdriver *bdp, message *mp, thread_id_t id)
|
||||
|
||||
/* Transfer bytes from/to the device. */
|
||||
do_write = (mp->m_type == BDEV_SCATTER);
|
||||
position = mp->BDEV_POS;
|
||||
position = mp->m_lbdev_lblockdriver_msg.pos;
|
||||
|
||||
r = (*bdp->bdr_transfer)(mp->BDEV_MINOR, do_write, position, mp->m_source,
|
||||
iovec, nr_req, mp->BDEV_FLAGS);
|
||||
r = (*bdp->bdr_transfer)(mp->m_lbdev_lblockdriver_msg.minor, do_write, position, mp->m_source,
|
||||
iovec, nr_req, mp->m_lbdev_lblockdriver_msg.flags);
|
||||
|
||||
/* Return the number of bytes transferred or an error code. */
|
||||
return r;
|
||||
@@ -322,10 +322,10 @@ static int do_ioctl(struct blockdriver *bdp, message *mp)
|
||||
endpoint_t user_endpt;
|
||||
int r;
|
||||
|
||||
minor = mp->BDEV_MINOR;
|
||||
request = mp->BDEV_REQUEST;
|
||||
grant = mp->BDEV_GRANT;
|
||||
user_endpt = mp->BDEV_USER;
|
||||
minor = mp->m_lbdev_lblockdriver_msg.minor;
|
||||
request = mp->m_lbdev_lblockdriver_msg.request;
|
||||
grant = mp->m_lbdev_lblockdriver_msg.grant;
|
||||
user_endpt = mp->m_lbdev_lblockdriver_msg.user;
|
||||
|
||||
switch (request) {
|
||||
case BIOCTRACEBUF:
|
||||
@@ -422,7 +422,7 @@ void blockdriver_process_on_thread(struct blockdriver *bdp, message *m_ptr,
|
||||
* requests on devices that have not previously been opened, signaling the
|
||||
* caller that something went wrong.
|
||||
*/
|
||||
if (IS_BDEV_RQ(m_ptr->m_type) && !is_open_dev(m_ptr->BDEV_MINOR)) {
|
||||
if (IS_BDEV_RQ(m_ptr->m_type) && !is_open_dev(m_ptr->m_lbdev_lblockdriver_msg.minor)) {
|
||||
/* Reply ERESTART to spurious requests for unopened devices. */
|
||||
if (m_ptr->m_type != BDEV_OPEN) {
|
||||
blockdriver_reply(m_ptr, ipc_status, ERESTART);
|
||||
@@ -431,7 +431,7 @@ void blockdriver_process_on_thread(struct blockdriver *bdp, message *m_ptr,
|
||||
}
|
||||
|
||||
/* Mark the device as opened otherwise. */
|
||||
set_open_dev(m_ptr->BDEV_MINOR);
|
||||
set_open_dev(m_ptr->m_lbdev_lblockdriver_msg.minor);
|
||||
}
|
||||
|
||||
trace_start(id, m_ptr);
|
||||
|
||||
@@ -298,7 +298,7 @@ static void master_handle_message(message *m_ptr, int ipc_status)
|
||||
}
|
||||
|
||||
/* Query the device ID. Upon failure, send the error code to the caller. */
|
||||
r = (*bdtab->bdr_device)(m_ptr->BDEV_MINOR, &id);
|
||||
r = (*bdtab->bdr_device)(m_ptr->m_lbdev_lblockdriver_msg.minor, &id);
|
||||
if (r != OK) {
|
||||
blockdriver_reply(m_ptr, ipc_status, r);
|
||||
|
||||
|
||||
@@ -174,7 +174,7 @@ void trace_start(thread_id_t id, message *m_ptr)
|
||||
size_t size;
|
||||
int flags;
|
||||
|
||||
if (!trace_enabled || trace_dev != m_ptr->BDEV_MINOR) return;
|
||||
if (!trace_enabled || trace_dev != m_ptr->m_lbdev_lblockdriver_msg.minor) return;
|
||||
|
||||
assert(id >= 0 && id < MAX_THREADS + 1);
|
||||
|
||||
@@ -196,7 +196,7 @@ void trace_start(thread_id_t id, message *m_ptr)
|
||||
case BDEV_OPEN:
|
||||
case BDEV_CLOSE:
|
||||
pos = 0;
|
||||
size = m_ptr->BDEV_ACCESS;
|
||||
size = m_ptr->m_lbdev_lblockdriver_msg.access;
|
||||
flags = 0;
|
||||
|
||||
break;
|
||||
@@ -205,15 +205,15 @@ void trace_start(thread_id_t id, message *m_ptr)
|
||||
case BDEV_WRITE:
|
||||
case BDEV_GATHER:
|
||||
case BDEV_SCATTER:
|
||||
pos = m_ptr->BDEV_POS;
|
||||
size = m_ptr->BDEV_COUNT;
|
||||
flags = m_ptr->BDEV_FLAGS;
|
||||
pos = m_ptr->m_lbdev_lblockdriver_msg.pos;
|
||||
size = m_ptr->m_lbdev_lblockdriver_msg.count;
|
||||
flags = m_ptr->m_lbdev_lblockdriver_msg.flags;
|
||||
|
||||
break;
|
||||
|
||||
case BDEV_IOCTL:
|
||||
pos = 0;
|
||||
size = m_ptr->BDEV_REQUEST;
|
||||
size = m_ptr->m_lbdev_lblockdriver_msg.request;
|
||||
flags = 0;
|
||||
|
||||
/* Do not log trace control requests. */
|
||||
|
||||
@@ -443,7 +443,7 @@ static void do_block_open(message *m_ptr, int ipc_status)
|
||||
|
||||
m_reply.m_type = BDEV_REPLY;
|
||||
m_reply.m_lblockdriver_lbdev_reply.status = ENXIO;
|
||||
m_reply.m_lblockdriver_lbdev_reply.id = m_ptr->BDEV_ID;
|
||||
m_reply.m_lblockdriver_lbdev_reply.id = m_ptr->m_lbdev_lblockdriver_msg.id;
|
||||
|
||||
send_reply(m_ptr->m_source, &m_reply, ipc_status);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user