Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[pandora-kernel.git] / net / sunrpc / svcsock.c
index d68eba4..953aff8 100644 (file)
@@ -388,7 +388,7 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr)
        /* send head */
        if (slen == xdr->head[0].iov_len)
                flags = 0;
-       len = sock->ops->sendpage(sock, rqstp->rq_respages[0], 0, xdr->head[0].iov_len, flags);
+       len = kernel_sendpage(sock, rqstp->rq_respages[0], 0, xdr->head[0].iov_len, flags);
        if (len != xdr->head[0].iov_len)
                goto out;
        slen -= xdr->head[0].iov_len;
@@ -400,7 +400,7 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr)
        while (pglen > 0) {
                if (slen == size)
                        flags = 0;
-               result = sock->ops->sendpage(sock, *ppage, base, size, flags);
+               result = kernel_sendpage(sock, *ppage, base, size, flags);
                if (result > 0)
                        len += result;
                if (result != size)
@@ -413,7 +413,7 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr)
        }
        /* send tail */
        if (xdr->tail[0].iov_len) {
-               result = sock->ops->sendpage(sock, rqstp->rq_respages[rqstp->rq_restailpage], 
+               result = kernel_sendpage(sock, rqstp->rq_respages[rqstp->rq_restailpage],
                                             ((unsigned long)xdr->tail[0].iov_base)& (PAGE_SIZE-1),
                                             xdr->tail[0].iov_len, 0);
 
@@ -434,13 +434,10 @@ out:
 static int
 svc_recv_available(struct svc_sock *svsk)
 {
-       mm_segment_t    oldfs;
        struct socket   *sock = svsk->sk_sock;
        int             avail, err;
 
-       oldfs = get_fs(); set_fs(KERNEL_DS);
-       err = sock->ops->ioctl(sock, TIOCINQ, (unsigned long) &avail);
-       set_fs(oldfs);
+       err = kernel_sock_ioctl(sock, TIOCINQ, (unsigned long) &avail);
 
        return (err >= 0)? avail : err;
 }
@@ -472,7 +469,7 @@ svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen)
         * at accept time. FIXME
         */
        alen = sizeof(rqstp->rq_addr);
-       sock->ops->getname(sock, (struct sockaddr *)&rqstp->rq_addr, &alen, 1);
+       kernel_getpeername(sock, (struct sockaddr *)&rqstp->rq_addr, &alen);
 
        dprintk("svc: socket %p recvfrom(%p, %Zu) = %d\n",
                rqstp->rq_sock, iov[0].iov_base, iov[0].iov_len, len);
@@ -758,7 +755,6 @@ svc_tcp_accept(struct svc_sock *svsk)
        struct svc_serv *serv = svsk->sk_server;
        struct socket   *sock = svsk->sk_sock;
        struct socket   *newsock;
-       const struct proto_ops *ops;
        struct svc_sock *newsvsk;
        int             err, slen;
 
@@ -766,29 +762,23 @@ svc_tcp_accept(struct svc_sock *svsk)
        if (!sock)
                return;
 
-       err = sock_create_lite(PF_INET, SOCK_STREAM, IPPROTO_TCP, &newsock);
-       if (err) {
+       clear_bit(SK_CONN, &svsk->sk_flags);
+       err = kernel_accept(sock, &newsock, O_NONBLOCK);
+       if (err < 0) {
                if (err == -ENOMEM)
                        printk(KERN_WARNING "%s: no more sockets!\n",
                               serv->sv_name);
-               return;
-       }
-
-       dprintk("svc: tcp_accept %p allocated\n", newsock);
-       newsock->ops = ops = sock->ops;
-
-       clear_bit(SK_CONN, &svsk->sk_flags);
-       if ((err = ops->accept(sock, newsock, O_NONBLOCK)) < 0) {
-               if (err != -EAGAIN && net_ratelimit())
+               else if (err != -EAGAIN && net_ratelimit())
                        printk(KERN_WARNING "%s: accept failed (err %d)!\n",
                                   serv->sv_name, -err);
-               goto failed;            /* aborted connection or whatever */
+               return;
        }
+
        set_bit(SK_CONN, &svsk->sk_flags);
        svc_sock_enqueue(svsk);
 
        slen = sizeof(sin);
-       err = ops->getname(newsock, (struct sockaddr *) &sin, &slen, 1);
+       err = kernel_getpeername(newsock, (struct sockaddr *) &sin, &slen);
        if (err < 0) {
                if (net_ratelimit())
                        printk(KERN_WARNING "%s: peername failed (err %d)!\n",
@@ -1026,7 +1016,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp)
        } else {
                printk(KERN_NOTICE "%s: recvfrom returned errno %d\n",
                                        svsk->sk_server->sv_name, -len);
-               svc_sock_received(svsk);
+               goto err_delete;
        }
 
        return len;
@@ -1296,13 +1286,13 @@ svc_send(struct svc_rqst *rqstp)
                xb->page_len +
                xb->tail[0].iov_len;
 
-       /* Grab svsk->sk_sem to serialize outgoing data. */
-       down(&svsk->sk_sem);
+       /* Grab svsk->sk_mutex to serialize outgoing data. */
+       mutex_lock(&svsk->sk_mutex);
        if (test_bit(SK_DEAD, &svsk->sk_flags))
                len = -ENOTCONN;
        else
                len = svsk->sk_sendto(rqstp);
-       up(&svsk->sk_sem);
+       mutex_unlock(&svsk->sk_mutex);
        svc_sock_release(rqstp);
 
        if (len == -ECONNREFUSED || len == -ENOTCONN || len == -EAGAIN)
@@ -1322,11 +1312,10 @@ svc_setup_socket(struct svc_serv *serv, struct socket *sock,
        struct sock     *inet;
 
        dprintk("svc: svc_setup_socket %p\n", sock);
-       if (!(svsk = kmalloc(sizeof(*svsk), GFP_KERNEL))) {
+       if (!(svsk = kzalloc(sizeof(*svsk), GFP_KERNEL))) {
                *errp = -ENOMEM;
                return NULL;
        }
-       memset(svsk, 0, sizeof(*svsk));
 
        inet = sock->sk;
 
@@ -1351,7 +1340,7 @@ svc_setup_socket(struct svc_serv *serv, struct socket *sock,
        svsk->sk_lastrecv = get_seconds();
        INIT_LIST_HEAD(&svsk->sk_deferred);
        INIT_LIST_HEAD(&svsk->sk_ready);
-       sema_init(&svsk->sk_sem, 1);
+       mutex_init(&svsk->sk_mutex);
 
        /* Initialize the socket */
        if (sock->type == SOCK_DGRAM)
@@ -1407,14 +1396,14 @@ svc_create_socket(struct svc_serv *serv, int protocol, struct sockaddr_in *sin)
        if (sin != NULL) {
                if (type == SOCK_STREAM)
                        sock->sk->sk_reuse = 1; /* allow address reuse */
-               error = sock->ops->bind(sock, (struct sockaddr *) sin,
+               error = kernel_bind(sock, (struct sockaddr *) sin,
                                                sizeof(*sin));
                if (error < 0)
                        goto bummer;
        }
 
        if (protocol == IPPROTO_TCP) {
-               if ((error = sock->ops->listen(sock, 64)) < 0)
+               if ((error = kernel_listen(sock, 64)) < 0)
                        goto bummer;
        }
 
@@ -1527,6 +1516,7 @@ svc_defer(struct cache_req *req)
                dr->handle.owner = rqstp->rq_server;
                dr->prot = rqstp->rq_prot;
                dr->addr = rqstp->rq_addr;
+               dr->daddr = rqstp->rq_daddr;
                dr->argslen = rqstp->rq_arg.len >> 2;
                memcpy(dr->args, rqstp->rq_arg.head[0].iov_base-skip, dr->argslen<<2);
        }
@@ -1552,6 +1542,7 @@ static int svc_deferred_recv(struct svc_rqst *rqstp)
        rqstp->rq_arg.len = dr->argslen<<2;
        rqstp->rq_prot        = dr->prot;
        rqstp->rq_addr        = dr->addr;
+       rqstp->rq_daddr       = dr->daddr;
        return dr->argslen<<2;
 }