drivers/md/dm-vdo/indexer/index-session.c
Source file repositories/reference/linux-study-clean/drivers/md/dm-vdo/indexer/index-session.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/md/dm-vdo/indexer/index-session.c- Extension
.c- Size
- 22004 bytes
- Lines
- 736
- Domain
- Driver Families
- Bucket
- drivers/md
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
index-session.hlinux/atomic.hlogger.hmemory-alloc.htime-utils.hfunnel-requestqueue.hindex.hindex-layout.h
Detected Declarations
enum index_session_flag_bitenum index_session_flagfunction release_index_sessionfunction release_index_sessionfunction uds_launch_requestfunction enter_callback_stagefunction count_oncefunction update_session_statsfunction handle_callbacksfunction make_empty_index_sessionfunction uds_create_index_sessionfunction start_loading_index_sessionfunction finish_loading_index_sessionfunction initialize_index_sessionfunction uds_open_indexfunction wait_for_no_requests_in_progressfunction save_indexfunction suspend_rebuildfunction uds_suspend_index_sessionfunction replace_devicefunction uds_resume_index_sessionfunction save_and_free_indexfunction uds_close_indexfunction uds_destroy_index_sessionfunction uds_flush_index_sessionfunction collect_statsfunction uds_get_index_session_statsfunction uds_wait_cond
Annotated Snippet
if (result != UDS_SUCCESS) {
mutex_lock(&session->request_mutex);
session->state &= ~IS_FLAG_WAITING;
uds_broadcast_cond(&session->request_cond);
mutex_unlock(&session->request_mutex);
return uds_status_to_errno(result);
}
}
if (resume_replay) {
mutex_lock(&session->load_context.mutex);
switch (session->load_context.status) {
case INDEX_SUSPENDED:
session->load_context.status = INDEX_OPENING;
/* Notify the index to start replaying again. */
uds_broadcast_cond(&session->load_context.cond);
break;
case INDEX_READY:
/* There is no index rebuild to resume. */
break;
case INDEX_OPENING:
case INDEX_SUSPENDING:
case INDEX_FREEING:
default:
/* These cases should not happen; do nothing. */
VDO_ASSERT_LOG_ONLY(false, "Bad load context state %u",
session->load_context.status);
break;
}
mutex_unlock(&session->load_context.mutex);
}
mutex_lock(&session->request_mutex);
session->state &= ~IS_FLAG_WAITING;
session->state &= ~IS_FLAG_SUSPENDED;
uds_broadcast_cond(&session->request_cond);
mutex_unlock(&session->request_mutex);
return UDS_SUCCESS;
}
static int save_and_free_index(struct uds_index_session *index_session)
{
int result = UDS_SUCCESS;
bool suspended;
struct uds_index *index = index_session->index;
if (index == NULL)
return UDS_SUCCESS;
mutex_lock(&index_session->request_mutex);
suspended = (index_session->state & IS_FLAG_SUSPENDED);
mutex_unlock(&index_session->request_mutex);
if (!suspended) {
result = uds_save_index(index);
if (result != UDS_SUCCESS)
vdo_log_warning_strerror(result,
"ignoring error from save_index");
}
uds_free_index(index);
index_session->index = NULL;
/*
* Reset all index state that happens to be in the index
* session, so it doesn't affect any future index.
*/
mutex_lock(&index_session->load_context.mutex);
index_session->load_context.status = INDEX_OPENING;
mutex_unlock(&index_session->load_context.mutex);
mutex_lock(&index_session->request_mutex);
/* Only the suspend bit will remain relevant. */
index_session->state &= IS_FLAG_SUSPENDED;
mutex_unlock(&index_session->request_mutex);
return result;
}
/* Save and close the current index. */
int uds_close_index(struct uds_index_session *index_session)
{
int result = UDS_SUCCESS;
/* Wait for any current index state change to complete. */
mutex_lock(&index_session->request_mutex);
while ((index_session->state & IS_FLAG_WAITING) ||
(index_session->state & IS_FLAG_CLOSING)) {
uds_wait_cond(&index_session->request_cond,
Annotation
- Immediate include surface: `index-session.h`, `linux/atomic.h`, `logger.h`, `memory-alloc.h`, `time-utils.h`, `funnel-requestqueue.h`, `index.h`, `index-layout.h`.
- Detected declarations: `enum index_session_flag_bit`, `enum index_session_flag`, `function release_index_session`, `function release_index_session`, `function uds_launch_request`, `function enter_callback_stage`, `function count_once`, `function update_session_stats`, `function handle_callbacks`, `function make_empty_index_session`.
- Atlas domain: Driver Families / drivers/md.
- Implementation status: source implementation candidate.
- 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.