@@ -283,17 +283,19 @@ tapdisk_nbdserver_set_free_request(td_nbdserver_client_t *client,
283
283
284
284
void
285
285
tapdisk_nbdserver_free_request (td_nbdserver_client_t * client ,
286
- td_nbdserver_req_t * req )
286
+ td_nbdserver_req_t * req , bool free_client_if_dead )
287
287
{
288
288
tapdisk_nbdserver_set_free_request (client , req );
289
- if (unlikely (client -> dead && !tapdisk_nbdserver_reqs_pending (client )))
290
- tapdisk_nbdserver_free_client (client );
291
289
292
290
if (unlikely (client -> n_reqs_free == (client -> n_reqs / 4 ))) {
293
291
/* free requests, unmask the events */
294
292
tapdisk_server_mask_event (client -> client_event_id , 0 );
295
293
}
296
294
295
+ if (unlikely (free_client_if_dead &&
296
+ client -> dead &&
297
+ !tapdisk_nbdserver_reqs_pending (client )))
298
+ tapdisk_nbdserver_free_client (client );
297
299
}
298
300
299
301
static void
@@ -835,11 +837,12 @@ static void
835
837
return & (((struct sockaddr_in6 * )ss )-> sin6_addr );
836
838
}
837
839
838
- static void tapdisk_nbd_server_free_vreq (td_nbdserver_client_t * client , td_vbd_request_t * vreq )
840
+ static void tapdisk_nbd_server_free_vreq (
841
+ td_nbdserver_client_t * client , td_vbd_request_t * vreq , bool free_client_if_dead )
839
842
{
840
843
td_nbdserver_req_t * req = container_of (vreq , td_nbdserver_req_t , vreq );
841
844
free (vreq -> iov -> base );
842
- tapdisk_nbdserver_free_request (client , req );
845
+ tapdisk_nbdserver_free_request (client , req , free_client_if_dead );
843
846
}
844
847
845
848
@@ -852,7 +855,7 @@ __tapdisk_nbdserver_block_status_cb(td_vbd_request_t *vreq, int err,
852
855
tapdisk_extents_t * extents = (tapdisk_extents_t * )(vreq -> data );
853
856
send_structured_reply_block_status (client -> client_fd , req -> id , extents );
854
857
free_extents (extents );
855
- tapdisk_nbd_server_free_vreq (client , vreq );
858
+ tapdisk_nbd_server_free_vreq (client , vreq , true );
856
859
}
857
860
858
861
static int
@@ -936,7 +939,7 @@ __tapdisk_nbdserver_structured_read_cb(
936
939
937
940
finish :
938
941
free (vreq -> iov -> base );
939
- tapdisk_nbdserver_free_request (client , req );
942
+ tapdisk_nbdserver_free_request (client , req , true );
940
943
}
941
944
942
945
static void
@@ -1001,7 +1004,7 @@ __tapdisk_nbdserver_request_cb(td_vbd_request_t *vreq, int error,
1001
1004
1002
1005
finish :
1003
1006
free (vreq -> iov -> base );
1004
- tapdisk_nbdserver_free_request (client , req );
1007
+ tapdisk_nbdserver_free_request (client , req , true );
1005
1008
}
1006
1009
1007
1010
void
@@ -1265,7 +1268,7 @@ tapdisk_nbdserver_clientcb(event_id_t id, char mode, void *data)
1265
1268
INFO ("About to send initial connection message" );
1266
1269
tapdisk_nbdserver_newclient_fd (server , fd );
1267
1270
INFO ("Sent initial connection message" );
1268
- goto free ;
1271
+ return ;
1269
1272
case TAPDISK_NBD_CMD_BLOCK_STATUS :
1270
1273
{
1271
1274
if (!client -> structured_reply )
@@ -1306,11 +1309,10 @@ tapdisk_nbdserver_clientcb(event_id_t id, char mode, void *data)
1306
1309
return ;
1307
1310
1308
1311
fail :
1309
- tapdisk_nbdserver_free_client (client );
1310
- free :
1311
1312
if (vreq )
1312
- tapdisk_nbd_server_free_vreq (client , vreq );
1313
+ tapdisk_nbd_server_free_vreq (client , vreq , false );
1313
1314
1315
+ tapdisk_nbdserver_free_client (client );
1314
1316
return ;
1315
1317
}
1316
1318
0 commit comments