fs/gfs2/lock_dlm.c
Source file repositories/reference/linux-study-clean/fs/gfs2/lock_dlm.c
File Facts
- System
- Linux kernel
- Corpus path
fs/gfs2/lock_dlm.c- Extension
.c- Size
- 43123 bytes
- Lines
- 1463
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: implementation source
- Status
- source 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.
- 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/fs.hlinux/dlm.hlinux/hex.hlinux/slab.hlinux/types.hlinux/delay.hlinux/gfs2_ondisk.hlinux/sched/signal.hincore.hutil.hsys.htrace_gfs2.h
Detected Declarations
function Copyrightfunction rttfunction irtfunction gdlm_astfunction gdlm_bastfunction make_modefunction middle_conversionfunction down_conversionfunction make_flagsfunction gfs2_reverse_hexfunction gdlm_lockfunction gdlm_put_lockfunction gdlm_cancelfunction control_mountfunction control_lvb_writefunction all_jid_bits_clearfunction sync_wait_cbfunction sync_unlockfunction sync_lockfunction mounted_unlockfunction mounted_lockfunction control_unlockfunction control_lockfunction gfs2_control_funcfunction control_mountfunction control_mountfunction clearfunction control_first_donefunction necessaryfunction free_recover_sizefunction gdlm_recover_prepfunction gdlm_recover_slotfunction gdlm_recover_donefunction gdlm_recovery_resultfunction gdlm_mountfunction gdlm_first_donefunction gdlm_unmount
Annotated Snippet
test_bit(DFL_FIRST_MOUNT, &ls->ls_recover_flags)) {
spin_unlock(&ls->ls_recover_spin);
return;
}
block_gen = ls->ls_recover_block;
start_gen = ls->ls_recover_start;
spin_unlock(&ls->ls_recover_spin);
/*
* Equal block_gen and start_gen implies we are between
* recover_prep and recover_done callbacks, which means
* dlm recovery is in progress and dlm locking is blocked.
* There's no point trying to do any work until recover_done.
*/
if (block_gen == start_gen)
return;
/*
* Propagate recover_submit[] and recover_result[] to lvb:
* dlm_recoverd adds to recover_submit[] jids needing recovery
* gfs2_recover adds to recover_result[] journal recovery results
*
* set lvb bit for jids in recover_submit[] if the lvb has not
* yet been updated for the generation of the failure
*
* clear lvb bit for jids in recover_result[] if the result of
* the journal recovery is SUCCESS
*/
error = control_lock(sdp, DLM_LOCK_EX, DLM_LKF_CONVERT|DLM_LKF_VALBLK);
if (error) {
fs_err(sdp, "control lock EX error %d\n", error);
return;
}
control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits);
spin_lock(&ls->ls_recover_spin);
if (block_gen != ls->ls_recover_block ||
start_gen != ls->ls_recover_start) {
fs_info(sdp, "recover generation %u block1 %u %u\n",
start_gen, block_gen, ls->ls_recover_block);
spin_unlock(&ls->ls_recover_spin);
control_lock(sdp, DLM_LOCK_NL, DLM_LKF_CONVERT);
return;
}
recover_size = ls->ls_recover_size;
if (lvb_gen <= start_gen) {
/*
* Clear lvb bits for jids we've successfully recovered.
* Because all nodes attempt to recover failed journals,
* a journal can be recovered multiple times successfully
* in succession. Only the first will really do recovery,
* the others find it clean, but still report a successful
* recovery. So, another node may have already recovered
* the jid and cleared the lvb bit for it.
*/
for (i = 0; i < recover_size; i++) {
if (ls->ls_recover_result[i] != LM_RD_SUCCESS)
continue;
ls->ls_recover_result[i] = 0;
if (!test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET))
continue;
__clear_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET);
write_lvb = 1;
}
}
if (lvb_gen == start_gen) {
/*
* Failed slots before start_gen are already set in lvb.
*/
for (i = 0; i < recover_size; i++) {
if (!ls->ls_recover_submit[i])
continue;
if (ls->ls_recover_submit[i] < lvb_gen)
ls->ls_recover_submit[i] = 0;
}
} else if (lvb_gen < start_gen) {
/*
* Failed slots before start_gen are not yet set in lvb.
*/
for (i = 0; i < recover_size; i++) {
if (!ls->ls_recover_submit[i])
Annotation
- Immediate include surface: `linux/fs.h`, `linux/dlm.h`, `linux/hex.h`, `linux/slab.h`, `linux/types.h`, `linux/delay.h`, `linux/gfs2_ondisk.h`, `linux/sched/signal.h`.
- Detected declarations: `function Copyright`, `function rtt`, `function irt`, `function gdlm_ast`, `function gdlm_bast`, `function make_mode`, `function middle_conversion`, `function down_conversion`, `function make_flags`, `function gfs2_reverse_hex`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- 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.