Index: branches/MR_Xenomai2_4/source/ksrc/nucleus/pipe.c
===================================================================
--- branches/MR_Xenomai2_4/source/ksrc/nucleus/pipe.c	(revision 3555)
+++ branches/MR_Xenomai2_4/source/ksrc/nucleus/pipe.c	(revision 3556)
@@ -729,8 +729,8 @@
 	return 0;
 }
 
-static ssize_t xnpipe_read(struct file *file,
-			   char *buf, size_t count, loff_t *ppos)
+static ssize_t xnpipe_read_v_(struct file *file, void *buf_iovec, size_t count,
+			      int v)
 {
 	struct xnpipe_state *state = file->private_data;
 	int sigpending, err = 0;
@@ -739,9 +739,12 @@
 	struct xnholder *h;
 	ssize_t ret;
 	spl_t s;
+	char *buf;
+	size_t vec_count;
+	const struct iovec *vec;
 
-	if (!access_ok(VERIFY_WRITE, buf, count))
-		return -EFAULT;
+	if (v)	vec = buf_iovec, vec_count = count, count = 0;
+	else	buf = buf_iovec;
 
 	xnlock_get_irqsave(&nklock, s);
 
@@ -781,9 +784,20 @@
 	 * entirely.
 	 */
 
+	ret =
 	inbytes = 0;
 
 	for (;;) {
+		if (v) if (inbytes == count) if (vec_count) {
+		    buf = vec->iov_base, count = vec++->iov_len, --vec_count;
+		    inbytes = 0;
+		    if (!access_ok(VERIFY_WRITE, buf, count)) {
+			err = -EFAULT; break;
+		    }
+
+		    continue;
+		}
+
 		nbytes = xnpipe_m_size(mh) - xnpipe_m_rdoff(mh);
 
 		if (nbytes + inbytes > count)
@@ -806,11 +820,11 @@
 		}
 
 		inbytes += nbytes;
+		ret += nbytes;
 		xnpipe_m_rdoff(mh) += nbytes;
 	}
 
-	state->ionrd -= inbytes;
-	ret = inbytes;
+	state->ionrd -= ret;
 
 	if (xnpipe_m_size(mh) > xnpipe_m_rdoff(mh))
 		prependq(&state->outq, &mh->link);
@@ -837,6 +851,21 @@
 	return err ? : ret;
 }
 
+static ssize_t xnpipe_read(struct file *file,
+			   char *buf, size_t count, loff_t *ppos)
+{
+	if (!access_ok(VERIFY_WRITE, buf, count))
+		return -EFAULT;
+
+	return xnpipe_read_v_(file, buf, count, 0);
+}
+
+static ssize_t xnpipe_readv(struct file *file, const struct iovec *iovec,
+			    unsigned long count, loff_t *ppos)
+{
+	return xnpipe_read_v_(file, iovec, count, 1);
+}
+
 static ssize_t xnpipe_write(struct file *file,
 			    const char *buf, size_t count, loff_t *ppos)
 {
@@ -1060,6 +1089,7 @@
 static struct file_operations xnpipe_fops = {
 	.owner = THIS_MODULE,
 	.read = xnpipe_read,
+	.readv = xnpipe_readv,
 	.write = xnpipe_write,
 	.poll = xnpipe_poll,
 	.ioctl = xnpipe_ioctl,
