@@ -1163,7 +1163,8 @@ static void scoutfs_net_connect_worker(struct work_struct *work)
11631163
11641164 trace_scoutfs_net_connect_work_enter (sb , 0 , 0 );
11651165
1166- ret = kc_sock_create_kern (AF_INET , SOCK_STREAM , IPPROTO_TCP , & sock );
1166+ ret = kc_sock_create_kern (conn -> connect_sin .ss_family ,
1167+ SOCK_STREAM , IPPROTO_TCP , & sock );
11671168 if (ret )
11681169 goto out ;
11691170
@@ -1184,7 +1185,9 @@ static void scoutfs_net_connect_worker(struct work_struct *work)
11841185 trace_scoutfs_conn_connect_start (conn );
11851186
11861187 ret = kernel_connect (sock , (struct sockaddr * )& conn -> connect_sin ,
1187- sizeof (struct sockaddr_in ), 0 );
1188+ conn -> connect_sin .ss_family == AF_INET ?
1189+ sizeof (struct sockaddr_in ) : sizeof (struct sockaddr_in6 ),
1190+ 0 );
11881191 if (ret )
11891192 goto out ;
11901193
@@ -1226,6 +1229,13 @@ static bool empty_accepted_list(struct scoutfs_net_connection *conn)
12261229 return empty ;
12271230}
12281231
1232+ /*
1233+ * sockaddr_storage wraps both _in and _in6, which have _port always
1234+ * __be16 at the same offset, and we only need to test whether it's
1235+ * zero.
1236+ */
1237+ #define sockaddr_port_is_nonzero (sin ) ((sin).__data[0] || (sin).__data[1])
1238+
12291239/*
12301240 * Safely shut down an active connection. This can be triggered by
12311241 * errors in workers or by an external call to free the connection. The
@@ -1249,7 +1259,7 @@ static void scoutfs_net_shutdown_worker(struct work_struct *work)
12491259 trace_scoutfs_conn_shutdown_start (conn );
12501260
12511261 /* connected and accepted conns print a message */
1252- if (conn -> peername . sin_port != 0 )
1262+ if (sockaddr_port_is_nonzero ( conn -> peername ) )
12531263 scoutfs_info (sb , "%s " SIN_FMT " -> " SIN_FMT ,
12541264 conn -> listening_conn ? "server closing" :
12551265 "client disconnected" ,
@@ -1379,6 +1389,7 @@ static void scoutfs_net_reconn_free_worker(struct work_struct *work)
13791389 DEFINE_CONN_FROM_WORK (conn , work , reconn_free_dwork .work );
13801390 struct super_block * sb = conn -> sb ;
13811391 struct scoutfs_net_connection * acc ;
1392+ union scoutfs_inet_addr addr ;
13821393 unsigned long now = jiffies ;
13831394 unsigned long deadline = 0 ;
13841395 bool requeue = false;
@@ -1399,8 +1410,9 @@ static void scoutfs_net_reconn_free_worker(struct work_struct *work)
13991410 if (!test_conn_fl (conn , shutting_down )) {
14001411 scoutfs_info (sb , "client " SIN_FMT " reconnect timed out, fencing" ,
14011412 SIN_ARG (& acc -> last_peername ));
1413+ scoutfs_sin_to_addr (& addr , & acc -> last_peername );
14021414 ret = scoutfs_fence_start (sb , acc -> rid ,
1403- acc -> last_peername . sin_addr . s_addr ,
1415+ & addr ,
14041416 SCOUTFS_FENCE_CLIENT_RECONNECT );
14051417 if (ret ) {
14061418 scoutfs_err (sb , "client fence returned err %d, shutting down server" ,
@@ -1483,9 +1495,9 @@ scoutfs_net_alloc_conn(struct super_block *sb,
14831495 conn -> req_funcs = req_funcs ;
14841496 spin_lock_init (& conn -> lock );
14851497 init_waitqueue_head (& conn -> waitq );
1486- conn -> sockname .sin_family = AF_INET ;
1487- conn -> peername .sin_family = AF_INET ;
1488- conn -> last_peername .sin_family = AF_INET ;
1498+ conn -> sockname .ss_family = AF_UNSPEC ;
1499+ conn -> peername .ss_family = AF_UNSPEC ;
1500+ conn -> last_peername .ss_family = AF_UNSPEC ;
14891501 INIT_LIST_HEAD (& conn -> accepted_head );
14901502 INIT_LIST_HEAD (& conn -> accepted_list );
14911503 conn -> next_send_seq = 1 ;
@@ -1562,7 +1574,7 @@ void scoutfs_net_free_conn(struct super_block *sb,
15621574 */
15631575int scoutfs_net_bind (struct super_block * sb ,
15641576 struct scoutfs_net_connection * conn ,
1565- struct sockaddr_in * sin )
1577+ struct sockaddr_storage * sin )
15661578{
15671579 struct socket * sock = NULL ;
15681580 int addrlen ;
@@ -1573,7 +1585,7 @@ int scoutfs_net_bind(struct super_block *sb,
15731585 if (WARN_ON_ONCE (conn -> sock ))
15741586 return - EINVAL ;
15751587
1576- ret = kc_sock_create_kern (AF_INET , SOCK_STREAM , IPPROTO_TCP , & sock );
1588+ ret = kc_sock_create_kern (sin -> ss_family , SOCK_STREAM , IPPROTO_TCP , & sock );
15771589 if (ret )
15781590 goto out ;
15791591
@@ -1585,7 +1597,7 @@ int scoutfs_net_bind(struct super_block *sb,
15851597 if (ret )
15861598 goto out ;
15871599
1588- addrlen = sizeof (struct sockaddr_in );
1600+ addrlen = sin -> ss_family == AF_INET ? sizeof (struct sockaddr_in ) : sizeof ( struct sockaddr_in6 );
15891601 ret = kernel_bind (sock , (struct sockaddr * )sin , addrlen );
15901602 if (ret )
15911603 goto out ;
@@ -1601,7 +1613,7 @@ int scoutfs_net_bind(struct super_block *sb,
16011613 ret = 0 ;
16021614
16031615 conn -> sock = sock ;
1604- * sin = conn -> sockname ;
1616+ sin = ( struct sockaddr_storage * ) & conn -> sockname ;
16051617
16061618out :
16071619 if (ret < 0 && sock )
@@ -1636,7 +1648,7 @@ static bool connect_result(struct scoutfs_net_connection *conn, int *error)
16361648 done = true;
16371649 * error = 0 ;
16381650 } else if (test_conn_fl (conn , shutting_down ) ||
1639- conn -> connect_sin .sin_family == 0 ) {
1651+ conn -> connect_sin .ss_family == AF_UNSPEC ) {
16401652 done = true;
16411653 * error = - ESHUTDOWN ;
16421654 }
@@ -1657,7 +1669,7 @@ static bool connect_result(struct scoutfs_net_connection *conn, int *error)
16571669 */
16581670int scoutfs_net_connect (struct super_block * sb ,
16591671 struct scoutfs_net_connection * conn ,
1660- struct sockaddr_in * sin , unsigned long timeout_ms )
1672+ struct sockaddr_storage * sin , unsigned long timeout_ms )
16611673{
16621674 int ret = 0 ;
16631675
0 commit comments