Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1dcf65f authored by David Teigland's avatar David Teigland
Browse files

dlm: fix locking of lockspace list in dlm_scand



The dlm_scand thread needs to lock the list of lockspaces
when going through it.

Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent dc68c7ed
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -445,6 +445,7 @@ struct dlm_ls {
						   the dlm using this ls */
	int			ls_create_count; /* create/release refcount */
	unsigned long		ls_flags;	/* LSFL_ */
	unsigned long		ls_scan_time;
	struct kobject		ls_kobj;

	struct dlm_rsbtable	*ls_rsbtbl;
+25 −2
Original line number Diff line number Diff line
@@ -212,19 +212,41 @@ void dlm_lockspace_exit(void)
	kset_unregister(dlm_kset);
}

static struct dlm_ls *find_ls_to_scan(void)
{
	struct dlm_ls *ls;

	spin_lock(&lslist_lock);
	list_for_each_entry(ls, &lslist, ls_list) {
		if (time_after_eq(jiffies, ls->ls_scan_time +
					    dlm_config.ci_scan_secs * HZ)) {
			spin_unlock(&lslist_lock);
			return ls;
		}
	}
	spin_unlock(&lslist_lock);
	return NULL;
}

static int dlm_scand(void *data)
{
	struct dlm_ls *ls;
	int timeout_jiffies = dlm_config.ci_scan_secs * HZ;

	while (!kthread_should_stop()) {
		list_for_each_entry(ls, &lslist, ls_list) {
		ls = find_ls_to_scan();
		if (ls) {
			if (dlm_lock_recovery_try(ls)) {
				ls->ls_scan_time = jiffies;
				dlm_scan_rsbs(ls);
				dlm_scan_timeout(ls);
				dlm_unlock_recovery(ls);
			} else {
				ls->ls_scan_time += HZ;
			}
		} else {
			schedule_timeout_interruptible(timeout_jiffies);
		}
		schedule_timeout_interruptible(dlm_config.ci_scan_secs * HZ);
	}
	return 0;
}
@@ -418,6 +440,7 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
	ls->ls_lvblen = lvblen;
	ls->ls_count = 0;
	ls->ls_flags = 0;
	ls->ls_scan_time = jiffies;

	if (flags & DLM_LSFL_TIMEWARN)
		set_bit(LSFL_TIMEWARN, &ls->ls_flags);