fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / net / rxrpc / connection.c
index a923806..93d2c55 100644 (file)
@@ -30,6 +30,8 @@ LIST_HEAD(rxrpc_conns);
 DECLARE_RWSEM(rxrpc_conns_sem);
 unsigned long rxrpc_conn_timeout = 60 * 60;
 
+static void rxrpc_conn_do_timeout(struct rxrpc_connection *conn);
+
 static void __rxrpc_conn_timeout(rxrpc_timer_t *timer)
 {
        struct rxrpc_connection *conn =
@@ -56,13 +58,12 @@ static inline int __rxrpc_create_connection(struct rxrpc_peer *peer,
        _enter("%p",peer);
 
        /* allocate and initialise a connection record */
-       conn = kmalloc(sizeof(struct rxrpc_connection), GFP_KERNEL);
+       conn = kzalloc(sizeof(struct rxrpc_connection), GFP_KERNEL);
        if (!conn) {
                _leave(" = -ENOMEM");
                return -ENOMEM;
        }
 
-       memset(conn, 0, sizeof(struct rxrpc_connection));
        atomic_set(&conn->usage, 1);
 
        INIT_LIST_HEAD(&conn->link);
@@ -88,8 +89,8 @@ static inline int __rxrpc_create_connection(struct rxrpc_peer *peer,
  * create a new connection record for outgoing connections
  */
 int rxrpc_create_connection(struct rxrpc_transport *trans,
-                           uint16_t port,
-                           uint32_t addr,
+                           __be16 port,
+                           __be32 addr,
                            uint16_t service_id,
                            void *security,
                            struct rxrpc_connection **_conn)
@@ -97,7 +98,7 @@ int rxrpc_create_connection(struct rxrpc_transport *trans,
        struct rxrpc_connection *candidate, *conn;
        struct rxrpc_peer *peer;
        struct list_head *_p;
-       uint32_t connid;
+       __be32 connid;
        int ret;
 
        _enter("%p{%hu},%u,%hu", trans, trans->port, ntohs(port), service_id);
@@ -169,7 +170,7 @@ int rxrpc_create_connection(struct rxrpc_transport *trans,
        spin_unlock(&peer->conn_gylock);
 
        /* pick the new candidate */
-       _debug("created connection: {%08x} [out]", htonl(candidate->conn_id));
+       _debug("created connection: {%08x} [out]", ntohl(candidate->conn_id));
        atomic_inc(&peer->conn_count);
        conn = candidate;
        candidate = NULL;
@@ -199,7 +200,7 @@ int rxrpc_create_connection(struct rxrpc_transport *trans,
 
        /* handle resurrecting a connection from the graveyard */
  found_in_graveyard:
-       _debug("resurrecting connection: {%08x} [out]", htonl(conn->conn_id));
+       _debug("resurrecting connection: {%08x} [out]", ntohl(conn->conn_id));
        rxrpc_get_connection(conn);
        rxrpc_krxtimod_del_timer(&conn->timeout);
        list_del_init(&conn->link);
@@ -218,18 +219,20 @@ int rxrpc_connection_lookup(struct rxrpc_peer *peer,
 {
        struct rxrpc_connection *conn, *candidate = NULL;
        struct list_head *_p;
+       struct sk_buff *pkt = msg->pkt;
        int ret, fresh = 0;
-       u32 x_epoch, x_connid;
-       u16 x_port, x_secix, x_servid;
+       __be32 x_epoch, x_connid;
+       __be16 x_port, x_servid;
+       __u32 x_secix;
        u8 x_clflag;
 
        _enter("%p{{%hu}},%u,%hu",
               peer,
               peer->trans->port,
-              ntohs(msg->pkt->h.uh->source),
+              ntohs(pkt->h.uh->source),
               ntohs(msg->hdr.serviceId));
 
-       x_port          = msg->pkt->h.uh->source;
+       x_port          = pkt->h.uh->source;
        x_epoch         = msg->hdr.epoch;
        x_clflag        = msg->hdr.flags & RXRPC_CLIENT_INITIATED;
        x_connid        = htonl(ntohl(msg->hdr.cid) & RXRPC_CIDMASK);
@@ -264,7 +267,7 @@ int rxrpc_connection_lookup(struct rxrpc_peer *peer,
                /* fill in the specifics */
                candidate->addr.sin_family      = AF_INET;
                candidate->addr.sin_port        = x_port;
-               candidate->addr.sin_addr.s_addr = msg->pkt->nh.iph->saddr;
+               candidate->addr.sin_addr.s_addr = pkt->nh.iph->saddr;
                candidate->in_epoch             = x_epoch;
                candidate->out_epoch            = x_epoch;
                candidate->in_clientflag        = RXRPC_CLIENT_INITIATED;
@@ -310,7 +313,7 @@ int rxrpc_connection_lookup(struct rxrpc_peer *peer,
        }
 
        /* we can now add the new candidate to the list */
-       _debug("created connection: {%08x} [in]", htonl(candidate->conn_id));
+       _debug("created connection: {%08x} [in]", ntohl(candidate->conn_id));
        rxrpc_get_peer(peer);
        conn = candidate;
        candidate = NULL;
@@ -351,7 +354,7 @@ int rxrpc_connection_lookup(struct rxrpc_peer *peer,
 
        /* handle resurrecting a connection from the graveyard */
  found_in_graveyard:
-       _debug("resurrecting connection: {%08x} [in]", htonl(conn->conn_id));
+       _debug("resurrecting connection: {%08x} [in]", ntohl(conn->conn_id));
        rxrpc_get_peer(peer);
        rxrpc_get_connection(conn);
        rxrpc_krxtimod_del_timer(&conn->timeout);
@@ -397,9 +400,8 @@ void rxrpc_put_connection(struct rxrpc_connection *conn)
        }
 
        /* move to graveyard queue */
-       _debug("burying connection: {%08x}", htonl(conn->conn_id));
-       list_del(&conn->link);
-       list_add_tail(&conn->link, &peer->conn_graveyard);
+       _debug("burying connection: {%08x}", ntohl(conn->conn_id));
+       list_move_tail(&conn->link, &peer->conn_graveyard);
 
        rxrpc_krxtimod_add_timer(&conn->timeout, rxrpc_conn_timeout * HZ);
 
@@ -414,7 +416,7 @@ void rxrpc_put_connection(struct rxrpc_connection *conn)
 /*
  * free a connection record
  */
-void rxrpc_conn_do_timeout(struct rxrpc_connection *conn)
+static void rxrpc_conn_do_timeout(struct rxrpc_connection *conn)
 {
        struct rxrpc_peer *peer;
 
@@ -442,7 +444,7 @@ void rxrpc_conn_do_timeout(struct rxrpc_connection *conn)
        }
 
        _debug("--- Destroying Connection %p{%08x} ---",
-              conn, htonl(conn->conn_id));
+              conn, ntohl(conn->conn_id));
 
        down_write(&rxrpc_conns_sem);
        list_del(&conn->proc_link);
@@ -518,8 +520,8 @@ int rxrpc_conn_newmsg(struct rxrpc_connection *conn,
                      struct rxrpc_call *call,
                      uint8_t type,
                      int dcount,
-                     struct iovec diov[],
-                     int alloc_flags,
+                     struct kvec diov[],
+                     gfp_t alloc_flags,
                      struct rxrpc_message **_msg)
 {
        struct rxrpc_message *msg;
@@ -532,13 +534,12 @@ int rxrpc_conn_newmsg(struct rxrpc_connection *conn,
                return -EINVAL;
        }
 
-       msg = kmalloc(sizeof(struct rxrpc_message), alloc_flags);
+       msg = kzalloc(sizeof(struct rxrpc_message), alloc_flags);
        if (!msg) {
                _leave(" = -ENOMEM");
                return -ENOMEM;
        }
 
-       memset(msg, 0, sizeof(*msg));
        atomic_set(&msg->usage, 1);
 
        INIT_LIST_HEAD(&msg->link);
@@ -620,7 +621,6 @@ int rxrpc_conn_sendmsg(struct rxrpc_connection *conn,
                       struct rxrpc_message *msg)
 {
        struct msghdr msghdr;
-       mm_segment_t oldfs;
        int ret;
 
        _enter("%p{%d}", conn, ntohs(conn->addr.sin_port));
@@ -634,8 +634,6 @@ int rxrpc_conn_sendmsg(struct rxrpc_connection *conn,
        /* set up the message to be transmitted */
        msghdr.msg_name         = &conn->addr;
        msghdr.msg_namelen      = sizeof(conn->addr);
-       msghdr.msg_iov          = msg->data;
-       msghdr.msg_iovlen       = msg->dcount;
        msghdr.msg_control      = NULL;
        msghdr.msg_controllen   = 0;
        msghdr.msg_flags        = MSG_CONFIRM | MSG_DONTWAIT;
@@ -643,19 +641,15 @@ int rxrpc_conn_sendmsg(struct rxrpc_connection *conn,
        _net("Sending message type %d of %Zd bytes to %08x:%d",
             msg->hdr.type,
             msg->dsize,
-            htonl(conn->addr.sin_addr.s_addr),
-            htons(conn->addr.sin_port));
+            ntohl(conn->addr.sin_addr.s_addr),
+            ntohs(conn->addr.sin_port));
 
        /* send the message */
-       oldfs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = sock_sendmsg(conn->trans->socket, &msghdr, msg->dsize);
-       set_fs(oldfs);
-
+       ret = kernel_sendmsg(conn->trans->socket, &msghdr,
+                            msg->data, msg->dcount, msg->dsize);
        if (ret < 0) {
                msg->state = RXRPC_MSG_ERROR;
-       }
-       else {
+       } else {
                msg->state = RXRPC_MSG_SENT;
                ret = 0;
 
@@ -679,6 +673,7 @@ int rxrpc_conn_receive_call_packet(struct rxrpc_connection *conn,
                                   struct rxrpc_message *msg)
 {
        struct rxrpc_message *pmsg;
+       struct dst_entry *dst;
        struct list_head *_p;
        unsigned cix, seq;
        int ret = 0;
@@ -706,18 +701,18 @@ int rxrpc_conn_receive_call_packet(struct rxrpc_connection *conn,
        }
 
        _proto("Received packet %%%u [%u] on call %hu:%u:%u",
-              htonl(msg->hdr.serial),
-              htonl(msg->hdr.seq),
-              htons(msg->hdr.serviceId),
-              htonl(conn->conn_id),
-              htonl(call->call_id));
+              ntohl(msg->hdr.serial),
+              ntohl(msg->hdr.seq),
+              ntohs(msg->hdr.serviceId),
+              ntohl(conn->conn_id),
+              ntohl(call->call_id));
 
        call->pkt_rcv_count++;
 
-       if (msg->pkt->dst && msg->pkt->dst->dev)
+       dst = msg->pkt->dst;
+       if (dst && dst->dev)
                conn->peer->if_mtu =
-                       msg->pkt->dst->dev->mtu -
-                       msg->pkt->dst->dev->hard_header_len;
+                       dst->dev->mtu - dst->dev->hard_header_len;
 
        /* queue on the call in seq order */
        rxrpc_get_message(msg);