[Devel] [PATCH vz9/vz10] dm-ploop: Fix file handle leaks when merging deltas

Vasileios Almpanis vasileios.ampanis at virtuozzo.com
Tue Sep 30 10:40:30 MSK 2025


On 9/30/25 5:15 AM, Pavel Tikhomirov wrote:
>
>
> On 9/29/25 13:24, Vasileios Almpanis wrote:
>> When merging deltas, we rewrite the deltas array and remove the lower
>> delta. Each delta holds file handles for its runners, but these were not
>> being released. On vStorage, the files were deleted but a
>> temporary handle remained, causing EBUSY errors until reboot. As a
>> result, directories containing snapshots could not be deleted.
>>
>> https://virtuozzo.atlassian.net/browse/VSTOR-116285
>>
>> Signed-off-by: Vasileios Almpanis <vasileios.almpanis at virtuozzo.com>
>> Feature: dm-ploop: ploop target driver
>> ---
>>   drivers/md/dm-ploop-cmd.c | 20 +++++++++++++++++++-
>>   1 file changed, 19 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
>> index 2043162164be..1975f782be3c 100644
>> --- a/drivers/md/dm-ploop-cmd.c
>> +++ b/drivers/md/dm-ploop-cmd.c
>> @@ -725,7 +725,7 @@ static int ploop_merge_latest_snapshot(struct 
>> ploop *ploop)
>>   {
>>       struct file *file;
>>       u8 level;
>> -    int ret;
>> +    int ret, i;
>>         if (ploop->maintaince)
>>           return -EBUSY;
>> @@ -745,6 +745,15 @@ static int ploop_merge_latest_snapshot(struct 
>> ploop *ploop)
>>         level = ploop->nr_deltas - 2;
>>       file = ploop->deltas[level].file;
>> +
>> +    if (ploop->deltas[level].mtfile) {
>> +        for (i = 0; i < ploop->nkt_runners; i++) {
>> +            if (ploop->deltas[level].mtfile[i])
>> +                fput(ploop->deltas[level].mtfile[i]);
>> +        }
>> +        kfree(ploop->deltas[level].mtfile);
>> +    }
>
> Functionally looks good.
>
> We have this code in multiple places (which puts delta file and 
> mtfile-s), maybe we can make a helper of it (ploop_put_delta(struct 
> ploop_delta *delta)) and use it everywhere (in 
> ploop_merge_latest_snapshot, notify_delta_merged and ploop_destroy)?
>
Thats a good idea. I'll send v2.
>> +
>>       ploop->deltas[level] = ploop->deltas[level + 1];
>>       ploop->nr_deltas--;
>>       fput(file);
>> @@ -818,6 +827,15 @@ static void notify_delta_merged(struct ploop 
>> *ploop, u8 level,
>>       }
>>         file = ploop->deltas[level].file;
>> +
>> +    if (ploop->deltas[level].mtfile) {
>> +        for (i = 0; i < ploop->nkt_runners; i++) {
>> +            if (ploop->deltas[level].mtfile[i])
>> +                fput(ploop->deltas[level].mtfile[i]);
>> +        }
>> +        kfree(ploop->deltas[level].mtfile);
>> +    }
>> +
>>       /* Renumber deltas above @level */
>>       for (i = level + 1; i < ploop->nr_deltas; i++)
>>           ploop->deltas[i - 1] = ploop->deltas[i];
>


More information about the Devel mailing list