/*===========================================================================* * fbd_ioctl * *===========================================================================*/ static int fbd_ioctl(devminor_t UNUSED(minor), unsigned long request, endpoint_t endpt, cp_grant_id_t grant, endpoint_t UNUSED(user_endpt)) { /* Handle an I/O control request. */ cp_grant_id_t gid; message m; int r; /* We only handle the FBD requests, and pass on everything else. */ switch (request) { case FBDCADDRULE: case FBDCDELRULE: case FBDCGETRULE: return rule_ctl(request, endpt, grant); } assert(grant != GRANT_INVALID); gid = cpf_grant_indirect(driver_endpt, endpt, grant); assert(gid != GRANT_INVALID); memset(&m, 0, sizeof(m)); m.m_type = BDEV_IOCTL; m.m_lbdev_lblockdriver_msg.minor = driver_minor; m.m_lbdev_lblockdriver_msg.request = request; m.m_lbdev_lblockdriver_msg.grant = gid; m.m_lbdev_lblockdriver_msg.user = NONE; m.m_lbdev_lblockdriver_msg.id = 0; if ((r = ipc_sendrec(driver_endpt, &m)) != OK) panic("ipc_sendrec to driver failed (%d)\n", r); if (m.m_type != BDEV_REPLY) panic("invalid reply from driver (%d)\n", m.m_type); cpf_revoke(gid); return m.m_lblockdriver_lbdev_reply.status; }
/*===========================================================================* * fbd_ioctl * *===========================================================================*/ static int fbd_ioctl(dev_t UNUSED(minor), unsigned int request, endpoint_t endpt, cp_grant_id_t grant) { /* Handle an I/O control request. */ cp_grant_id_t gid; message m; int r; /* We only handle the FBD requests, and pass on everything else. */ switch (request) { case FBDCADDRULE: case FBDCDELRULE: case FBDCGETRULE: return rule_ctl(request, endpt, grant); } assert(grant != GRANT_INVALID); gid = cpf_grant_indirect(driver_endpt, endpt, grant); assert(gid != GRANT_INVALID); memset(&m, 0, sizeof(m)); m.m_type = BDEV_IOCTL; m.BDEV_MINOR = driver_minor; m.BDEV_REQUEST = request; m.BDEV_GRANT = gid; m.BDEV_ID = 0; if ((r = sendrec(driver_endpt, &m)) != OK) panic("sendrec to driver failed (%d)\n", r); if (m.m_type != BDEV_REPLY) panic("invalid reply from driver (%d)\n", m.m_type); cpf_revoke(gid); return m.BDEV_STATUS; }