ocfs2/trivial: Use proper mask for 2 places in hearbeat.c
[safe/jmp/linux-2.6] / fs / ocfs2 / cluster / tcp.c
index 1170918..334f231 100644 (file)
@@ -142,6 +142,74 @@ static void o2net_idle_timer(unsigned long data);
 static void o2net_sc_postpone_idle(struct o2net_sock_container *sc);
 static void o2net_sc_reset_idle_timer(struct o2net_sock_container *sc);
 
+#ifdef CONFIG_DEBUG_FS
+static void o2net_init_nst(struct o2net_send_tracking *nst, u32 msgtype,
+                          u32 msgkey, struct task_struct *task, u8 node)
+{
+       INIT_LIST_HEAD(&nst->st_net_debug_item);
+       nst->st_task = task;
+       nst->st_msg_type = msgtype;
+       nst->st_msg_key = msgkey;
+       nst->st_node = node;
+}
+
+static void o2net_set_nst_sock_time(struct o2net_send_tracking *nst)
+{
+       do_gettimeofday(&nst->st_sock_time);
+}
+
+static void o2net_set_nst_send_time(struct o2net_send_tracking *nst)
+{
+       do_gettimeofday(&nst->st_send_time);
+}
+
+static void o2net_set_nst_status_time(struct o2net_send_tracking *nst)
+{
+       do_gettimeofday(&nst->st_status_time);
+}
+
+static void o2net_set_nst_sock_container(struct o2net_send_tracking *nst,
+                                        struct o2net_sock_container *sc)
+{
+       nst->st_sc = sc;
+}
+
+static void o2net_set_nst_msg_id(struct o2net_send_tracking *nst, u32 msg_id)
+{
+       nst->st_id = msg_id;
+}
+
+#else  /* CONFIG_DEBUG_FS */
+
+static inline void o2net_init_nst(struct o2net_send_tracking *nst, u32 msgtype,
+                                 u32 msgkey, struct task_struct *task, u8 node)
+{
+}
+
+static inline void o2net_set_nst_sock_time(struct o2net_send_tracking *nst)
+{
+}
+
+static inline void o2net_set_nst_send_time(struct o2net_send_tracking *nst)
+{
+}
+
+static inline void o2net_set_nst_status_time(struct o2net_send_tracking *nst)
+{
+}
+
+static inline void o2net_set_nst_sock_container(struct o2net_send_tracking *nst,
+                                               struct o2net_sock_container *sc)
+{
+}
+
+static inline void o2net_set_nst_msg_id(struct o2net_send_tracking *nst,
+                                       u32 msg_id)
+{
+}
+
+#endif /* CONFIG_DEBUG_FS */
+
 static inline int o2net_reconnect_delay(void)
 {
        return o2nm_single_cluster->cl_reconnect_delay_ms;
@@ -290,6 +358,7 @@ static void sc_kref_release(struct kref *kref)
        o2nm_node_put(sc->sc_node);
        sc->sc_node = NULL;
 
+       o2net_debug_del_sc(sc);
        kfree(sc);
 }
 
@@ -330,6 +399,7 @@ static struct o2net_sock_container *sc_alloc(struct o2nm_node *node)
 
        ret = sc;
        sc->sc_page = page;
+       o2net_debug_add_sc(sc);
        sc = NULL;
        page = NULL;
 
