VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / net / sunrpc / xdr.c
index c7d8bb4..a6630a1 100644 (file)
@@ -141,7 +141,7 @@ void
 xdr_encode_pages(struct xdr_buf *xdr, struct page **pages, unsigned int base,
                 unsigned int len)
 {
-       struct iovec *tail = xdr->tail;
+       struct kvec *tail = xdr->tail;
        u32 *p;
 
        xdr->pages = pages;
@@ -168,8 +168,8 @@ void
 xdr_inline_pages(struct xdr_buf *xdr, unsigned int offset,
                 struct page **pages, unsigned int base, unsigned int len)
 {
-       struct iovec *head = xdr->head;
-       struct iovec *tail = xdr->tail;
+       struct kvec *head = xdr->head;
+       struct kvec *tail = xdr->tail;
        char *buf = (char *)head->iov_base;
        unsigned int buflen = head->iov_len;
 
@@ -186,19 +186,19 @@ xdr_inline_pages(struct xdr_buf *xdr, unsigned int offset,
 }
 
 /*
- * Realign the iovec if the server missed out some reply elements
+ * Realign the kvec if the server missed out some reply elements
  * (such as post-op attributes,...)
  * Note: This is a simple implementation that assumes that
  *            len <= iov->iov_len !!!
  *       The RPC header (assumed to be the 1st element in the iov array)
  *            is not shifted.
  */
-void xdr_shift_iovec(struct iovec *iov, int nr, size_t len)
+void xdr_shift_iovec(struct kvec *iov, int nr, size_t len)
 {
-       struct iovec *pvec;
+       struct kvec *pvec;
 
        for (pvec = iov + nr - 1; nr > 1; nr--, pvec--) {
-               struct iovec *svec = pvec - 1;
+               struct kvec *svec = pvec - 1;
 
                if (len > pvec->iov_len) {
                        printk(KERN_DEBUG "RPC: Urk! Large shift of short iovec.\n");
@@ -217,11 +217,11 @@ void xdr_shift_iovec(struct iovec *iov, int nr, size_t len)
 }
 
 /*
- * Map a struct xdr_buf into an iovec array.
+ * Map a struct xdr_buf into an kvec array.
  */
-int xdr_kmap(struct iovec *iov_base, struct xdr_buf *xdr, size_t base)
+int xdr_kmap(struct kvec *iov_base, struct xdr_buf *xdr, size_t base)
 {
-       struct iovec    *iov = iov_base;
+       struct kvec     *iov = iov_base;
        struct page     **ppage = xdr->pages;
        unsigned int    len, pglen = xdr->page_len;
 
@@ -371,11 +371,10 @@ xdr_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
        unsigned int len, pglen = xdr->page_len;
        int err, ret = 0;
        ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int);
-       mm_segment_t oldfs;
 
        len = xdr->head[0].iov_len;
        if (base < len || (addr != NULL && base == 0)) {
-               struct iovec iov = {
+               struct kvec iov = {
                        .iov_base = xdr->head[0].iov_base + base,
                        .iov_len  = len - base,
                };
@@ -384,16 +383,13 @@ xdr_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
                        .msg_namelen = addrlen,
                        .msg_flags   = msgflags,
                };
-
-               if (iov.iov_len != 0) {
-                       msg.msg_iov     = &iov;
-                       msg.msg_iovlen  = 1;
-               }
                if (xdr->len > len)
                        msg.msg_flags |= MSG_MORE;
-               oldfs = get_fs(); set_fs(get_ds());
-               err = sock_sendmsg(sock, &msg, iov.iov_len);
-               set_fs(oldfs);
+
+               if (iov.iov_len != 0)
+                       err = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);
+               else
+                       err = kernel_sendmsg(sock, &msg, NULL, 0, 0);
                if (ret == 0)
                        ret = err;
                else if (err > 0)
@@ -446,18 +442,14 @@ xdr_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
 copy_tail:
        len = xdr->tail[0].iov_len;
        if (base < len) {
-               struct iovec iov = {
+               struct kvec iov = {
                        .iov_base = xdr->tail[0].iov_base + base,
                        .iov_len  = len - base,
                };
                struct msghdr msg = {
-                       .msg_iov     = &iov,
-                       .msg_iovlen  = 1,
                        .msg_flags   = msgflags,
                };
-               oldfs = get_fs(); set_fs(get_ds());
-               err = sock_sendmsg(sock, &msg, iov.iov_len);
-               set_fs(oldfs);
+               err = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);
                if (ret == 0)
                        ret = err;
                else if (err > 0)
@@ -614,14 +606,14 @@ _copy_from_pages(char *p, struct page **pages, size_t pgbase, size_t len)
  * @buf: xdr_buf
  * @len: bytes to remove from buf->head[0]
  *
- * Shrinks XDR buffer's header iovec buf->head[0] by 
+ * Shrinks XDR buffer's header kvec buf->head[0] by 
  * 'len' bytes. The extra data is not lost, but is instead
  * moved into the inlined pages and/or the tail.
  */
 void
 xdr_shrink_bufhead(struct xdr_buf *buf, size_t len)
 {
-       struct iovec *head, *tail;
+       struct kvec *head, *tail;
        size_t copy, offs;
        unsigned int pglen = buf->page_len;
 
@@ -694,7 +686,7 @@ xdr_shrink_bufhead(struct xdr_buf *buf, size_t len)
 void
 xdr_shrink_pagelen(struct xdr_buf *buf, size_t len)
 {
-       struct iovec *tail;
+       struct kvec *tail;
        size_t copy;
        char *p;
        unsigned int pglen = buf->page_len;
@@ -738,15 +730,15 @@ xdr_shift_buf(struct xdr_buf *buf, size_t len)
  * @p: current pointer inside XDR buffer
  *
  * Note: at the moment the RPC client only passes the length of our
- *      scratch buffer in the xdr_buf's header iovec. Previously this
+ *      scratch buffer in the xdr_buf's header kvec. Previously this
  *      meant we needed to call xdr_adjust_iovec() after encoding the
  *      data. With the new scheme, the xdr_stream manages the details
- *      of the buffer length, and takes care of adjusting the iovec
+ *      of the buffer length, and takes care of adjusting the kvec
  *      length for us.
  */
 void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p)
 {
-       struct iovec *iov = buf->head;
+       struct kvec *iov = buf->head;
 
        xdr->buf = buf;
        xdr->iov = iov;
@@ -763,7 +755,7 @@ EXPORT_SYMBOL(xdr_init_encode);
  *
  * Checks that we have enough buffer space to encode 'nbytes' more
  * bytes of data. If so, update the total xdr_buf length, and
- * adjust the length of the current iovec.
+ * adjust the length of the current kvec.
  */
 uint32_t * xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes)
 {
@@ -795,7 +787,7 @@ void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, unsigned int b
                 unsigned int len)
 {
        struct xdr_buf *buf = xdr->buf;
-       struct iovec *iov = buf->tail;
+       struct kvec *iov = buf->tail;
        buf->pages = pages;
        buf->page_base = base;
        buf->page_len = len;
@@ -826,7 +818,7 @@ EXPORT_SYMBOL(xdr_write_pages);
  */
 void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p)
 {
-       struct iovec *iov = buf->head;
+       struct kvec *iov = buf->head;
        unsigned int len = iov->iov_len;
 
        if (len > buf->len)
@@ -873,7 +865,7 @@ EXPORT_SYMBOL(xdr_inline_decode);
 void xdr_read_pages(struct xdr_stream *xdr, unsigned int len)
 {
        struct xdr_buf *buf = xdr->buf;
-       struct iovec *iov;
+       struct kvec *iov;
        ssize_t shift;
        unsigned int end;
        int padding;
@@ -905,10 +897,10 @@ void xdr_read_pages(struct xdr_stream *xdr, unsigned int len)
 }
 EXPORT_SYMBOL(xdr_read_pages);
 
-static struct iovec empty_iov = {.iov_base = NULL, .iov_len = 0};
+static struct kvec empty_iov = {.iov_base = NULL, .iov_len = 0};
 
 void
-xdr_buf_from_iov(struct iovec *iov, struct xdr_buf *buf)
+xdr_buf_from_iov(struct kvec *iov, struct xdr_buf *buf)
 {
        buf->head[0] = *iov;
        buf->tail[0] = empty_iov;
@@ -921,7 +913,7 @@ xdr_buf_from_iov(struct iovec *iov, struct xdr_buf *buf)
  * length of subiov to zero.  Decrements len by length of subiov, sets base
  * to zero (or decrements it by length of iov if subiov is empty). */
 static void
-iov_subsegment(struct iovec *iov, struct iovec *subiov, int *base, int *len)
+iov_subsegment(struct kvec *iov, struct kvec *subiov, int *base, int *len)
 {
        if (*base > iov->iov_len) {
                subiov->iov_base = NULL;