The commit is pushed to "branch-rh9-5.14.0-427.55.1.vz9.82.x-ovz" and will appear at g...@bitbucket.org:openvz/vzkernel.git after rh9-5.14.0-427.55.1.vz9.82.2 ------> commit fa0c4cfa4658f389970d58dfc408c41c75ecdd8f Author: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> Date: Mon Jul 7 16:04:10 2025 +0200
dm-ploop: make preallocations absolute instead of relative in ploop_req_prealloc() Preallocation in ploop_allocate_cluster() should not depend on (pos < prealloc_start), so always try to preallocate. https://virtuozzo.atlassian.net/browse/VSTOR-108868 Co-developed-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com> Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> Feature: dm-ploop: ploop target driver --- drivers/md/dm-ploop-map.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index aa3cd483f6a55..7c79a7ed1177e 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -385,11 +385,16 @@ static void ploop_schedule_work(struct ploop *ploop) wake_up_process(ploop->kt_worker->task); } -void ploop_req_prealloc(struct ploop *ploop, loff_t newlen) +static void ploop_req_prealloc(struct ploop *ploop, loff_t size) { + struct ploop_delta *top = ploop_top_delta(ploop); + lockdep_assert_held(&ploop->bat_lock); - ploop->prealloc_size += newlen; + size = ALIGN(size + PREALLOC_SIZE / 2, PREALLOC_SIZE); + if (top->file_size + ploop->prealloc_in_progress + ploop->prealloc_size >= size) + return; + ploop->prealloc_size = size - top->file_size - ploop->prealloc_in_progress; wake_up_process(ploop->kt_allocator->task); } @@ -1221,7 +1226,6 @@ ALLOW_ERROR_INJECTION(ploop_preallocate_cluster, ERRNO); void ploop_should_prealloc(struct ploop *ploop, struct file *file) { - struct ploop_delta *top = ploop_top_delta(ploop); u32 dst_clu; u32 clu_size = CLU_SIZE(ploop); loff_t pos, end; @@ -1235,9 +1239,8 @@ void ploop_should_prealloc(struct ploop *ploop, struct file *file) pos = CLU_TO_POS(ploop, dst_clu); end = pos + clu_size; - if (end > top->file_preallocated_area_start - (PREALLOC_SIZE/2)) { - ploop_req_prealloc(ploop, PREALLOC_SIZE); - } + + ploop_req_prealloc(ploop, end); spin_unlock_irqrestore(&ploop->bat_lock, flags); } @@ -1280,16 +1283,11 @@ static int ploop_allocate_cluster(struct ploop *ploop, u32 *dst_clu, struct file pos = CLU_TO_POS(ploop, *dst_clu); end = pos + clu_size; off = min_t(loff_t, top->file_size, end); + ploop_req_prealloc(ploop, end); + spin_unlock_irqrestore(&ploop->bat_lock, flags); if (pos < prealloc_start) { - if (end + clu_size > - top->file_preallocated_area_start - (PREALLOC_SIZE/2)) { - spin_lock_irqsave(&ploop->bat_lock, flags); - ploop_req_prealloc(ploop, PREALLOC_SIZE); - spin_unlock_irqrestore(&ploop->bat_lock, flags); - } - /* Clu at @pos may contain dirty data */ if (!ploop->falloc_new_clu) ret = ploop_punch_hole(file, pos, off - pos); @@ -1314,7 +1312,11 @@ static int ploop_allocate_cluster(struct ploop *ploop, u32 *dst_clu, struct file spin_lock_irqsave(&ploop->bat_lock, flags); /* size can change from parallel alloc */ if (end > top->file_size) { - ploop_req_prealloc(ploop, PREALLOC_SIZE); + /* + * Reset preallocation, in case ploop_preallocate_cluster + * dropped it on error path. + */ + ploop_req_prealloc(ploop, end); spin_unlock_irqrestore(&ploop->bat_lock, flags); wait_event_interruptible(ploop->dispatcher_wq_prealloc, _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel