[Ocfs2-commits] mfasheh commits r1597 - branches/dlm-glue/src

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Thu Oct 28 15:06:51 CDT 2004


Author: mfasheh
Date: 2004-10-28 15:06:50 -0500 (Thu, 28 Oct 2004)
New Revision: 1597

Modified:
   branches/dlm-glue/src/dlmglue.c
   branches/dlm-glue/src/heartbeat.c
   branches/dlm-glue/src/heartbeat.h
   branches/dlm-glue/src/ocfs.h
   branches/dlm-glue/src/proc.c
   branches/dlm-glue/src/super.c
Log:
* more cleanup and compile fixes



Modified: branches/dlm-glue/src/dlmglue.c
===================================================================
--- branches/dlm-glue/src/dlmglue.c	2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/dlmglue.c	2004-10-28 20:06:50 UTC (rev 1597)
@@ -42,6 +42,7 @@
 #include "alloc.h"
 #include "dlmglue.h"
 #include "extent_map.h"
+#include "heartbeat.h"
 #include "inode.h"
 #include "util.h"
 
@@ -94,7 +95,8 @@
 static void ocfs2_schedule_blocked_inode(struct inode *inode);
 static inline void ocfs2_recover_from_dlm_error(ocfs2_lock_res *lockres,
 						ocfs2_lock *lock);
-static void ocfs2_data_vote_on_unlock(struct inode *inode);
+static void ocfs2_vote_on_unlock(ocfs_super *osb,
+				 ocfs2_lock *lock);
 /* Called after we refresh our inode, only has any effect if we have
  * an EX lock. This populates the LVB with the initial values for our
  * change set. */
@@ -695,17 +697,14 @@
 	return status;
 }
 
-static void ocfs2_data_vote_on_unlock(struct inode *inode)
+static void ocfs2_vote_on_unlock(ocfs_super *osb,
+				 ocfs2_lock *lock)
 {
-	ocfs2_lock_res *lockres = &OCFS_I(inode)->ip_lockres;
-	ocfs2_lock *lock = &lockres->lr_data;
 	int kick = 0;
 
-	/* Data locking needs to be fast. If we know that another node
-	 * is waiting on our lock, don't just wait for the vote thread
-	 * to timeout before it processes this -- kick it
-	 * pre-emptively when we reach a release condition. */
-	spin_lock(&lockres->lr_lock);
+	/* If we know that another node is waiting on our lock, kick
+	 * the vote thread * pre-emptively when we reach a release
+	 * condition. */
 	if (lock->l_flags & OCFS2_LOCK_BLOCKED) {
 		switch(lock->l_blocking) {
 		case LKM_EXMODE:
@@ -720,33 +719,31 @@
 			BUG();
 		}
 	}
-	spin_unlock(&lockres->lr_lock);
 
 	if (kick)
-		ocfs2_kick_vote_thread(OCFS2_SB(inode->i_sb));
+		ocfs2_kick_vote_thread(osb);
 }
 
 void ocfs2_data_unlock(struct inode *inode,
 		       int write)
 {
 	int level;
-	ocfs2_lock *lock;
+	ocfs2_lock_res *lockres = &OCFS_I(inode)->ip_lockres;
+	ocfs2_lock *lock = &lockres->lr_data;
 
-	OCFS_ASSERT(inode);
+	level = write ? LKM_EXMODE : LKM_PRMODE;
 
-	lock = &(OCFS_I(inode)->ip_lockres.lr_data);
-	level = write ? LKM_EXMODE : LKM_PRMODE;
+	spin_lock(&lockres->lr_lock);
 	ocfs2_dec_holders(lock, level);
-
-	ocfs2_data_vote_on_unlock(inode);
+	ocfs2_vote_on_unlock(OCFS2_SB(inode->i_sb), lock);
+	spin_unlock(&lockres->lr_lock);
 }
 
 static inline int ocfs2_wait_on_recovery(ocfs_super *osb)
 {
-	/* recovery_count is incremented once for every dead node and
-	 * decremented once when it gets recovered. */
 	wait_event_interruptible(osb->recovery_event,
-				 !atomic_read(&osb->num_recovery_threads));
+				 !ocfs_node_map_is_empty(osb,
+							 &osb->recovery_map));
 
 	if (signal_pending(current))
 		return -EINTR;
