Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libceph: make ceph_pr_addr take an struct ceph_entity_addr pointer

GCC9 is throwing a lot of warnings about unaligned accesses by
callers of ceph_pr_addr. All of the current callers are passing a
pointer to the sockaddr inside struct ceph_entity_addr.

Fix it to take a pointer to a struct ceph_entity_addr instead,
and then have the function make a copy of the sockaddr before
printing it.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>

authored by

Jeff Layton and committed by
Ilya Dryomov
b726ec97 cede185b

+35 -34
+1 -1
fs/ceph/debugfs.c
··· 37 37 struct ceph_entity_addr *addr = &mdsmap->m_info[i].addr; 38 38 int state = mdsmap->m_info[i].state; 39 39 seq_printf(s, "\tmds%d\t%s\t(%s)\n", i, 40 - ceph_pr_addr(&addr->in_addr), 40 + ceph_pr_addr(addr), 41 41 ceph_mds_state_name(state)); 42 42 } 43 43 return 0;
+1 -1
fs/ceph/mdsmap.c
··· 205 205 206 206 dout("mdsmap_decode %d/%d %lld mds%d.%d %s %s\n", 207 207 i+1, n, global_id, mds, inc, 208 - ceph_pr_addr(&addr.in_addr), 208 + ceph_pr_addr(&addr), 209 209 ceph_mds_state_name(state)); 210 210 211 211 if (mds < 0 || state <= 0)
+2 -1
include/linux/ceph/messenger.h
··· 323 323 }; 324 324 325 325 326 - extern const char *ceph_pr_addr(const struct sockaddr_storage *ss); 326 + extern const char *ceph_pr_addr(const struct ceph_entity_addr *addr); 327 + 327 328 extern int ceph_parse_ips(const char *c, const char *end, 328 329 struct ceph_entity_addr *addr, 329 330 int max_count, int *count);
+1 -1
net/ceph/cls_lock_client.c
··· 271 271 272 272 dout("%s %s%llu cookie %s addr %s\n", __func__, 273 273 ENTITY_NAME(locker->id.name), locker->id.cookie, 274 - ceph_pr_addr(&locker->info.addr.in_addr)); 274 + ceph_pr_addr(&locker->info.addr)); 275 275 return 0; 276 276 } 277 277
+2 -2
net/ceph/debugfs.c
··· 46 46 47 47 seq_printf(s, "\t%s%lld\t%s\n", 48 48 ENTITY_NAME(inst->name), 49 - ceph_pr_addr(&inst->addr.in_addr)); 49 + ceph_pr_addr(&inst->addr)); 50 50 } 51 51 return 0; 52 52 } ··· 82 82 char sb[64]; 83 83 84 84 seq_printf(s, "osd%d\t%s\t%3d%%\t(%s)\t%3d%%\n", 85 - i, ceph_pr_addr(&addr->in_addr), 85 + i, ceph_pr_addr(addr), 86 86 ((map->osd_weight[i]*100) >> 16), 87 87 ceph_osdmap_state_str(sb, sizeof(sb), state), 88 88 ((ceph_get_primary_affinity(map, i)*100) >> 16));
+24 -24
net/ceph/messenger.c
··· 186 186 187 187 static struct page *zero_page; /* used in certain error cases */ 188 188 189 - const char *ceph_pr_addr(const struct sockaddr_storage *ss) 189 + const char *ceph_pr_addr(const struct ceph_entity_addr *addr) 190 190 { 191 191 int i; 192 192 char *s; 193 - struct sockaddr_in *in4 = (struct sockaddr_in *) ss; 194 - struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) ss; 193 + struct sockaddr_storage ss = addr->in_addr; /* align */ 194 + struct sockaddr_in *in4 = (struct sockaddr_in *)&ss; 195 + struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)&ss; 195 196 196 197 i = atomic_inc_return(&addr_str_seq) & ADDR_STR_COUNT_MASK; 197 198 s = addr_str[i]; 198 199 199 - switch (ss->ss_family) { 200 + switch (ss.ss_family) { 200 201 case AF_INET: 201 202 snprintf(s, MAX_ADDR_STR_LEN, "%pI4:%hu", &in4->sin_addr, 202 203 ntohs(in4->sin_port)); ··· 210 209 211 210 default: 212 211 snprintf(s, MAX_ADDR_STR_LEN, "(unknown sockaddr family %hu)", 213 - ss->ss_family); 212 + ss.ss_family); 214 213 } 215 214 216 215 return s; ··· 472 471 473 472 set_sock_callbacks(sock, con); 474 473 475 - dout("connect %s\n", ceph_pr_addr(&con->peer_addr.in_addr)); 474 + dout("connect %s\n", ceph_pr_addr(&con->peer_addr)); 476 475 477 476 con_sock_state_connecting(con); 478 477 ret = sock->ops->connect(sock, (struct sockaddr *)&ss, sizeof(ss), 479 478 O_NONBLOCK); 480 479 if (ret == -EINPROGRESS) { 481 480 dout("connect %s EINPROGRESS sk_state = %u\n", 482 - ceph_pr_addr(&con->peer_addr.in_addr), 481 + ceph_pr_addr(&con->peer_addr), 483 482 sock->sk->sk_state); 484 483 } else if (ret < 0) { 485 484 pr_err("connect %s error %d\n", 486 - ceph_pr_addr(&con->peer_addr.in_addr), ret); 485 + ceph_pr_addr(&con->peer_addr), ret); 487 486 sock_release(sock); 488 487 return ret; 489 488 } ··· 670 669 void ceph_con_close(struct ceph_connection *con) 671 670 { 672 671 mutex_lock(&con->mutex); 673 - dout("con_close %p peer %s\n", con, 674 - ceph_pr_addr(&con->peer_addr.in_addr)); 672 + dout("con_close %p peer %s\n", con, ceph_pr_addr(&con->peer_addr)); 675 673 con->state = CON_STATE_CLOSED; 676 674 677 675 con_flag_clear(con, CON_FLAG_LOSSYTX); /* so we retry next connect */ ··· 694 694 struct ceph_entity_addr *addr) 695 695 { 696 696 mutex_lock(&con->mutex); 697 - dout("con_open %p %s\n", con, ceph_pr_addr(&addr->in_addr)); 697 + dout("con_open %p %s\n", con, ceph_pr_addr(addr)); 698 698 699 699 WARN_ON(con->state != CON_STATE_CLOSED); 700 700 con->state = CON_STATE_PREOPEN; ··· 1788 1788 { 1789 1789 if (memcmp(con->in_banner, CEPH_BANNER, strlen(CEPH_BANNER))) { 1790 1790 pr_err("connect to %s got bad banner\n", 1791 - ceph_pr_addr(&con->peer_addr.in_addr)); 1791 + ceph_pr_addr(&con->peer_addr)); 1792 1792 con->error_msg = "protocol error, bad banner"; 1793 1793 return -1; 1794 1794 } ··· 1898 1898 *ipend = end; 1899 1899 1900 1900 pr_info("resolve '%.*s' (ret=%d): %s\n", (int)(end - name), name, 1901 - ret, ret ? "failed" : ceph_pr_addr(&addr->in_addr)); 1901 + ret, ret ? "failed" : ceph_pr_addr(addr)); 1902 1902 1903 1903 return ret; 1904 1904 } ··· 1981 1981 1982 1982 addr_set_port(&addr[i], port); 1983 1983 1984 - dout("parse_ips got %s\n", ceph_pr_addr(&addr[i].in_addr)); 1984 + dout("parse_ips got %s\n", ceph_pr_addr(&addr[i])); 1985 1985 1986 1986 if (p == end) 1987 1987 break; ··· 2023 2023 !(addr_is_blank(&con->actual_peer_addr) && 2024 2024 con->actual_peer_addr.nonce == con->peer_addr.nonce)) { 2025 2025 pr_warn("wrong peer, want %s/%d, got %s/%d\n", 2026 - ceph_pr_addr(&con->peer_addr.in_addr), 2026 + ceph_pr_addr(&con->peer_addr), 2027 2027 (int)le32_to_cpu(con->peer_addr.nonce), 2028 - ceph_pr_addr(&con->actual_peer_addr.in_addr), 2028 + ceph_pr_addr(&con->actual_peer_addr), 2029 2029 (int)le32_to_cpu(con->actual_peer_addr.nonce)); 2030 2030 con->error_msg = "wrong peer at address"; 2031 2031 return -1; ··· 2043 2043 addr_set_port(&con->msgr->inst.addr, port); 2044 2044 encode_my_addr(con->msgr); 2045 2045 dout("process_banner learned my addr is %s\n", 2046 - ceph_pr_addr(&con->msgr->inst.addr.in_addr)); 2046 + ceph_pr_addr(&con->msgr->inst.addr)); 2047 2047 } 2048 2048 2049 2049 return 0; ··· 2094 2094 pr_err("%s%lld %s feature set mismatch," 2095 2095 " my %llx < server's %llx, missing %llx\n", 2096 2096 ENTITY_NAME(con->peer_name), 2097 - ceph_pr_addr(&con->peer_addr.in_addr), 2097 + ceph_pr_addr(&con->peer_addr), 2098 2098 sup_feat, server_feat, server_feat & ~sup_feat); 2099 2099 con->error_msg = "missing required protocol features"; 2100 2100 reset_connection(con); ··· 2104 2104 pr_err("%s%lld %s protocol version mismatch," 2105 2105 " my %d != server's %d\n", 2106 2106 ENTITY_NAME(con->peer_name), 2107 - ceph_pr_addr(&con->peer_addr.in_addr), 2107 + ceph_pr_addr(&con->peer_addr), 2108 2108 le32_to_cpu(con->out_connect.protocol_version), 2109 2109 le32_to_cpu(con->in_reply.protocol_version)); 2110 2110 con->error_msg = "protocol version mismatch"; ··· 2138 2138 le32_to_cpu(con->in_reply.connect_seq)); 2139 2139 pr_err("%s%lld %s connection reset\n", 2140 2140 ENTITY_NAME(con->peer_name), 2141 - ceph_pr_addr(&con->peer_addr.in_addr)); 2141 + ceph_pr_addr(&con->peer_addr)); 2142 2142 reset_connection(con); 2143 2143 con_out_kvec_reset(con); 2144 2144 ret = prepare_write_connect(con); ··· 2195 2195 pr_err("%s%lld %s protocol feature mismatch," 2196 2196 " my required %llx > server's %llx, need %llx\n", 2197 2197 ENTITY_NAME(con->peer_name), 2198 - ceph_pr_addr(&con->peer_addr.in_addr), 2198 + ceph_pr_addr(&con->peer_addr), 2199 2199 req_feat, server_feat, req_feat & ~server_feat); 2200 2200 con->error_msg = "missing required protocol features"; 2201 2201 reset_connection(con); ··· 2402 2402 if ((s64)seq - (s64)con->in_seq < 1) { 2403 2403 pr_info("skipping %s%lld %s seq %lld expected %lld\n", 2404 2404 ENTITY_NAME(con->peer_name), 2405 - ceph_pr_addr(&con->peer_addr.in_addr), 2405 + ceph_pr_addr(&con->peer_addr), 2406 2406 seq, con->in_seq + 1); 2407 2407 con->in_base_pos = -front_len - middle_len - data_len - 2408 2408 sizeof_footer(con); ··· 2981 2981 static void con_fault(struct ceph_connection *con) 2982 2982 { 2983 2983 dout("fault %p state %lu to peer %s\n", 2984 - con, con->state, ceph_pr_addr(&con->peer_addr.in_addr)); 2984 + con, con->state, ceph_pr_addr(&con->peer_addr)); 2985 2985 2986 2986 pr_warn("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), 2987 - ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg); 2987 + ceph_pr_addr(&con->peer_addr), con->error_msg); 2988 2988 con->error_msg = NULL; 2989 2989 2990 2990 WARN_ON(con->state != CON_STATE_CONNECTING &&
+3 -3
net/ceph/mon_client.c
··· 76 76 m->num_mon); 77 77 for (i = 0; i < m->num_mon; i++) 78 78 dout("monmap_decode mon%d is %s\n", i, 79 - ceph_pr_addr(&m->mon_inst[i].addr.in_addr)); 79 + ceph_pr_addr(&m->mon_inst[i].addr)); 80 80 return m; 81 81 82 82 bad: ··· 203 203 { 204 204 if (!monc->hunting) 205 205 pr_info("mon%d %s session lost, hunting for new mon\n", 206 - monc->cur_mon, ceph_pr_addr(&monc->con.peer_addr.in_addr)); 206 + monc->cur_mon, ceph_pr_addr(&monc->con.peer_addr)); 207 207 208 208 __close_session(monc); 209 209 __open_session(monc); ··· 1178 1178 __resend_generic_request(monc); 1179 1179 1180 1180 pr_info("mon%d %s session established\n", monc->cur_mon, 1181 - ceph_pr_addr(&monc->con.peer_addr.in_addr)); 1181 + ceph_pr_addr(&monc->con.peer_addr)); 1182 1182 } 1183 1183 1184 1184 out:
+1 -1
net/ceph/osd_client.c
··· 4926 4926 4927 4927 dout("%s %s%llu cookie %llu addr %s\n", __func__, 4928 4928 ENTITY_NAME(item->name), item->cookie, 4929 - ceph_pr_addr(&item->addr.in_addr)); 4929 + ceph_pr_addr(&item->addr)); 4930 4930 return 0; 4931 4931 } 4932 4932