mirror of
https://github.com/versity/scoutfs.git
synced 2026-02-08 03:30:46 +00:00
8064a161f0ccb716c01eefa77289687b1fb2e3c7
This replaces the fragile recursive locking logic in dlmglue. In particular that code fails when we have a pending downconvert and a process comes in for a level that's compatible with the existing level. The downconvert will still happen which causes us to now believe we are holding a lock that we are not! We could go back to checking for holders that raced our downconvert worker but that had problems of its own (see commit e8f7ef0). Instead of trying to infer from lock state what we are allowed to do, let's be explicit. Each lock now has a tree of task refs. If you come in to acquire a lock, we look for our task in that tree. If it's not there, we know this is the first time this task wanted that lock, so we can continue. Otherwise we incremement a count on the task ref and return the already locked lock. Unlock does the opposite - it finds the task ref and decreases the count. On zero it will proceed with the actual unlock. The owning task is the only process allowed to manipulate a task ref, so we only have to lock manipulation of the tree. We make an exception for global locks which might be unlocked from another process context (in this case that means the node id lock). Signed-off-by: Mark Fasheh <mfasheh@versity.com>
Description
No description provided
Languages
C
87%
Shell
9.3%
Roff
2.5%
TeX
0.8%
Makefile
0.4%