@@ -996,13 +993,15 @@
 		       int ex)
 {
 	int level;
-	ocfs2_lock *lock;
+	ocfs2_lock_res *lockres = &OCFS_I(inode)->ip_lockres;
+	ocfs2_lock *lock = &lockres->lr_meta;
 
-	OCFS_ASSERT(inode);
+	level = ex ? LKM_EXMODE : LKM_PRMODE;
 
-	lock = &(OCFS_I(inode)->ip_lockres.lr_meta);
-	level = ex ? LKM_EXMODE : LKM_PRMODE;
+	spin_lock(&lockres->lr_lock);
 	ocfs2_dec_holders(lock, level);
+	ocfs2_vote_on_unlock(OCFS2_SB(inode->i_sb), lock);
+	spin_unlock(&lockres->lr_lock);
 }
 
 int ocfs2_dlm_init(ocfs_super *osb)
@@ -1496,11 +1495,13 @@
 	while (1) {
 		spin_unlock(&osb->vote_task_lock);
 
-#define OCFS2_VOTE_THREAD_TIMEOUT (HZ >> 1)
-		wait_event_interruptible_timeout(osb->vote_event,
-						 atomic_read(
-							 &osb->wake_vote_task),
-						 OCFS2_VOTE_THREAD_TIMEOUT);
+//#define OCFS2_VOTE_THREAD_TIMEOUT (HZ >> 1)
+//		wait_event_interruptible_timeout(osb->vote_event,
+//						 atomic_read(
+//							 &osb->wake_vote_task),
+//						 OCFS2_VOTE_THREAD_TIMEOUT);
+		wait_event_interruptible(osb->vote_event,
+					 atomic_read(&osb->wake_vote_task));
 
 		atomic_set(&osb->wake_vote_task, 0);
 
@@ -1580,6 +1581,7 @@
 			      enum ocfs2_vote_request type)
 {
 	int status;
+	ocfs_super *osb = OCFS2_SB(inode->i_sb);
 
 	if (ocfs_inode_is_new(inode))
 		return 0;
@@ -1589,8 +1591,10 @@
 		if (signal_pending(current))
 			return -EINTR;
 
-		status = ocfs2_do_request_vote(OCFS2_SB(inode->i_sb),
-					       inode, type);
+		if (ocfs_node_map_is_only(osb, &osb->node_map, osb->node_num))
+			return 0;
+
+		status = ocfs2_do_request_vote(osb, inode, type);
 	}
 	return status;
 }

Modified: branches/dlm-glue/src/heartbeat.c
===================================================================
--- branches/dlm-glue/src/heartbeat.c	2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/heartbeat.c	2004-10-28 20:06:50 UTC (rev 1597)
@@ -46,6 +46,18 @@
 #define OCFS_DEBUG_CONTEXT      OCFS_DEBUG_CONTEXT_HEARTBEAT
 
 static void ocfs_node_map_init(ocfs_super *osb, ocfs_node_map *map);
