15 Feb, 2014
1 commit
-
The log messages relating to the progress of recovery
are minimal and very often useful. Change these to
the KERN_INFO level so they are always available.Signed-off-by: David Teigland
08 Jan, 2013
1 commit
-
Keep track of whether a toss list contains any
shrinkable rsbs. If not, dlm_scand can avoid
scanning the list for rsbs to shrink. Unnecessary
scanning can otherwise waste a lot of time because
the toss lists can contain a large number of rsbs
that are non-shrinkable (directory records).Signed-off-by: David Teigland
17 Nov, 2012
1 commit
-
When a node is removed that held a PW/EX lock, the
existing master node should invalidate the lvb on the
resource due to the purged lock.Previously, the existing master node was invalidating
the lvb if it found only NL/CR locks on the resource
during recovery for the removed node. This could lead
to cases where it invalidated the lvb and shouldn't
have, or cases where it should have invalidated and
didn't.When recovery selects a *new* master node for a
resource, and that new master finds only NL/CR locks
on the resource after lock recovery, it should
invalidate the lvb. This case was handled correctly
(but was incorrectly applied to the existing master
case also.)When a process exits while holding a PW/EX lock,
the lvb on the resource should be invalidated.
This was not happening.The lvb contents and VALNOTVALID flag should be
recovered before granting locks in recovery so that
the recovered lvb state is provided in the callback.
The lvb was being recovered after the lock was granted.Signed-off-by: David Teigland
09 Aug, 2012
1 commit
-
The in_recovery rw_semaphore has always been acquired and
released by different threads by design. To work around
the "BUG: bad unlock balance detected!" messages, adjust
things so the dlm_recoverd thread always does both down_write
and up_write.Signed-off-by: David Teigland
17 Jul, 2012
3 commits
-
It was possible for a remove message on an old
rsb to be sent after a lookup message on a new
rsb, where the rsbs were for the same resource
name. This could lead to a missing directory
entry for the new rsb.It is fixed by keeping a copy of the resource
name being removed until after the remove has
been sent. A lookup checks if this in-progress
remove matches the name it is looking up.Signed-off-by: David Teigland
-
When a large number of resources are being recovered,
a linear search of the recover_list takes a long time.
Use an idr in place of a list.Signed-off-by: David Teigland
-
Remove the dir hash table (dirtbl), and use
the rsb hash table (rsbtbl) as the resource
directory. It has always been an unnecessary
duplication of information.This improves efficiency by using a single rsbtbl
lookup in many cases where both rsbtbl and dirtbl
lookups were needed previously.This eliminates the need to handle cases of rsbtbl
and dirtbl being out of sync.In many cases there will be memory savings because
the dir hash table no longer exists.Signed-off-by: David Teigland
03 May, 2012
1 commit
-
The "nodir" mode (statically assign master nodes instead
of using the resource directory) has always been highly
experimental, and never seriously used. This commit
fixes a number of problems, making nodir much more usable.- Major change to recovery: recover all locks and restart
all in-progress operations after recovery. In some
cases it's not possible to know which in-progess locks
to recover, so recover all. (Most require recovery
in nodir mode anyway since rehashing changes most
master nodes.)- Change the way nodir mode is enabled, from a command
line mount arg passed through gfs2, into a sysfs
file managed by dlm_controld, consistent with the
other config settings.- Allow recovering MSTCPY locks on an rsb that has not
yet been turned into a master copy.- Ignore RCOM_LOCK and RCOM_LOCK_REPLY recovery messages
from a previous, aborted recovery cycle. Base this
on the local recovery status not being in the state
where any nodes should be sending LOCK messages for the
current recovery cycle.- Hold rsb lock around dlm_purge_mstcpy_locks() because it
may run concurrently with dlm_recover_master_copy().- Maintain highbast on process-copy lkb's (in addition to
the master as is usual), because the lkb can switch
back and forth between being a master and being a
process copy as the master node changes in recovery.- When recovering MSTCPY locks, flag rsb's that have
non-empty convert or waiting queues for granting
at the end of recovery. (Rename flag from LOCKS_PURGED
to RECOVER_GRANT and similar for the recovery function,
because it's not only resources with purged locks
that need grant a grant attempt.)- Replace a couple of unnecessary assertion panics with
error messages.Signed-off-by: David Teigland
27 Apr, 2012
1 commit
-
Unify the checking for both types of ignored
rcom messages, and replace the two log_debug
statements with a single, rate limited debug
message.Signed-off-by: David Teigland
04 Jan, 2012
2 commits
-
These new callbacks notify the dlm user about lock recovery.
GFS2, and possibly others, need to be aware of when the dlm
will be doing lock recovery for a failed lockspace member.In the past, this coordination has been done between dlm and
file system daemons in userspace, which then direct their
kernel counterparts. These callbacks allow the same
coordination directly, and more simply.Signed-off-by: David Teigland
-
Slot numbers are assigned to nodes when they join the lockspace.
The slot number chosen is the minimum unused value starting at 1.
Once a node is assigned a slot, that slot number will not change
while the node remains a lockspace member. If the node leaves
and rejoins it can be assigned a new slot number.A new generation number is also added to a lockspace. It is
set and incremented during each recovery along with the slot
collection/assignment.The slot numbers will be passed to gfs2 which will use them as
journal id's.Signed-off-by: David Teigland
19 Nov, 2011
1 commit
-
Change the linked lists to rb_tree's in the rsb
hash table to speed up searches. Slow rsb searches
were having a large impact on gfs2 performance due
to the large number of dlm locks gfs2 uses.Signed-off-by: Bob Peterson
Signed-off-by: David Teigland
16 Jul, 2011
1 commit
-
Instead of creating our own kthread (dlm_astd) to deliver
callbacks for all lockspaces, use a per-lockspace workqueue
to deliver the callbacks. This eliminates complications and
slowdowns from many lockspaces sharing the same thread.Signed-off-by: David Teigland
13 Jul, 2011
1 commit
-
By pre-allocating rsb structs before searching the hash
table, they can be inserted immediately. This avoids
always having to repeat the search when adding the struct
to hash list.This also adds space to the rsb struct for a max resource
name, so an rsb allocation can be used by any request.
The constant size also allows us to finally use a slab
for the rsb structs.Signed-off-by: David Teigland
11 Jul, 2011
1 commit
-
This is simpler and quicker than the hash table, and
avoids needing to search the hash list for every new
lkid to check if it's used.Signed-off-by: David Teigland
05 Apr, 2011
1 commit
-
kmalloc a stub message struct during recovery instead of sharing the
struct in the lockspace. This leaves the lockspace stub_ms only for
faking downconvert replies, where it is never modified and sharing
is not a problem.Also improve the debug messages in the same recovery function.
Signed-off-by: David Teigland
02 Apr, 2011
1 commit
-
Add an option (disabled by default) to print a warning message
when a lock has been waiting a configurable amount of time for
a reply message from another node. This is mainly for debugging.Signed-off-by: David Teigland
11 Mar, 2011
1 commit
-
Change how callbacks are recorded for locks. Previously, information
about multiple callbacks was combined into a couple of variables that
indicated what the end result should be. In some situations, we
could not tell from this combined state what the exact sequence of
callbacks were, and would end up either delivering the callbacks in
the wrong order, or suppress redundant callbacks incorrectly. This
new approach records all the data for each callback, leaving no
uncertainty about what needs to be delivered.Signed-off-by: David Teigland
25 Feb, 2010
1 commit
-
When both blocking and completion callbacks are queued for lock,
the dlm would always deliver the completion callback (cast) first.
In some cases the blocking callback (bast) is queued before the
cast, though, and should be delivered first. This patch keeps
track of the order in which they were queued and delivers them
in that order.This patch also keeps track of the granted mode in the last cast
and eliminates the following bast if the bast mode is compatible
with the preceding cast mode. This happens when a remotely mastered
lock is demoted, e.g. EX->NL, in which case the local node queues
a cast immediately after sending the demote message. In this way
a cast can be queued for a mode, e.g. NL, that makes an in-transit
bast extraneous.Signed-off-by: David Teigland
01 Dec, 2009
1 commit
-
Replace all GFP_KERNEL and ls_allocation with GFP_NOFS.
ls_allocation would be GFP_KERNEL for userland lockspaces
and GFP_NOFS for file system lockspaces.It was discovered that any lockspaces on the system can
affect all others by triggering memory reclaim in the
file system which could in turn call back into the dlm
to acquire locks, deadlocking dlm threads that were
shared by all lockspaces, like dlm_recv.Signed-off-by: David Teigland
29 Jan, 2009
1 commit
-
The ls_dirtbl[].lock was an rwlock, but since it was only used in write
mode a spinlock will suffice.Signed-off-by: Steven Whitehouse
Signed-off-by: David Teigland
09 Jan, 2009
1 commit
-
The rwlock is almost always used in write mode, so there's no reason
to not use a spinlock instead.Signed-off-by: David Teigland
24 Dec, 2008
3 commits
-
The new debugfs entry dumps all rsb and lkb structures, and includes
a lot more information than has been available before. This includes
the new timestamps added by a previous patch for debugging callback
issues.Signed-off-by: David Teigland
-
Record the time the latest blocking callback was queued for
a lock. This will be used for debugging in combination with
lock queue timestamp changes in the previous patch.Signed-off-by: David Teigland
-
Use ktime instead of jiffies for timestamping lkb's. Also stamp the
time on every lkb whenever it's added to a resource queue, instead of
just stamping locks subject to timeouts. This will allow us to use
timestamps more widely for debugging all locks.Signed-off-by: David Teigland
29 Aug, 2008
2 commits
-
The dlm_scand thread needs to lock the list of lockspaces
when going through it.Signed-off-by: David Teigland
-
Add a count for lockspace create and release so that create can
be called multiple times to use the lockspace from different places.
Also add the new flag DLM_LSFL_NEWEXCL to create a lockspace with
the previous behavior of returning -EEXIST if the lockspace already
exists.Signed-off-by: David Teigland
23 Apr, 2008
1 commit
-
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm:
dlm: linux/{dlm,dlm_device}.h: cleanup for userspace
dlm: common max length definitions
dlm: move plock code from gfs2
dlm: recover nodes that are removed and re-added
dlm: save master info after failed no-queue request
dlm: make dlm_print_rsb() static
dlm: match signedness between dlm_config_info and cluster_set
22 Apr, 2008
3 commits
-
Add central definitions for max lockspace name length and max resource
name length. The lack of central definitions has resulted in scattered
private definitions which we can now clean up, including an unused one
in dlm_device.h.Signed-off-by: David Teigland
-
Move the code that handles cluster posix locks from gfs2 into the dlm
so that it can be used by both gfs2 and ocfs2.Signed-off-by: David Teigland
-
If a node is removed from a lockspace, and then added back before the
dlm is notified of the removal, the dlm will not detect the removal
and won't clear the old state from the node. This is fixed by using a
list of added nodes so the membership recovery can detect when a newly
added node is already in the member list.Signed-off-by: David Teigland
19 Apr, 2008
1 commit
-
None of these files use any of the functionality promised by
asm/semaphore.h.Signed-off-by: Matthew Wilcox
07 Feb, 2008
1 commit
-
Put lkb_astparam in a union with a dlm_user_args pointer to
eliminate a lot of type casting.Signed-off-by: David Teigland
06 Feb, 2008
1 commit
-
Use proper types for ast and bast functions, and use
consistent type for ast param.Signed-off-by: David Teigland
04 Feb, 2008
4 commits
-
Signed-off-by: Al Viro
Signed-off-by: David Teigland -
Signed-off-by: Al Viro
Signed-off-by: David Teigland -
Signed-off-by: Al Viro
Signed-off-by: David Teigland -
* check that length is large enough to cover the non-variable part of message or
rcom resp. (after checking that it's large enough to cover the header, of
course).* kill more pointless casts
Signed-off-by: Al Viro
Signed-off-by: David Teigland
30 Jan, 2008
1 commit
-
This patch adds a proper prototype for some functions in
fs/dlm/dlm_internal.hSigned-off-by: Adrian Bunk
Signed-off-by: David Teigland
10 Oct, 2007
1 commit
-
Introduce a per-lockspace rwsem that's held in read mode by dlm_recv
threads while working in the dlm. This allows dlm_recv activity to be
suspended when the lockspace transitions to, from and between recovery
cycles.The specific bug prompting this change is one where an in-progress
recovery cycle is aborted by a new recovery cycle. While dlm_recv was
processing a recovery message, the recovery cycle was aborted and
dlm_recoverd began cleaning up. dlm_recv decremented recover_locks_count
on an rsb after dlm_recoverd had reset it to zero. This is fixed by
suspending dlm_recv (taking write lock on the rwsem) before aborting the
current recovery.The transitions to/from normal and recovery modes are simplified by using
this new ability to block dlm_recv. The switch from normal to recovery
mode means dlm_recv goes from processing locking messages, to saving them
for later, and vice versa. Races are avoided by blocking dlm_recv when
setting the flag that switches between modes.Signed-off-by: David Teigland
Signed-off-by: Steven Whitehouse