Commit 578acf9a authored by Alexander Aring's avatar Alexander Aring Committed by David Teigland
Browse files

dlm: use spin_lock_bh for message processing



Use spin_lock_bh for all spinlocks involved in message processing,
in preparation for softirq message processing.  DLM lock requests
from user space involve dlm processing in user context, in addition
to the standard kernel context, necessitating bh variants.

Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent 308533b4
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -142,12 +142,12 @@ void dlm_add_cb(struct dlm_lkb *lkb, uint32_t flags, int mode, int status,
		cb->astparam = lkb->lkb_astparam;
		INIT_WORK(&cb->work, dlm_callback_work);

		spin_lock(&ls->ls_cb_lock);
		spin_lock_bh(&ls->ls_cb_lock);
		if (test_bit(LSFL_CB_DELAY, &ls->ls_flags))
			list_add(&cb->list, &ls->ls_cb_delay);
		else
			queue_work(ls->ls_callback_wq, &cb->work);
		spin_unlock(&ls->ls_cb_lock);
		spin_unlock_bh(&ls->ls_cb_lock);
		break;
	case DLM_ENQUEUE_CALLBACK_SUCCESS:
		break;
@@ -179,9 +179,9 @@ void dlm_callback_stop(struct dlm_ls *ls)
void dlm_callback_suspend(struct dlm_ls *ls)
{
	if (ls->ls_callback_wq) {
		spin_lock(&ls->ls_cb_lock);
		spin_lock_bh(&ls->ls_cb_lock);
		set_bit(LSFL_CB_DELAY, &ls->ls_flags);
		spin_unlock(&ls->ls_cb_lock);
		spin_unlock_bh(&ls->ls_cb_lock);

		flush_workqueue(ls->ls_callback_wq);
	}
@@ -199,7 +199,7 @@ void dlm_callback_resume(struct dlm_ls *ls)
		return;

more:
	spin_lock(&ls->ls_cb_lock);
	spin_lock_bh(&ls->ls_cb_lock);
	list_for_each_entry_safe(cb, safe, &ls->ls_cb_delay, list) {
		list_del(&cb->list);
		queue_work(ls->ls_callback_wq, &cb->work);
@@ -210,7 +210,7 @@ void dlm_callback_resume(struct dlm_ls *ls)
	empty = list_empty(&ls->ls_cb_delay);
	if (empty)
		clear_bit(LSFL_CB_DELAY, &ls->ls_flags);
	spin_unlock(&ls->ls_cb_lock);
	spin_unlock_bh(&ls->ls_cb_lock);

	sum += count;
	if (!empty) {
+14 −14
Original line number Diff line number Diff line
@@ -452,7 +452,7 @@ static void *table_seq_start(struct seq_file *seq, loff_t *pos)

	tree = toss ? &ls->ls_rsbtbl[bucket].toss : &ls->ls_rsbtbl[bucket].keep;

	spin_lock(&ls->ls_rsbtbl[bucket].lock);
	spin_lock_bh(&ls->ls_rsbtbl[bucket].lock);
	if (!RB_EMPTY_ROOT(tree)) {
		for (node = rb_first(tree); node; node = rb_next(node)) {
			r = rb_entry(node, struct dlm_rsb, res_hashnode);
@@ -460,12 +460,12 @@ static void *table_seq_start(struct seq_file *seq, loff_t *pos)
				dlm_hold_rsb(r);
				ri->rsb = r;
				ri->bucket = bucket;
				spin_unlock(&ls->ls_rsbtbl[bucket].lock);
				spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);
				return ri;
			}
		}
	}
	spin_unlock(&ls->ls_rsbtbl[bucket].lock);
	spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);

	/*
	 * move to the first rsb in the next non-empty bucket
@@ -484,18 +484,18 @@ static void *table_seq_start(struct seq_file *seq, loff_t *pos)
		}
		tree = toss ? &ls->ls_rsbtbl[bucket].toss : &ls->ls_rsbtbl[bucket].keep;

		spin_lock(&ls->ls_rsbtbl[bucket].lock);
		spin_lock_bh(&ls->ls_rsbtbl[bucket].lock);
		if (!RB_EMPTY_ROOT(tree)) {
			node = rb_first(tree);
			r = rb_entry(node, struct dlm_rsb, res_hashnode);
			dlm_hold_rsb(r);
			ri->rsb = r;
			ri->bucket = bucket;
			spin_unlock(&ls->ls_rsbtbl[bucket].lock);
			spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);
			*pos = n;
			return ri;
		}
		spin_unlock(&ls->ls_rsbtbl[bucket].lock);
		spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);
	}
}

@@ -516,7 +516,7 @@ static void *table_seq_next(struct seq_file *seq, void *iter_ptr, loff_t *pos)
	 * move to the next rsb in the same bucket
	 */

	spin_lock(&ls->ls_rsbtbl[bucket].lock);
	spin_lock_bh(&ls->ls_rsbtbl[bucket].lock);
	rp = ri->rsb;
	next = rb_next(&rp->res_hashnode);

@@ -524,12 +524,12 @@ static void *table_seq_next(struct seq_file *seq, void *iter_ptr, loff_t *pos)
		r = rb_entry(next, struct dlm_rsb, res_hashnode);
		dlm_hold_rsb(r);
		ri->rsb = r;
		spin_unlock(&ls->ls_rsbtbl[bucket].lock);
		spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);
		dlm_put_rsb(rp);
		++*pos;
		return ri;
	}
	spin_unlock(&ls->ls_rsbtbl[bucket].lock);
	spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);
	dlm_put_rsb(rp);

	/*
@@ -550,18 +550,18 @@ static void *table_seq_next(struct seq_file *seq, void *iter_ptr, loff_t *pos)
		}
		tree = toss ? &ls->ls_rsbtbl[bucket].toss : &ls->ls_rsbtbl[bucket].keep;

		spin_lock(&ls->ls_rsbtbl[bucket].lock);
		spin_lock_bh(&ls->ls_rsbtbl[bucket].lock);
		if (!RB_EMPTY_ROOT(tree)) {
			next = rb_first(tree);
			r = rb_entry(next, struct dlm_rsb, res_hashnode);
			dlm_hold_rsb(r);
			ri->rsb = r;
			ri->bucket = bucket;
			spin_unlock(&ls->ls_rsbtbl[bucket].lock);
			spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);
			*pos = n;
			return ri;
		}
		spin_unlock(&ls->ls_rsbtbl[bucket].lock);
		spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);
	}
}

@@ -743,7 +743,7 @@ static ssize_t waiters_read(struct file *file, char __user *userbuf,
		goto out;
	}

	spin_lock(&ls->ls_waiters_lock);
	spin_lock_bh(&ls->ls_waiters_lock);
	memset(debug_buf, 0, sizeof(debug_buf));

	list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) {
@@ -754,7 +754,7 @@ static ssize_t waiters_read(struct file *file, char __user *userbuf,
			break;
		pos += ret;
	}
	spin_unlock(&ls->ls_waiters_lock);
	spin_unlock_bh(&ls->ls_waiters_lock);
	dlm_unlock_recovery(ls);

	rv = simple_read_from_buffer(userbuf, count, ppos, debug_buf, pos);
+12 −12
Original line number Diff line number Diff line
@@ -204,12 +204,12 @@ static struct dlm_rsb *find_rsb_root(struct dlm_ls *ls, const char *name,
	hash = jhash(name, len, 0);
	bucket = hash & (ls->ls_rsbtbl_size - 1);

	spin_lock(&ls->ls_rsbtbl[bucket].lock);
	spin_lock_bh(&ls->ls_rsbtbl[bucket].lock);
	rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[bucket].keep, name, len, &r);
	if (rv)
		rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[bucket].toss,
					 name, len, &r);
	spin_unlock(&ls->ls_rsbtbl[bucket].lock);
	spin_unlock_bh(&ls->ls_rsbtbl[bucket].lock);

	if (!rv)
		return r;
@@ -245,7 +245,7 @@ static void drop_dir_ctx(struct dlm_ls *ls, int nodeid)
{
	struct dlm_dir_dump *dd, *safe;

	write_lock(&ls->ls_dir_dump_lock);
	write_lock_bh(&ls->ls_dir_dump_lock);
	list_for_each_entry_safe(dd, safe, &ls->ls_dir_dump_list, list) {
		if (dd->nodeid_init == nodeid) {
			log_error(ls, "drop dump seq %llu",
@@ -254,21 +254,21 @@ static void drop_dir_ctx(struct dlm_ls *ls, int nodeid)
			kfree(dd);
		}
	}
	write_unlock(&ls->ls_dir_dump_lock);
	write_unlock_bh(&ls->ls_dir_dump_lock);
}

static struct dlm_dir_dump *lookup_dir_dump(struct dlm_ls *ls, int nodeid)
{
	struct dlm_dir_dump *iter, *dd = NULL;

	read_lock(&ls->ls_dir_dump_lock);
	read_lock_bh(&ls->ls_dir_dump_lock);
	list_for_each_entry(iter, &ls->ls_dir_dump_list, list) {
		if (iter->nodeid_init == nodeid) {
			dd = iter;
			break;
		}
	}
	read_unlock(&ls->ls_dir_dump_lock);
	read_unlock_bh(&ls->ls_dir_dump_lock);

	return dd;
}
@@ -291,9 +291,9 @@ static struct dlm_dir_dump *init_dir_dump(struct dlm_ls *ls, int nodeid)
	dd->seq_init = ls->ls_recover_seq;
	dd->nodeid_init = nodeid;

	write_lock(&ls->ls_dir_dump_lock);
	write_lock_bh(&ls->ls_dir_dump_lock);
	list_add(&dd->list, &ls->ls_dir_dump_list);
	write_unlock(&ls->ls_dir_dump_lock);
	write_unlock_bh(&ls->ls_dir_dump_lock);

	return dd;
}
@@ -311,7 +311,7 @@ void dlm_copy_master_names(struct dlm_ls *ls, const char *inbuf, int inlen,
	struct dlm_dir_dump *dd;
	__be16 be_namelen;

	read_lock(&ls->ls_masters_lock);
	read_lock_bh(&ls->ls_masters_lock);

	if (inlen > 1) {
		dd = lookup_dir_dump(ls, nodeid);
@@ -397,12 +397,12 @@ void dlm_copy_master_names(struct dlm_ls *ls, const char *inbuf, int inlen,
		log_rinfo(ls, "dlm_recover_directory nodeid %d sent %u res out %u messages",
			  nodeid, dd->sent_res, dd->sent_msg);

		write_lock(&ls->ls_dir_dump_lock);
		write_lock_bh(&ls->ls_dir_dump_lock);
		list_del_init(&dd->list);
		write_unlock(&ls->ls_dir_dump_lock);
		write_unlock_bh(&ls->ls_dir_dump_lock);
		kfree(dd);
	}
 out:
	read_unlock(&ls->ls_masters_lock);
	read_unlock_bh(&ls->ls_masters_lock);
}
+118 −88

File changed.

Preview size limit exceeded, changes collapsed.

+2 −2
Original line number Diff line number Diff line
@@ -69,12 +69,12 @@ static inline int is_master(struct dlm_rsb *r)

static inline void lock_rsb(struct dlm_rsb *r)
{
	spin_lock(&r->res_lock);
	spin_lock_bh(&r->res_lock);
}

static inline void unlock_rsb(struct dlm_rsb *r)
{
	spin_unlock(&r->res_lock);
	spin_unlock_bh(&r->res_lock);
}

#endif
Loading