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 <[email protected]>
> Signed-off-by: Pasha Tatashin <[email protected]>
> ---
>  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.

Reply via email to