[Devel] [PATCH RH8 1/2] ploop: Track if we have delta with disable_merge
Kirill Tkhai
ktkhai at virtuozzo.com
Tue Aug 17 17:39:18 MSK 2021
Vasily, this is for VZ7
On 16.08.2021 12:37, Kirill Tkhai wrote:
> Add a notifier after delta list change, which
> will allow to skip disable merge in next patch.
>
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
> drivers/block/ploop/dev.c | 7 +++++++
> include/linux/ploop/ploop.h | 14 ++++++++++++++
> 2 files changed, 21 insertions(+)
>
> diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
> index 0a6c4111ca82..c4cb944358ee 100644
> --- a/drivers/block/ploop/dev.c
> +++ b/drivers/block/ploop/dev.c
> @@ -3519,6 +3519,7 @@ static int ploop_add_delta(struct ploop_device * plo, unsigned long arg)
> mutex_lock(&plo->sysfs_mutex);
> list_add(&delta->list, &plo->map.delta_list);
> mutex_unlock(&plo->sysfs_mutex);
> + ploop_delta_list_changed(plo);
> set_bit(PLOOP_S_CHANGED, &plo->state);
>
> /*
> @@ -3602,6 +3603,7 @@ static int ploop_replace_delta(struct ploop_device * plo, unsigned long arg)
>
> ploop_map_destroy(&plo->map);
> list_replace_init(&old_delta->list, &delta->list);
> + ploop_delta_list_changed(plo);
> clear_bit(PLOOP_S_ABORT, &plo->state);
>
> spin_lock_irq(plo->queue->queue_lock);
> @@ -3892,6 +3894,7 @@ static int ploop_snapshot(struct ploop_device * plo, unsigned long arg,
> list_add(&delta->list, &plo->map.delta_list);
> clear_bit(PLOOP_MAP_IDENTICAL, &plo->map.flags);
> mutex_unlock(&plo->sysfs_mutex);
> + ploop_delta_list_changed(plo);
> }
> ploop_relax(plo);
>
> @@ -4010,6 +4013,7 @@ static int ploop_del_delta(struct ploop_device * plo, unsigned long arg)
> ploop_quiesce(plo);
> next = list_entry(delta->list.next, struct ploop_delta, list);
> list_del(&delta->list);
> + ploop_delta_list_changed(plo);
> if (list_empty(&plo->map.delta_list))
> plo->cookie[0] = 0;
> if (level != 0)
> @@ -4111,6 +4115,7 @@ static void ploop_merge_complete(struct ploop_device * plo,
> plo->trans_map = NULL;
> plo->maintenance_type = PLOOP_MNTN_OFF;
> mutex_unlock(&plo->sysfs_mutex);
> + ploop_delta_list_changed(plo);
> ploop_map_destroy(map);
> ploop_relax(plo);
> }
> @@ -4194,6 +4199,7 @@ static int ploop_merge(struct ploop_device * plo)
> plo->trans_map = map;
> plo->maintenance_type = PLOOP_MNTN_MERGE;
> mutex_unlock(&plo->sysfs_mutex);
> + ploop_delta_list_changed(plo);
> } else {
> /* Yes. All transient obstacles must be resolved
> * in prepare_merge. Failed start_merge means
> @@ -4540,6 +4546,7 @@ static void destroy_deltas(struct ploop_device * plo, struct ploop_map * map)
> mutex_lock(&plo->sysfs_mutex);
> list_del(&delta->list);
> mutex_unlock(&plo->sysfs_mutex);
> + ploop_delta_list_changed(plo);
>
> kobject_del(&delta->kobj);
> kobject_put(&plo->kobj);
> diff --git a/include/linux/ploop/ploop.h b/include/linux/ploop/ploop.h
> index 2256eb489a97..d0f665796a42 100644
> --- a/include/linux/ploop/ploop.h
> +++ b/include/linux/ploop/ploop.h
> @@ -490,6 +490,7 @@ struct ploop_device
> unsigned long locking_state; /* plo locked by userspace */
> unsigned int fast_path_disabled_count;
> unsigned int discard_disabled_count;
> + bool has_disable_merge;
> };
>
> enum
> @@ -650,6 +651,19 @@ static inline struct ploop_delta * map_top_delta(struct ploop_map * map)
> return list_first_entry(&map->delta_list, struct ploop_delta, list);
> }
>
> +static inline void ploop_delta_list_changed(struct ploop_device *plo)
> +{
> + bool has_disable_merge = false;
> + struct ploop_delta *delta;
> +
> + list_for_each_entry(delta, &plo->map.delta_list, list) {
> + if (delta->io.ops->disable_merge)
> + has_disable_merge = true;
> + }
> +
> + plo->has_disable_merge = has_disable_merge;
> +}
> +
> static inline unsigned int cluster_size_in_bytes(struct ploop_device *plo)
> {
> return 1 << (plo->cluster_log + 9);
>
>
More information about the Devel
mailing list