prwc
prwc(c);
prwritectl_readin(prwritectl_t *prwc, size_t needed)
if (prwc->prwc_curvalid > needed) {
ASSERT3U(prwc->prwc_buflen, >=, prwc->prwc_curvalid);
ASSERT3U(prwc->prwc_buflen, >=, needed);
if (needed - prwc->prwc_curvalid > prwc->prwc_uiop->uio_resid) {
if (prwc->prwc_locked) {
prunlock(prwc->prwc_pnp);
prwc->prwc_locked = B_FALSE;
if (needed > prwc->prwc_buflen) {
prwc->prwc_buf = kmem_rezalloc(prwc->prwc_buf,
prwc->prwc_buflen, new_len, KM_SLEEP);
if (prwc->prwc_need32) {
prwc->prwc_buf32 = kmem_rezalloc(prwc->prwc_buf32,
prwc->prwc_buflen, new_len, KM_SLEEP);
prwc->prwc_buflen = new_len;
toread = MIN(prwc->prwc_buflen - prwc->prwc_curvalid,
prwc->prwc_uiop->uio_resid);
ASSERT3U(toread, >=, needed - prwc->prwc_curvalid);
start = (void *)((uintptr_t)prwc->prwc_buf + prwc->prwc_curvalid);
if ((ret = uiomove(start, toread, UIO_WRITE, prwc->prwc_uiop)) != 0) {
prwc->prwc_curvalid += toread;
prwritectl_cmd_identify(const prwritectl_t *prwc,
cmd = (long)*(int32_t *)prwc->prwc_buf;
cmd = *(long *)prwc->prwc_buf;
prwritectl_t prwc;
bzero(&prwc, sizeof (prwc));
prwc.prwc_pnp = VTOP(vp);
prwc.prwc_uiop = uiop;
prwc.prwc_need32 = (cmdsize == sizeof (int32_t));
while (uiop->uio_resid > 0 || prwc.prwc_curvalid > 0) {
if ((ret = prwritectl_readin(&prwc, cmdsize)) != 0) {
if ((proc_cmd = prwritectl_cmd_identify(&prwc, proc_info,
if ((ret = prwritectl_readin(&prwc, needed_data)) !=
VERIFY3U(prwc.prwc_curvalid, >, cmdsize);
data = (void *)((uintptr_t)prwc.prwc_buf + cmdsize);
if ((ret = prwritectl_readin(&prwc, needed_data)) != 0) {
prwc.prwc_curvalid > needed_data ||
prwc.prwc_uiop->uio_resid > 0) {
if ((ret = prwritectl_readin(&prwc,
if (!prwc.prwc_locked) {
ret = prlock(prwc.prwc_pnp, ZNO);
prwc.prwc_locked = B_TRUE;
data = (void *)((uintptr_t)prwc.prwc_buf + cmdsize);
if (prwc.prwc_need32 && ((uintptr_t)data % alignof (long)) !=
bcopy(data, prwc.prwc_buf32, needed_data - cmdsize);
data = prwc.prwc_buf32;
ret = pr_controlf(proc_cmd->pcs_cmd, data, prwc.prwc_pnp, cr);
prwc.prwc_locked = B_FALSE;
if (prwc.prwc_buf32 != NULL) {
bzero(prwc.prwc_buf32, needed_data - cmdsize);
if (prwc.prwc_curvalid > needed_data) {
size_t save_size = prwc.prwc_curvalid - needed_data;
void *first_save = (void *)((uintptr_t)prwc.prwc_buf +
memmove(prwc.prwc_buf, first_save, save_size);
void *first_zero = (void *)((uintptr_t)prwc.prwc_buf +
bzero(prwc.prwc_buf, prwc.prwc_curvalid);
prwc.prwc_curvalid -= needed_data;
if (prwc.prwc_locked) {
prunlock(prwc.prwc_pnp);
prwc.prwc_locked = B_FALSE;
if (prwc.prwc_buf != NULL) {
kmem_free(prwc.prwc_buf, prwc.prwc_buflen);
if (prwc.prwc_buf32 != NULL) {
VERIFY(prwc.prwc_need32);
kmem_free(prwc.prwc_buf32, prwc.prwc_buflen);