mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Add convenience wrappers for common uio usage
The macOS uio struct is opaque and the API must be used, this makes the smallest changes to the code for all platforms. Reviewed-by: Matt Macy <mmacy@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Jorgen Lundman <lundman@lundman.net> Closes #10412
This commit is contained in:
+6
-8
@@ -1327,7 +1327,7 @@ dmu_read_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size)
|
||||
* NB: we could do this block-at-a-time, but it's nice
|
||||
* to be reading in parallel.
|
||||
*/
|
||||
err = dmu_buf_hold_array_by_dnode(dn, uio->uio_loffset, size,
|
||||
err = dmu_buf_hold_array_by_dnode(dn, uio_offset(uio), size,
|
||||
TRUE, FTAG, &numbufs, &dbp, 0);
|
||||
if (err)
|
||||
return (err);
|
||||
@@ -1339,7 +1339,7 @@ dmu_read_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size)
|
||||
|
||||
ASSERT(size > 0);
|
||||
|
||||
bufoff = uio->uio_loffset - db->db_offset;
|
||||
bufoff = uio_offset(uio) - db->db_offset;
|
||||
tocpy = MIN(db->db_size - bufoff, size);
|
||||
|
||||
#ifdef HAVE_UIO_ZEROCOPY
|
||||
@@ -1348,10 +1348,8 @@ dmu_read_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size)
|
||||
arc_buf_t *dbuf_abuf = dbi->db_buf;
|
||||
arc_buf_t *abuf = dbuf_loan_arcbuf(dbi);
|
||||
err = dmu_xuio_add(xuio, abuf, bufoff, tocpy);
|
||||
if (!err) {
|
||||
uio->uio_resid -= tocpy;
|
||||
uio->uio_loffset += tocpy;
|
||||
}
|
||||
if (!err)
|
||||
uio_advance(uio, tocpy);
|
||||
|
||||
if (abuf == dbuf_abuf)
|
||||
XUIOSTAT_BUMP(xuiostat_rbuf_nocopy);
|
||||
@@ -1436,7 +1434,7 @@ dmu_write_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size, dmu_tx_t *tx)
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
err = dmu_buf_hold_array_by_dnode(dn, uio->uio_loffset, size,
|
||||
err = dmu_buf_hold_array_by_dnode(dn, uio_offset(uio), size,
|
||||
FALSE, FTAG, &numbufs, &dbp, DMU_READ_PREFETCH);
|
||||
if (err)
|
||||
return (err);
|
||||
@@ -1448,7 +1446,7 @@ dmu_write_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size, dmu_tx_t *tx)
|
||||
|
||||
ASSERT(size > 0);
|
||||
|
||||
bufoff = uio->uio_loffset - db->db_offset;
|
||||
bufoff = uio_offset(uio) - db->db_offset;
|
||||
tocpy = MIN(db->db_size - bufoff, size);
|
||||
|
||||
ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
|
||||
|
||||
+1
-1
@@ -1517,7 +1517,7 @@ sa_lookup_uio(sa_handle_t *hdl, sa_attr_type_t attr, uio_t *uio)
|
||||
mutex_enter(&hdl->sa_lock);
|
||||
if ((error = sa_attr_op(hdl, &bulk, 1, SA_LOOKUP, NULL)) == 0) {
|
||||
error = uiomove((void *)bulk.sa_addr, MIN(bulk.sa_size,
|
||||
uio->uio_resid), UIO_READ, uio);
|
||||
uio_resid(uio)), UIO_READ, uio);
|
||||
}
|
||||
mutex_exit(&hdl->sa_lock);
|
||||
return (error);
|
||||
|
||||
+2
-2
@@ -81,13 +81,13 @@ zfs_sa_readlink(znode_t *zp, uio_t *uio)
|
||||
if (bufsz + ZFS_OLD_ZNODE_PHYS_SIZE <= db->db_size) {
|
||||
error = uiomove((caddr_t)db->db_data +
|
||||
ZFS_OLD_ZNODE_PHYS_SIZE,
|
||||
MIN((size_t)bufsz, uio->uio_resid), UIO_READ, uio);
|
||||
MIN((size_t)bufsz, uio_resid(uio)), UIO_READ, uio);
|
||||
} else {
|
||||
dmu_buf_t *dbp;
|
||||
if ((error = dmu_buf_hold(ZTOZSB(zp)->z_os, zp->z_id,
|
||||
0, FTAG, &dbp, DMU_READ_NO_PREFETCH)) == 0) {
|
||||
error = uiomove(dbp->db_data,
|
||||
MIN((size_t)bufsz, uio->uio_resid), UIO_READ, uio);
|
||||
MIN((size_t)bufsz, uio_resid(uio)), UIO_READ, uio);
|
||||
dmu_buf_rele(dbp, FTAG);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user