Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_physio.c
Show First 20 Lines • Show All 98 Lines • ▼ Show 20 Lines | physio(struct cdev *dev, struct uio *uio, int ioflag) | ||||
if (uio->uio_segflg != UIO_USERSPACE) { | if (uio->uio_segflg != UIO_USERSPACE) { | ||||
pbuf = NULL; | pbuf = NULL; | ||||
pages = NULL; | pages = NULL; | ||||
} else if ((dev->si_flags & SI_UNMAPPED) && unmapped_buf_allowed) { | } else if ((dev->si_flags & SI_UNMAPPED) && unmapped_buf_allowed) { | ||||
pbuf = NULL; | pbuf = NULL; | ||||
maxpages = btoc(MIN(uio->uio_resid, MAXPHYS)) + 1; | maxpages = btoc(MIN(uio->uio_resid, MAXPHYS)) + 1; | ||||
pages = malloc(sizeof(*pages) * maxpages, M_DEVBUF, M_WAITOK); | pages = malloc(sizeof(*pages) * maxpages, M_DEVBUF, M_WAITOK); | ||||
} else { | } else { | ||||
pbuf = getpbuf(NULL); | pbuf = uma_zalloc(pbuf_zone, M_WAITOK); | ||||
sa = pbuf->b_data; | sa = pbuf->b_data; | ||||
maxpages = btoc(MAXPHYS); | maxpages = btoc(MAXPHYS); | ||||
pages = pbuf->b_pages; | pages = pbuf->b_pages; | ||||
} | } | ||||
prot = VM_PROT_READ; | prot = VM_PROT_READ; | ||||
if (uio->uio_rw == UIO_READ) | if (uio->uio_rw == UIO_READ) | ||||
prot |= VM_PROT_WRITE; /* Less backwards than it looks */ | prot |= VM_PROT_WRITE; /* Less backwards than it looks */ | ||||
error = 0; | error = 0; | ||||
▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | while (uio->uio_iov[i].iov_len) { | ||||
if (bp->bio_flags & BIO_ERROR) { | if (bp->bio_flags & BIO_ERROR) { | ||||
error = bp->bio_error; | error = bp->bio_error; | ||||
goto doerror; | goto doerror; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
doerror: | doerror: | ||||
if (pbuf) | if (pbuf) | ||||
relpbuf(pbuf, NULL); | uma_zfree(pbuf_zone, pbuf); | ||||
else if (pages) | else if (pages) | ||||
free(pages, M_DEVBUF); | free(pages, M_DEVBUF); | ||||
g_destroy_bio(bp); | g_destroy_bio(bp); | ||||
PRELE(curproc); | PRELE(curproc); | ||||
return (error); | return (error); | ||||
} | } |