[Devel] [PATCH v5 vz9 6/7] dm-ploop: make preallocations absolute instead of relative in ploop_req_prealloc()
Konstantin Khorenko
khorenko at virtuozzo.com
Mon Jul 7 22:48:00 MSK 2025
From: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
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,
--
2.43.0
More information about the Devel
mailing list