diff options
author | Andreas Gruenbacher <agruen@linbit.com> | 2011-07-28 09:56:02 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2014-02-17 10:50:40 -0500 |
commit | b5043c5e2ca0de11a22e02cd8835c9489f833722 (patch) | |
tree | 337175f55d4e53b9d11f1b521234934d035ffbb9 /drivers/block/drbd/drbd_receiver.c | |
parent | 84b8c06b6591e73250e6ab4834a02a86c8994b91 (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.c | 22 |
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 | ||
4488 | static 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 | |||
4496 | void 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 | |||
4506 | static void conn_disconnect(struct drbd_connection *connection) | 4488 | static 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(). */ |