liveupdate: add LIVEUPDATE_SESSION_GET_NAME ioctl

Userspace when requesting a session via the ioctl specifies a name and
gets a FD, but then there is no ioctl to go back the other way and get
the name given a LUO session FD. This is problematic especially when
there is a userspace orchestrator that wants to check what FDs it is
handling for clients without having to do manual string scraping of
procfs, or without procfs at all.

Add a ioctl to simply get the name from an FD.

Signed-off-by: Luca Boccassi <luca.boccassi@gmail.com>
Reviewed-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Reviewed-by: Pratyush Yadav <pratyush@kernel.org>
Link: https://lore.kernel.org/r/20260429212221.814107-4-luca.boccassi@gmail.com
Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
This commit is contained in:
Luca Boccassi 2026-04-29 22:21:16 +01:00 committed by Mike Rapoport (Microsoft)
parent dab2b4c66a
commit 4c08a9f38c
2 changed files with 37 additions and 0 deletions

View File

@ -59,6 +59,7 @@ enum {
LIVEUPDATE_CMD_SESSION_PRESERVE_FD = LIVEUPDATE_CMD_SESSION_BASE,
LIVEUPDATE_CMD_SESSION_RETRIEVE_FD = 0x41,
LIVEUPDATE_CMD_SESSION_FINISH = 0x42,
LIVEUPDATE_CMD_SESSION_GET_NAME = 0x43,
};
/**
@ -213,4 +214,24 @@ struct liveupdate_session_finish {
#define LIVEUPDATE_SESSION_FINISH \
_IO(LIVEUPDATE_IOCTL_TYPE, LIVEUPDATE_CMD_SESSION_FINISH)
/**
* struct liveupdate_session_get_name - ioctl(LIVEUPDATE_SESSION_GET_NAME)
* @size: Input; sizeof(struct liveupdate_session_get_name)
* @reserved: Input; Must be zero. Reserved for future use.
* @name: Output; A null-terminated string with the full session name.
*
* Retrieves the full name of the session associated with this file descriptor.
* This is useful because the kernel may truncate the name shown in /proc.
*
* Return: 0 on success, negative error code on failure.
*/
struct liveupdate_session_get_name {
__u32 size;
__u32 reserved;
__u8 name[LIVEUPDATE_SESSION_NAME_LENGTH];
};
#define LIVEUPDATE_SESSION_GET_NAME \
_IO(LIVEUPDATE_IOCTL_TYPE, LIVEUPDATE_CMD_SESSION_GET_NAME)
#endif /* _UAPI_LIVEUPDATE_H */

View File

@ -289,10 +289,24 @@ static int luo_session_finish(struct luo_session *session,
return luo_ucmd_respond(ucmd, sizeof(*argp));
}
static int luo_session_get_name(struct luo_session *session,
struct luo_ucmd *ucmd)
{
struct liveupdate_session_get_name *argp = ucmd->cmd;
if (argp->reserved != 0)
return -EINVAL;
strscpy((char *)argp->name, session->name, sizeof(argp->name));
return luo_ucmd_respond(ucmd, sizeof(*argp));
}
union ucmd_buffer {
struct liveupdate_session_finish finish;
struct liveupdate_session_preserve_fd preserve;
struct liveupdate_session_retrieve_fd retrieve;
struct liveupdate_session_get_name get_name;
};
struct luo_ioctl_op {
@ -319,6 +333,8 @@ static const struct luo_ioctl_op luo_session_ioctl_ops[] = {
struct liveupdate_session_preserve_fd, token),
IOCTL_OP(LIVEUPDATE_SESSION_RETRIEVE_FD, luo_session_retrieve_fd,
struct liveupdate_session_retrieve_fd, token),
IOCTL_OP(LIVEUPDATE_SESSION_GET_NAME, luo_session_get_name,
struct liveupdate_session_get_name, name),
};
static long luo_session_ioctl(struct file *filep, unsigned int cmd,