Re: [PATCH v6 12/20] mm: shmem: allow freezing inode mapping
From: Pratyush Yadav
Date: Mon Nov 24 2025 - 10:07:04 EST
On Mon, Nov 17 2025, Mike Rapoport wrote:
> On Sat, Nov 15, 2025 at 06:33:58PM -0500, Pasha Tatashin wrote:
>> From: Pratyush Yadav <ptyadav@xxxxxxxxx>
>>
>> To prepare a shmem inode for live update via the Live Update
>> Orchestrator (LUO), its index -> folio mappings must be serialized. Once
>> the mappings are serialized, they cannot change since it would cause the
>> serialized data to become inconsistent. This can be done by pinning the
>> folios to avoid migration, and by making sure no folios can be added to
>> or removed from the inode.
>>
>> While mechanisms to pin folios already exist, the only way to stop
>> folios being added or removed are the grow and shrink file seals. But
>> file seals come with their own semantics, one of which is that they
>> can't be removed. This doesn't work with liveupdate since it can be
>> cancelled or error out, which would need the seals to be removed and the
>> file's normal functionality to be restored.
>>
>> Introduce SHMEM_F_MAPPING_FROZEN to indicate this instead. It is
>> internal to shmem and is not directly exposed to userspace. It functions
>> similar to F_SEAL_GROW | F_SEAL_SHRINK, but additionally disallows hole
>> punching, and can be removed.
>>
>> Signed-off-by: Pratyush Yadav <ptyadav@xxxxxxxxx>
>> Signed-off-by: Pasha Tatashin <pasha.tatashin@xxxxxxxxxx>
>> ---
[...]
>> diff --git a/mm/shmem.c b/mm/shmem.c
>> index 1d5036dec08a..05c3db840257 100644
>> --- a/mm/shmem.c
>> +++ b/mm/shmem.c
>> @@ -1292,7 +1292,8 @@ static int shmem_setattr(struct mnt_idmap *idmap,
>> loff_t newsize = attr->ia_size;
>>
>> /* protected by i_rwsem */
>> - if ((newsize < oldsize && (info->seals & F_SEAL_SHRINK)) ||
>> + if ((info->flags & SHMEM_F_MAPPING_FROZEN) ||
>
> A corner case: if newsize == oldsize this will be a false positive
Good catch. Though I wonder why anyone would do a truncate with the same
size.
>
>> + (newsize < oldsize && (info->seals & F_SEAL_SHRINK)) ||
>> (newsize > oldsize && (info->seals & F_SEAL_GROW)))
>> return -EPERM;
>>
[...]
--
Regards,
Pratyush Yadav