mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +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
@@ -55,7 +55,7 @@
|
||||
* a non-zero errno on failure.
|
||||
*/
|
||||
static int
|
||||
uiomove_iov(void *p, size_t n, enum uio_rw rw, struct uio *uio)
|
||||
zfs_uiomove_iov(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
|
||||
{
|
||||
const struct iovec *iov = uio->uio_iov;
|
||||
size_t skip = uio->uio_skip;
|
||||
@@ -126,7 +126,7 @@ uiomove_iov(void *p, size_t n, enum uio_rw rw, struct uio *uio)
|
||||
}
|
||||
|
||||
static int
|
||||
uiomove_bvec(void *p, size_t n, enum uio_rw rw, struct uio *uio)
|
||||
zfs_uiomove_bvec(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
|
||||
{
|
||||
const struct bio_vec *bv = uio->uio_bvec;
|
||||
size_t skip = uio->uio_skip;
|
||||
@@ -160,7 +160,7 @@ uiomove_bvec(void *p, size_t n, enum uio_rw rw, struct uio *uio)
|
||||
|
||||
#if defined(HAVE_VFS_IOV_ITER)
|
||||
static int
|
||||
uiomove_iter(void *p, size_t n, enum uio_rw rw, struct uio *uio,
|
||||
zfs_uiomove_iter(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio,
|
||||
boolean_t revert)
|
||||
{
|
||||
size_t cnt = MIN(n, uio->uio_resid);
|
||||
@@ -182,7 +182,7 @@ uiomove_iter(void *p, size_t n, enum uio_rw rw, struct uio *uio,
|
||||
return (EFAULT);
|
||||
|
||||
/*
|
||||
* Revert advancing the uio_iter. This is set by uiocopy()
|
||||
* Revert advancing the uio_iter. This is set by zfs_uiocopy()
|
||||
* to avoid consuming the uio and its iov_iter structure.
|
||||
*/
|
||||
if (revert)
|
||||
@@ -196,18 +196,18 @@ uiomove_iter(void *p, size_t n, enum uio_rw rw, struct uio *uio,
|
||||
#endif
|
||||
|
||||
int
|
||||
uiomove(void *p, size_t n, enum uio_rw rw, struct uio *uio)
|
||||
zfs_uiomove(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
|
||||
{
|
||||
if (uio->uio_segflg == UIO_BVEC)
|
||||
return (uiomove_bvec(p, n, rw, uio));
|
||||
return (zfs_uiomove_bvec(p, n, rw, uio));
|
||||
#if defined(HAVE_VFS_IOV_ITER)
|
||||
else if (uio->uio_segflg == UIO_ITER)
|
||||
return (uiomove_iter(p, n, rw, uio, B_FALSE));
|
||||
return (zfs_uiomove_iter(p, n, rw, uio, B_FALSE));
|
||||
#endif
|
||||
else
|
||||
return (uiomove_iov(p, n, rw, uio));
|
||||
return (zfs_uiomove_iov(p, n, rw, uio));
|
||||
}
|
||||
EXPORT_SYMBOL(uiomove);
|
||||
EXPORT_SYMBOL(zfs_uiomove);
|
||||
|
||||
/*
|
||||
* Fault in the pages of the first n bytes specified by the uio structure.
|
||||
@@ -216,7 +216,7 @@ EXPORT_SYMBOL(uiomove);
|
||||
* the pages resident.
|
||||
*/
|
||||
int
|
||||
uio_prefaultpages(ssize_t n, struct uio *uio)
|
||||
zfs_uio_prefaultpages(ssize_t n, zfs_uio_t *uio)
|
||||
{
|
||||
if (uio->uio_segflg == UIO_SYSSPACE || uio->uio_segflg == UIO_BVEC) {
|
||||
/* There's never a need to fault in kernel pages */
|
||||
@@ -263,40 +263,40 @@ uio_prefaultpages(ssize_t n, struct uio *uio)
|
||||
|
||||
return (0);
|
||||
}
|
||||
EXPORT_SYMBOL(uio_prefaultpages);
|
||||
EXPORT_SYMBOL(zfs_uio_prefaultpages);
|
||||
|
||||
/*
|
||||
* The same as uiomove() but doesn't modify uio structure.
|
||||
* The 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 uio uio_copy;
|
||||
zfs_uio_t uio_copy;
|
||||
int ret;
|
||||
|
||||
bcopy(uio, &uio_copy, sizeof (struct uio));
|
||||
bcopy(uio, &uio_copy, sizeof (zfs_uio_t));
|
||||
|
||||
if (uio->uio_segflg == UIO_BVEC)
|
||||
ret = uiomove_bvec(p, n, rw, &uio_copy);
|
||||
ret = zfs_uiomove_bvec(p, n, rw, &uio_copy);
|
||||
#if defined(HAVE_VFS_IOV_ITER)
|
||||
else if (uio->uio_segflg == UIO_ITER)
|
||||
ret = uiomove_iter(p, n, rw, &uio_copy, B_TRUE);
|
||||
ret = zfs_uiomove_iter(p, n, rw, &uio_copy, B_TRUE);
|
||||
#endif
|
||||
else
|
||||
ret = uiomove_iov(p, n, rw, &uio_copy);
|
||||
ret = zfs_uiomove_iov(p, n, rw, &uio_copy);
|
||||
|
||||
*cbytes = uio->uio_resid - uio_copy.uio_resid;
|
||||
|
||||
return (ret);
|
||||
}
|
||||
EXPORT_SYMBOL(uiocopy);
|
||||
EXPORT_SYMBOL(zfs_uiocopy);
|
||||
|
||||
/*
|
||||
* Drop the next n chars out of *uio.
|
||||
*/
|
||||
void
|
||||
uioskip(uio_t *uio, size_t n)
|
||||
zfs_uioskip(zfs_uio_t *uio, size_t n)
|
||||
{
|
||||
if (n > uio->uio_resid)
|
||||
return;
|
||||
@@ -325,5 +325,6 @@ uioskip(uio_t *uio, size_t n)
|
||||
uio->uio_loffset += n;
|
||||
uio->uio_resid -= n;
|
||||
}
|
||||
EXPORT_SYMBOL(uioskip);
|
||||
EXPORT_SYMBOL(zfs_uioskip);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
@@ -301,7 +301,7 @@ update_pages(znode_t *zp, int64_t start, int len, objset_t *os)
|
||||
* 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)
|
||||
{
|
||||
struct inode *ip = ZTOI(zp);
|
||||
struct address_space *mp = ip->i_mapping;
|
||||
@@ -323,7 +323,7 @@ mappedread(znode_t *zp, int nbytes, uio_t *uio)
|
||||
unlock_page(pp);
|
||||
|
||||
pb = kmap(pp);
|
||||
error = uiomove(pb + off, bytes, UIO_READ, uio);
|
||||
error = zfs_uiomove(pb + off, bytes, UIO_READ, uio);
|
||||
kunmap(pp);
|
||||
|
||||
if (mapping_writably_mapped(mp))
|
||||
@@ -375,8 +375,8 @@ zfs_write_simple(znode_t *zp, const void *data, size_t len,
|
||||
iov.iov_base = (void *)data;
|
||||
iov.iov_len = len;
|
||||
|
||||
uio_t uio;
|
||||
uio_iovec_init(&uio, &iov, 1, pos, UIO_SYSSPACE, len, 0);
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_iovec_init(&uio, &iov, 1, pos, UIO_SYSSPACE, len, 0);
|
||||
|
||||
cookie = spl_fstrans_mark();
|
||||
error = zfs_write(zp, &uio, 0, kcred);
|
||||
@@ -384,8 +384,8 @@ zfs_write_simple(znode_t *zp, const void *data, size_t len,
|
||||
|
||||
if (error == 0) {
|
||||
if (residp != NULL)
|
||||
*residp = uio_resid(&uio);
|
||||
else if (uio_resid(&uio) != 0)
|
||||
*residp = zfs_uio_resid(&uio);
|
||||
else if (zfs_uio_resid(&uio) != 0)
|
||||
error = SET_ERROR(EIO);
|
||||
}
|
||||
|
||||
@@ -3208,7 +3208,7 @@ top:
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
int
|
||||
zfs_readlink(struct inode *ip, uio_t *uio, cred_t *cr)
|
||||
zfs_readlink(struct inode *ip, zfs_uio_t *uio, cred_t *cr)
|
||||
{
|
||||
znode_t *zp = ITOZ(ip);
|
||||
zfsvfs_t *zfsvfs = ITOZSB(ip);
|
||||
|
||||
@@ -376,7 +376,7 @@ error:
|
||||
static int
|
||||
zio_do_crypt_uio(boolean_t encrypt, uint64_t crypt, crypto_key_t *key,
|
||||
crypto_ctx_template_t tmpl, uint8_t *ivbuf, uint_t datalen,
|
||||
uio_t *puio, uio_t *cuio, uint8_t *authbuf, uint_t auth_len)
|
||||
zfs_uio_t *puio, zfs_uio_t *cuio, uint8_t *authbuf, uint_t auth_len)
|
||||
{
|
||||
int ret;
|
||||
crypto_data_t plaindata, cipherdata;
|
||||
@@ -479,7 +479,7 @@ zio_crypt_key_wrap(crypto_key_t *cwkey, zio_crypt_key_t *key, uint8_t *iv,
|
||||
uint8_t *mac, uint8_t *keydata_out, uint8_t *hmac_keydata_out)
|
||||
{
|
||||
int ret;
|
||||
uio_t puio, cuio;
|
||||
zfs_uio_t puio, cuio;
|
||||
uint64_t aad[3];
|
||||
iovec_t plain_iovecs[2], cipher_iovecs[3];
|
||||
uint64_t crypt = key->zk_crypt;
|
||||
@@ -495,7 +495,7 @@ zio_crypt_key_wrap(crypto_key_t *cwkey, zio_crypt_key_t *key, uint8_t *iv,
|
||||
if (ret != 0)
|
||||
goto error;
|
||||
|
||||
/* initialize uio_ts */
|
||||
/* initialize zfs_uio_ts */
|
||||
plain_iovecs[0].iov_base = key->zk_master_keydata;
|
||||
plain_iovecs[0].iov_len = keydata_len;
|
||||
plain_iovecs[1].iov_base = key->zk_hmac_keydata;
|
||||
@@ -550,7 +550,7 @@ zio_crypt_key_unwrap(crypto_key_t *cwkey, uint64_t crypt, uint64_t version,
|
||||
uint8_t *mac, zio_crypt_key_t *key)
|
||||
{
|
||||
crypto_mechanism_t mech;
|
||||
uio_t puio, cuio;
|
||||
zfs_uio_t puio, cuio;
|
||||
uint64_t aad[3];
|
||||
iovec_t plain_iovecs[2], cipher_iovecs[3];
|
||||
uint_t enc_len, keydata_len, aad_len;
|
||||
@@ -563,7 +563,7 @@ zio_crypt_key_unwrap(crypto_key_t *cwkey, uint64_t crypt, uint64_t version,
|
||||
|
||||
keydata_len = zio_crypt_table[crypt].ci_keylen;
|
||||
|
||||
/* initialize uio_ts */
|
||||
/* initialize zfs_uio_ts */
|
||||
plain_iovecs[0].iov_base = key->zk_master_keydata;
|
||||
plain_iovecs[0].iov_len = keydata_len;
|
||||
plain_iovecs[1].iov_base = key->zk_hmac_keydata;
|
||||
@@ -1289,7 +1289,7 @@ 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));
|
||||
@@ -1379,8 +1379,8 @@ zio_crypt_do_indirect_mac_checksum_abd(boolean_t generate, abd_t *abd,
|
||||
*/
|
||||
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 *cuio, 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 *cuio, uint_t *enc_len, uint8_t **authbuf, uint_t *auth_len,
|
||||
boolean_t *no_crypt)
|
||||
{
|
||||
int ret;
|
||||
@@ -1575,7 +1575,7 @@ error:
|
||||
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 *cuio, uint_t *enc_len, uint8_t **authbuf,
|
||||
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;
|
||||
@@ -1758,7 +1758,7 @@ error:
|
||||
|
||||
static int
|
||||
zio_crypt_init_uios_normal(boolean_t encrypt, uint8_t *plainbuf,
|
||||
uint8_t *cipherbuf, uint_t datalen, uio_t *puio, uio_t *cuio,
|
||||
uint8_t *cipherbuf, uint_t datalen, zfs_uio_t *puio, zfs_uio_t *cuio,
|
||||
uint_t *enc_len)
|
||||
{
|
||||
int ret;
|
||||
@@ -1818,8 +1818,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;
|
||||
@@ -1878,7 +1878,7 @@ 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;
|
||||
uint8_t enc_keydata[MASTER_KEY_MAX_LEN];
|
||||
crypto_key_t tmp_ckey, *ckey = NULL;
|
||||
crypto_ctx_template_t tmpl;
|
||||
@@ -1944,8 +1944,8 @@ zio_do_crypt_data(boolean_t encrypt, zio_crypt_key_t *key,
|
||||
/* If the hardware implementation fails fall back to software */
|
||||
}
|
||||
|
||||
bzero(&puio, sizeof (uio_t));
|
||||
bzero(&cuio, sizeof (uio_t));
|
||||
bzero(&puio, sizeof (zfs_uio_t));
|
||||
bzero(&cuio, sizeof (zfs_uio_t));
|
||||
|
||||
/* create uios for encryption */
|
||||
ret = zio_crypt_init_uios(encrypt, key->zk_version, ot, plainbuf,
|
||||
|
||||
@@ -245,13 +245,13 @@ zpl_file_accessed(struct file *filp)
|
||||
* Otherwise, for older kernels extract the iovec and pass it instead.
|
||||
*/
|
||||
static void
|
||||
zpl_uio_init(uio_t *uio, struct kiocb *kiocb, struct iov_iter *to,
|
||||
zpl_uio_init(zfs_uio_t *uio, struct kiocb *kiocb, struct iov_iter *to,
|
||||
loff_t pos, ssize_t count, size_t skip)
|
||||
{
|
||||
#if defined(HAVE_VFS_IOV_ITER)
|
||||
uio_iov_iter_init(uio, to, pos, count, skip);
|
||||
zfs_uio_iov_iter_init(uio, to, pos, count, skip);
|
||||
#else
|
||||
uio_iovec_init(uio, to->iov, to->nr_segs, pos,
|
||||
zfs_uio_iovec_init(uio, to->iov, to->nr_segs, pos,
|
||||
to->type & ITER_KVEC ? UIO_SYSSPACE : UIO_USERSPACE,
|
||||
count, skip);
|
||||
#endif
|
||||
@@ -264,7 +264,7 @@ zpl_iter_read(struct kiocb *kiocb, struct iov_iter *to)
|
||||
fstrans_cookie_t cookie;
|
||||
struct file *filp = kiocb->ki_filp;
|
||||
ssize_t count = iov_iter_count(to);
|
||||
uio_t uio;
|
||||
zfs_uio_t uio;
|
||||
|
||||
zpl_uio_init(&uio, kiocb, to, kiocb->ki_pos, count, 0);
|
||||
|
||||
@@ -320,7 +320,7 @@ zpl_iter_write(struct kiocb *kiocb, struct iov_iter *from)
|
||||
fstrans_cookie_t cookie;
|
||||
struct file *filp = kiocb->ki_filp;
|
||||
struct inode *ip = filp->f_mapping->host;
|
||||
uio_t uio;
|
||||
zfs_uio_t uio;
|
||||
size_t count = 0;
|
||||
ssize_t ret;
|
||||
|
||||
@@ -364,8 +364,8 @@ zpl_aio_read(struct kiocb *kiocb, const struct iovec *iov,
|
||||
if (ret)
|
||||
return (ret);
|
||||
|
||||
uio_t uio;
|
||||
uio_iovec_init(&uio, iov, nr_segs, kiocb->ki_pos, UIO_USERSPACE,
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_iovec_init(&uio, iov, nr_segs, kiocb->ki_pos, UIO_USERSPACE,
|
||||
count, 0);
|
||||
|
||||
crhold(cr);
|
||||
@@ -407,8 +407,8 @@ zpl_aio_write(struct kiocb *kiocb, const struct iovec *iov,
|
||||
if (ret)
|
||||
return (ret);
|
||||
|
||||
uio_t uio;
|
||||
uio_iovec_init(&uio, iov, nr_segs, kiocb->ki_pos, UIO_USERSPACE,
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_iovec_init(&uio, iov, nr_segs, kiocb->ki_pos, UIO_USERSPACE,
|
||||
count, 0);
|
||||
|
||||
crhold(cr);
|
||||
|
||||
@@ -545,8 +545,8 @@ zpl_get_link_common(struct dentry *dentry, struct inode *ip, char **link)
|
||||
iov.iov_len = MAXPATHLEN;
|
||||
iov.iov_base = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
|
||||
|
||||
uio_t uio;
|
||||
uio_iovec_init(&uio, &iov, 1, 0, UIO_SYSSPACE, MAXPATHLEN - 1, 0);
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_iovec_init(&uio, &iov, 1, 0, UIO_SYSSPACE, MAXPATHLEN - 1, 0);
|
||||
|
||||
cookie = spl_fstrans_mark();
|
||||
error = -zfs_readlink(ip, &uio, cr);
|
||||
|
||||
@@ -306,15 +306,15 @@ zpl_xattr_get_dir(struct inode *ip, const char *name, void *value,
|
||||
iov.iov_base = (void *)value;
|
||||
iov.iov_len = size;
|
||||
|
||||
uio_t uio;
|
||||
uio_iovec_init(&uio, &iov, 1, 0, UIO_SYSSPACE, size, 0);
|
||||
zfs_uio_t uio;
|
||||
zfs_uio_iovec_init(&uio, &iov, 1, 0, UIO_SYSSPACE, size, 0);
|
||||
|
||||
cookie = spl_fstrans_mark();
|
||||
error = -zfs_read(ITOZ(xip), &uio, 0, cr);
|
||||
spl_fstrans_unmark(cookie);
|
||||
|
||||
if (error == 0)
|
||||
error = size - uio_resid(&uio);
|
||||
error = size - zfs_uio_resid(&uio);
|
||||
out:
|
||||
if (xzp)
|
||||
zrele(xzp);
|
||||
|
||||
@@ -85,9 +85,9 @@ zvol_write(void *arg)
|
||||
zv_request_t *zvr = arg;
|
||||
struct bio *bio = zvr->bio;
|
||||
int error = 0;
|
||||
uio_t uio;
|
||||
zfs_uio_t uio;
|
||||
|
||||
uio_bvec_init(&uio, bio);
|
||||
zfs_uio_bvec_init(&uio, bio);
|
||||
|
||||
zvol_state_t *zv = zvr->zv;
|
||||
ASSERT3P(zv, !=, NULL);
|
||||
@@ -247,9 +247,9 @@ zvol_read(void *arg)
|
||||
zv_request_t *zvr = arg;
|
||||
struct bio *bio = zvr->bio;
|
||||
int error = 0;
|
||||
uio_t uio;
|
||||
zfs_uio_t uio;
|
||||
|
||||
uio_bvec_init(&uio, bio);
|
||||
zfs_uio_bvec_init(&uio, bio);
|
||||
|
||||
zvol_state_t *zv = zvr->zv;
|
||||
ASSERT3P(zv, !=, NULL);
|
||||
|
||||
Reference in New Issue
Block a user