summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormm <mm@FreeBSD.org>2012-11-08 01:38:30 +0000
committermm <mm@FreeBSD.org>2012-11-08 01:38:30 +0000
commitdf7d8d5c43c3735ec957b1ba03768d735ba2b219 (patch)
tree13503637632c58cf5f18440bd8b32ba75f539b07
parentcab0cc7d7a2d10ffa21890c1f9bcc26c6b74c540 (diff)
downloadFreeBSD-src-df7d8d5c43c3735ec957b1ba03768d735ba2b219.zip
FreeBSD-src-df7d8d5c43c3735ec957b1ba03768d735ba2b219.tar.gz
Update vendor/illumos/dist and vendor/illumos-sys/dist
to illumos-gate 13871:a9c12c2c1647 (zfs changes, illumos issues #3306, #3321)
-rw-r--r--uts/common/fs/zfs/sys/vdev_impl.h8
-rw-r--r--uts/common/fs/zfs/vdev_disk.c19
-rw-r--r--uts/common/fs/zfs/vdev_file.c67
-rw-r--r--uts/common/fs/zfs/zio.c2
4 files changed, 75 insertions, 21 deletions
diff --git a/uts/common/fs/zfs/sys/vdev_impl.h b/uts/common/fs/zfs/sys/vdev_impl.h
index fcc2cbd..95b8f9b 100644
--- a/uts/common/fs/zfs/sys/vdev_impl.h
+++ b/uts/common/fs/zfs/sys/vdev_impl.h
@@ -322,6 +322,14 @@ extern void vdev_set_min_asize(vdev_t *vd);
*/
extern int zfs_vdev_cache_size;
+/*
+ * The vdev_buf_t is used to translate between zio_t and buf_t, and back again.
+ */
+typedef struct vdev_buf {
+ buf_t vb_buf; /* buffer that describes the io */
+ zio_t *vb_io; /* pointer back to the original zio_t */
+} vdev_buf_t;
+
#ifdef __cplusplus
}
#endif
diff --git a/uts/common/fs/zfs/vdev_disk.c b/uts/common/fs/zfs/vdev_disk.c
index 6f8cb17..655728c 100644
--- a/uts/common/fs/zfs/vdev_disk.c
+++ b/uts/common/fs/zfs/vdev_disk.c
@@ -40,11 +40,6 @@
extern ldi_ident_t zfs_li;
-typedef struct vdev_disk_buf {
- buf_t vdb_buf;
- zio_t *vdb_io;
-} vdev_disk_buf_t;
-
static void
vdev_disk_hold(vdev_t *vd)
{
@@ -397,8 +392,8 @@ vdev_disk_physio(ldi_handle_t vd_lh, caddr_t data, size_t size,
static void
vdev_disk_io_intr(buf_t *bp)
{
- vdev_disk_buf_t *vdb = (vdev_disk_buf_t *)bp;
- zio_t *zio = vdb->vdb_io;
+ vdev_buf_t *vb = (vdev_buf_t *)bp;
+ zio_t *zio = vb->vb_io;
/*
* The rest of the zio stack only deals with EIO, ECKSUM, and ENXIO.
@@ -410,7 +405,7 @@ vdev_disk_io_intr(buf_t *bp)
if (zio->io_error == 0 && bp->b_resid != 0)
zio->io_error = EIO;
- kmem_free(vdb, sizeof (vdev_disk_buf_t));
+ kmem_free(vb, sizeof (vdev_buf_t));
zio_interrupt(zio);
}
@@ -441,7 +436,7 @@ vdev_disk_io_start(zio_t *zio)
{
vdev_t *vd = zio->io_vd;
vdev_disk_t *dvd = vd->vdev_tsd;
- vdev_disk_buf_t *vdb;
+ vdev_buf_t *vb;
struct dk_callback *dkc;
buf_t *bp;
int error;
@@ -505,10 +500,10 @@ vdev_disk_io_start(zio_t *zio)
return (ZIO_PIPELINE_CONTINUE);
}
- vdb = kmem_alloc(sizeof (vdev_disk_buf_t), KM_SLEEP);
+ vb = kmem_alloc(sizeof (vdev_buf_t), KM_SLEEP);
- vdb->vdb_io = zio;
- bp = &vdb->vdb_buf;
+ vb->vb_io = zio;
+ bp = &vb->vb_buf;
bioinit(bp);
bp->b_flags = B_BUSY | B_NOCACHE |
diff --git a/uts/common/fs/zfs/vdev_file.c b/uts/common/fs/zfs/vdev_file.c
index 043fa51..1fbce5e 100644
--- a/uts/common/fs/zfs/vdev_file.c
+++ b/uts/common/fs/zfs/vdev_file.c
@@ -25,6 +25,7 @@
#include <sys/zfs_context.h>
#include <sys/spa.h>
+#include <sys/spa_impl.h>
#include <sys/vdev_file.h>
#include <sys/vdev_impl.h>
#include <sys/zio.h>
@@ -140,12 +141,55 @@ vdev_file_close(vdev_t *vd)
vd->vdev_tsd = NULL;
}
+/*
+ * Implements the interrupt side for file vdev types. This routine will be
+ * called when the I/O completes allowing us to transfer the I/O to the
+ * interrupt taskqs. For consistency, the code structure mimics disk vdev
+ * types.
+ */
+static void
+vdev_file_io_intr(buf_t *bp)
+{
+ vdev_buf_t *vb = (vdev_buf_t *)bp;
+ zio_t *zio = vb->vb_io;
+
+ zio->io_error = (geterror(bp) != 0 ? EIO : 0);
+ if (zio->io_error == 0 && bp->b_resid != 0)
+ zio->io_error = ENOSPC;
+
+ kmem_free(vb, sizeof (vdev_buf_t));
+ zio_interrupt(zio);
+}
+
+static void
+vdev_file_io_strategy(void *arg)
+{
+ buf_t *bp = arg;
+ vnode_t *vp = bp->b_private;
+ ssize_t resid;
+ int error;
+
+ error = vn_rdwr((bp->b_flags & B_READ) ? UIO_READ : UIO_WRITE,
+ vp, bp->b_un.b_addr, bp->b_bcount, ldbtob(bp->b_lblkno),
+ UIO_SYSSPACE, 0, RLIM64_INFINITY, kcred, &resid);
+
+ if (error == 0) {
+ bp->b_resid = resid;
+ biodone(bp);
+ } else {
+ bioerror(bp, error);
+ biodone(bp);
+ }
+}
+
static int
vdev_file_io_start(zio_t *zio)
{
+ spa_t *spa = zio->io_spa;
vdev_t *vd = zio->io_vd;
vdev_file_t *vf = vd->vdev_tsd;
- ssize_t resid;
+ vdev_buf_t *vb;
+ buf_t *bp;
if (zio->io_type == ZIO_TYPE_IOCTL) {
/* XXPOLICY */
@@ -166,15 +210,22 @@ vdev_file_io_start(zio_t *zio)
return (ZIO_PIPELINE_CONTINUE);
}
- zio->io_error = vn_rdwr(zio->io_type == ZIO_TYPE_READ ?
- UIO_READ : UIO_WRITE, vf->vf_vnode, zio->io_data,
- zio->io_size, zio->io_offset, UIO_SYSSPACE,
- 0, RLIM64_INFINITY, kcred, &resid);
+ vb = kmem_alloc(sizeof (vdev_buf_t), KM_SLEEP);
- if (resid != 0 && zio->io_error == 0)
- zio->io_error = ENOSPC;
+ vb->vb_io = zio;
+ bp = &vb->vb_buf;
- zio_interrupt(zio);
+ bioinit(bp);
+ bp->b_flags = (zio->io_type == ZIO_TYPE_READ ? B_READ : B_WRITE);
+ bp->b_bcount = zio->io_size;
+ bp->b_un.b_addr = zio->io_data;
+ bp->b_lblkno = lbtodb(zio->io_offset);
+ bp->b_bufsize = zio->io_size;
+ bp->b_private = vf->vf_vnode;
+ bp->b_iodone = (int (*)())vdev_file_io_intr;
+
+ taskq_dispatch_ent(spa->spa_zio_taskq[ZIO_TYPE_FREE][ZIO_TASKQ_ISSUE],
+ vdev_file_io_strategy, bp, 0, &zio->io_tqent);
return (ZIO_PIPELINE_STOP);
}
diff --git a/uts/common/fs/zfs/zio.c b/uts/common/fs/zfs/zio.c
index 88684b9..d1bed63 100644
--- a/uts/common/fs/zfs/zio.c
+++ b/uts/common/fs/zfs/zio.c
@@ -2917,7 +2917,7 @@ zio_done(zio_t *zio)
* Hand it off to the otherwise-unused claim taskq.
*/
ASSERT(zio->io_tqent.tqent_next == NULL);
- (void) taskq_dispatch_ent(
+ taskq_dispatch_ent(
spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE],
(task_func_t *)zio_reexecute, zio, 0,
&zio->io_tqent);
OpenPOWER on IntegriCloud