Add a notifier after delta list change, which will allow to skip disable merge in next patch.
Signed-off-by: Kirill Tkhai <[email protected]> --- 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); _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
