xio
xio->xio_flags = 0;
xio->xio_offset = (vm_offset_t)kbase & PAGE_MASK;
xio->xio_bytes = 0;
xio->xio_pages = xio->xio_internal_pages;
xio->xio_error = 0;
if ((n = PAGE_SIZE - xio->xio_offset) > kbytes)
xio->xio_pages[i] = m;
xio->xio_bytes += n;
xio->xio_npages = i;
xio_release(xio);
xio->xio_error = EFAULT;
return(xio->xio_error);
xio_init_pages(xio_t xio, struct vm_page **mbase, int npages, int xflags)
xio->xio_flags = xflags;
xio->xio_offset = 0;
xio->xio_bytes = npages * PAGE_SIZE;
xio->xio_pages = xio->xio_internal_pages;
xio->xio_npages = npages;
xio->xio_error = 0;
xio->xio_pages[i] = mbase[i];
xio_release(xio_t xio)
for (i = 0; i < xio->xio_npages; ++i) {
m = xio->xio_pages[i];
if (xio->xio_flags & XIOF_WRITE)
xio->xio_offset = 0;
xio->xio_npages = 0;
xio->xio_bytes = 0;
xio->xio_error = ENOBUFS;
xio_uio_copy(xio_t xio, int uoffset, struct uio *uio, size_t *sizep)
bytes = xio->xio_bytes - uoffset;
error = uiomove_fromphys(xio->xio_pages, xio->xio_offset + uoffset,
xio_copy_xtou(xio_t xio, int uoffset, void *uptr, int bytes)
if (uoffset + bytes > xio->xio_bytes)
offset = (xio->xio_offset + uoffset) & PAGE_MASK;
for (i = (xio->xio_offset + uoffset) >> PAGE_SHIFT;
i < xio->xio_npages;
m = xio->xio_pages[i];
xio_copy_xtok(xio_t xio, int uoffset, void *kptr, int bytes)
if (bytes + uoffset > xio->xio_bytes)
offset = (xio->xio_offset + uoffset) & PAGE_MASK;
for (i = (xio->xio_offset + uoffset) >> PAGE_SHIFT;
i < xio->xio_npages;
m = xio->xio_pages[i];
xio_copy_utox(xio_t xio, int uoffset, const void *uptr, int bytes)
if (uoffset + bytes > xio->xio_bytes)
offset = (xio->xio_offset + uoffset) & PAGE_MASK;
for (i = (xio->xio_offset + uoffset) >> PAGE_SHIFT;
i < xio->xio_npages;
m = xio->xio_pages[i];
xio_copy_ktox(xio_t xio, int uoffset, const void *kptr, int bytes)
if (uoffset + bytes > xio->xio_bytes)
offset = (xio->xio_offset + uoffset) & PAGE_MASK;
for (i = (xio->xio_offset + uoffset) >> PAGE_SHIFT;
i < xio->xio_npages;
m = xio->xio_pages[i];
xio_init(xio_t xio)
xio->xio_flags = 0;
xio->xio_bytes = 0;
xio->xio_error = 0;
xio->xio_offset = 0;
xio->xio_npages = 0;
xio->xio_pages = xio->xio_internal_pages;
xio_init_kbuf(xio_t xio, void *kbase, size_t kbytes)
struct xio xio;
xio_init(&xio);
error = xio_init_pages(&xio, pglist + b, i - b, XIOF_READ);
jrecord_leaf_xio(jrec, rectype, &xio);
xio_release(&xio);
jrecord_leaf_xio(struct jrecord *jrec, int16_t rectype, xio_t xio)
int bytes = xio->xio_npages * PAGE_SIZE;
jrecord_data(jrec, xio, bytes, JDATA_XIO);
struct xio b_xio; /* data buffer page list management */
struct xio;
struct xio;
int16_t rectype, struct xio *xio);
xio_remaining(xio_t xio, int uoffset)
return(xio->xio_bytes - uoffset);
xio_kvaoffset(xio_t xio, int uoffset)
return(xio->xio_offset + uoffset);
typedef struct xio *xio_t;
void xio_init(xio_t xio);
int xio_init_kbuf(xio_t xio, void *kbase, size_t kbytes);
int xio_init_pages(xio_t xio, struct vm_page **mbase, int npages, int xflags);
void xio_release(xio_t xio);
int xio_uio_copy(xio_t xio, int uoffset, struct uio *uio, size_t *sizep);
int xio_copy_xtou(xio_t xio, int uoffset, void *uptr, int bytes);
int xio_copy_xtok(xio_t xio, int uoffset, void *kptr, int bytes);
int xio_copy_utox(xio_t xio, int uoffset, const void *uptr, int bytes);
int xio_copy_ktox(xio_t xio, int uoffset, const void *kptr, int bytes);
hammer2_io_t *xio;
xio = hammer2_io_hash_enter(hmp, dio, &refs);
if (xio == NULL) {
dio = xio;
hammer2_io_t *xio;
for (xiop = &hash->base; (xio = *xiop) != NULL; xiop = &xio->next) {
if (xio->pbase == dio->pbase) {
refs = atomic_fetchadd_64(&xio->refs, 1);
atomic_add_int(&xio->hmp->iofree_count, -1);
return xio;
hammer2_io_t *xio;
xio = hammer2_io_hash_enter(hmp, dio, &refs);
if (xio == NULL) {
dio = xio;
hammer2_io_t *xio;
for (xiop = &hash->base; (xio = *xiop) != NULL; xiop = &xio->next) {
if (xio->pbase == dio->pbase) {
refs = atomic_fetchadd_64(&xio->refs, 1);
atomic_add_int(&xio->hmp->iofree_count, -1);
return xio;