kernel/liveupdate/luo_session.c
Source file repositories/reference/linux-study-clean/kernel/liveupdate/luo_session.c
File Facts
- System
- Linux kernel
- Corpus path
kernel/liveupdate/luo_session.c- Extension
.c- Size
- 19169 bytes
- Lines
- 683
- Domain
- Core OS
- Bucket
- Scheduler, Processes, Timers, Sync, And Syscalls
- Inferred role
- Core OS: operation-table or driver-model contract
- Status
- pattern implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/anon_inodes.hlinux/cleanup.hlinux/err.hlinux/errno.hlinux/file.hlinux/fs.hlinux/io.hlinux/kexec_handover.hlinux/kho_block.hlinux/kho/abi/luo.hlinux/list.hlinux/liveupdate.hlinux/mutex.hlinux/rwsem.hlinux/slab.huapi/linux/liveupdate.hluo_internal.h
Detected Declarations
struct luo_session_headerstruct luo_session_globalstruct luo_ioctl_openum luo_ioctl_typefunction luo_session_freefunction luo_session_insertfunction Ofunction luo_session_removefunction luo_session_finish_onefunction luo_session_unfreeze_onefunction luo_session_freeze_onefunction luo_session_releasefunction luo_session_preserve_fdfunction luo_session_retrieve_fdfunction luo_session_finishfunction luo_session_get_namefunction luo_ioctl_type_validfunction luo_session_ioctlfunction ARRAY_SIZEfunction luo_session_getfilefunction luo_session_createfunction luo_session_retrievefunction luo_session_setup_outgoingfunction luo_session_setup_incomingfunction luo_session_deserialize_onefunction scoped_guardfunction luo_session_deserializefunction luo_session_serializefunction list_for_each_entry
Annotated Snippet
static const struct file_operations luo_session_fops = {
.owner = THIS_MODULE,
.release = luo_session_release,
.unlocked_ioctl = luo_session_ioctl,
};
/* Create a "struct file" for session */
static int luo_session_getfile(struct luo_session *session, struct file **filep)
{
char name_buf[128];
struct file *file;
lockdep_assert_held(&session->mutex);
snprintf(name_buf, sizeof(name_buf), "[luo_session] %s", session->name);
file = anon_inode_getfile(name_buf, &luo_session_fops, session, O_RDWR);
if (IS_ERR(file))
return PTR_ERR(file);
*filep = file;
return 0;
}
int luo_session_create(const char *name, struct file **filep)
{
size_t len = strnlen(name, LIVEUPDATE_SESSION_NAME_LENGTH);
struct luo_session *session;
int err;
if (len == 0 || len > LIVEUPDATE_SESSION_NAME_LENGTH - 1)
return -EINVAL;
session = luo_session_alloc(name);
if (IS_ERR(session))
return PTR_ERR(session);
down_read(&luo_session_serialize_rwsem);
err = luo_session_insert(&luo_session_global.outgoing, session);
if (err)
goto err_free;
mutex_lock(&session->mutex);
err = luo_session_getfile(session, filep);
mutex_unlock(&session->mutex);
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);
up_read(&luo_session_serialize_rwsem);
return err;
}
int luo_session_retrieve(const char *name, struct file **filep)
{
struct luo_session_header *sh = &luo_session_global.incoming;
struct luo_session *session = NULL;
struct luo_session *it;
int err;
guard(rwsem_read)(&luo_session_serialize_rwsem);
guard(rwsem_read)(&sh->rwsem);
list_for_each_entry(it, &sh->list, list) {
if (!strncmp(it->name, name, sizeof(it->name))) {
session = it;
break;
}
}
if (!session)
return -ENOENT;
guard(mutex)(&session->mutex);
if (session->retrieved)
return -EINVAL;
err = luo_session_getfile(session, filep);
if (!err)
session->retrieved = true;
return err;
}
void __init luo_session_setup_outgoing(u64 *sessions_pa)
Annotation
- Immediate include surface: `linux/anon_inodes.h`, `linux/cleanup.h`, `linux/err.h`, `linux/errno.h`, `linux/file.h`, `linux/fs.h`, `linux/io.h`, `linux/kexec_handover.h`.
- Detected declarations: `struct luo_session_header`, `struct luo_session_global`, `struct luo_ioctl_op`, `enum luo_ioctl_type`, `function luo_session_free`, `function luo_session_insert`, `function O`, `function luo_session_remove`, `function luo_session_finish_one`, `function luo_session_unfreeze_one`.
- Atlas domain: Core OS / Scheduler, Processes, Timers, Sync, And Syscalls.
- Implementation status: pattern implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.