[Devel] [PATCH RHEL9 COMMIT] dm-ploop: make preallocations absolute instead of relative in ploop_req_prealloc()

Konstantin Khorenko khorenko at virtuozzo.com
Tue Jul 8 13:59:34 MSK 2025


The commit is pushed to "branch-rh9-5.14.0-427.55.1.vz9.82.x-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh9-5.14.0-427.55.1.vz9.82.2
------>
commit fa0c4cfa4658f389970d58dfc408c41c75ecdd8f
Author: Pavel Tikhomirov <ptikhomirov at 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.zhadchenko at virtuozzo.com>
    Signed-off-by: Pavel Tikhomirov <ptikhomirov at 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,


More information about the Devel mailing list