mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-23 10:54:35 +03:00
Extending FreeBSD UIO Struct
In FreeBSD the struct uio was just a typedef to uio_t. In order to extend this struct, outside of the definition for the struct uio, the struct uio has been embedded inside of a uio_t struct. Also renamed all the uio_* interfaces to be zfs_uio_* to make it clear this is a ZFS interface. Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Jorgen Lundman <lundman@lundman.net> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Brian Atkinson <batkinson@lanl.gov> Closes #11438
This commit is contained in:
committed by
Tony Hutter
parent
cd4f9572d0
commit
0b1e6fcc3e
@@ -43,31 +43,32 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/zfs_znode.h>
|
||||
|
||||
/*
|
||||
* same as uiomove() but doesn't modify uio structure.
|
||||
* same as zfs_uiomove() but doesn't modify uio structure.
|
||||
* return in cbytes how many bytes were copied.
|
||||
*/
|
||||
int
|
||||
uiocopy(void *p, size_t n, enum uio_rw rw, struct uio *uio, size_t *cbytes)
|
||||
zfs_uiocopy(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio, size_t *cbytes)
|
||||
{
|
||||
struct iovec small_iovec[1];
|
||||
struct uio small_uio_clone;
|
||||
struct uio *uio_clone;
|
||||
int error;
|
||||
|
||||
ASSERT3U(uio->uio_rw, ==, rw);
|
||||
if (uio->uio_iovcnt == 1) {
|
||||
small_uio_clone = *uio;
|
||||
small_iovec[0] = *uio->uio_iov;
|
||||
ASSERT3U(zfs_uio_rw(uio), ==, rw);
|
||||
if (zfs_uio_iovcnt(uio) == 1) {
|
||||
small_uio_clone = *(GET_UIO_STRUCT(uio));
|
||||
small_iovec[0] = *(GET_UIO_STRUCT(uio)->uio_iov);
|
||||
small_uio_clone.uio_iov = small_iovec;
|
||||
uio_clone = &small_uio_clone;
|
||||
} else {
|
||||
uio_clone = cloneuio(uio);
|
||||
uio_clone = cloneuio(GET_UIO_STRUCT(uio));
|
||||
}
|
||||
|
||||
error = vn_io_fault_uiomove(p, n, uio_clone);
|
||||
*cbytes = uio->uio_resid - uio_clone->uio_resid;
|
||||
*cbytes = zfs_uio_resid(uio) - uio_clone->uio_resid;
|
||||
if (uio_clone != &small_uio_clone)
|
||||
free(uio_clone, M_IOV);
|
||||
return (error);
|
||||
@@ -77,16 +78,23 @@ uiocopy(void *p, size_t n, enum uio_rw rw, struct uio *uio, size_t *cbytes)
|
||||
* Drop the next n chars out of *uiop.
|
||||
*/
|
||||
void
|
||||
uioskip(uio_t *uio, size_t n)
|
||||
zfs_uioskip(zfs_uio_t *uio, size_t n)
|
||||
{
|
||||
enum uio_seg segflg;
|
||||
zfs_uio_seg_t segflg;
|
||||
|
||||
/* For the full compatibility with illumos. */
|
||||
if (n > uio->uio_resid)
|
||||
if (n > zfs_uio_resid(uio))
|
||||
return;
|
||||
|
||||
segflg = uio->uio_segflg;
|
||||
uio->uio_segflg = UIO_NOCOPY;
|
||||
uiomove(NULL, n, uio->uio_rw, uio);
|
||||
uio->uio_segflg = segflg;
|
||||
segflg = zfs_uio_segflg(uio);
|
||||
zfs_uio_segflg(uio) = UIO_NOCOPY;
|
||||
zfs_uiomove(NULL, n, zfs_uio_rw(uio), uio);
|
||||
zfs_uio_segflg(uio) = segflg;
|
||||
}
|
||||
|
||||
int
|
||||
zfs_uio_fault_move(void *p, size_t n, zfs_uio_rw_t dir, zfs_uio_t *uio)
|
||||
{
|
||||
ASSERT(zfs_uio_rw(uio) == dir);
|
||||
return (vn_io_fault_uiomove(p, n, GET_UIO_STRUCT(uio)));
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ static void
|
||||
freebsd_crypt_uio_debug_log(boolean_t encrypt,
|
||||
freebsd_crypt_session_t *input_sessionp,
|
||||
struct zio_crypt_info *c_info,
|
||||
uio_t *data_uio,
|
||||
zfs_uio_t *data_uio,
|
||||
crypto_key_t *key,
|
||||
uint8_t *ivbuf,
|
||||
size_t datalen,
|
||||
@@ -224,13 +224,13 @@ freebsd_crypt_uio_debug_log(boolean_t encrypt,
|
||||
printf("%02x ", b[i]);
|
||||
}
|
||||
printf("}\n");
|
||||
for (int i = 0; i < data_uio->uio_iovcnt; i++) {
|
||||
for (int i = 0; i < zfs_uio_iovcnt(data_uio); i++) {
|
||||
printf("\tiovec #%d: <%p, %u>\n", i,
|
||||
data_uio->uio_iov[i].iov_base,
|
||||
(unsigned int)data_uio->uio_iov[i].iov_len);
|
||||
total += data_uio->uio_iov[i].iov_len;
|
||||
zfs_uio_iovbase(data_uio, i),
|
||||
(unsigned int)zfs_uio_iovlen(data_uio, i));
|
||||
total += zfs_uio_iovlen(data_uio, i);
|
||||
}
|
||||
data_uio->uio_resid = total;
|
||||
zfs_uio_resid(data_uio) = total;
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
@@ -323,7 +323,7 @@ int
|
||||
freebsd_crypt_uio(boolean_t encrypt,
|
||||
freebsd_crypt_session_t *input_sessionp,
|
||||
struct zio_crypt_info *c_info,
|
||||
uio_t *data_uio,
|
||||
zfs_uio_t *data_uio,
|
||||
crypto_key_t *key,
|
||||
uint8_t *ivbuf,
|
||||
size_t datalen,
|
||||
@@ -336,9 +336,9 @@ freebsd_crypt_uio(boolean_t encrypt,
|
||||
|
||||
freebsd_crypt_uio_debug_log(encrypt, input_sessionp, c_info, data_uio,
|
||||
key, ivbuf, datalen, auth_len);
|
||||
for (int i = 0; i < data_uio->uio_iovcnt; i++)
|
||||
total += data_uio->uio_iov[i].iov_len;
|
||||
data_uio->uio_resid = total;
|
||||
for (int i = 0; i < zfs_uio_iovcnt(data_uio); i++)
|
||||
total += zfs_uio_iovlen(data_uio, i);
|
||||
zfs_uio_resid(data_uio) = total;
|
||||
if (input_sessionp == NULL) {
|
||||
session = kmem_zalloc(sizeof (*session), KM_SLEEP);
|
||||
error = freebsd_crypt_newsession(session, c_info, key);
|
||||
@@ -356,7 +356,7 @@ freebsd_crypt_uio(boolean_t encrypt,
|
||||
CRYPTO_OP_VERIFY_DIGEST;
|
||||
}
|
||||
crp->crp_flags = CRYPTO_F_CBIFSYNC | CRYPTO_F_IV_SEPARATE;
|
||||
crypto_use_uio(crp, data_uio);
|
||||
crypto_use_uio(crp, GET_UIO_STRUCT(data_uio));
|
||||
|
||||
crp->crp_aad_start = 0;
|
||||
crp->crp_aad_length = auth_len;
|
||||
@@ -493,7 +493,7 @@ int
|
||||
freebsd_crypt_uio(boolean_t encrypt,
|
||||
freebsd_crypt_session_t *input_sessionp,
|
||||
struct zio_crypt_info *c_info,
|
||||
uio_t *data_uio,
|
||||
zfs_uio_t *data_uio,
|
||||
crypto_key_t *key,
|
||||
uint8_t *ivbuf,
|
||||
size_t datalen,
|
||||
@@ -577,7 +577,7 @@ freebsd_crypt_uio(boolean_t encrypt,
|
||||
|
||||
crp->crp_session = session->fs_sid;
|
||||
crp->crp_ilen = auth_len + datalen;
|
||||
crp->crp_buf = (void*)data_uio;
|
||||
crp->crp_buf = (void*)GET_UIO_STRUCT(data_uio);
|
||||
crp->crp_flags = CRYPTO_F_IOV | CRYPTO_F_CBIFSYNC;
|
||||
|
||||
auth_desc->crd_skip = 0;
|
||||
|
||||
@@ -251,7 +251,7 @@ sfs_reclaim_vnode(vnode_t *vp)
|
||||
|
||||
static int
|
||||
sfs_readdir_common(uint64_t parent_id, uint64_t id, struct vop_readdir_args *ap,
|
||||
uio_t *uio, off_t *offp)
|
||||
zfs_uio_t *uio, off_t *offp)
|
||||
{
|
||||
struct dirent entry;
|
||||
int error;
|
||||
@@ -260,26 +260,26 @@ sfs_readdir_common(uint64_t parent_id, uint64_t id, struct vop_readdir_args *ap,
|
||||
if (ap->a_ncookies != NULL)
|
||||
*ap->a_ncookies = 0;
|
||||
|
||||
if (uio->uio_resid < sizeof (entry))
|
||||
if (zfs_uio_resid(uio) < sizeof (entry))
|
||||
return (SET_ERROR(EINVAL));
|
||||
|
||||
if (uio->uio_offset < 0)
|
||||
if (zfs_uio_offset(uio) < 0)
|
||||
return (SET_ERROR(EINVAL));
|
||||
if (uio->uio_offset == 0) {
|
||||
if (zfs_uio_offset(uio) == 0) {
|
||||
entry.d_fileno = id;
|
||||
entry.d_type = DT_DIR;
|
||||
entry.d_name[0] = '.';
|
||||
entry.d_name[1] = '\0';
|
||||
entry.d_namlen = 1;
|
||||
entry.d_reclen = sizeof (entry);
|
||||
error = vfs_read_dirent(ap, &entry, uio->uio_offset);
|
||||
error = vfs_read_dirent(ap, &entry, zfs_uio_offset(uio));
|
||||
if (error != 0)
|
||||
return (SET_ERROR(error));
|
||||
}
|
||||
|
||||
if (uio->uio_offset < sizeof (entry))
|
||||
if (zfs_uio_offset(uio) < sizeof (entry))
|
||||
return (SET_ERROR(EINVAL));
|
||||
if (uio->uio_offset == sizeof (entry)) {
|
||||
if (zfs_uio_offset(uio) == sizeof (entry)) {
|
||||
entry.d_fileno = parent_id;
|
||||
entry.d_type = DT_DIR;
|
||||
entry.d_name[0] = '.';
|
||||
@@ -287,7 +287,7 @@ sfs_readdir_common(uint64_t parent_id, uint64_t id, struct vop_readdir_args *ap,
|
||||
entry.d_name[2] = '\0';
|
||||
entry.d_namlen = 2;
|
||||
entry.d_reclen = sizeof (entry);
|
||||
error = vfs_read_dirent(ap, &entry, uio->uio_offset);
|
||||
error = vfs_read_dirent(ap, &entry, zfs_uio_offset(uio));
|
||||
if (error != 0)
|
||||
return (SET_ERROR(error));
|
||||
}
|
||||
@@ -666,21 +666,23 @@ zfsctl_root_readdir(struct vop_readdir_args *ap)
|
||||
vnode_t *vp = ap->a_vp;
|
||||
zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
|
||||
zfsctl_root_t *node = vp->v_data;
|
||||
uio_t *uio = ap->a_uio;
|
||||
zfs_uio_t uio;
|
||||
int *eofp = ap->a_eofflag;
|
||||
off_t dots_offset;
|
||||
int error;
|
||||
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
|
||||
ASSERT(vp->v_type == VDIR);
|
||||
|
||||
error = sfs_readdir_common(zfsvfs->z_root, ZFSCTL_INO_ROOT, ap, uio,
|
||||
error = sfs_readdir_common(zfsvfs->z_root, ZFSCTL_INO_ROOT, ap, &uio,
|
||||
&dots_offset);
|
||||
if (error != 0) {
|
||||
if (error == ENAMETOOLONG) /* ran out of destination space */
|
||||
error = 0;
|
||||
return (error);
|
||||
}
|
||||
if (uio->uio_offset != dots_offset)
|
||||
if (zfs_uio_offset(&uio) != dots_offset)
|
||||
return (SET_ERROR(EINVAL));
|
||||
|
||||
CTASSERT(sizeof (node->snapdir->sn_name) <= sizeof (entry.d_name));
|
||||
@@ -689,7 +691,7 @@ zfsctl_root_readdir(struct vop_readdir_args *ap)
|
||||
strcpy(entry.d_name, node->snapdir->sn_name);
|
||||
entry.d_namlen = strlen(entry.d_name);
|
||||
entry.d_reclen = sizeof (entry);
|
||||
error = vfs_read_dirent(ap, &entry, uio->uio_offset);
|
||||
error = vfs_read_dirent(ap, &entry, zfs_uio_offset(&uio));
|
||||
if (error != 0) {
|
||||
if (error == ENAMETOOLONG)
|
||||
error = 0;
|
||||
@@ -1030,15 +1032,17 @@ zfsctl_snapdir_readdir(struct vop_readdir_args *ap)
|
||||
struct dirent entry;
|
||||
vnode_t *vp = ap->a_vp;
|
||||
zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
|
||||
uio_t *uio = ap->a_uio;
|
||||
zfs_uio_t uio;
|
||||
int *eofp = ap->a_eofflag;
|
||||
off_t dots_offset;
|
||||
int error;
|
||||
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
|
||||
ASSERT(vp->v_type == VDIR);
|
||||
|
||||
error = sfs_readdir_common(ZFSCTL_INO_ROOT, ZFSCTL_INO_SNAPDIR, ap, uio,
|
||||
&dots_offset);
|
||||
error = sfs_readdir_common(ZFSCTL_INO_ROOT, ZFSCTL_INO_SNAPDIR, ap,
|
||||
&uio, &dots_offset);
|
||||
if (error != 0) {
|
||||
if (error == ENAMETOOLONG) /* ran out of destination space */
|
||||
error = 0;
|
||||
@@ -1050,7 +1054,7 @@ zfsctl_snapdir_readdir(struct vop_readdir_args *ap)
|
||||
uint64_t cookie;
|
||||
uint64_t id;
|
||||
|
||||
cookie = uio->uio_offset - dots_offset;
|
||||
cookie = zfs_uio_offset(&uio) - dots_offset;
|
||||
|
||||
dsl_pool_config_enter(dmu_objset_pool(zfsvfs->z_os), FTAG);
|
||||
error = dmu_snapshot_list_next(zfsvfs->z_os, sizeof (snapname),
|
||||
@@ -1071,14 +1075,14 @@ zfsctl_snapdir_readdir(struct vop_readdir_args *ap)
|
||||
strcpy(entry.d_name, snapname);
|
||||
entry.d_namlen = strlen(entry.d_name);
|
||||
entry.d_reclen = sizeof (entry);
|
||||
error = vfs_read_dirent(ap, &entry, uio->uio_offset);
|
||||
error = vfs_read_dirent(ap, &entry, zfs_uio_offset(&uio));
|
||||
if (error != 0) {
|
||||
if (error == ENAMETOOLONG)
|
||||
error = 0;
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (SET_ERROR(error));
|
||||
}
|
||||
uio->uio_offset = cookie + dots_offset;
|
||||
zfs_uio_setoffset(&uio, cookie + dots_offset);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
@@ -287,7 +287,7 @@ zfs_file_private(zfs_file_t *fp)
|
||||
int
|
||||
zfs_file_unlink(const char *fnamep)
|
||||
{
|
||||
enum uio_seg seg = UIO_SYSSPACE;
|
||||
zfs_uio_seg_t seg = UIO_SYSSPACE;
|
||||
int rc;
|
||||
|
||||
#if __FreeBSD_version >= 1300018
|
||||
|
||||
@@ -518,7 +518,7 @@ update_pages(znode_t *zp, int64_t start, int len, objset_t *os)
|
||||
* in one single dmu_read() call.
|
||||
*/
|
||||
int
|
||||
mappedread_sf(znode_t *zp, int nbytes, uio_t *uio)
|
||||
mappedread_sf(znode_t *zp, int nbytes, zfs_uio_t *uio)
|
||||
{
|
||||
vnode_t *vp = ZTOV(zp);
|
||||
objset_t *os = zp->z_zfsvfs->z_os;
|
||||
@@ -530,14 +530,14 @@ mappedread_sf(znode_t *zp, int nbytes, uio_t *uio)
|
||||
int len = nbytes;
|
||||
int error = 0;
|
||||
|
||||
ASSERT(uio->uio_segflg == UIO_NOCOPY);
|
||||
ASSERT(zfs_uio_segflg(uio) == UIO_NOCOPY);
|
||||
ASSERT(vp->v_mount != NULL);
|
||||
obj = vp->v_object;
|
||||
ASSERT(obj != NULL);
|
||||
ASSERT((uio->uio_loffset & PAGEOFFSET) == 0);
|
||||
ASSERT((zfs_uio_offset(uio) & PAGEOFFSET) == 0);
|
||||
|
||||
zfs_vmobject_wlock_12(obj);
|
||||
for (start = uio->uio_loffset; len > 0; start += PAGESIZE) {
|
||||
for (start = zfs_uio_offset(uio); len > 0; start += PAGESIZE) {
|
||||
int bytes = MIN(PAGESIZE, len);
|
||||
|
||||
pp = vm_page_grab_unlocked(obj, OFF_TO_IDX(start),
|
||||
@@ -584,8 +584,7 @@ mappedread_sf(znode_t *zp, int nbytes, uio_t *uio)
|
||||
}
|
||||
if (error)
|
||||
break;
|
||||
uio->uio_resid -= bytes;
|
||||
uio->uio_offset += bytes;
|
||||
zfs_uio_advance(uio, bytes);
|
||||
len -= bytes;
|
||||
}
|
||||
zfs_vmobject_wunlock_12(obj);
|
||||
@@ -603,7 +602,7 @@ mappedread_sf(znode_t *zp, int nbytes, uio_t *uio)
|
||||
* the file is memory mapped.
|
||||
*/
|
||||
int
|
||||
mappedread(znode_t *zp, int nbytes, uio_t *uio)
|
||||
mappedread(znode_t *zp, int nbytes, zfs_uio_t *uio)
|
||||
{
|
||||
vnode_t *vp = ZTOV(zp);
|
||||
vm_object_t obj;
|
||||
@@ -616,7 +615,7 @@ mappedread(znode_t *zp, int nbytes, uio_t *uio)
|
||||
obj = vp->v_object;
|
||||
ASSERT(obj != NULL);
|
||||
|
||||
start = uio->uio_loffset;
|
||||
start = zfs_uio_offset(uio);
|
||||
off = start & PAGEOFFSET;
|
||||
zfs_vmobject_wlock_12(obj);
|
||||
for (start &= PAGEMASK; len > 0; start += PAGESIZE) {
|
||||
@@ -629,7 +628,8 @@ mappedread(znode_t *zp, int nbytes, uio_t *uio)
|
||||
|
||||
zfs_vmobject_wunlock_12(obj);
|
||||
va = zfs_map_page(pp, &sf);
|
||||
error = vn_io_fault_uiomove(va + off, bytes, uio);
|
||||
error = vn_io_fault_uiomove(va + off, bytes,
|
||||
GET_UIO_STRUCT(uio));
|
||||
zfs_unmap_page(sf);
|
||||
zfs_vmobject_wlock_12(obj);
|
||||
page_unhold(pp);
|
||||
@@ -1678,7 +1678,7 @@ zfs_rmdir(znode_t *dzp, const char *name, znode_t *cwd, cred_t *cr, int flags)
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp,
|
||||
zfs_readdir(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, int *eofp,
|
||||
int *ncookies, ulong_t **cookies)
|
||||
{
|
||||
znode_t *zp = VTOZ(vp);
|
||||
@@ -1723,7 +1723,7 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp,
|
||||
/*
|
||||
* Check for valid iov_len.
|
||||
*/
|
||||
if (uio->uio_iov->iov_len <= 0) {
|
||||
if (GET_UIO_STRUCT(uio)->uio_iov->iov_len <= 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (SET_ERROR(EINVAL));
|
||||
}
|
||||
@@ -1738,7 +1738,7 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp,
|
||||
|
||||
error = 0;
|
||||
os = zfsvfs->z_os;
|
||||
offset = uio->uio_loffset;
|
||||
offset = zfs_uio_offset(uio);
|
||||
prefetch = zp->z_zn_prefetch;
|
||||
|
||||
/*
|
||||
@@ -1759,9 +1759,9 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp,
|
||||
/*
|
||||
* Get space to change directory entries into fs independent format.
|
||||
*/
|
||||
iovp = uio->uio_iov;
|
||||
iovp = GET_UIO_STRUCT(uio)->uio_iov;
|
||||
bytes_wanted = iovp->iov_len;
|
||||
if (uio->uio_segflg != UIO_SYSSPACE || uio->uio_iovcnt != 1) {
|
||||
if (zfs_uio_segflg(uio) != UIO_SYSSPACE || zfs_uio_iovcnt(uio) != 1) {
|
||||
bufsize = bytes_wanted;
|
||||
outbuf = kmem_alloc(bufsize, KM_SLEEP);
|
||||
odp = (struct dirent64 *)outbuf;
|
||||
@@ -1776,7 +1776,7 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp,
|
||||
/*
|
||||
* Minimum entry size is dirent size and 1 byte for a file name.
|
||||
*/
|
||||
ncooks = uio->uio_resid / (sizeof (struct dirent) -
|
||||
ncooks = zfs_uio_resid(uio) / (sizeof (struct dirent) -
|
||||
sizeof (((struct dirent *)NULL)->d_name) + 1);
|
||||
cooks = malloc(ncooks * sizeof (ulong_t), M_TEMP, M_WAITOK);
|
||||
*cookies = cooks;
|
||||
@@ -1956,20 +1956,21 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp,
|
||||
if (ncookies != NULL)
|
||||
*ncookies -= ncooks;
|
||||
|
||||
if (uio->uio_segflg == UIO_SYSSPACE && uio->uio_iovcnt == 1) {
|
||||
if (zfs_uio_segflg(uio) == UIO_SYSSPACE && zfs_uio_iovcnt(uio) == 1) {
|
||||
iovp->iov_base += outcount;
|
||||
iovp->iov_len -= outcount;
|
||||
uio->uio_resid -= outcount;
|
||||
} else if ((error = uiomove(outbuf, (long)outcount, UIO_READ, uio))) {
|
||||
zfs_uio_resid(uio) -= outcount;
|
||||
} else if ((error =
|
||||
zfs_uiomove(outbuf, (long)outcount, UIO_READ, uio))) {
|
||||
/*
|
||||
* Reset the pointer.
|
||||
*/
|
||||
offset = uio->uio_loffset;
|
||||
offset = zfs_uio_offset(uio);
|
||||
}
|
||||
|
||||
update:
|
||||
zap_cursor_fini(&zc);
|
||||
if (uio->uio_segflg != UIO_SYSSPACE || uio->uio_iovcnt != 1)
|
||||
if (zfs_uio_segflg(uio) != UIO_SYSSPACE || zfs_uio_iovcnt(uio) != 1)
|
||||
kmem_free(outbuf, bufsize);
|
||||
|
||||
if (error == ENOENT)
|
||||
@@ -1977,7 +1978,7 @@ update:
|
||||
|
||||
ZFS_ACCESSTIME_STAMP(zfsvfs, zp);
|
||||
|
||||
uio->uio_loffset = offset;
|
||||
zfs_uio_setoffset(uio, offset);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
if (error != 0 && cookies != NULL) {
|
||||
free(*cookies, M_TEMP);
|
||||
@@ -3660,7 +3661,7 @@ zfs_symlink(znode_t *dzp, const char *name, vattr_t *vap,
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_readlink(vnode_t *vp, uio_t *uio, cred_t *cr, caller_context_t *ct)
|
||||
zfs_readlink(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, caller_context_t *ct)
|
||||
{
|
||||
znode_t *zp = VTOZ(vp);
|
||||
zfsvfs_t *zfsvfs = zp->z_zfsvfs;
|
||||
@@ -4443,8 +4444,9 @@ struct vop_read_args {
|
||||
static int
|
||||
zfs_freebsd_read(struct vop_read_args *ap)
|
||||
{
|
||||
|
||||
return (zfs_read(VTOZ(ap->a_vp), ap->a_uio, ioflags(ap->a_ioflag),
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
return (zfs_read(VTOZ(ap->a_vp), &uio, ioflags(ap->a_ioflag),
|
||||
ap->a_cred));
|
||||
}
|
||||
|
||||
@@ -4460,8 +4462,9 @@ struct vop_write_args {
|
||||
static int
|
||||
zfs_freebsd_write(struct vop_write_args *ap)
|
||||
{
|
||||
|
||||
return (zfs_write(VTOZ(ap->a_vp), ap->a_uio, ioflags(ap->a_ioflag),
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
return (zfs_write(VTOZ(ap->a_vp), &uio, ioflags(ap->a_ioflag),
|
||||
ap->a_cred));
|
||||
}
|
||||
|
||||
@@ -4713,8 +4716,9 @@ struct vop_readdir_args {
|
||||
static int
|
||||
zfs_freebsd_readdir(struct vop_readdir_args *ap)
|
||||
{
|
||||
|
||||
return (zfs_readdir(ap->a_vp, ap->a_uio, ap->a_cred, ap->a_eofflag,
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
return (zfs_readdir(ap->a_vp, &uio, ap->a_cred, ap->a_eofflag,
|
||||
ap->a_ncookies, ap->a_cookies));
|
||||
}
|
||||
|
||||
@@ -5004,8 +5008,9 @@ struct vop_readlink_args {
|
||||
static int
|
||||
zfs_freebsd_readlink(struct vop_readlink_args *ap)
|
||||
{
|
||||
|
||||
return (zfs_readlink(ap->a_vp, ap->a_uio, ap->a_cred, NULL));
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
return (zfs_readlink(ap->a_vp, &uio, ap->a_cred, NULL));
|
||||
}
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
@@ -5473,11 +5478,14 @@ zfs_listextattr(struct vop_listextattr_args *ap)
|
||||
uint8_t dirbuf[sizeof (struct dirent)];
|
||||
struct dirent *dp;
|
||||
struct iovec aiov;
|
||||
struct uio auio, *uio = ap->a_uio;
|
||||
struct uio auio;
|
||||
size_t *sizep = ap->a_size;
|
||||
size_t plen;
|
||||
vnode_t *xvp = NULL, *vp;
|
||||
int done, error, eof, pos;
|
||||
zfs_uio_t uio;
|
||||
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
|
||||
/*
|
||||
* If the xattr property is off, refuse the request.
|
||||
@@ -5559,15 +5567,16 @@ zfs_listextattr(struct vop_listextattr_args *ap)
|
||||
nlen = dp->d_namlen - plen;
|
||||
if (sizep != NULL)
|
||||
*sizep += 1 + nlen;
|
||||
else if (uio != NULL) {
|
||||
else if (GET_UIO_STRUCT(&uio) != NULL) {
|
||||
/*
|
||||
* Format of extattr name entry is one byte for
|
||||
* length and the rest for name.
|
||||
*/
|
||||
error = uiomove(&nlen, 1, uio->uio_rw, uio);
|
||||
error = zfs_uiomove(&nlen, 1, zfs_uio_rw(&uio),
|
||||
&uio);
|
||||
if (error == 0) {
|
||||
error = uiomove(dp->d_name + plen, nlen,
|
||||
uio->uio_rw, uio);
|
||||
error = zfs_uiomove(dp->d_name + plen,
|
||||
nlen, zfs_uio_rw(&uio), &uio);
|
||||
}
|
||||
if (error != 0)
|
||||
break;
|
||||
|
||||
@@ -404,7 +404,7 @@ int failed_decrypt_size;
|
||||
static int
|
||||
zio_do_crypt_uio_opencrypto(boolean_t encrypt, freebsd_crypt_session_t *sess,
|
||||
uint64_t crypt, crypto_key_t *key, uint8_t *ivbuf, uint_t datalen,
|
||||
uio_t *uio, uint_t auth_len)
|
||||
zfs_uio_t *uio, uint_t auth_len)
|
||||
{
|
||||
zio_crypt_info_t *ci;
|
||||
int ret;
|
||||
@@ -439,7 +439,8 @@ zio_crypt_key_wrap(crypto_key_t *cwkey, zio_crypt_key_t *key, uint8_t *iv,
|
||||
* input and output. Also, the AAD (for AES-GMC at least)
|
||||
* needs to logically go in front.
|
||||
*/
|
||||
uio_t cuio;
|
||||
zfs_uio_t cuio;
|
||||
struct uio cuio_s;
|
||||
iovec_t iovecs[4];
|
||||
uint64_t crypt = key->zk_crypt;
|
||||
uint_t enc_len, keydata_len, aad_len;
|
||||
@@ -447,6 +448,8 @@ zio_crypt_key_wrap(crypto_key_t *cwkey, zio_crypt_key_t *key, uint8_t *iv,
|
||||
ASSERT3U(crypt, <, ZIO_CRYPT_FUNCTIONS);
|
||||
ASSERT3U(cwkey->ck_format, ==, CRYPTO_KEY_RAW);
|
||||
|
||||
zfs_uio_init(&cuio, &cuio_s);
|
||||
|
||||
keydata_len = zio_crypt_table[crypt].ci_keylen;
|
||||
|
||||
/* generate iv for wrapping the master and hmac key */
|
||||
@@ -489,9 +492,9 @@ zio_crypt_key_wrap(crypto_key_t *cwkey, zio_crypt_key_t *key, uint8_t *iv,
|
||||
iovecs[0].iov_len = aad_len;
|
||||
enc_len = zio_crypt_table[crypt].ci_keylen + SHA512_HMAC_KEYLEN;
|
||||
|
||||
cuio.uio_iov = iovecs;
|
||||
cuio.uio_iovcnt = 4;
|
||||
cuio.uio_segflg = UIO_SYSSPACE;
|
||||
GET_UIO_STRUCT(&cuio)->uio_iov = iovecs;
|
||||
zfs_uio_iovcnt(&cuio) = 4;
|
||||
zfs_uio_segflg(&cuio) = UIO_SYSSPACE;
|
||||
|
||||
/* encrypt the keys and store the resulting ciphertext and mac */
|
||||
ret = zio_do_crypt_uio_opencrypto(B_TRUE, NULL, crypt, cwkey,
|
||||
@@ -517,7 +520,8 @@ zio_crypt_key_unwrap(crypto_key_t *cwkey, uint64_t crypt, uint64_t version,
|
||||
* input and output. Also, the AAD (for AES-GMC at least)
|
||||
* needs to logically go in front.
|
||||
*/
|
||||
uio_t cuio;
|
||||
zfs_uio_t cuio;
|
||||
struct uio cuio_s;
|
||||
iovec_t iovecs[4];
|
||||
void *src, *dst;
|
||||
uint_t enc_len, keydata_len, aad_len;
|
||||
@@ -528,6 +532,8 @@ zio_crypt_key_unwrap(crypto_key_t *cwkey, uint64_t crypt, uint64_t version,
|
||||
keydata_len = zio_crypt_table[crypt].ci_keylen;
|
||||
rw_init(&key->zk_salt_lock, NULL, RW_DEFAULT, NULL);
|
||||
|
||||
zfs_uio_init(&cuio, &cuio_s);
|
||||
|
||||
/*
|
||||
* Since we only support one buffer, we need to copy
|
||||
* the encrypted buffer (source) to the plain buffer
|
||||
@@ -565,9 +571,9 @@ zio_crypt_key_unwrap(crypto_key_t *cwkey, uint64_t crypt, uint64_t version,
|
||||
iovecs[0].iov_base = aad;
|
||||
iovecs[0].iov_len = aad_len;
|
||||
|
||||
cuio.uio_iov = iovecs;
|
||||
cuio.uio_iovcnt = 4;
|
||||
cuio.uio_segflg = UIO_SYSSPACE;
|
||||
GET_UIO_STRUCT(&cuio)->uio_iov = iovecs;
|
||||
zfs_uio_iovcnt(&cuio) = 4;
|
||||
zfs_uio_segflg(&cuio) = UIO_SYSSPACE;
|
||||
|
||||
/* decrypt the keys and store the result in the output buffers */
|
||||
ret = zio_do_crypt_uio_opencrypto(B_FALSE, NULL, crypt, cwkey,
|
||||
@@ -1137,10 +1143,11 @@ error:
|
||||
}
|
||||
|
||||
static void
|
||||
zio_crypt_destroy_uio(uio_t *uio)
|
||||
zio_crypt_destroy_uio(zfs_uio_t *uio)
|
||||
{
|
||||
if (uio->uio_iov)
|
||||
kmem_free(uio->uio_iov, uio->uio_iovcnt * sizeof (iovec_t));
|
||||
if (GET_UIO_STRUCT(uio)->uio_iov)
|
||||
kmem_free(GET_UIO_STRUCT(uio)->uio_iov,
|
||||
zfs_uio_iovcnt(uio) * sizeof (iovec_t));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1234,14 +1241,14 @@ zio_crypt_do_indirect_mac_checksum_abd(boolean_t generate, abd_t *abd,
|
||||
* accommodate some of the drivers, the authbuf needs to be logically before
|
||||
* the data. This means that we need to copy the source to the destination,
|
||||
* and set up an extra iovec_t at the beginning to handle the authbuf.
|
||||
* It also means we'll only return one uio_t.
|
||||
* It also means we'll only return one zfs_uio_t.
|
||||
*/
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zio_crypt_init_uios_zil(boolean_t encrypt, uint8_t *plainbuf,
|
||||
uint8_t *cipherbuf, uint_t datalen, boolean_t byteswap, uio_t *puio,
|
||||
uio_t *out_uio, uint_t *enc_len, uint8_t **authbuf, uint_t *auth_len,
|
||||
uint8_t *cipherbuf, uint_t datalen, boolean_t byteswap, zfs_uio_t *puio,
|
||||
zfs_uio_t *out_uio, uint_t *enc_len, uint8_t **authbuf, uint_t *auth_len,
|
||||
boolean_t *no_crypt)
|
||||
{
|
||||
uint8_t *aadbuf = zio_buf_alloc(datalen);
|
||||
@@ -1385,8 +1392,8 @@ zio_crypt_init_uios_zil(boolean_t encrypt, uint8_t *plainbuf,
|
||||
*enc_len = total_len;
|
||||
*authbuf = aadbuf;
|
||||
*auth_len = aad_len;
|
||||
out_uio->uio_iov = dst_iovecs;
|
||||
out_uio->uio_iovcnt = nr_iovecs;
|
||||
GET_UIO_STRUCT(out_uio)->uio_iov = dst_iovecs;
|
||||
zfs_uio_iovcnt(out_uio) = nr_iovecs;
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -1397,7 +1404,7 @@ zio_crypt_init_uios_zil(boolean_t encrypt, uint8_t *plainbuf,
|
||||
static int
|
||||
zio_crypt_init_uios_dnode(boolean_t encrypt, uint64_t version,
|
||||
uint8_t *plainbuf, uint8_t *cipherbuf, uint_t datalen, boolean_t byteswap,
|
||||
uio_t *puio, uio_t *out_uio, uint_t *enc_len, uint8_t **authbuf,
|
||||
zfs_uio_t *puio, zfs_uio_t *out_uio, uint_t *enc_len, uint8_t **authbuf,
|
||||
uint_t *auth_len, boolean_t *no_crypt)
|
||||
{
|
||||
uint8_t *aadbuf = zio_buf_alloc(datalen);
|
||||
@@ -1534,8 +1541,8 @@ zio_crypt_init_uios_dnode(boolean_t encrypt, uint64_t version,
|
||||
*enc_len = total_len;
|
||||
*authbuf = aadbuf;
|
||||
*auth_len = aad_len;
|
||||
out_uio->uio_iov = dst_iovecs;
|
||||
out_uio->uio_iovcnt = nr_iovecs;
|
||||
GET_UIO_STRUCT(out_uio)->uio_iov = dst_iovecs;
|
||||
zfs_uio_iovcnt(out_uio) = nr_iovecs;
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -1543,7 +1550,7 @@ zio_crypt_init_uios_dnode(boolean_t encrypt, uint64_t version,
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zio_crypt_init_uios_normal(boolean_t encrypt, uint8_t *plainbuf,
|
||||
uint8_t *cipherbuf, uint_t datalen, uio_t *puio, uio_t *out_uio,
|
||||
uint8_t *cipherbuf, uint_t datalen, zfs_uio_t *puio, zfs_uio_t *out_uio,
|
||||
uint_t *enc_len)
|
||||
{
|
||||
int ret;
|
||||
@@ -1571,8 +1578,8 @@ zio_crypt_init_uios_normal(boolean_t encrypt, uint8_t *plainbuf,
|
||||
cipher_iovecs[0].iov_len = datalen;
|
||||
|
||||
*enc_len = datalen;
|
||||
out_uio->uio_iov = cipher_iovecs;
|
||||
out_uio->uio_iovcnt = nr_cipher;
|
||||
GET_UIO_STRUCT(out_uio)->uio_iov = cipher_iovecs;
|
||||
zfs_uio_iovcnt(out_uio) = nr_cipher;
|
||||
|
||||
return (0);
|
||||
|
||||
@@ -1583,8 +1590,8 @@ error:
|
||||
kmem_free(cipher_iovecs, nr_cipher * sizeof (iovec_t));
|
||||
|
||||
*enc_len = 0;
|
||||
out_uio->uio_iov = NULL;
|
||||
out_uio->uio_iovcnt = 0;
|
||||
GET_UIO_STRUCT(out_uio)->uio_iov = NULL;
|
||||
zfs_uio_iovcnt(out_uio) = 0;
|
||||
|
||||
return (ret);
|
||||
}
|
||||
@@ -1600,8 +1607,8 @@ error:
|
||||
static int
|
||||
zio_crypt_init_uios(boolean_t encrypt, uint64_t version, dmu_object_type_t ot,
|
||||
uint8_t *plainbuf, uint8_t *cipherbuf, uint_t datalen, boolean_t byteswap,
|
||||
uint8_t *mac, uio_t *puio, uio_t *cuio, uint_t *enc_len, uint8_t **authbuf,
|
||||
uint_t *auth_len, boolean_t *no_crypt)
|
||||
uint8_t *mac, zfs_uio_t *puio, zfs_uio_t *cuio, uint_t *enc_len,
|
||||
uint8_t **authbuf, uint_t *auth_len, boolean_t *no_crypt)
|
||||
{
|
||||
int ret;
|
||||
iovec_t *mac_iov;
|
||||
@@ -1633,9 +1640,11 @@ zio_crypt_init_uios(boolean_t encrypt, uint64_t version, dmu_object_type_t ot,
|
||||
goto error;
|
||||
|
||||
/* populate the uios */
|
||||
cuio->uio_segflg = UIO_SYSSPACE;
|
||||
zfs_uio_segflg(cuio) = UIO_SYSSPACE;
|
||||
|
||||
mac_iov = ((iovec_t *)&cuio->uio_iov[cuio->uio_iovcnt - 1]);
|
||||
mac_iov =
|
||||
((iovec_t *)&(GET_UIO_STRUCT(cuio)->
|
||||
uio_iov[zfs_uio_iovcnt(cuio) - 1]));
|
||||
mac_iov->iov_base = (void *)mac;
|
||||
mac_iov->iov_len = ZIO_DATA_MAC_LEN;
|
||||
|
||||
@@ -1662,14 +1671,18 @@ zio_do_crypt_data(boolean_t encrypt, zio_crypt_key_t *key,
|
||||
uint64_t crypt = key->zk_crypt;
|
||||
uint_t keydata_len = zio_crypt_table[crypt].ci_keylen;
|
||||
uint_t enc_len, auth_len;
|
||||
uio_t puio, cuio;
|
||||
zfs_uio_t puio, cuio;
|
||||
struct uio puio_s, cuio_s;
|
||||
uint8_t enc_keydata[MASTER_KEY_MAX_LEN];
|
||||
crypto_key_t tmp_ckey, *ckey = NULL;
|
||||
freebsd_crypt_session_t *tmpl = NULL;
|
||||
uint8_t *authbuf = NULL;
|
||||
|
||||
bzero(&puio, sizeof (uio_t));
|
||||
bzero(&cuio, sizeof (uio_t));
|
||||
|
||||
zfs_uio_init(&puio, &puio_s);
|
||||
zfs_uio_init(&cuio, &cuio_s);
|
||||
bzero(GET_UIO_STRUCT(&puio), sizeof (struct uio));
|
||||
bzero(GET_UIO_STRUCT(&cuio), sizeof (struct uio));
|
||||
|
||||
#ifdef FCRYPTO_DEBUG
|
||||
printf("%s(%s, %p, %p, %d, %p, %p, %u, %s, %p, %p, %p)\n",
|
||||
|
||||
@@ -746,12 +746,15 @@ out:
|
||||
*/
|
||||
|
||||
static int
|
||||
zvol_cdev_read(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
zvol_cdev_read(struct cdev *dev, struct uio *uio_s, int ioflag)
|
||||
{
|
||||
zvol_state_t *zv;
|
||||
uint64_t volsize;
|
||||
zfs_locked_range_t *lr;
|
||||
int error = 0;
|
||||
zfs_uio_t uio;
|
||||
|
||||
zfs_uio_init(&uio, uio_s);
|
||||
|
||||
zv = dev->si_drv2;
|
||||
|
||||
@@ -760,20 +763,20 @@ zvol_cdev_read(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
* uio_loffset == volsize isn't an error as
|
||||
* its required for EOF processing.
|
||||
*/
|
||||
if (uio->uio_resid > 0 &&
|
||||
(uio->uio_loffset < 0 || uio->uio_loffset > volsize))
|
||||
if (zfs_uio_resid(&uio) > 0 &&
|
||||
(zfs_uio_offset(&uio) < 0 || zfs_uio_offset(&uio) > volsize))
|
||||
return (SET_ERROR(EIO));
|
||||
|
||||
lr = zfs_rangelock_enter(&zv->zv_rangelock, uio->uio_loffset,
|
||||
uio->uio_resid, RL_READER);
|
||||
while (uio->uio_resid > 0 && uio->uio_loffset < volsize) {
|
||||
uint64_t bytes = MIN(uio->uio_resid, DMU_MAX_ACCESS >> 1);
|
||||
lr = zfs_rangelock_enter(&zv->zv_rangelock, zfs_uio_offset(&uio),
|
||||
zfs_uio_resid(&uio), RL_READER);
|
||||
while (zfs_uio_resid(&uio) > 0 && zfs_uio_offset(&uio) < volsize) {
|
||||
uint64_t bytes = MIN(zfs_uio_resid(&uio), DMU_MAX_ACCESS >> 1);
|
||||
|
||||
/* don't read past the end */
|
||||
if (bytes > volsize - uio->uio_loffset)
|
||||
bytes = volsize - uio->uio_loffset;
|
||||
if (bytes > volsize - zfs_uio_offset(&uio))
|
||||
bytes = volsize - zfs_uio_offset(&uio);
|
||||
|
||||
error = dmu_read_uio_dnode(zv->zv_dn, uio, bytes);
|
||||
error = dmu_read_uio_dnode(zv->zv_dn, &uio, bytes);
|
||||
if (error) {
|
||||
/* convert checksum errors into IO errors */
|
||||
if (error == ECKSUM)
|
||||
@@ -787,20 +790,23 @@ zvol_cdev_read(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
}
|
||||
|
||||
static int
|
||||
zvol_cdev_write(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
zvol_cdev_write(struct cdev *dev, struct uio *uio_s, int ioflag)
|
||||
{
|
||||
zvol_state_t *zv;
|
||||
uint64_t volsize;
|
||||
zfs_locked_range_t *lr;
|
||||
int error = 0;
|
||||
boolean_t sync;
|
||||
zfs_uio_t uio;
|
||||
|
||||
zv = dev->si_drv2;
|
||||
|
||||
volsize = zv->zv_volsize;
|
||||
|
||||
if (uio->uio_resid > 0 &&
|
||||
(uio->uio_loffset < 0 || uio->uio_loffset > volsize))
|
||||
zfs_uio_init(&uio, uio_s);
|
||||
|
||||
if (zfs_uio_resid(&uio) > 0 &&
|
||||
(zfs_uio_offset(&uio) < 0 || zfs_uio_offset(&uio) > volsize))
|
||||
return (SET_ERROR(EIO));
|
||||
|
||||
sync = (ioflag & IO_SYNC) ||
|
||||
@@ -809,11 +815,11 @@ zvol_cdev_write(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
|
||||
zvol_ensure_zilog(zv);
|
||||
|
||||
lr = zfs_rangelock_enter(&zv->zv_rangelock, uio->uio_loffset,
|
||||
uio->uio_resid, RL_WRITER);
|
||||
while (uio->uio_resid > 0 && uio->uio_loffset < volsize) {
|
||||
uint64_t bytes = MIN(uio->uio_resid, DMU_MAX_ACCESS >> 1);
|
||||
uint64_t off = uio->uio_loffset;
|
||||
lr = zfs_rangelock_enter(&zv->zv_rangelock, zfs_uio_offset(&uio),
|
||||
zfs_uio_resid(&uio), RL_WRITER);
|
||||
while (zfs_uio_resid(&uio) > 0 && zfs_uio_offset(&uio) < volsize) {
|
||||
uint64_t bytes = MIN(zfs_uio_resid(&uio), DMU_MAX_ACCESS >> 1);
|
||||
uint64_t off = zfs_uio_offset(&uio);
|
||||
dmu_tx_t *tx = dmu_tx_create(zv->zv_objset);
|
||||
|
||||
if (bytes > volsize - off) /* don't write past the end */
|
||||
@@ -825,7 +831,7 @@ zvol_cdev_write(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
dmu_tx_abort(tx);
|
||||
break;
|
||||
}
|
||||
error = dmu_write_uio_dnode(zv->zv_dn, uio, bytes, tx);
|
||||
error = dmu_write_uio_dnode(zv->zv_dn, &uio, bytes, tx);
|
||||
if (error == 0)
|
||||
zvol_log_write(zv, tx, off, bytes, sync);
|
||||
dmu_tx_commit(tx);
|
||||
|
||||
Reference in New Issue
Block a user