From d071329701a3f8cbfaa290279413407d6cea8664 Mon Sep 17 00:00:00 2001 From: eeb <eeb> Date: Tue, 2 Sep 2003 22:09:05 +0000 Subject: [PATCH] * fixed file table corruption (bug 1843) --- lnet/klnds/socklnd/socklnd_cb.c | 29 ++++++++++++++--------- lustre/portals/knals/socknal/socknal_cb.c | 29 ++++++++++++++--------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index 3341596c44..656a0c5cce 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -2029,6 +2029,10 @@ ksocknal_connect_peer (ksock_route_t *route) CERROR ("sock_map_fd error %d\n", fd); return (fd); } + + /* NB the fd now owns the ref on sock->file */ + LASSERT (sock->file != NULL); + LASSERT (file_count(sock->file) == 1); /* Set the socket timeouts, so our connection attempt completes in * finite time */ @@ -2045,7 +2049,7 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Can't set send timeout %d (in HZ): %d\n", ksocknal_io_timeout, rc); - goto failed; + goto out; } set_fs (KERNEL_DS); @@ -2055,7 +2059,7 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Can't set receive timeout %d (in HZ): %d\n", ksocknal_io_timeout, rc); - goto failed; + goto out; } if (route->ksnr_nonagel) { @@ -2067,7 +2071,7 @@ ksocknal_connect_peer (ksock_route_t *route) set_fs (oldmm); if (rc != 0) { CERROR ("Can't disable nagel: %d\n", rc); - goto failed; + goto out; } } @@ -2081,7 +2085,7 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Can't set send buffer %d: %d\n", route->ksnr_buffer_size, rc); - goto failed; + goto out; } set_fs (KERNEL_DS); @@ -2091,7 +2095,7 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Can't set receive buffer %d: %d\n", route->ksnr_buffer_size, rc); - goto failed; + goto out; } } @@ -2105,22 +2109,25 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Error %d connecting to "LPX64"\n", rc, route->ksnr_peer->ksnp_nid); - goto failed; + goto out; } if (route->ksnr_xchange_nids) { rc = ksocknal_exchange_nids (sock, route->ksnr_peer->ksnp_nid); if (rc != 0) - goto failed; + goto out; } rc = ksocknal_create_conn (route->ksnr_peer->ksnp_nid, route, sock, route->ksnr_irq_affinity); - if (rc == 0) - return (0); + if (rc == 0) { + /* Take an extra ref on sock->file to compensate for the + * upcoming close which will lose fd's ref on it. */ + get_file (sock->file); + } - failed: - fput (sock->file); + out: + sys_close (fd); return (rc); } diff --git a/lustre/portals/knals/socknal/socknal_cb.c b/lustre/portals/knals/socknal/socknal_cb.c index 3341596c44..656a0c5cce 100644 --- a/lustre/portals/knals/socknal/socknal_cb.c +++ b/lustre/portals/knals/socknal/socknal_cb.c @@ -2029,6 +2029,10 @@ ksocknal_connect_peer (ksock_route_t *route) CERROR ("sock_map_fd error %d\n", fd); return (fd); } + + /* NB the fd now owns the ref on sock->file */ + LASSERT (sock->file != NULL); + LASSERT (file_count(sock->file) == 1); /* Set the socket timeouts, so our connection attempt completes in * finite time */ @@ -2045,7 +2049,7 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Can't set send timeout %d (in HZ): %d\n", ksocknal_io_timeout, rc); - goto failed; + goto out; } set_fs (KERNEL_DS); @@ -2055,7 +2059,7 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Can't set receive timeout %d (in HZ): %d\n", ksocknal_io_timeout, rc); - goto failed; + goto out; } if (route->ksnr_nonagel) { @@ -2067,7 +2071,7 @@ ksocknal_connect_peer (ksock_route_t *route) set_fs (oldmm); if (rc != 0) { CERROR ("Can't disable nagel: %d\n", rc); - goto failed; + goto out; } } @@ -2081,7 +2085,7 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Can't set send buffer %d: %d\n", route->ksnr_buffer_size, rc); - goto failed; + goto out; } set_fs (KERNEL_DS); @@ -2091,7 +2095,7 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Can't set receive buffer %d: %d\n", route->ksnr_buffer_size, rc); - goto failed; + goto out; } } @@ -2105,22 +2109,25 @@ ksocknal_connect_peer (ksock_route_t *route) if (rc != 0) { CERROR ("Error %d connecting to "LPX64"\n", rc, route->ksnr_peer->ksnp_nid); - goto failed; + goto out; } if (route->ksnr_xchange_nids) { rc = ksocknal_exchange_nids (sock, route->ksnr_peer->ksnp_nid); if (rc != 0) - goto failed; + goto out; } rc = ksocknal_create_conn (route->ksnr_peer->ksnp_nid, route, sock, route->ksnr_irq_affinity); - if (rc == 0) - return (0); + if (rc == 0) { + /* Take an extra ref on sock->file to compensate for the + * upcoming close which will lose fd's ref on it. */ + get_file (sock->file); + } - failed: - fput (sock->file); + out: + sys_close (fd); return (rc); } -- GitLab