@@ -904,7 +974,7 @@ static int o2net_tx_can_proceed(struct o2net_node *nn,
 int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec,
                           size_t caller_veclen, u8 target_node, int *status)
 {
-       int ret, error = 0;
+       int ret;
        struct o2net_msg *msg = NULL;
        size_t veclen, caller_bytes = 0;
        struct kvec *vec = NULL;
@@ -913,6 +983,9 @@ int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec,
        struct o2net_status_wait nsw = {
                .ns_node_item = LIST_HEAD_INIT(nsw.ns_node_item),
        };
+       struct o2net_send_tracking nst;
+
+       o2net_init_nst(&nst, msg_type, key, current, target_node);
 
        if (o2net_wq == NULL) {
                mlog(0, "attempt to tx without o2netd running\n");
@@ -938,13 +1011,16 @@ int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec,
                goto out;
        }
 
-       ret = wait_event_interruptible(nn->nn_sc_wq,
-                                      o2net_tx_can_proceed(nn, &sc, &error));
-       if (!ret && error)
-               ret = error;
+       o2net_debug_add_nst(&nst);
+
+       o2net_set_nst_sock_time(&nst);
+
+       wait_event(nn->nn_sc_wq, o2net_tx_can_proceed(nn, &sc, &ret));
        if (ret)
                goto out;
 
+       o2net_set_nst_sock_container(&nst, sc);
+
        veclen = caller_veclen + 1;
        vec = kmalloc(sizeof(struct kvec) * veclen, GFP_ATOMIC);
        if (vec == NULL) {
@@ -971,6 +1047,9 @@ int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec,
                goto out;
 
        msg->msg_num = cpu_to_be32(nsw.ns_id);
+       o2net_set_nst_msg_id(&nst, nsw.ns_id);
+
+       o2net_set_nst_send_time(&nst);
 
        /* finally, convert the message header to network byte-order
         * and send */
@@ -985,6 +1064,7 @@ int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec,
        }
 
        /* wait on other node's handler */
+       o2net_set_nst_status_time(&nst);
        wait_event(nsw.ns_wq, o2net_nsw_completed(nn, &nsw));
 
        /* Note that we avoid overwriting the callers status return
@@ -997,6 +1077,7 @@ int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec,
        mlog(0, "woken, returning system status %d, user status %d\n",
             ret, nsw.ns_status);
 out:
+       o2net_debug_del_nst(&nst); /* must be before dropping sc and node */
        if (sc)
                sc_put(sc);
        if (vec)
@@ -1513,8 +1594,8 @@ static void o2net_start_connect(struct work_struct *work)
        ret = sock->ops->bind(sock, (struct sockaddr *)&myaddr,
                              sizeof(myaddr));
        if (ret) {
-               mlog(ML_ERROR, "bind failed with %d at address %u.%u.%u.%u\n",
-                    ret, NIPQUAD(mynode->nd_ipv4_address));
+               mlog(ML_ERROR, "bind failed with %d at address %pI4\n",
+                    ret, &mynode->nd_ipv4_address);
                goto out;
        }
 
@@ -1706,17 +1787,16 @@ static int o2net_accept_one(struct socket *sock)
 
        node = o2nm_get_node_by_ip(sin.sin_addr.s_addr);
        if (node == NULL) {
-               mlog(ML_NOTICE, "attempt to connect from unknown node at "
-                    "%u.%u.%u.%u:%d\n", NIPQUAD(sin.sin_addr.s_addr),
-                    ntohs(sin.sin_port));
+               mlog(ML_NOTICE, "attempt to connect from unknown node at %pI4:%d\n",
+                    &sin.sin_addr.s_addr, ntohs(sin.sin_port));
                ret = -EINVAL;
                goto out;
        }
 
        if (o2nm_this_node() > node->nd_num) {
                mlog(ML_NOTICE, "unexpected connect attempted from a lower "
-                    "numbered node '%s' at " "%u.%u.%u.%u:%d with num %u\n",
-                    node->nd_name, NIPQUAD(sin.sin_addr.s_addr),
+                    "numbered node '%s' at " "%pI4:%d with num %u\n",
+                    node->nd_name, &sin.sin_addr.s_addr,
                     ntohs(sin.sin_port), node->nd_num);
                ret = -EINVAL;
                goto out;
@@ -1726,8 +1806,8 @@ static int o2net_accept_one(struct socket *sock)
         * and tries to connect before we see their heartbeat */
        if (!o2hb_check_node_heartbeating_from_callback(node->nd_num)) {
                mlog(ML_CONN, "attempt to connect from node '%s' at "
-                    "%u.%u.%u.%u:%d but it isn't heartbeating\n",
-                    node->nd_name, NIPQUAD(sin.sin_addr.s_addr),
+                    "%pI4:%d but it isn't heartbeating\n",
+                    node->nd_name, &sin.sin_addr.s_addr,
                     ntohs(sin.sin_port));
                ret = -EINVAL;
                goto out;
@@ -1743,8 +1823,8 @@ static int o2net_accept_one(struct socket *sock)
        spin_unlock(&nn->nn_lock);
        if (ret) {
                mlog(ML_NOTICE, "attempt to connect from node '%s' at "
-                    "%u.%u.%u.%u:%d but it already has an open connection\n",
-                    node->nd_name, NIPQUAD(sin.sin_addr.s_addr),
+                    "%pI4:%d but it already has an open connection\n",
+                    node->nd_name, &sin.sin_addr.s_addr,
                     ntohs(sin.sin_port));
                goto out;
        }
@@ -1840,15 +1920,15 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port)
        sock->sk->sk_reuse = 1;
        ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
        if (ret < 0) {
-               mlog(ML_ERROR, "unable to bind socket at %u.%u.%u.%u:%u, "
-                    "ret=%d\n", NIPQUAD(addr), ntohs(port), ret);
+               mlog(ML_ERROR, "unable to bind socket at %pI4:%u, "
+                    "ret=%d\n", &addr, ntohs(port), ret);
                goto out;
        }
 
        ret = sock->ops->listen(sock, 64);
        if (ret < 0) {
-               mlog(ML_ERROR, "unable to listen on %u.%u.%u.%u:%u, ret=%d\n",
-                    NIPQUAD(addr), ntohs(port), ret);
+               mlog(ML_ERROR, "unable to listen on %pI4:%u, ret=%d\n",
+                    &addr, ntohs(port), ret);
        }
 
 out:
@@ -1935,6 +2015,9 @@ int o2net_init(void)
 
        o2quo_init();
 
+       if (o2net_debugfs_init())
+               return -ENOMEM;
+
        o2net_hand = kzalloc(sizeof(struct o2net_handshake), GFP_KERNEL);
        o2net_keep_req = kzalloc(sizeof(struct o2net_msg), GFP_KERNEL);
        o2net_keep_resp = kzalloc(sizeof(struct o2net_msg), GFP_KERNEL);
@@ -1976,4 +2059,5 @@ void o2net_exit(void)
        kfree(o2net_hand);
        kfree(o2net_keep_req);
        kfree(o2net_keep_resp);
+       o2net_debugfs_exit();
 }