[Cluster-devel] cluster/dlm-kernel/src locking.c

teigland at sourceware.org teigland at sourceware.org
Thu Jun 22 14:29:55 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL4
Changes by:	teigland at sourceware.org	2006-06-22 14:29:54

Modified files:
	dlm-kernel/src : locking.c 

Log message:
	Add a log_error() for every abnormal error/exit condition in dlm_lock()
	and dlm_unlock().  When gfs panics after it gets the error we can look
	back and see what the cause was.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/locking.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.50.2.8&r2=1.50.2.9

--- cluster/dlm-kernel/src/Attic/locking.c	2005/03/10 07:07:36	1.50.2.8
+++ cluster/dlm-kernel/src/Attic/locking.c	2006/06/22 14:29:54	1.50.2.9
@@ -396,56 +396,85 @@
 	     void (*bast) (void *astarg, int mode),
 	     struct dlm_range *range)
 {
-	struct dlm_ls *lspace;
+	struct dlm_ls *ls;
 	struct dlm_lkb *lkb = NULL, *parent_lkb = NULL;
 	int ret = -EINVAL;
 
-	lspace = find_lockspace_by_local_id(lockspace);
-	if (!lspace)
+	ls = find_lockspace_by_local_id(lockspace);
+	if (!ls) {
+		log_print("dlm_lock: no lockspace");
 		return ret;
+	}
 
-	if (mode < 0 || mode > DLM_LOCK_EX)
+	if (mode < 0 || mode > DLM_LOCK_EX) {
+		log_error(ls, "dlm_lock: bad mode %u", mode);
 		goto out;
+	}
 
-	if (!(flags & DLM_LKF_CONVERT) && (namelen > DLM_RESNAME_MAXLEN))
+	if (!(flags & DLM_LKF_CONVERT) && (namelen > DLM_RESNAME_MAXLEN)) {
+		log_error(ls, "dlm_lock: bad name length %u", namelen);
 		goto out;
+	}
 
-	if (flags & DLM_LKF_CANCEL)
+	if (flags & DLM_LKF_CANCEL) {
+		log_error(ls, "dlm_lock: cancel not allowed");
 		goto out;
+	}
 
-	if (flags & DLM_LKF_QUECVT && !(flags & DLM_LKF_CONVERT))
+	if (flags & DLM_LKF_QUECVT && !(flags & DLM_LKF_CONVERT)) {
+		log_error(ls, "dlm_lock: bad quecvt use %x", flags);
 		goto out;
+	}
 
-	if (flags & DLM_LKF_CONVDEADLK && !(flags & DLM_LKF_CONVERT))
+	if (flags & DLM_LKF_CONVDEADLK && !(flags & DLM_LKF_CONVERT)) {
+		log_error(ls, "dlm_lock: bad convdeadlk/convert use %x", flags);
 		goto out;
+	}
 
-	if (flags & DLM_LKF_CONVDEADLK && flags & DLM_LKF_NOQUEUE)
+	if (flags & DLM_LKF_CONVDEADLK && flags & DLM_LKF_NOQUEUE) {
+		log_error(ls, "dlm_lock: bad convdeadlk/noqueue use %x", flags);
 		goto out;
+	}
 
-	if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_CONVERT)
+	if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_CONVERT) {
+		log_error(ls, "dlm_lock: bad expedite/convert use %x", flags);
 		goto out;
+	}
 
-	if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_QUECVT)
+	if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_QUECVT) {
+		log_error(ls, "dlm_lock: bad expedite/quecvt use %x", flags);
 		goto out;
+	}
 
-	if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_NOQUEUE)
+	if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_NOQUEUE) {
+		log_error(ls, "dlm_lock: bad expedite/noqueue use %x", flags);
 		goto out;
+	}
 
-	if (flags & DLM_LKF_EXPEDITE && (mode != DLM_LOCK_NL))
+	if (flags & DLM_LKF_EXPEDITE && (mode != DLM_LOCK_NL)) {
+		log_error(ls, "dlm_lock: bad mode %u flags %x", mode, flags);
 		goto out;
+	}
 