+static void __ocfs_node_map_dup(ocfs_super *osb,
+				ocfs_node_map *target,
+				ocfs_node_map *from);
+static inline void __ocfs_node_map_set_bit(ocfs_node_map *map,
+					   int bit);
+static inline void __ocfs_node_map_clear_bit(ocfs_node_map *map,
+					     int bit);
+static inline int __ocfs_node_map_is_empty(ocfs_node_map *map);
+static void __ocfs_node_map_dup(ocfs_super *osb,
+				ocfs_node_map *target,
+				ocfs_node_map *from);
+static void __ocfs_node_map_set(ocfs_node_map *target, ocfs_node_map *from);
 
 void ocfs2_init_node_maps(ocfs_super *osb)
 {
@@ -57,81 +69,154 @@
 /* Most functions here are just stubs for now... */
 int ocfs2_register_hb_callbacks(ocfs_super *osb)
 {
-	ocfs_node_map_set_bit(&osb->node_map, osb->node_num);
+	ocfs_node_map_set_bit(osb, &osb->node_map, osb->node_num);
 	return 0;
 }
 
 void ocfs2_clear_hb_callbacks(ocfs_super *osb)
 {
-
+	ocfs_node_map_clear_bit(osb, &osb->node_map, osb->node_num);
 }
 
-#warning these node map functions need to be spin locked
 /* special case -1 for now
  * TODO: should *really* make sure the calling func never passes -1!!  */
-static void ocfs_node_map_init(ocfs_super *osb, ocfs_node_map *map)
+static void ocfs_node_map_init(ocfs_super *osb,
+			       ocfs_node_map *map)
 {
-	spin_lock(&osb->node_map_lock);
 	map->num_nodes = osb->max_nodes;
 	memset(map->map, 0, BITS_TO_LONGS(OCFS_NODE_MAP_MAX_NODES) * 
 	       sizeof(unsigned long));
-	spin_unlock(&osb->node_map_lock);
 }
 
-void ocfs_node_map_set_bit(ocfs_node_map *map, int bit)
+static inline void __ocfs_node_map_set_bit(ocfs_node_map *map,
+					   int bit)
 {
-	if (bit==-1)
-		return;
-	OCFS_ASSERT(bit < map->num_nodes);
 	set_bit(bit, map->map);
 }
 
-void ocfs_node_map_clear_bit(ocfs_node_map *map, int bit)
+void ocfs_node_map_set_bit(ocfs_super *osb,
+			   ocfs_node_map *map,
+			   int bit)
 {
 	if (bit==-1)
 		return;
 	OCFS_ASSERT(bit < map->num_nodes);
-	clear_bit(bit, map->map);
+	spin_lock(&osb->node_map_lock);
+	__ocfs_node_map_set_bit(map, bit);
+	spin_unlock(&osb->node_map_lock);
 }
 
-#if 0
-// clear all the bits in "target" which are set in "mask"
-static void __ocfs_node_map_clear_bits(ocfs_node_map *target,
-				       ocfs_node_map *mask)
+static inline void __ocfs_node_map_clear_bit(ocfs_node_map *map,
+					     int bit)
 {
-	int bit, prev=0;
-	while (1) {
-		bit = find_next_bit (mask->map, mask->num_nodes, prev);
-		if (bit >= mask->num_nodes)
-			break;
-		ocfs_node_map_clear_bit(target, bit);
-		prev = bit+1;
-	}
+	clear_bit(bit, map->map);
 }
 
-// set all the bits in "target" which are set in "mask"
-void __ocfs_node_map_set_bits(ocfs_node_map *target,
-			      ocfs_node_map *mask)
+void ocfs_node_map_clear_bit(ocfs_super *osb,
+			     ocfs_node_map *map,
+			     int bit)
 {
-	int bit, prev=0;
-	while (1) {
-		bit = find_next_bit (mask->map, mask->num_nodes, prev);
-		if (bit >= mask->num_nodes)
-			break;
-		ocfs_node_map_set_bit(target, bit);
-		prev = bit+1;
-	}
+	if (bit==-1)
+		return;
+	OCFS_ASSERT(bit < map->num_nodes);
+	spin_lock(&osb->node_map_lock);
+	__ocfs_node_map_clear_bit(map, bit);
+	spin_unlock(&osb->node_map_lock);
 }
-#endif
-int ocfs_node_map_test_bit(ocfs_node_map *map, int bit)
+
+int ocfs_node_map_test_bit(ocfs_super *osb,
+			   ocfs_node_map *map,
+			   int bit)
 {
+	int ret;
 	if (bit >= map->num_nodes) {
 		LOG_ERROR_ARGS("bit=%d map->num_nodes=%d\n", bit, map->num_nodes);
 		BUG();
 	}
-	return test_bit(bit, map->map);
+	spin_lock(&osb->node_map_lock);
+	ret = test_bit(bit, map->map);
+	spin_unlock(&osb->node_map_lock);
+	return ret;
 }
 
+static inline int __ocfs_node_map_is_empty(ocfs_node_map *map)
+{
+	int bit;
+	bit = find_next_bit(map->map, map->num_nodes, 0);
+	if (bit < map->num_nodes)
+		return 0;
+	return 1;
+}
+
+int ocfs_node_map_is_empty(ocfs_super *osb,
+			   ocfs_node_map *map)
+{
+	int ret;
+	OCFS_ASSERT(map->num_nodes > 0);
+	spin_lock(&osb->node_map_lock);
+	ret = __ocfs_node_map_is_empty(map);
+	spin_unlock(&osb->node_map_lock);
+	return ret;
+}
+
+static void __ocfs_node_map_dup(ocfs_super *osb,
+				ocfs_node_map *target,
+				ocfs_node_map *from)
+{
+	OCFS_ASSERT(from->num_nodes > 0);
+	ocfs_node_map_init(osb, target);
+	__ocfs_node_map_set(target, from);
+}
+
+/* returns 1 if bit is the only bit set in target, 0 otherwise */
+int ocfs_node_map_is_only(ocfs_super *osb,
+			  ocfs_node_map *target,
+			  int bit)
+{
+	ocfs_node_map temp;
+	int ret;
+
+	spin_lock(&osb->node_map_lock);
+	__ocfs_node_map_dup(osb, &temp, target);
+	__ocfs_node_map_clear_bit(&temp, bit);
+	ret = __ocfs_node_map_is_empty(&temp);
+	spin_unlock(&osb->node_map_lock);
+
+	return ret;
+}
+
+static void __ocfs_node_map_set(ocfs_node_map *target,
+				ocfs_node_map *from)
+{
+	int num_longs, i; 
+
+	OCFS_ASSERT(target->num_nodes == from->num_nodes);
+	OCFS_ASSERT(target->num_nodes > 0);
+
+	num_longs = BITS_TO_LONGS(target->num_nodes);
+	for (i=0; i<num_longs; i++)
+		target->map[i] = from->map[i];
+}
+
+void ocfs_recovery_map_set(ocfs_super *osb,
+			   int num)
+{
+	spin_lock(&osb->node_map_lock);
+	__ocfs_node_map_clear_bit(&osb->node_map, num);
+	__ocfs_node_map_set_bit(&osb->recovery_map, num);
+	spin_unlock(&osb->node_map_lock);
+}
+
+void ocfs_recovery_map_clear(ocfs_super *osb,
+			     int num)
+{
+	ocfs_node_map_clear_bit(osb, &osb->recovery_map, num);
+}
+
+
+#if 0
+/* unused (for now) node map functions. */
+
 static int ocfs_node_map_stringify(ocfs_node_map *map, char **str)
 {
 	int i, n;
@@ -159,14 +244,16 @@
 	return 0;
 }
 
-int ocfs_node_map_is_empty(ocfs_node_map *map)
+void ocfs_node_map_and(ocfs_node_map *target, ocfs_node_map *mask)
 {
-	int bit;
-	OCFS_ASSERT(map->num_nodes > 0);
-	bit = find_next_bit(map->map, map->num_nodes, 0);
-	if (bit < map->num_nodes)
-		return 0;
-	return 1;
+	int num_longs, i; 
+
+	OCFS_ASSERT(target->num_nodes == mask->num_nodes);
+	OCFS_ASSERT(target->num_nodes > 0);
+	
+	num_longs = BITS_TO_LONGS(target->num_nodes);
+	for (i=0; i<num_longs; i++)
+		target->map[i] &= mask->map[i];
 }
 
 int ocfs_node_map_is_equal(ocfs_node_map *map1, ocfs_node_map *map2)
@@ -184,64 +271,36 @@
 	return 1;
 }
 
