[Devel] [PATCH rh7 4/4] ploop: push_backup cleanup

Dmitry Monakhov dmonakhov at openvz.org
Sat Apr 30 10:01:02 PDT 2016


Maxim Patlasov <mpatlasov at virtuozzo.com> writes:

> ploop_pb_stop() is called either explicitly, when userspace makes
> ioctl(PLOOP_IOC_PUSH_BACKUP_STOP), or implicitly on ploop shutdown
> when userspace stops ploop device by ioctl(PLOOP_IOC_STOP).
>
> In both cases, it's useful to re-schedule all suspended preq-s. Otherwise,
> we won't be able to destroy ploop because some preq-s are still not
> completed.
>
Acked-by: Dmitry Monakhov <dmonakhov at openvz.org>
> Signed-off-by: Maxim Patlasov <mpatlasov at virtuozzo.com>
> ---
>  drivers/block/ploop/push_backup.c |   36 +++++++++++++++++++++++++++++++++++-
>  1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/block/ploop/push_backup.c b/drivers/block/ploop/push_backup.c
> index 488b8fb..05af67c 100644
> --- a/drivers/block/ploop/push_backup.c
> +++ b/drivers/block/ploop/push_backup.c
> @@ -358,6 +358,12 @@ ploop_pb_get_first_req_from_pending(struct ploop_pushbackup_desc *pbd)
>  }
>  
>  static struct ploop_request *
> +ploop_pb_get_first_req_from_reported(struct ploop_pushbackup_desc *pbd)
> +{
> +	return ploop_pb_get_first_req_from_tree(&pbd->reported_tree);
> +}
> +
> +static struct ploop_request *
>  ploop_pb_get_req_from_pending(struct ploop_pushbackup_desc *pbd,
>  			      cluster_t clu)
>  {
> @@ -400,16 +406,44 @@ int ploop_pb_preq_add_pending(struct ploop_pushbackup_desc *pbd,
>  
>  unsigned long ploop_pb_stop(struct ploop_pushbackup_desc *pbd)
>  {
> +	unsigned long ret = 0;
> +	LIST_HEAD(drop_list);
> +
>  	if (pbd == NULL)
>  		return 0;
>  
>  	spin_lock(&pbd->ppb_lock);
>  
> +	while (!RB_EMPTY_ROOT(&pbd->pending_tree)) {
> +		struct ploop_request *preq =
> +			ploop_pb_get_first_req_from_pending(pbd);
> +		list_add(&preq->list, &drop_list);
> +		ret++;
> +	}
> +
> +	while (!RB_EMPTY_ROOT(&pbd->reported_tree)) {
> +		struct ploop_request *preq =
> +			ploop_pb_get_first_req_from_reported(pbd);
> +		list_add(&preq->list, &drop_list);
> +		ret++;
> +	}
> +
>  	if (pbd->ppb_waiting)
>  		complete(&pbd->ppb_comp);
>  	spin_unlock(&pbd->ppb_lock);
>  
> -	return 0;
> +	if (!list_empty(&drop_list)) {
> +		struct ploop_device *plo = pbd->plo;
> +
> +		BUG_ON(!plo);
> +		spin_lock_irq(&plo->lock);
> +		list_splice_init(&drop_list, plo->ready_queue.prev);
> +		if (test_bit(PLOOP_S_WAIT_PROCESS, &plo->state))
> +			wake_up_interruptible(&plo->waitq);
> +		spin_unlock_irq(&plo->lock);
> +	}
> +
> +	return ret;
>  }
>  
>  int ploop_pb_get_pending(struct ploop_pushbackup_desc *pbd,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 472 bytes
Desc: not available
URL: <http://lists.openvz.org/pipermail/devel/attachments/20160430/6f96b2cb/attachment.sig>


More information about the Devel mailing list