@@ -74,7 +74,8 @@ char* op_strings[TD_OPS_END] ={"read", "write", "block_status"};
7474
7575static void tapdisk_vbd_complete_vbd_request (td_vbd_t * , td_vbd_request_t * );
7676static int tapdisk_vbd_queue_ready (td_vbd_t * );
77- static void tapdisk_vbd_check_queue_state (td_vbd_t * );
77+ static void tapdisk_vbd_check_complete_requests (td_vbd_t * );
78+ static void tapdisk_vbd_check_requests_for_issue (td_vbd_t * );
7879
7980static bool log = true;
8081
@@ -944,12 +945,13 @@ tapdisk_vbd_pause(td_vbd_t *vbd)
944945 if (vbd -> nbdserver )
945946 tapdisk_nbdserver_pause (vbd -> nbdserver , log );
946947
948+ list_for_each_entry (blkif , & vbd -> rings , entry )
949+ tapdisk_xenblkif_suspend (blkif );
950+
947951 err = tapdisk_vbd_quiesce_queue (vbd );
948952 if (err )
949953 return err ;
950954
951- list_for_each_entry (blkif , & vbd -> rings , entry )
952- tapdisk_xenblkif_suspend (blkif );
953955
954956 tapdisk_vbd_close_vdi (vbd );
955957
@@ -1062,7 +1064,7 @@ tapdisk_vbd_request_timeout(td_vbd_request_t *vreq)
10621064}
10631065
10641066static void
1065- tapdisk_vbd_check_queue_state (td_vbd_t * vbd )
1067+ tapdisk_vbd_check_complete_requests (td_vbd_t * vbd )
10661068{
10671069 td_vbd_request_t * vreq , * tmp ;
10681070 struct timeval now ;
@@ -1071,25 +1073,36 @@ tapdisk_vbd_check_queue_state(td_vbd_t *vbd)
10711073 tapdisk_vbd_for_each_request (vreq , tmp , & vbd -> failed_requests )
10721074 if (__tapdisk_vbd_request_timeout (vreq , & now ))
10731075 tapdisk_vbd_complete_vbd_request (vbd , vreq );
1076+ }
10741077
1078+ static void
1079+ tapdisk_vbd_check_requests_for_issue (td_vbd_t * vbd )
1080+ {
10751081 if (!list_empty (& vbd -> new_requests ) ||
10761082 !list_empty (& vbd -> failed_requests ))
10771083 tapdisk_vbd_issue_requests (vbd );
1078-
10791084}
10801085
10811086void
10821087tapdisk_vbd_check_state (td_vbd_t * vbd )
10831088{
10841089 struct td_xenblkif * blkif ;
10851090
1091+ /* Don't check if we're already quiesced */
1092+ if (td_flag_test (vbd -> state , TD_VBD_QUIESCED ))
1093+ return ;
1094+
10861095 /*
10871096 * TODO don't ignore return value
10881097 */
10891098 list_for_each_entry (blkif , & vbd -> rings , entry )
10901099 tapdisk_xenblkif_ring_stats_update (blkif );
10911100
1092- tapdisk_vbd_check_queue_state (vbd );
1101+ tapdisk_vbd_check_complete_requests (vbd );
1102+
1103+ if (!td_flag_test (vbd -> state , TD_VBD_QUIESCE_REQUESTED ) &&
1104+ !td_flag_test (vbd -> state , TD_VBD_PAUSE_REQUESTED ))
1105+ tapdisk_vbd_check_requests_for_issue (vbd );
10931106
10941107 if (td_flag_test (vbd -> state , TD_VBD_QUIESCE_REQUESTED ))
10951108 tapdisk_vbd_quiesce_queue (vbd );
@@ -1344,7 +1357,7 @@ tapdisk_vbd_forward_request(td_request_t treq)
13441357 if (tapdisk_vbd_queue_ready (vbd ))
13451358 __tapdisk_vbd_reissue_td_request (vbd , image , treq );
13461359 else
1347- __tapdisk_vbd_complete_td_request ( vbd , vreq , treq , - EBUSY );
1360+ td_complete_request ( treq , - EBUSY );
13481361}
13491362
13501363int
@@ -1672,16 +1685,19 @@ tapdisk_vbd_issue_new_requests(td_vbd_t *vbd)
16721685int
16731686tapdisk_vbd_recheck_state (td_vbd_t * vbd )
16741687{
1688+ int err = 0 ;
1689+
16751690 if (list_empty (& vbd -> new_requests ))
16761691 return 0 ;
16771692
16781693 if (td_flag_test (vbd -> state , TD_VBD_QUIESCED ) ||
16791694 td_flag_test (vbd -> state , TD_VBD_QUIESCE_REQUESTED ))
16801695 return 0 ;
16811696
1682- tapdisk_vbd_issue_new_requests (vbd );
1697+ err = tapdisk_vbd_issue_requests (vbd );
16831698
1684- return 1 ;
1699+ /* If we have errors stop checking in this cycle */
1700+ return err ? 0 : 1 ;
16851701}
16861702
16871703static int
0 commit comments