-	if (!ast || !lksb)
+	if (!ast || !lksb) {
+		if (!ast)
+			log_error(ls, "dlm_lock: no ast param");
+		if (!lksb)
+			log_error(ls, "dlm_lock: no lksb param");
 		goto out;
+	}
 
-	if ((flags & DLM_LKF_VALBLK) && !lksb->sb_lvbptr)
+	if ((flags & DLM_LKF_VALBLK) && !lksb->sb_lvbptr) {
+		log_error(ls, "dlm_lock: no lvbptr flags %x", flags);
 		goto out;
+	}
 
 	/*
 	 * Take conversion path.
 	 */
 
 	if (flags & DLM_LKF_CONVERT) {
-		ret = convert_lock(lspace, mode, lksb, flags, ast, astarg,
+		ret = convert_lock(ls, mode, lksb, flags, ast, astarg,
 				   bast, range);
 		goto out;
 	}
@@ -458,27 +487,27 @@
 	 */
 
 	if (parent) {
-		down_read(&lspace->ls_unlock_sem);
+		down_read(&ls->ls_unlock_sem);
 
-		parent_lkb = find_lock_by_id(lspace, parent);
+		parent_lkb = find_lock_by_id(ls, parent);
 
 		if (!parent_lkb ||
 		    parent_lkb->lkb_flags & GDLM_LKFLG_DELETED ||
 		    parent_lkb->lkb_flags & GDLM_LKFLG_MSTCPY ||
 		    parent_lkb->lkb_status != GDLM_LKSTS_GRANTED) {
-			up_read(&lspace->ls_unlock_sem);
+			up_read(&ls->ls_unlock_sem);
 			goto out;
 		}
 
 		atomic_inc(&parent_lkb->lkb_childcnt);
-		up_read(&lspace->ls_unlock_sem);
+		up_read(&ls->ls_unlock_sem);
 	}
 
-	down_read(&lspace->ls_in_recovery);
+	down_read(&ls->ls_in_recovery);
 
 	ret = -ENOMEM;
 
-	lkb = create_lkb(lspace);
+	lkb = create_lkb(ls);
 	if (!lkb)
 		goto fail_dec;
 	lkb->lkb_astaddr = ast;
@@ -499,11 +528,12 @@
 
 	if (range) {
 		if (range->ra_start > range->ra_end) {
+			log_error(ls, "dlm_lock bad range");
 			ret = -EINVAL;
 			goto fail_free;
 		}
 
-		if (lkb_set_range(lspace, lkb, range->ra_start, range->ra_end))
+		if (lkb_set_range(ls, lkb, range->ra_start, range->ra_end))
 			goto fail_free;
 	}
 
@@ -517,19 +547,19 @@
 
 	lksb->sb_lkid = lkb->lkb_id;
 
-	ret = dlm_lock_stage1(lspace, lkb, flags, name, namelen);
+	ret = dlm_lock_stage1(ls, lkb, flags, name, namelen);
 	if (ret)
 		goto fail_free;
 
-	up_read(&lspace->ls_in_recovery);
+	up_read(&ls->ls_in_recovery);
 
 	wake_astd();
 
-	put_lockspace(lspace);
+	put_lockspace(ls);
 	return 0;
 
       fail_free:
-	release_lkb(lspace, lkb);
+	release_lkb(ls, lkb);
 	goto fail_unlock;
 
       fail_dec:
@@ -537,10 +567,10 @@
 		atomic_dec(&parent_lkb->lkb_childcnt);
 
       fail_unlock:
-	up_read(&lspace->ls_in_recovery);
+	up_read(&ls->ls_in_recovery);
 
       out:
-	put_lockspace(lspace);
+	put_lockspace(ls);
 	return ret;
 }
 
