]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - net/iucv/af_iucv.c
af_iucv: remove duplicate sock_set_flag
[linux-2.6.git] / net / iucv / af_iucv.c
index 49c15b48408e5617a5405ba396f1f9b9e427dd5d..3aebabb158a87d9af522600acef8bb45063d9f1f 100644 (file)
@@ -34,7 +34,7 @@
 
 static char iucv_userid[80];
 
-static struct proto_ops iucv_sock_ops;
+static const struct proto_ops iucv_sock_ops;
 
 static struct proto iucv_proto = {
        .name           = "AF_IUCV",
@@ -59,8 +59,8 @@ do {                                                                  \
        DEFINE_WAIT(__wait);                                            \
        long __timeo = timeo;                                           \
        ret = 0;                                                        \
+       prepare_to_wait(sk->sk_sleep, &__wait, TASK_INTERRUPTIBLE);     \
        while (!(condition)) {                                          \
-               prepare_to_wait(sk->sk_sleep, &__wait, TASK_INTERRUPTIBLE); \
                if (!__timeo) {                                         \
                        ret = -EAGAIN;                                  \
                        break;                                          \
@@ -361,10 +361,9 @@ static void iucv_sock_cleanup_listen(struct sock *parent)
        }
 
        parent->sk_state = IUCV_CLOSED;
-       sock_set_flag(parent, SOCK_ZAPPED);
 }
 
-/* Kill socket */
+/* Kill socket (only if zapped and orphaned) */
 static void iucv_sock_kill(struct sock *sk)
 {
        if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
@@ -426,17 +425,17 @@ static void iucv_sock_close(struct sock *sk)
 
                skb_queue_purge(&iucv->send_skb_q);
                skb_queue_purge(&iucv->backlog_skb_q);
-
-               sock_set_flag(sk, SOCK_ZAPPED);
                break;
 
        default:
-               sock_set_flag(sk, SOCK_ZAPPED);
+               /* nothing to do here */
                break;
        }
 
+       /* mark socket for deletion by iucv_sock_kill() */
+       sock_set_flag(sk, SOCK_ZAPPED);
+
        release_sock(sk);
-       iucv_sock_kill(sk);
 }
 
 static void iucv_sock_init(struct sock *sk, struct sock *parent)
@@ -536,7 +535,7 @@ void iucv_accept_enqueue(struct sock *parent, struct sock *sk)
        list_add_tail(&iucv_sk(sk)->accept_q, &par->accept_q);
        spin_unlock_irqrestore(&par->accept_q_lock, flags);
        iucv_sk(sk)->parent = parent;
-       parent->sk_ack_backlog++;
+       sk_acceptq_added(parent);
 }
 
 void iucv_accept_unlink(struct sock *sk)
@@ -547,7 +546,7 @@ void iucv_accept_unlink(struct sock *sk)
        spin_lock_irqsave(&par->accept_q_lock, flags);
        list_del_init(&iucv_sk(sk)->accept_q);
        spin_unlock_irqrestore(&par->accept_q_lock, flags);
-       iucv_sk(sk)->parent->sk_ack_backlog--;
+       sk_acceptq_removed(iucv_sk(sk)->parent);
        iucv_sk(sk)->parent = NULL;
        sock_put(sk);
 }
@@ -569,6 +568,7 @@ struct sock *iucv_accept_dequeue(struct sock *parent, struct socket *newsock)
 
                if (sk->sk_state == IUCV_CONNECTED ||
                    sk->sk_state == IUCV_SEVERED ||
+                   sk->sk_state == IUCV_DISCONN ||     /* due to PM restore */
                    !newsock) {
                        iucv_accept_unlink(sk);
                        if (newsock)
@@ -1035,6 +1035,10 @@ out:
        return err;
 }
 
+/* iucv_fragment_skb() - Fragment a single IUCV message into multiple skb's
+ *
+ * Locking: must be called with message_q.lock held
+ */
 static int iucv_fragment_skb(struct sock *sk, struct sk_buff *skb, int len)
 {
        int dataleft, size, copied = 0;
@@ -1069,6 +1073,10 @@ static int iucv_fragment_skb(struct sock *sk, struct sk_buff *skb, int len)
        return 0;
 }
 
+/* iucv_process_message() - Receive a single outstanding IUCV message
+ *
+ * Locking: must be called with message_q.lock held
+ */
 static void iucv_process_message(struct sock *sk, struct sk_buff *skb,
                                 struct iucv_path *path,
                                 struct iucv_message *msg)
@@ -1119,6 +1127,10 @@ static void iucv_process_message(struct sock *sk, struct sk_buff *skb,
                skb_queue_head(&iucv_sk(sk)->backlog_skb_q, skb);
 }
 
+/* iucv_process_message_q() - Process outstanding IUCV messages
+ *
+ * Locking: must be called with message_q.lock held
+ */
 static void iucv_process_message_q(struct sock *sk)
 {
        struct iucv_sock *iucv = iucv_sk(sk);
@@ -1209,6 +1221,7 @@ static int iucv_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
                kfree_skb(skb);
 
                /* Queue backlog skbs */
+               spin_lock_bh(&iucv->message_q.lock);
                rskb = skb_dequeue(&iucv->backlog_skb_q);
                while (rskb) {
                        if (sock_queue_rcv_skb(sk, rskb)) {
@@ -1220,11 +1233,10 @@ static int iucv_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
                        }
                }
                if (skb_queue_empty(&iucv->backlog_skb_q)) {
-                       spin_lock_bh(&iucv->message_q.lock);
                        if (!list_empty(&iucv->message_q.list))
                                iucv_process_message_q(sk);
-                       spin_unlock_bh(&iucv->message_q.lock);
                }
+               spin_unlock_bh(&iucv->message_q.lock);
        }
 
 done:
@@ -1374,7 +1386,7 @@ static int iucv_sock_release(struct socket *sock)
 
 /* getsockopt and setsockopt */
 static int iucv_sock_setsockopt(struct socket *sock, int level, int optname,
-                               char __user *optval, int optlen)
+                               char __user *optval, unsigned int optlen)
 {
        struct sock *sk = sock->sk;
        struct iucv_sock *iucv = iucv_sk(sk);
@@ -1682,7 +1694,7 @@ static void iucv_callback_shutdown(struct iucv_path *path, u8 ipuser[16])
        bh_unlock_sock(sk);
 }
 
-static struct proto_ops iucv_sock_ops = {
+static const struct proto_ops iucv_sock_ops = {
        .family         = PF_IUCV,
        .owner          = THIS_MODULE,
        .release        = iucv_sock_release,
@@ -1702,7 +1714,7 @@ static struct proto_ops iucv_sock_ops = {
        .getsockopt     = iucv_sock_getsockopt,
 };
 
-static struct net_proto_family iucv_sock_family_ops = {
+static const struct net_proto_family iucv_sock_family_ops = {
        .family = AF_IUCV,
        .owner  = THIS_MODULE,
        .create = iucv_sock_create,