@@ -93,7 +93,10 @@ typedef struct BDRVNBDState {
93
93
char * x_dirty_bitmap ;
94
94
} BDRVNBDState ;
95
95
96
- static int nbd_client_connect (BlockDriverState * bs , Error * * errp );
96
+ static QIOChannelSocket * nbd_establish_connection (SocketAddress * saddr ,
97
+ Error * * errp );
98
+ static int nbd_client_handshake (BlockDriverState * bs , QIOChannelSocket * sioc ,
99
+ Error * * errp );
97
100
98
101
static void nbd_clear_bdrvstate (BDRVNBDState * s )
99
102
{
@@ -241,7 +244,9 @@ static bool nbd_client_connecting_wait(BDRVNBDState *s)
241
244
242
245
static coroutine_fn void nbd_reconnect_attempt (BDRVNBDState * s )
243
246
{
247
+ int ret ;
244
248
Error * local_err = NULL ;
249
+ QIOChannelSocket * sioc ;
245
250
246
251
if (!nbd_client_connecting (s )) {
247
252
return ;
@@ -280,19 +285,25 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNBDState *s)
280
285
s -> ioc = NULL ;
281
286
}
282
287
283
- s -> connect_status = nbd_client_connect (s -> bs , & local_err );
288
+ sioc = nbd_establish_connection (s -> saddr , & local_err );
289
+ if (!sioc ) {
290
+ ret = - ECONNREFUSED ;
291
+ goto out ;
292
+ }
293
+
294
+ ret = nbd_client_handshake (s -> bs , sioc , & local_err );
295
+
296
+ out :
297
+ s -> connect_status = ret ;
284
298
error_free (s -> connect_err );
285
299
s -> connect_err = NULL ;
286
300
error_propagate (& s -> connect_err , local_err );
287
301
288
- if (s -> connect_status < 0 ) {
289
- /* failed attempt */
290
- return ;
302
+ if (ret >= 0 ) {
303
+ /* successfully connected */
304
+ s -> state = NBD_CLIENT_CONNECTED ;
305
+ qemu_co_queue_restart_all (& s -> free_sema );
291
306
}
292
-
293
- /* successfully connected */
294
- s -> state = NBD_CLIENT_CONNECTED ;
295
- qemu_co_queue_restart_all (& s -> free_sema );
296
307
}
297
308
298
309
static coroutine_fn void nbd_co_reconnect_loop (BDRVNBDState * s )
@@ -1425,24 +1436,15 @@ static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr,
1425
1436
return sioc ;
1426
1437
}
1427
1438
1428
- static int nbd_client_connect (BlockDriverState * bs , Error * * errp )
1439
+ /* nbd_client_handshake takes ownership on sioc. On failure it is unref'ed. */
1440
+ static int nbd_client_handshake (BlockDriverState * bs , QIOChannelSocket * sioc ,
1441
+ Error * * errp )
1429
1442
{
1430
1443
BDRVNBDState * s = (BDRVNBDState * )bs -> opaque ;
1431
1444
AioContext * aio_context = bdrv_get_aio_context (bs );
1432
1445
int ret ;
1433
1446
1434
- /*
1435
- * establish TCP connection, return error if it fails
1436
- * TODO: Configurable retry-until-timeout behaviour.
1437
- */
1438
- QIOChannelSocket * sioc = nbd_establish_connection (s -> saddr , errp );
1439
-
1440
- if (!sioc ) {
1441
- return - ECONNREFUSED ;
1442
- }
1443
-
1444
- /* NBD handshake */
1445
- trace_nbd_client_connect (s -> export );
1447
+ trace_nbd_client_handshake (s -> export );
1446
1448
qio_channel_set_blocking (QIO_CHANNEL (sioc ), false, NULL );
1447
1449
qio_channel_attach_aio_context (QIO_CHANNEL (sioc ), aio_context );
1448
1450
@@ -1489,7 +1491,7 @@ static int nbd_client_connect(BlockDriverState *bs, Error **errp)
1489
1491
object_ref (OBJECT (s -> ioc ));
1490
1492
}
1491
1493
1492
- trace_nbd_client_connect_success (s -> export );
1494
+ trace_nbd_client_handshake_success (s -> export );
1493
1495
1494
1496
return 0 ;
1495
1497
@@ -1894,6 +1896,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
1894
1896
{
1895
1897
int ret ;
1896
1898
BDRVNBDState * s = (BDRVNBDState * )bs -> opaque ;
1899
+ QIOChannelSocket * sioc ;
1897
1900
1898
1901
ret = nbd_process_options (bs , options , errp );
1899
1902
if (ret < 0 ) {
@@ -1904,7 +1907,16 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
1904
1907
qemu_co_mutex_init (& s -> send_mutex );
1905
1908
qemu_co_queue_init (& s -> free_sema );
1906
1909
1907
- ret = nbd_client_connect (bs , errp );
1910
+ /*
1911
+ * establish TCP connection, return error if it fails
1912
+ * TODO: Configurable retry-until-timeout behaviour.
1913
+ */
1914
+ sioc = nbd_establish_connection (s -> saddr , errp );
1915
+ if (!sioc ) {
1916
+ return - ECONNREFUSED ;
1917
+ }
1918
+
1919
+ ret = nbd_client_handshake (bs , sioc , errp );
1908
1920
if (ret < 0 ) {
1909
1921
nbd_clear_bdrvstate (s );
1910
1922
return ret ;
0 commit comments