@@ -805,20 +835,20 @@
 
 	lkb = find_lock_by_id(ls, lkid);
 	if (!lkb) {
-		log_debug(ls, "unlock %x no id", lkid);
+		log_error(ls, "dlm_unlock: unknown lkid %x", lkid);
 		goto out;
 	}
 
 	/* Can't dequeue a master copy (a remote node's mastered lock) */
 	if (lkb->lkb_flags & GDLM_LKFLG_MSTCPY) {
-		log_debug(ls, "(%d) unlock %x lkb_flags %x",
+		log_error(ls, "(%d) dlm_unlock: %x invalid lkb_flags %x",
 			  lkb->lkb_ownpid, lkid, lkb->lkb_flags);
 		goto out;
 	}
 
 	/* Already waiting for a remote lock operation */
 	if (lkb->lkb_lockqueue_state) {
-		log_debug(ls, "(%d) unlock %x lq%d",
+		log_error(ls, "(%d) dlm_unlock: %x busy %d",
 			  lkb->lkb_ownpid, lkid, lkb->lkb_lockqueue_state);
 		ret = -EBUSY;
 		goto out;
@@ -833,7 +863,7 @@
 	 */
 	if ((flags & DLM_LKF_CANCEL) &&
 	    (lkb->lkb_status == GDLM_LKSTS_GRANTED)) {
-		log_debug(ls, "(%d) unlock %x %x %d",
+		log_error(ls, "(%d) dlm_unlock: id %x flags %x status %d",
 			  lkb->lkb_ownpid, lkid, flags, lkb->lkb_status);
 		goto out;
 	}
@@ -841,13 +871,13 @@
 	/* "Normal" unlocks must operate on a granted lock */
 	if (!(flags & DLM_LKF_CANCEL) &&
 	    (lkb->lkb_status != GDLM_LKSTS_GRANTED)) {
-		log_debug(ls, "(%d) unlock %x %x %d",
+		log_error(ls, "(%d) dlm_unlock: id %x flags %x status %d",
 			  lkb->lkb_ownpid, lkid, flags, lkb->lkb_status);
 		goto out;
 	}
 
 	if (lkb->lkb_flags & GDLM_LKFLG_DELETED) {
-		log_debug(ls, "(%d) unlock deleted %x %x %d",
+		log_debug(ls, "(%d) dlm_unlock: deleted id %x flags %x sts %d",
 			  lkb->lkb_ownpid, lkid, flags, lkb->lkb_status);
 		goto out;
 	}
@@ -1005,24 +1035,34 @@
 
 	lkb = find_lock_by_id(ls, lksb->sb_lkid);
 	if (!lkb) {
+		log_error(ls, "dlm_lock: convert unknown lkid %x",
+			  lksb->sb_lkid);
 		goto out;
 	}
 
 	if (lkb->lkb_status != GDLM_LKSTS_GRANTED) {
+		log_error(ls, "dlm_lock: convert busy lock id %x status %d",
+			  lksb->sb_lkid, lkb->lkb_status);
 		ret = -EBUSY;
 		goto out;
 	}
 
 	if (lkb->lkb_flags & GDLM_LKFLG_MSTCPY) {
+		log_error(ls, "dlm_lock: convert mstcpy flags %x id %x",
+			  lkb->lkb_flags, lksb->sb_lkid);
 		goto out;
 	}
 
 	if ((flags & DLM_LKF_QUECVT) &&
 	    !__quecvt_compat_matrix[lkb->lkb_grmode + 1][mode + 1]) {
+		log_error(ls, "dlm_lock: convert id %x flags %x modes %d %d",
+			  lksb->sb_lkid, flags, lkb->lkb_grmode, mode);
 		goto out;
 	}
 
 	if (!lksb->sb_lvbptr && (flags & DLM_LKF_VALBLK)) {
+		log_error(ls, "dlm_lock: convert %x no lvbptr %x",
+			  lksb->sb_lkid, flags);
 	        goto out;
 	}
 
@@ -1031,8 +1071,10 @@
 #endif
 	/* Set up the ranges as appropriate */
 	if (range) {
-		if (range->ra_start > range->ra_end)
+		if (range->ra_start > range->ra_end) {
+			log_error(ls, "dlm_lock: convert bad range");
 			goto out;
+		}
 
 		if (lkb_set_range(ls, lkb, range->ra_start, range->ra_end)) {
 			ret = -ENOMEM;




More information about the Cluster-devel mailing list