Whamcloud - gitweb
LU-15860 socklnd: Duplicate ksock_conn_cb
[fs/lustre-release.git] / lnet / klnds / socklnd / socklnd.c
index 4d6907e..f3fff31 100644 (file)
@@ -291,7 +291,7 @@ ksocknal_unlink_peer_locked(struct ksock_peer_ni *peer_ni)
 
 static int
 ksocknal_get_peer_info(struct lnet_ni *ni, int index,
-                      struct lnet_process_id *id, __u32 *myip, __u32 *peer_ip,
+                      struct lnet_processid *id, __u32 *myip, __u32 *peer_ip,
                       int *port, int *conn_count, int *share_count)
 {
        struct ksock_peer_ni *peer_ni;
@@ -312,8 +312,7 @@ ksocknal_get_peer_info(struct lnet_ni *ni, int index,
                        if (index-- > 0)
                                continue;
 
-                       id->pid = peer_ni->ksnp_id.pid;
-                       id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
+                       *id = peer_ni->ksnp_id;
                        *myip = 0;
                        *peer_ip = 0;
                        *port = 0;
@@ -327,8 +326,7 @@ ksocknal_get_peer_info(struct lnet_ni *ni, int index,
                        if (index-- > 0)
                                continue;
 
-                       id->pid = peer_ni->ksnp_id.pid;
-                       id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
+                       *id = peer_ni->ksnp_id;
                        *myip = peer_ni->ksnp_passive_ips[j];
                        *peer_ip = 0;
                        *port = 0;
@@ -344,8 +342,7 @@ ksocknal_get_peer_info(struct lnet_ni *ni, int index,
 
                        conn_cb = peer_ni->ksnp_conn_cb;
 
-                       id->pid = peer_ni->ksnp_id.pid;
-                       id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
+                       *id = peer_ni->ksnp_id;
                        if (conn_cb->ksnr_addr.ss_family == AF_INET) {
                                struct sockaddr_in *sa =
                                        (void *)&conn_cb->ksnr_addr;
@@ -648,14 +645,17 @@ ksocknal_add_peer(struct lnet_ni *ni, struct lnet_processid *id,
                         nidhash(&id->nid));
        }
 
-       ksocknal_add_conn_cb_locked(peer_ni, conn_cb);
-
-       /* Remember conns_per_peer setting at the time
-        * of connection initiation. It will define the
-        * max number of conns per type for this conn_cb
-        * while it's in use.
-        */
-       conn_cb->ksnr_max_conns = ksocknal_get_conns_per_peer(peer_ni);
+       if (peer_ni->ksnp_conn_cb) {
+               ksocknal_conn_cb_decref(conn_cb);
+       } else {
+               ksocknal_add_conn_cb_locked(peer_ni, conn_cb);
+               /* Remember conns_per_peer setting at the time
+                * of connection initiation. It will define the
+                * max number of conns per type for this conn_cb
+                * while it's in use.
+                */
+               conn_cb->ksnr_max_conns = ksocknal_get_conns_per_peer(peer_ni);
+       }
 
        write_unlock_bh(&ksocknal_data.ksnd_global_lock);
 
@@ -663,7 +663,7 @@ ksocknal_add_peer(struct lnet_ni *ni, struct lnet_processid *id,
 }
 
 static void
-ksocknal_del_peer_locked(struct ksock_peer_ni *peer_ni, __u32 ip)
+ksocknal_del_peer_locked(struct ksock_peer_ni *peer_ni)
 {
        struct ksock_conn *conn;
        struct ksock_conn *cnxt;
@@ -686,7 +686,7 @@ ksocknal_del_peer_locked(struct ksock_peer_ni *peer_ni, __u32 ip)
 }
 
 static int
-ksocknal_del_peer(struct lnet_ni *ni, struct lnet_process_id id4, __u32 ip)
+ksocknal_del_peer(struct lnet_ni *ni, struct lnet_processid *id)
 {
        LIST_HEAD(zombies);
        struct hlist_node *pnxt;
@@ -695,15 +695,11 @@ ksocknal_del_peer(struct lnet_ni *ni, struct lnet_process_id id4, __u32 ip)
        int hi;
        int i;
        int rc = -ENOENT;
-       struct lnet_processid id;
-
-       id.pid = id4.pid;
-       lnet_nid4_to_nid(id4.nid, &id.nid);
 
        write_lock_bh(&ksocknal_data.ksnd_global_lock);
 
-       if (!LNET_NID_IS_ANY(&id.nid)) {
-               lo = hash_min(nidhash(&id.nid),
+       if (id && !LNET_NID_IS_ANY(&id->nid)) {
+               lo = hash_min(nidhash(&id->nid),
                              HASH_BITS(ksocknal_data.ksnd_peers));
                hi = lo;
        } else {
@@ -718,15 +714,15 @@ ksocknal_del_peer(struct lnet_ni *ni, struct lnet_process_id id4, __u32 ip)
                        if (peer_ni->ksnp_ni != ni)
                                continue;
 
-                       if (!((LNET_NID_IS_ANY(&id.nid) ||
-                              nid_same(&peer_ni->ksnp_id.nid, &id.nid)) &&
-                             (id.pid == LNET_PID_ANY ||
-                              peer_ni->ksnp_id.pid == id.pid)))
+                       if (!((!id || LNET_NID_IS_ANY(&id->nid) ||
+                              nid_same(&peer_ni->ksnp_id.nid, &id->nid)) &&
+                             (!id || id->pid == LNET_PID_ANY ||
+                              peer_ni->ksnp_id.pid == id->pid)))
                                continue;
 
                        ksocknal_peer_addref(peer_ni);  /* a ref for me... */
 
-                       ksocknal_del_peer_locked(peer_ni, ip);
+                       ksocknal_del_peer_locked(peer_ni);
 
                        if (peer_ni->ksnp_closing &&
                            !list_empty(&peer_ni->ksnp_tx_queue)) {
@@ -1751,7 +1747,6 @@ ksocknal_push(struct lnet_ni *ni, struct lnet_processid *id)
 int
 ksocknal_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg)
 {
-       struct lnet_process_id id4 = {};
        struct lnet_processid id = {};
        struct libcfs_ioctl_data *data = arg;
        int rc;
@@ -1792,18 +1787,19 @@ ksocknal_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg)
                int share_count = 0;
 
                rc = ksocknal_get_peer_info(ni, data->ioc_count,
-                                           &id4, &myip, &ip, &port,
+                                           &id, &myip, &ip, &port,
                                            &conn_count,  &share_count);
                if (rc != 0)
                        return rc;
-
-               data->ioc_nid    = id4.nid;
+               if (!nid_is_nid4(&id.nid))
+                       return -EINVAL;
+               data->ioc_nid    = lnet_nid_to_nid4(&id.nid);
                data->ioc_count  = share_count;
                data->ioc_u32[0] = ip;
                data->ioc_u32[1] = port;
                data->ioc_u32[2] = myip;
                data->ioc_u32[3] = conn_count;
-               data->ioc_u32[4] = id4.pid;
+               data->ioc_u32[4] = id.pid;
                return 0;
        }
 
@@ -1817,10 +1813,9 @@ ksocknal_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg)
                return ksocknal_add_peer(ni, &id, (struct sockaddr *)&sa);
        }
        case IOC_LIBCFS_DEL_PEER:
-               id4.nid = data->ioc_nid;
-               id4.pid = LNET_PID_ANY;
-               return ksocknal_del_peer(ni, id4,
-                                        data->ioc_u32[0]); /* IP */
+               lnet_nid4_to_nid(data->ioc_nid, &id.nid);
+               id.pid = LNET_PID_ANY;
+               return ksocknal_del_peer(ni, &id);
 
         case IOC_LIBCFS_GET_CONN: {
                 int           txmem;
@@ -2335,10 +2330,6 @@ void
 ksocknal_shutdown(struct lnet_ni *ni)
 {
        struct ksock_net *net = ni->ni_data;
-       struct lnet_process_id anyid = {
-               .nid = LNET_NID_ANY,
-               .pid = LNET_PID_ANY,
-       };
 
        LASSERT(ksocknal_data.ksnd_init == SOCKNAL_INIT_ALL);
        LASSERT(ksocknal_data.ksnd_nnets > 0);
@@ -2347,7 +2338,7 @@ ksocknal_shutdown(struct lnet_ni *ni)
        atomic_add(SOCKNAL_SHUTDOWN_BIAS, &net->ksnn_npeers);
 
        /* Delete all peers */
-       ksocknal_del_peer(ni, anyid, 0);
+       ksocknal_del_peer(ni, NULL);
 
        /* Wait for all peer_ni state to clean up */
        wait_var_event_warning(&net->ksnn_npeers,