aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_receiver.c
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@linbit.com>2011-07-28 09:56:02 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2014-02-17 10:50:40 -0500
commitb5043c5e2ca0de11a22e02cd8835c9489f833722 (patch)
tree337175f55d4e53b9d11f1b521234934d035ffbb9 /drivers/block/drbd/drbd_receiver.c
parent84b8c06b6591e73250e6ab4834a02a86c8994b91 (diff)
drbd: Turn conn_flush_workqueue() into drbd_flush_workqueue()
The new function can flush any work queue, not just the work queue of the data socket of a connection. Signed-off-by: Andreas Gruenbacher <agruen@linbit.com> Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r--drivers/block/drbd/drbd_receiver.c22
1 files changed, 2 insertions, 20 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 87114361d804..1d9a99c031fa 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -4485,24 +4485,6 @@ static void drbdd(struct drbd_connection *connection)
4485 conn_request_state(connection, NS(conn, C_PROTOCOL_ERROR), CS_HARD); 4485 conn_request_state(connection, NS(conn, C_PROTOCOL_ERROR), CS_HARD);
4486} 4486}
4487 4487
4488static int w_complete(struct drbd_work *w, int cancel)
4489{
4490 struct drbd_wq_barrier *b = container_of(w, struct drbd_wq_barrier, w);
4491
4492 complete(&b->done);
4493 return 0;
4494}
4495
4496void conn_flush_workqueue(struct drbd_connection *connection)
4497{
4498 struct drbd_wq_barrier barr;
4499
4500 barr.w.cb = w_complete;
4501 init_completion(&barr.done);
4502 drbd_queue_work(&connection->sender_work, &barr.w);
4503 wait_for_completion(&barr.done);
4504}
4505
4506static void conn_disconnect(struct drbd_connection *connection) 4488static void conn_disconnect(struct drbd_connection *connection)
4507{ 4489{
4508 struct drbd_peer_device *peer_device; 4490 struct drbd_peer_device *peer_device;
@@ -4590,14 +4572,14 @@ static int drbd_disconnected(struct drbd_peer_device *peer_device)
4590 /* wait for all w_e_end_data_req, w_e_end_rsdata_req, w_send_barrier, 4572 /* wait for all w_e_end_data_req, w_e_end_rsdata_req, w_send_barrier,
4591 * w_make_resync_request etc. which may still be on the worker queue 4573 * w_make_resync_request etc. which may still be on the worker queue
4592 * to be "canceled" */ 4574 * to be "canceled" */
4593 drbd_flush_workqueue(device); 4575 drbd_flush_workqueue(&peer_device->connection->sender_work);
4594 4576
4595 drbd_finish_peer_reqs(device); 4577 drbd_finish_peer_reqs(device);
4596 4578
4597 /* This second workqueue flush is necessary, since drbd_finish_peer_reqs() 4579 /* This second workqueue flush is necessary, since drbd_finish_peer_reqs()
4598 might have issued a work again. The one before drbd_finish_peer_reqs() is 4580 might have issued a work again. The one before drbd_finish_peer_reqs() is
4599 necessary to reclain net_ee in drbd_finish_peer_reqs(). */ 4581 necessary to reclain net_ee in drbd_finish_peer_reqs(). */
4600 drbd_flush_workqueue(device); 4582 drbd_flush_workqueue(&peer_device->connection->sender_work);
4601 4583
4602 /* need to do it again, drbd_finish_peer_reqs() may have populated it 4584 /* need to do it again, drbd_finish_peer_reqs() may have populated it
4603 * again via drbd_try_clear_on_disk_bm(). */ 4585 * again via drbd_try_clear_on_disk_bm(). */