[PATCH v4 3/5] liveupdate: block session mutations during reboot

Mike Rapoport rppt at kernel.org
Mon May 18 01:40:08 PDT 2026


On Sun, May 17, 2026 at 07:26:48PM +0000, Pasha Tatashin wrote:
> During the reboot() syscall, user processes may still be running
> concurrently and attempting to mutate sessions (e.g., creating,
> retrieving, or releasing sessions). To prevent this, introduce
> luo_session_serialize_rwsem to synchronize mutations with the
> serialization process.
> 
> All session mutation operations (create, retrieve, release, ioctl) take
> the read lock. The serialization process (luo_session_serialize) takes
> the write lock and holds it indefinitely on success. This effectively
> freezes the LUO session subsystem during the transition to the new
> kernel. If serialization fails, the lock is released to allow recovery.
> 
> Fixes: 0153094d03df ("liveupdate: luo_session: add sessions support")
> Reported-by: Oskar Gerlicz Kowalczuk <oskar at gerlicz.space>
> Signed-off-by: Pasha Tatashin <pasha.tatashin at soleen.com>
> ---
>  kernel/liveupdate/luo_session.c | 27 ++++++++++++++++++++++++---
>  1 file changed, 24 insertions(+), 3 deletions(-)
> 
> diff --git a/kernel/liveupdate/luo_session.c b/kernel/liveupdate/luo_session.c
> index 59b37d17db6b..6099213275d8 100644
> --- a/kernel/liveupdate/luo_session.c
> +++ b/kernel/liveupdate/luo_session.c
> @@ -385,9 +394,12 @@ int luo_session_create(const char *name, struct file **filep)
>  	struct luo_session *session;
>  	int err;
>  
> +	down_read(&luo_session_serialize_rwsem);
>  	session = luo_session_alloc(name);

We can alloc outside the lock, will make error handling simpler.

sashiko complains about mixing down_read() with scoped_guard(), for this
function it would make sense to use plain mutex_{lock,unlock} around
luo_session_getfile()

> -	if (IS_ERR(session))
> -		return PTR_ERR(session);
> +	if (IS_ERR(session)) {
> +		err = PTR_ERR(session);
> +		goto err_unlock;
> +	}
>  
>  	err = luo_session_insert(&luo_session_global.outgoing, session);
>  	if (err)
> @@ -398,12 +410,16 @@ int luo_session_create(const char *name, struct file **filep)
>  	if (err)
>  		goto err_remove;
>  
> +	up_read(&luo_session_serialize_rwsem);
> +
>  	return 0;
>  
>  err_remove:
>  	luo_session_remove(&luo_session_global.outgoing, session);
>  err_free:
>  	luo_session_free(session);
> +err_unlock:
> +	up_read(&luo_session_serialize_rwsem);
>  
>  	return err;
>  }

-- 
Sincerely yours,
Mike.



More information about the kexec mailing list