Add xio_init_pages(), which builds an XIO based on an array of vm_page_t's.
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 13 Aug 2007 17:20:05 +0000 (17:20 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 13 Aug 2007 17:20:05 +0000 (17:20 +0000)
sys/kern/kern_xio.c
sys/sys/xio.h

index 9fa7e92..4d36a6b 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/kern_xio.c,v 1.14 2007/06/29 05:09:15 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_xio.c,v 1.15 2007/08/13 17:20:04 dillon Exp $
  */
 /*
  * Kernel XIO interface.  An initialized XIO is basically a collection of
@@ -203,6 +203,31 @@ xio_init_kbuf(xio_t xio, void *kbase, size_t kbytes)
 }
 
 /*
+ * Initialize an XIO given an array of vm_page pointers.
+ */
+int
+xio_init_pages(xio_t xio, struct vm_page **mbase, int npages, int xflags)
+{
+    int i;
+
+    KKASSERT(npages <= XIO_INTERNAL_PAGES);
+
+    xio->xio_flags = xflags;
+    xio->xio_offset = 0;
+    xio->xio_bytes = 0;
+    xio->xio_pages = xio->xio_internal_pages;
+    xio->xio_npages = npages;
+    xio->xio_error = 0;
+    crit_enter();
+    for (i = 0; i < npages; ++i) {
+       vm_page_hold(mbase[i]);
+       xio->xio_pages[i] = mbase[i];
+    }
+    crit_exit();
+    return(0);
+}
+
+/*
  * Cleanup an XIO so it can be destroyed.  The pages associated with the
  * XIO are released.
  */
index 7c129a9..8ac1fec 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/sys/xio.h,v 1.9 2007/06/29 05:09:14 dillon Exp $
+ * $DragonFly: src/sys/sys/xio.h,v 1.10 2007/08/13 17:20:05 dillon Exp $
  */
 
 /*
@@ -93,6 +93,7 @@ typedef struct xio *xio_t;
 void xio_init(xio_t xio);
 int xio_init_ubuf(xio_t xio, void *ubase, size_t ubytes, int vmprot);
 int xio_init_kbuf(xio_t xio, void *kbase, size_t kbytes);
+int xio_init_pages(xio_t xio, struct vm_page **mbase, int npages, int xflags);
 void xio_release(xio_t xio);
 int xio_uio_copy(xio_t xio, int uoffset, struct uio *uio, int *sizep);
 int xio_copy_xtou(xio_t xio, int uoffset, void *uptr, int bytes);