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

Reply via email to