2010-08-26 18:50:56 +00:00
|
|
|
/*
|
|
|
|
* CDDL HEADER START
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the terms of the
|
|
|
|
* Common Development and Distribution License, Version 1.0 only
|
|
|
|
* (the "License"). You may not use this file except in compliance
|
|
|
|
* with the License.
|
|
|
|
*
|
|
|
|
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
|
|
|
* or http://www.opensolaris.org/os/licensing.
|
|
|
|
* See the License for the specific language governing permissions
|
|
|
|
* and limitations under the License.
|
|
|
|
*
|
|
|
|
* When distributing Covered Code, include this CDDL HEADER in each
|
|
|
|
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
|
|
|
* If applicable, add the following below this CDDL HEADER, with the
|
|
|
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
|
|
|
* information: Portions Copyright [yyyy] [name of copyright owner]
|
|
|
|
*
|
|
|
|
* CDDL HEADER END
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
|
|
|
|
* Use is subject to license terms.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
|
|
|
|
/* All Rights Reserved */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* University Copyright- Copyright (c) 1982, 1986, 1988
|
|
|
|
* The Regents of the University of California
|
|
|
|
* All Rights Reserved
|
|
|
|
*
|
|
|
|
* University Acknowledgment- Portions of this document are derived from
|
|
|
|
* software developed by the University of California, Berkeley, and its
|
|
|
|
* contributors.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _LIBSPL_SYS_UIO_H
|
|
|
|
#define _LIBSPL_SYS_UIO_H
|
|
|
|
|
2019-10-02 17:39:48 +00:00
|
|
|
#include <sys/types.h>
|
2010-08-26 18:50:56 +00:00
|
|
|
#include_next <sys/uio.h>
|
|
|
|
|
2020-06-14 17:09:55 +00:00
|
|
|
#ifdef __APPLE__
|
|
|
|
#include <sys/_types/_iovec_t.h>
|
|
|
|
#endif
|
|
|
|
|
2019-10-02 17:39:48 +00:00
|
|
|
#include <stdint.h>
|
2010-08-26 18:50:56 +00:00
|
|
|
typedef struct iovec iovec_t;
|
|
|
|
|
2020-06-14 17:09:55 +00:00
|
|
|
#if defined(__linux__) || defined(__APPLE__)
|
2021-01-21 05:27:30 +00:00
|
|
|
typedef enum zfs_uio_rw {
|
2013-11-01 19:26:11 +00:00
|
|
|
UIO_READ = 0,
|
|
|
|
UIO_WRITE = 1,
|
2021-01-21 05:27:30 +00:00
|
|
|
} zfs_uio_rw_t;
|
2010-08-26 18:50:56 +00:00
|
|
|
|
2021-01-21 05:27:30 +00:00
|
|
|
typedef enum zfs_uio_seg {
|
2013-11-01 19:26:11 +00:00
|
|
|
UIO_USERSPACE = 0,
|
|
|
|
UIO_SYSSPACE = 1,
|
2021-01-21 05:27:30 +00:00
|
|
|
} zfs_uio_seg_t;
|
2010-08-26 18:50:56 +00:00
|
|
|
|
2020-06-14 17:09:55 +00:00
|
|
|
#elif defined(__FreeBSD__)
|
2021-01-21 05:27:30 +00:00
|
|
|
typedef enum uio_seg zfs_uio_seg_t;
|
2020-06-14 17:09:55 +00:00
|
|
|
#endif
|
|
|
|
|
2021-01-21 05:27:30 +00:00
|
|
|
typedef struct zfs_uio {
|
2010-08-26 18:50:56 +00:00
|
|
|
struct iovec *uio_iov; /* pointer to array of iovecs */
|
|
|
|
int uio_iovcnt; /* number of iovecs */
|
2020-06-14 17:09:55 +00:00
|
|
|
offset_t uio_loffset; /* file offset */
|
2021-01-21 05:27:30 +00:00
|
|
|
zfs_uio_seg_t uio_segflg; /* address space (kernel or user) */
|
2010-08-26 18:50:56 +00:00
|
|
|
uint16_t uio_fmode; /* file mode flags */
|
|
|
|
uint16_t uio_extflg; /* extended flags */
|
|
|
|
ssize_t uio_resid; /* residual count */
|
2021-01-21 05:27:30 +00:00
|
|
|
} zfs_uio_t;
|
2010-08-26 18:50:56 +00:00
|
|
|
|
2021-01-21 05:27:30 +00:00
|
|
|
#define zfs_uio_segflg(uio) (uio)->uio_segflg
|
|
|
|
#define zfs_uio_offset(uio) (uio)->uio_loffset
|
|
|
|
#define zfs_uio_resid(uio) (uio)->uio_resid
|
|
|
|
#define zfs_uio_iovcnt(uio) (uio)->uio_iovcnt
|
|
|
|
#define zfs_uio_iovlen(uio, idx) (uio)->uio_iov[(idx)].iov_len
|
|
|
|
#define zfs_uio_iovbase(uio, idx) (uio)->uio_iov[(idx)].iov_base
|
2020-06-14 17:09:55 +00:00
|
|
|
|
|
|
|
static inline void
|
2021-01-21 05:27:30 +00:00
|
|
|
zfs_uio_iov_at_index(zfs_uio_t *uio, uint_t idx, void **base, uint64_t *len)
|
2020-06-14 17:09:55 +00:00
|
|
|
{
|
2021-01-21 05:27:30 +00:00
|
|
|
*base = zfs_uio_iovbase(uio, idx);
|
|
|
|
*len = zfs_uio_iovlen(uio, idx);
|
2020-06-14 17:09:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
2021-01-21 05:27:30 +00:00
|
|
|
zfs_uio_advance(zfs_uio_t *uio, size_t size)
|
2020-06-14 17:09:55 +00:00
|
|
|
{
|
|
|
|
uio->uio_resid -= size;
|
|
|
|
uio->uio_loffset += size;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline offset_t
|
2021-01-21 05:27:30 +00:00
|
|
|
zfs_uio_index_at_offset(zfs_uio_t *uio, offset_t off, uint_t *vec_idx)
|
2020-06-14 17:09:55 +00:00
|
|
|
{
|
|
|
|
*vec_idx = 0;
|
2021-01-21 05:27:30 +00:00
|
|
|
while (*vec_idx < (uint_t)zfs_uio_iovcnt(uio) &&
|
|
|
|
off >= (offset_t)zfs_uio_iovlen(uio, *vec_idx)) {
|
|
|
|
off -= zfs_uio_iovlen(uio, *vec_idx);
|
2020-06-14 17:09:55 +00:00
|
|
|
(*vec_idx)++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (off);
|
|
|
|
}
|
|
|
|
|
2010-08-26 18:50:56 +00:00
|
|
|
#endif /* _SYS_UIO_H */
|