-void ocfs_node_map_and(ocfs_node_map *target, ocfs_node_map *mask)
-{
-	int num_longs, i; 
 
-	OCFS_ASSERT(target->num_nodes == mask->num_nodes);
-	OCFS_ASSERT(target->num_nodes > 0);
-	
-	num_longs = BITS_TO_LONGS(target->num_nodes);
-	for (i=0; i<num_longs; i++)
-		target->map[i] &= mask->map[i];
-}
-
-void ocfs_node_map_set(ocfs_node_map *target, ocfs_node_map *from)
+// clear all the bits in "target" which are set in "mask"
+static void __ocfs_node_map_clear_bits(ocfs_node_map *target,
+				       ocfs_node_map *mask)
 {
-	int num_longs, i; 
-
-	OCFS_ASSERT(target->num_nodes == from->num_nodes);
-	OCFS_ASSERT(target->num_nodes > 0);
-
-	num_longs = BITS_TO_LONGS(target->num_nodes);
-	for (i=0; i<num_longs; i++)
-		target->map[i] = from->map[i];
+	int bit, prev=0;
+	while (1) {
+		bit = find_next_bit (mask->map, mask->num_nodes, prev);
+		if (bit >= mask->num_nodes)
+			break;
+		ocfs_node_map_clear_bit(target, bit);
+		prev = bit+1;
+	}
 }
 
