]> git.proxmox.com Git - mirror_spl.git/commitdiff
Restructure uio to accommodate bio_vec
authorChunwei Chen <tuxoko@gmail.com>
Thu, 30 Jul 2015 14:19:01 +0000 (22:19 +0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 24 Aug 2015 17:10:21 +0000 (10:10 -0700)
Starting from Linux 4.1, bio_vec will be allowed to pass into filesystem via
iter_read/iter_write, so we add a bio_vec field in uio_t to hold it, and use
UIO_BVEC in segflg to determine which "vec".

Also, to be consistent to newer kernel, we make iovec and bio_vec immutable,
and make uio act as an iterator with the new uio_skip field indicating number
of bytes to skip in the first segment.

Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue zfsonlinux/zfs#3511
Issue zfsonlinux/zfs#3640
Closes #468

include/sys/uio.h

index 25c5f4a01807bc72406d004305a9e8c7bb094066..404c03774aea46698653dc2b5d1783b91a67238d 100644 (file)
@@ -1,6 +1,7 @@
 /*****************************************************************************\
  *  Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC.
  *  Copyright (C) 2007 The Regents of the University of California.
+ *  Copyright (c) 2015 by Chunwei Chen. All rights reserved.
  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
  *  Written by Brian Behlendorf <behlendorf1@llnl.gov>.
  *  UCRL-CODE-235197
@@ -26,6 +27,7 @@
 #define _SPL_UIO_H
 
 #include <linux/uio.h>
+#include <linux/blkdev.h>
 #include <asm/uaccess.h>
 #include <sys/types.h>
 
@@ -40,10 +42,14 @@ typedef enum uio_seg {
        UIO_USERSPACE = 0,
        UIO_SYSSPACE =  1,
        UIO_USERISPACE= 2,
+       UIO_BVEC =      3,
 } uio_seg_t;
 
 typedef struct uio {
-       struct iovec    *uio_iov;
+       union {
+               const struct iovec      *uio_iov;
+               const struct bio_vec    *uio_bvec;
+       };
        int             uio_iovcnt;
        offset_t        uio_loffset;
        uio_seg_t       uio_segflg;
@@ -51,6 +57,7 @@ typedef struct uio {
        uint16_t        uio_extflg;
        offset_t        uio_limit;
        ssize_t         uio_resid;
+       size_t          uio_skip;
 } uio_t;
 
 typedef struct aio_req {