Re: [PATCH v6 07/20] liveupdate: luo_session: Add ioctls for file preservation

From: Mike Rapoport

Date: Sun Nov 16 2025 - 13:26:09 EST


On Sat, Nov 15, 2025 at 06:33:53PM -0500, Pasha Tatashin wrote:
> Introducing the userspace interface and internal logic required to
> manage the lifecycle of file descriptors within a session. Previously, a
> session was merely a container; this change makes it a functional
> management unit.
>
> The following capabilities are added:
>
> A new set of ioctl commands are added, which operate on the file
> descriptor returned by CREATE_SESSION. This allows userspace to:
> - LIVEUPDATE_SESSION_PRESERVE_FD: Add a file descriptor to a session
> to be preserved across the live update.
> - LIVEUPDATE_SESSION_RETRIEVE_FD: Retrieve a preserved file in the
> new kernel using its unique token.
> - LIVEUPDATE_SESSION_FINISH: finish session
>
> The session's .release handler is enhanced to be state-aware. When a
> session's file descriptor is closed, it correctly unpreserves
> the session based on its current state before freeing all
> associated file resources.
>
> Signed-off-by: Pasha Tatashin <pasha.tatashin@xxxxxxxxxx>
> ---
> include/uapi/linux/liveupdate.h | 103 ++++++++++++++++++
> kernel/liveupdate/luo_session.c | 187 +++++++++++++++++++++++++++++++-
> 2 files changed, 286 insertions(+), 4 deletions(-)

...

> static int luo_session_release(struct inode *inodep, struct file *filep)
> {
> struct luo_session *session = filep->private_data;
> struct luo_session_header *sh;
> + int err = 0;
>
> /* If retrieved is set, it means this session is from incoming list */
> - if (session->retrieved)
> + if (session->retrieved) {
> sh = &luo_session_global.incoming;
> - else
> +
> + err = luo_session_finish_one(session);
> + if (err) {
> + pr_warn("Unable to finish session [%s] on release\n",
> + session->name);

return err;

and then else can go away here and luo_session_remove() and
luo_session_free() can be moved outside if (session->retrieved).

> + } else {
> + luo_session_remove(sh, session);
> + luo_session_free(session);
> + }
> +
> + } else {
> sh = &luo_session_global.outgoing;
>
> - luo_session_remove(sh, session);
> - luo_session_free(session);
> + scoped_guard(mutex, &session->mutex)
> + luo_file_unpreserve_files(session);
> + luo_session_remove(sh, session);
> + luo_session_free(session);
> + }
> +
> + return err;
> +}

--
Sincerely yours,
Mike.