-void ocfs_node_map_dup(ocfs_super *osb, ocfs_node_map *target, ocfs_node_map *from)
+// set all the bits in "target" which are set in "mask"
+void __ocfs_node_map_set_bits(ocfs_node_map *target,
+			      ocfs_node_map *mask)
 {
-	OCFS_ASSERT(from->num_nodes > 0);
-	ocfs_node_map_init(osb, target);
-	ocfs_node_map_set(target, from);
+	int bit, prev=0;
+	while (1) {
+		bit = find_next_bit (mask->map, mask->num_nodes, prev);
+		if (bit >= mask->num_nodes)
+			break;
+		ocfs_node_map_set_bit(target, bit);
+		prev = bit+1;
+	}
 }
+#endif
 
-/* returns 1 if bit is the only bit set in target, 0 otherwise */
-int ocfs_node_map_is_only(ocfs_super *osb, ocfs_node_map *target, int bit)
-{
-	ocfs_node_map temp;
-	int ret;
-
-	ocfs_node_map_dup(osb, &temp, target);
-	ocfs_node_map_clear_bit(&temp, bit);
-	ret = ocfs_node_map_is_empty(&temp);
-	return ret;
-}
-
-/* update the recovery map here */
-void ocfs_recovery_map_set(ocfs_super *osb, int num)
-{
-	spin_lock(&osb->node_map_lock);
-	ocfs_node_map_set_bit(&osb->recovery_map, num);
-	spin_unlock(&osb->node_map_lock);
-}
-
-void ocfs_recovery_map_clear(ocfs_super *osb, int num)
-{
-	spin_lock(&osb->node_map_lock);
-	ocfs_node_map_clear_bit(&osb->recovery_map, num);
-	spin_unlock(&osb->node_map_lock);
-}
-
 #if 0
 				if (node_map[i].miss_cnt >= MISS_COUNT_NODE_DEAD) {
 					ocfs_recovery_map_set(osb, i);

Modified: branches/dlm-glue/src/heartbeat.h
===================================================================
--- branches/dlm-glue/src/heartbeat.h	2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/heartbeat.h	2004-10-28 20:06:50 UTC (rev 1597)
@@ -31,17 +31,26 @@
 int ocfs2_register_hb_callbacks(ocfs_super *osb);
 void ocfs2_clear_hb_callbacks(ocfs_super *osb);
 
-void ocfs_node_map_set_bit(ocfs_node_map *map, int bit);
-void ocfs_node_map_clear_bit(ocfs_node_map *map, int bit);
-int ocfs_node_map_test_bit(ocfs_node_map *map, int bit);
-int ocfs_node_map_is_empty(ocfs_node_map *map);
-int ocfs_node_map_is_equal(ocfs_node_map *map1, ocfs_node_map *map2);
-void ocfs_node_map_and(ocfs_node_map *target, ocfs_node_map *mask);
-void ocfs_node_map_set(ocfs_node_map *target, ocfs_node_map *from);
-void ocfs_node_map_dup(ocfs_super *osb, ocfs_node_map *target, ocfs_node_map *from);
+/* node map functions - used to keep track of mounted and in-recovery
+ * nodes. */
+int ocfs_node_map_is_empty(ocfs_super *osb,
+			   ocfs_node_map *map);
+void ocfs_node_map_set_bit(ocfs_super *osb,
+			   ocfs_node_map *map,
+			   int bit);
+void ocfs_node_map_clear_bit(ocfs_super *osb,
+			     ocfs_node_map *map,
+			     int bit);
+int ocfs_node_map_test_bit(ocfs_super *osb,
+			   ocfs_node_map *map,
+			   int bit);
+void ocfs_recovery_map_set(ocfs_super *osb,
+			   int num);
+void ocfs_recovery_map_clear(ocfs_super *osb,
+			     int num);
 /* returns 1 if bit is the only bit set in target, 0 otherwise */
-int ocfs_node_map_is_only(ocfs_super *osb, ocfs_node_map *target, int bit);
-void ocfs_recovery_map_set(ocfs_super *osb, int num);
-void ocfs_recovery_map_clear(ocfs_super *osb, int num);
+int ocfs_node_map_is_only(ocfs_super *osb,
+			  ocfs_node_map *target,
+			  int bit);
 
 #endif /* OCFS2_HEARTBEAT_H */

Modified: branches/dlm-glue/src/ocfs.h
===================================================================
--- branches/dlm-glue/src/ocfs.h	2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/ocfs.h	2004-10-28 20:06:50 UTC (rev 1597)
@@ -514,7 +514,6 @@
 
 	dlm_ctxt *dlm;
 
-	atomic_t recovery_count;
 	wait_queue_head_t recovery_event;
 
 	spinlock_t vote_task_lock;

Modified: branches/dlm-glue/src/proc.c
===================================================================
--- branches/dlm-glue/src/proc.c	2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/proc.c	2004-10-28 20:06:50 UTC (rev 1597)
@@ -446,7 +446,7 @@
 
 	ptr = pubmap;
 	for (i = 0; i < osb->max_nodes; i++) {
-		if (ocfs_node_map_test_bit(&osb->node_map, i))
+		if (ocfs_node_map_test_bit(osb, &osb->node_map, i))
 			ptr += sprintf (ptr, "%d ", i);
 	}
 	if (pubmap != ptr)
@@ -527,7 +527,7 @@
 			node = osb->node_cfg_info[i];
 			if (!node)
 				continue;
-			mount = ocfs_node_map_test_bit(&osb->node_map, i) ? 'M' : ' ';
+			mount = ocfs_node_map_test_bit(osb, &osb->node_map, i) ? 'M' : ' ';
 			len += sprintf (page + len,
 				       	"%2d %c %-32s 0x%08u %-6u ",
 				       	i, mount, node->node_name,

Modified: branches/dlm-glue/src/super.c
===================================================================
--- branches/dlm-glue/src/super.c	2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/super.c	2004-10-28 20:06:50 UTC (rev 1597)
@@ -1123,7 +1123,6 @@
 		goto finally;
 	}
 
-	atomic_set(&osb->recovery_count, 0);
 	init_waitqueue_head(&osb->recovery_event);
 	atomic_set(&osb->wake_vote_task, 0);
 	spin_lock_init(&osb->vote_task_lock);



More information about the Ocfs2-commits mailing list