Relax the early validation checks in the Live Update preservation path to allow general shmem-backed files, completely dropping the requirement that the file be unlinked (!inode->i_nlink).
This officially enables userspace to push standard, path-backed tmpfs file descriptors through the LUO session ioctl instead of being artificially restricted strictly to anonymous memfd pseudofiles. Signed-off-by: David Matlack <[email protected]> --- mm/memfd_luo.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mm/memfd_luo.c b/mm/memfd_luo.c index dcda5bf98646..107115c97bd8 100644 --- a/mm/memfd_luo.c +++ b/mm/memfd_luo.c @@ -9,14 +9,15 @@ */ /** - * DOC: Memfd Preservation via LUO + * DOC: Memfd and Tmpfs Preservation via LUO * * Overview * ======== * - * Memory file descriptors (memfd) can be preserved over a kexec using the Live - * Update Orchestrator (LUO) file preservation. This allows userspace to - * transfer its memory contents to the next kernel after a kexec. + * Memory file descriptors (memfd) and generic tmpfs files can be preserved + * over a kexec using the Live Update Orchestrator (LUO) file preservation. + * This allows userspace to transfer its memory contents to the next kernel + * after a kexec. * * The preservation is not intended to be transparent. Only select properties of * the file are preserved. All others are reset to default. The preserved @@ -24,16 +25,17 @@ * * .. note:: * The LUO API is not stabilized yet, so the preserved properties of a memfd - * are also not stable and are subject to backwards incompatible changes. + * or tmpfs file are also not stable and are subject to backwards + * incompatible changes. * * .. note:: - * Currently a memfd backed by Hugetlb is not supported. Memfds created + * Currently a file backed by Hugetlb is not supported. Memfds created * with ``MFD_HUGETLB`` will be rejected. * * Preserved Properties * ==================== * - * The following properties of the memfd are preserved across kexec: + * The following properties of the memfd/tmpfs file are preserved across kexec: * * File Contents * All data stored in the file is preserved. @@ -580,9 +582,7 @@ static int memfd_luo_retrieve(struct liveupdate_file_op_args *args) static bool memfd_luo_can_preserve(struct liveupdate_file_handler *handler, struct file *file) { - struct inode *inode = file_inode(file); - - return shmem_file(file) && !inode->i_nlink; + return shmem_file(file) || shmem_mapping(file->f_mapping); } static unsigned long memfd_luo_get_id(struct file *file) -- 2.55.0.966.g6673acef38-goog

