ceph: fix printing of ipv6 addrs

The buffer was too small. Make it bigger, use snprintf(), put brackets
around the ipv6 address to avoid mixing it up with the :port, and use the
ever-so-handy %pI[46] formats.

Signed-off-by: Sage Weil <sage@newdream.net>

Sage Weil d06dbaf6 b0bbb0be

+6 -18
+6 -18
fs/ceph/messenger.c
··· 43 * nicely render a sockaddr as a string. 44 */ 45 #define MAX_ADDR_STR 20 46 - static char addr_str[MAX_ADDR_STR][40]; 47 static DEFINE_SPINLOCK(addr_str_lock); 48 static int last_addr_str; 49 ··· 53 int i; 54 char *s; 55 struct sockaddr_in *in4 = (void *)ss; 56 - unsigned char *quad = (void *)&in4->sin_addr.s_addr; 57 struct sockaddr_in6 *in6 = (void *)ss; 58 59 spin_lock(&addr_str_lock); ··· 64 65 switch (ss->ss_family) { 66 case AF_INET: 67 - sprintf(s, "%u.%u.%u.%u:%u", 68 - (unsigned int)quad[0], 69 - (unsigned int)quad[1], 70 - (unsigned int)quad[2], 71 - (unsigned int)quad[3], 72 - (unsigned int)ntohs(in4->sin_port)); 73 break; 74 75 case AF_INET6: 76 - sprintf(s, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%u", 77 - in6->sin6_addr.s6_addr16[0], 78 - in6->sin6_addr.s6_addr16[1], 79 - in6->sin6_addr.s6_addr16[2], 80 - in6->sin6_addr.s6_addr16[3], 81 - in6->sin6_addr.s6_addr16[4], 82 - in6->sin6_addr.s6_addr16[5], 83 - in6->sin6_addr.s6_addr16[6], 84 - in6->sin6_addr.s6_addr16[7], 85 - (unsigned int)ntohs(in6->sin6_port)); 86 break; 87 88 default:
··· 43 * nicely render a sockaddr as a string. 44 */ 45 #define MAX_ADDR_STR 20 46 + #define MAX_ADDR_STR_LEN 60 47 + static char addr_str[MAX_ADDR_STR][MAX_ADDR_STR_LEN]; 48 static DEFINE_SPINLOCK(addr_str_lock); 49 static int last_addr_str; 50 ··· 52 int i; 53 char *s; 54 struct sockaddr_in *in4 = (void *)ss; 55 struct sockaddr_in6 *in6 = (void *)ss; 56 57 spin_lock(&addr_str_lock); ··· 64 65 switch (ss->ss_family) { 66 case AF_INET: 67 + snprintf(s, MAX_ADDR_STR_LEN, "%pI4:%u", &in4->sin_addr, 68 + (unsigned int)ntohs(in4->sin_port)); 69 break; 70 71 case AF_INET6: 72 + snprintf(s, MAX_ADDR_STR_LEN, "[%pI6c]:%u", &in6->sin6_addr, 73 + (unsigned int)ntohs(in6->sin6_port)); 74 break; 75 76 default: