]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/tipc/port.c
Merge branch 'kmap_atomic' of git://github.com/congwang/linux
[karo-tx-linux.git] / net / tipc / port.c
index 2cbac3956fc96839f4e36bff2f4f8de43e2b9e24..07c42fba672be17a4a127b8907f52a3520801f1f 100644 (file)
@@ -581,67 +581,73 @@ exit:
        kfree_skb(buf);
 }
 
-static void port_print(struct tipc_port *p_ptr, struct print_buf *buf, int full_id)
+static int port_print(struct tipc_port *p_ptr, char *buf, int len, int full_id)
 {
        struct publication *publ;
+       int ret;
 
        if (full_id)
-               tipc_printf(buf, "<%u.%u.%u:%u>:",
-                           tipc_zone(tipc_own_addr), tipc_cluster(tipc_own_addr),
-                           tipc_node(tipc_own_addr), p_ptr->ref);
+               ret = tipc_snprintf(buf, len, "<%u.%u.%u:%u>:",
+                                   tipc_zone(tipc_own_addr),
+                                   tipc_cluster(tipc_own_addr),
+                                   tipc_node(tipc_own_addr), p_ptr->ref);
        else
-               tipc_printf(buf, "%-10u:", p_ptr->ref);
+               ret = tipc_snprintf(buf, len, "%-10u:", p_ptr->ref);
 
        if (p_ptr->connected) {
                u32 dport = port_peerport(p_ptr);
                u32 destnode = port_peernode(p_ptr);
 
-               tipc_printf(buf, " connected to <%u.%u.%u:%u>",
-                           tipc_zone(destnode), tipc_cluster(destnode),
-                           tipc_node(destnode), dport);
+               ret += tipc_snprintf(buf + ret, len - ret,
+                                    " connected to <%u.%u.%u:%u>",
+                                    tipc_zone(destnode),
+                                    tipc_cluster(destnode),
+                                    tipc_node(destnode), dport);
                if (p_ptr->conn_type != 0)
-                       tipc_printf(buf, " via {%u,%u}",
-                                   p_ptr->conn_type,
-                                   p_ptr->conn_instance);
+                       ret += tipc_snprintf(buf + ret, len - ret,
+                                            " via {%u,%u}", p_ptr->conn_type,
+                                            p_ptr->conn_instance);
        } else if (p_ptr->published) {
-               tipc_printf(buf, " bound to");
+               ret += tipc_snprintf(buf + ret, len - ret, " bound to");
                list_for_each_entry(publ, &p_ptr->publications, pport_list) {
                        if (publ->lower == publ->upper)
-                               tipc_printf(buf, " {%u,%u}", publ->type,
-                                           publ->lower);
+                               ret += tipc_snprintf(buf + ret, len - ret,
+                                                    " {%u,%u}", publ->type,
+                                                    publ->lower);
                        else
-                               tipc_printf(buf, " {%u,%u,%u}", publ->type,
-                                           publ->lower, publ->upper);
+                               ret += tipc_snprintf(buf + ret, len - ret,
+                                                    " {%u,%u,%u}", publ->type,
+                                                    publ->lower, publ->upper);
                }
        }
-       tipc_printf(buf, "\n");
+       ret += tipc_snprintf(buf + ret, len - ret, "\n");
+       return ret;
 }
 
-#define MAX_PORT_QUERY 32768
-
 struct sk_buff *tipc_port_get_ports(void)
 {
        struct sk_buff *buf;
        struct tlv_desc *rep_tlv;
-       struct print_buf pb;
+       char *pb;
+       int pb_len;
        struct tipc_port *p_ptr;
-       int str_len;
+       int str_len = 0;
 
-       buf = tipc_cfg_reply_alloc(TLV_SPACE(MAX_PORT_QUERY));
+       buf = tipc_cfg_reply_alloc(TLV_SPACE(ULTRA_STRING_MAX_LEN));
        if (!buf)
                return NULL;
        rep_tlv = (struct tlv_desc *)buf->data;
+       pb = TLV_DATA(rep_tlv);
+       pb_len = ULTRA_STRING_MAX_LEN;
 
-       tipc_printbuf_init(&pb, TLV_DATA(rep_tlv), MAX_PORT_QUERY);
        spin_lock_bh(&tipc_port_list_lock);
        list_for_each_entry(p_ptr, &ports, port_list) {
                spin_lock_bh(p_ptr->lock);
-               port_print(p_ptr, &pb, 0);
+               str_len += port_print(p_ptr, pb, pb_len, 0);
                spin_unlock_bh(p_ptr->lock);
        }
        spin_unlock_bh(&tipc_port_list_lock);
-       str_len = tipc_printbuf_validate(&pb);
-
+       str_len += 1;   /* for "\0" */
        skb_put(buf, TLV_SPACE(str_len));
        TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len);