[Ocfs2-commits] khackel commits r1001 - in branches/format-changes/src: . inc

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Thu Jun 3 20:59:43 CDT 2004


Author: khackel
Date: 2004-06-03 19:59:41 -0500 (Thu, 03 Jun 2004)
New Revision: 1001

Modified:
   branches/format-changes/src/alloc.c
   branches/format-changes/src/dcache.c
   branches/format-changes/src/dir.c
   branches/format-changes/src/dlm.c
   branches/format-changes/src/file.c
   branches/format-changes/src/heartbeat.c
   branches/format-changes/src/inc/ocfs.h
   branches/format-changes/src/inc/ocfs_compat.h
   branches/format-changes/src/inc/proto.h
   branches/format-changes/src/inode.c
   branches/format-changes/src/lockres.c
   branches/format-changes/src/namei.c
   branches/format-changes/src/nm.c
   branches/format-changes/src/proc.c
   branches/format-changes/src/super.c
   branches/format-changes/src/sysfile.c
   branches/format-changes/src/volcfg.c
   branches/format-changes/src/vote.c
Log:
This is a big commit for moving away from static (32 bit) "node maps" 
throughout the source.  The new code limits things at 256, but is 
flexible enough to go to whatever if need be.  A new structure 
(ocfs_node_map) is now used to handle anything related to a map of nodes,
such as open maps, publish map, etc.  It is kind of big and allocated
on the stack, so we can shrink or alloc/dealloc this if people scream.



Modified: branches/format-changes/src/alloc.c
===================================================================
--- branches/format-changes/src/alloc.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/alloc.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -234,12 +234,12 @@
 	} while (0)
 
 	ALLOC_BLOCK(free_ext_node,
-		    OCFS_MAXIMUM_NODES * sizeof (ocfs_free_rec *), status);
+		    osb->max_nodes * sizeof (ocfs_free_rec *), status);
 	ALLOC_BLOCK(extnode_inode,
-		    OCFS_MAXIMUM_NODES * sizeof (struct inode *), status);
+		    osb->max_nodes * sizeof (struct inode *), status);
 
 	/* init */
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
+	for (i = 0; i < osb->max_nodes; i++) {
 		free_ext_node[i] = NULL;
 		extnode_inode[i] = NULL;
 	}
@@ -315,7 +315,7 @@
 	 * preserve lock ordering with extend/create */
 	lock_id = (OCFS_FILE_FILE_ALLOC_BITMAP * osb->sect_size) +
 		  osb->vol_layout.root_int_off;
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++, lock_id += osb->sect_size) {
+	for (i = 0; i < osb->max_nodes; i++, lock_id += osb->sect_size) {
 		if (free_ext_node[i] != NULL) {
 			extnode_inode[i] = ocfs_iget(osb, lock_id, NULL);
 			if (!extnode_inode[i]) {
@@ -354,7 +354,7 @@
 		}
 		down(&vol_inode->i_sem);
 
-		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
+		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET(osb),
 					    OCFS_DLM_EXCLUSIVE_LOCK,
 					    FLAG_FILE_CREATE,
 					    &globalbh, vol_inode);
@@ -380,7 +380,7 @@
 
 	/* We can potentiallly loose some allocation for dirNodes or extent */
 	/* nodes but they should not be much...  */
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
+	for (i = 0; i < osb->max_nodes; i++) {
 		if (free_ext_node[i] != NULL)
 			ocfs_free_vol_block (osb, handle, free_ext_node[i], i,
 					     DISK_ALLOC_EXTENT_NODE);
@@ -416,7 +416,7 @@
 		ocfs_abort_trans(handle);
 
 	if (free_vol_bits) {
-		status = ocfs_release_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
+		status = ocfs_release_lock (osb, OCFS_BITMAP_LOCK_OFFSET(osb),
 					    OCFS_DLM_EXCLUSIVE_LOCK,
 					    FLAG_FILE_CREATE, globalbh, 
 					    vol_inode);
@@ -428,7 +428,7 @@
 
 	lock_id = (OCFS_FILE_FILE_ALLOC_BITMAP * osb->sect_size) +
 		  osb->vol_layout.root_int_off;
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++, lock_id += osb->sect_size) {
+	for (i = 0; i < osb->max_nodes; i++, lock_id += osb->sect_size) {
 		if (free_ext_node[i] != NULL) {
 			status = ocfs_release_lock (osb, lock_id,
 						    OCFS_DLM_EXCLUSIVE_LOCK,
@@ -444,7 +444,7 @@
 
 finally:
 
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
+	for (i = 0; i < osb->max_nodes; i++) {
 		if (extnode_inode[i]) {
 			up(&extnode_inode[i]->i_sem);
 			iput(extnode_inode[i]);
@@ -458,7 +458,7 @@
 	if (globalbh)
 		brelse(globalbh);
 
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
+	for (i = 0; i < osb->max_nodes; i++) {
 		ocfs_safefree (free_ext_node[i]);
 	}
 
@@ -2694,7 +2694,7 @@
 		ocfs_handle_add_inode(handle, bitmap_inode);
 
 		/* Get the allocation lock here */
-		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
+		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET(osb),
 					    OCFS_DLM_EXCLUSIVE_LOCK, 0, 
 					    &bh, bitmap_inode);
 		if (status < 0) {
@@ -2878,7 +2878,7 @@
 			blockSize = (__u32) osb->vol_layout.file_node_size;
 			blockSizeBits = osb->file_alloc_bits;
 			atomic_inc(&osb->alloc_stats.ext_allocs);
-			inode = igrab(osb->system_inodes[FILE_ALLOC_BITMAP_SYSTEM_INODE]);
+			inode = igrab(osb->system_inodes[EXTENT_ALLOC_BITMAP_SYSTEM_INODE]);
 			break;
 		case DISK_ALLOC_INODE:
 			bm_file = OCFS_INODE_BITMAP + NodeNum;
@@ -3525,7 +3525,7 @@
 		ocfs_handle_add_inode(handle, main_bm_inode);
 
 		/* Get the allocation lock here */
-		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
+		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET(osb),
 					    OCFS_DLM_EXCLUSIVE_LOCK, 0, 
 					    &main_bm_bh, 
 					    main_bm_inode);

Modified: branches/format-changes/src/dcache.c
===================================================================
--- branches/format-changes/src/dcache.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/dcache.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -80,7 +80,7 @@
 		goto bail;
 	}
 
-	if (osb->publ_map == (1 << osb->node_num)) {
+	if (ocfs_node_map_is_only(osb, &osb->publ_map, osb->node_num)) {
 		LOG_TRACE_STR ("Only node alive.  revalidate=true.");
 		ret = 1;
 		goto bail;

Modified: branches/format-changes/src/dir.c
===================================================================
--- branches/format-changes/src/dir.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/dir.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -176,7 +176,7 @@
  * NOTE: this should always be called with inode->i_sem taken!
  */
 /* parent off changed to file entry offset of parent! */
-int ocfs_find_files_on_disk (ocfs_super * osb, struct dentry * dentry, struct buffer_head ** fe_bh, struct inode *inode, struct inode *file_inode, int take_lock, struct buffer_head **dirent_bh, struct ocfs2_dir_entry **dirent)
+int ocfs_find_files_on_disk (ocfs_super * osb, const char *name, int namelen, struct buffer_head ** fe_bh, struct inode *inode, struct inode *file_inode, int take_lock, struct buffer_head **dirent_bh, struct ocfs2_dir_entry **dirent)
 {
 	int status = -ENOENT;
 	int tmpstat;
@@ -185,7 +185,8 @@
 	__u32 lock_type = OCFS_DLM_ENABLE_CACHE_LOCK;
 	__u64 parent_off = GET_INODE_FEOFF(inode);
 	
-	LOG_ENTRY_ARGS ("(osb=%p, parent=%llu, dentry=%p, fe_bh=%p, inode=%p)\n", osb, parent_off, dentry, fe_bh, inode);
+	LOG_ENTRY_ARGS ("(osb=%p, parent=%llu, name='%*s', fe_bh=%p, inode=%p)\n", 
+			osb, parent_off, namelen, name, fe_bh, inode);
 
 	if (take_lock) {
 		/* Get a lock on the directory... */
@@ -201,7 +202,7 @@
 	}
 
 	status = -ENOENT;
-	*dirent_bh = ocfs_find_entry (dentry, dirent);
+	*dirent_bh = ocfs_find_entry (name, namelen, inode, dirent);
 	if (!*dirent_bh || !*dirent)
 		goto leave;
 

Modified: branches/format-changes/src/dlm.c
===================================================================
--- branches/format-changes/src/dlm.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/dlm.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -48,16 +48,42 @@
 
 static inline int ocfs_wait_for_readonly_drop(ocfs_super *osb, struct inode *inode);
 
-static int ocfs_disk_request_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 * vote_map, __u64 * lock_seq_num, __u32 time_to_wait, struct inode *inode, __u64 *open_map);
-static int ocfs_wait_for_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 *vote_map, __u32 time_to_wait, __u64 lock_seq_num, __u64 *open_map);
+static int ocfs_disk_request_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_node_map * vote_map, __u64 * lock_seq_num, __u32 time_to_wait, struct inode *inode, ocfs_node_map *open_map);
+static int ocfs_wait_for_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_node_map *vote_map, __u32 time_to_wait, __u64 lock_seq_num, ocfs_node_map *open_map);
 static int ocfs_reset_voting (ocfs_super * osb);
-static int ocfs_get_vote_on_disk (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 * got_vote_map, __u64 vote_map, __u64 lock_seq_num, __u64 * oin_open_map);
+static int ocfs_get_vote_on_disk (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_node_map * got_vote_map, ocfs_node_map * vote_map, __u64 lock_seq_num, ocfs_node_map * oin_open_map);
 int ocfs_disk_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, struct buffer_head *bh, struct inode *inode);
 static int ocfs_zap_child_buffers_func(struct dentry *dentry, void *data);
 
 
+#warning change these later
+void ocfs_set_publish_vote_map(ocfs_super *osb, ocfs_publish *publish, ocfs_node_map *vote_map)
+{
+	// publish->vote_map; // this can only hold 64 bit
+	// publish->reserved1;  // this can hold __u8[32] = 256, our current max ;-)
+	ocfs_node_map_set_to_disk(publish->reserved1, vote_map);
+}
+
+void ocfs_get_publish_vote_map(ocfs_super *osb, ocfs_publish *publish, ocfs_node_map *vote_map)
+{
+	ocfs_node_map_init(osb, vote_map);
+	ocfs_node_map_set_from_disk(vote_map, publish->reserved1);
+}
+
+void ocfs_set_disk_lock_open_map(ocfs_super *osb, ocfs_disk_lock *lock, ocfs_node_map *open_map)
+{
+	ocfs_node_map_set_to_disk(lock->oin_node_map, open_map);
+}
+
+void ocfs_get_disk_lock_open_map(ocfs_super *osb, ocfs_disk_lock *lock, ocfs_node_map *open_map)
+{
+	ocfs_node_map_init(osb, open_map);
+	ocfs_node_map_set_from_disk(open_map, lock->oin_node_map);
+}
+	
+
 /* inode is definitely non NULL */
-static int ocfs_disk_request_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 * vote_map, __u64 * lock_seq_num, __u32 time_to_wait, struct inode *inode, __u64 *open_map)
+static int ocfs_disk_request_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_node_map * vote_map, __u64 * lock_seq_num, __u32 time_to_wait, struct inode *inode, ocfs_node_map *open_map)
 {
 	int status = 0;
 	__u64 offset = 0;
@@ -67,21 +93,18 @@
 	__u32 i;
 	ocfs_publish *pubsect = NULL;
 	__u64 largestseqno = 0;
-	__u64 pubmap = 0;
 	__u8 *p;
 	__u32 wait;
 	int publish_flag = 0;
 	struct buffer_head **bhs = NULL;
 
-	LOG_ENTRY_ARGS ("(osb=0x%p, id=%llu, ty=%u, fl=%u, vm=0x%08x)\n",
-			osb, lock_id, lock_type, flags,
-			(__u32)(*vote_map & 0xFFFFFFFFULL));
+	LOG_ENTRY_ARGS ("(osb=0x%p, id=%llu, ty=%u, fl=%u)\n",
+			osb, lock_id, lock_type, flags);
 
-	*vote_map &= ~(1 << osb->node_num);
+	ocfs_node_map_clear_bit(vote_map, osb->node_num);
 
-	pubmap = osb->publ_map;
 	offset = osb->vol_layout.publ_sect_off;
-	numnodes = OCFS_MAXIMUM_NODES;
+	numnodes = osb->max_nodes;
 	size = (numnodes * osb->sect_size);
 
 	/* take lock to prevent overwrites by vote_reset and nm thread */
@@ -110,7 +133,7 @@
 		largestseqno = pubsect->publ_seq_num;
 		if (pubsect->dirty) {
 			OCFS_BH_PUT_DATA(bhs[i]);
-			if (!IS_NODE_ALIVE (pubmap, i, numnodes) || 
+			if (!IS_NODE_ALIVE (&osb->publ_map, i, numnodes) || 
 			    TEST_NODE_IN_RECOVERY(osb, i)) {
 				LOG_TRACE_STR("Node is in recovery, trying"
 					      " again.");
@@ -140,9 +163,9 @@
 	pubsect->publ_seq_num = largestseqno;
 	pubsect->dirty = 1;
 	pubsect->vote = FLAG_VOTE_NODE;
-	pubsect->vote_map = *vote_map;
+	ocfs_set_publish_vote_map(osb, pubsect, vote_map);
 	pubsect->vote_type = flags;
-	pubsect->dir_ent = lock_id;
+	pubsect->lock_id = lock_id;
 
 	OCFS_BH_PUT_DATA(bhs[osb->node_num]);
 #ifdef VERBOSE_LOCKING_TRACE
@@ -230,7 +253,7 @@
 			goto got_it;
 		}
 
-		if (!IS_NODE_ALIVE (osb->publ_map, curr_master, OCFS_MAXIMUM_NODES)) {
+		if (!IS_NODE_ALIVE (&osb->publ_map, curr_master, osb->max_nodes)) {
 			/* Reset the lock as not owned and return success?? */
 			/* This needs to be under some sort of cluster wide lock */
 			fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_WRITE(bh); /* write */
@@ -302,7 +325,7 @@
 			goto got_it;
 		}
 		
-		if ((!IS_NODE_ALIVE (osb->publ_map, curr_master, OCFS_MAXIMUM_NODES)) && 
+		if ((!IS_NODE_ALIVE (&osb->publ_map, curr_master, osb->max_nodes)) && 
 		    (!TEST_NODE_IN_RECOVERY(osb, curr_master))) {
 			/* Reset the lock as not owned and return success?? */
 			/* This needs to be under some sort of cluster wide lock, */
@@ -429,7 +452,7 @@
  * ocfs_get_vote_on_disk()
  *
  */
-static int ocfs_get_vote_on_disk (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 * got_vote_map, __u64 vote_map, __u64 lock_seq_num, __u64 * oin_open_map)
+static int ocfs_get_vote_on_disk (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_node_map * got_vote_map, ocfs_node_map * vote_map, __u64 lock_seq_num, ocfs_node_map * oin_open_map)
 {
 	int status = 0;
 	__u32 length = 0;
@@ -439,11 +462,9 @@
 	__u8 *p;
 	struct buffer_head **bhs = NULL;
 
-	LOG_ENTRY_ARGS ("(lockid=%llu, locktype=%u, votemap=0x%08x)\n",
-			lock_id, lock_type,
-			(__u32)(vote_map & 0xFFFFFFFFULL));
+	LOG_ENTRY_ARGS ("(lockid=%llu, locktype=%u)\n", lock_id, lock_type);
 
-	numnodes = OCFS_MAXIMUM_NODES;
+	numnodes = osb->max_nodes;
 
 	/* Read the vote sectors of all the nodes */
 	length = numnodes * osb->sect_size;
@@ -460,7 +481,7 @@
 	}
 
 	for (i = 0; i < numnodes; i++) {
-		int node_alive = (IS_NODE_ALIVE (osb->publ_map, i, numnodes));
+		int node_alive = (IS_NODE_ALIVE (&osb->publ_map, i, numnodes));
 		int node_in_map = (IS_NODE_ALIVE (vote_map, i, numnodes));
 
 		status = 0;
@@ -471,12 +492,12 @@
 		if (!node_alive) {
 			if (node_in_map) {
 				if (flags & FLAG_FILE_UPDATE_OIN)
-					(*got_vote_map) |= 1 << i;
+					ocfs_node_map_set_bit(got_vote_map, i);
 				else
 					status = -EAGAIN;
 			}
 		} else if (node_in_map && vote->vote_seq_num == lock_seq_num &&
-			   vote->dir_ent == lock_id) {
+			   vote->lock_id == lock_id) {
 			ocfs_vote_reply_ctxt ctxt;
 			ctxt.reply_method = DISK_VOTE;
 			ctxt.got_vote_map = got_vote_map;
@@ -484,6 +505,9 @@
 			ctxt.status = &status;
 			ctxt.flags = flags;
 			ctxt.u.vote = vote;
+			if (vote->node != osb->node_num)
+				LOG_ERROR_ARGS("vote->node(%u) != this(%u)\n",
+					       vote->node, osb->node_num);
 			ocfs_process_one_vote_reply(osb, &ctxt, i);
 		}
 
@@ -507,18 +531,19 @@
  * ocfs_wait_for_vote()
  *
  */
-static int ocfs_wait_for_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 *vote_map, __u32 time_to_wait, __u64 lock_seq_num, __u64 *open_map)
+static int ocfs_wait_for_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_node_map *vote_map, __u32 time_to_wait, __u64 lock_seq_num, ocfs_node_map *open_map)
 {
 	int status = -EAGAIN;
 	__u32 timewaited = 0;
-	__u64 gotvotemap = 0;
+	ocfs_node_map gotvotemap;
 
-	LOG_ENTRY_ARGS ("(osb=0x%p, id=%llu, ty=%u, fl=%u, vm=0x%08x, "
-		"sq:%llu)\n", osb, lock_id, lock_type, flags,
-		(__u32)(*vote_map & 0xFFFFFFFFULL), lock_seq_num);
+	LOG_ENTRY_ARGS ("(osb=0x%p, id=%llu, ty=%u, fl=%u, sq:%llu)\n", 
+			osb, lock_id, lock_type, flags, lock_seq_num);
 
-	*vote_map &= ~(1 << osb->node_num);
+	ocfs_node_map_init(osb, &gotvotemap);
 
+	ocfs_node_map_clear_bit(vote_map, osb->node_num);
+
 	while (time_to_wait > timewaited) {
 		ocfs_sleep (WAIT_FOR_VOTE_INCREMENT);
 
@@ -529,15 +554,14 @@
 		}
 
 		status = ocfs_get_vote_on_disk (osb, lock_id, lock_type, flags,
-				&gotvotemap, *vote_map, lock_seq_num, open_map);
+				&gotvotemap, vote_map, lock_seq_num, open_map);
 		if (status < 0) {
 			if (status != -EAGAIN)
 				LOG_ERROR_STATUS (status);
 			goto bail;
 		}
-
-		*vote_map &= ~gotvotemap;
-		if (*vote_map == 0ULL) {
+		ocfs_node_map_clear_bits(vote_map, &gotvotemap);
+		if (ocfs_node_map_is_empty(vote_map)) {
 			status = 0;
 			goto bail;
 		}
@@ -568,6 +592,7 @@
 	ocfs_publish *pubsect = NULL;
 	__u64 offset = 0;
 	struct buffer_head *bh = NULL;
+	ocfs_node_map vote_map;
 
 	LOG_ENTRY ();
 
@@ -587,8 +612,10 @@
 	pubsect->dirty = 0;
 	pubsect->vote = 0;
 	pubsect->vote_type = 0;
-	pubsect->vote_map = 0;
-	pubsect->dir_ent = 0;
+	pubsect->lock_id = 0;
+	/* clear vote map */
+	ocfs_node_map_init(osb, &vote_map);
+	ocfs_set_publish_vote_map(osb, pubsect, &vote_map);
 
 	/* Write it back */
 	OCFS_BH_PUT_DATA(bh);
@@ -666,15 +693,21 @@
 	}
 
 	if (flags & DLOCK_FLAG_OPEN_MAP) {
-	       if (flags & DLOCK_FLAG_ADD_SELF)
-		       lockres->oin_openmap |= (1ULL << osb->node_num);
-	       if (DISK_LOCK(fe)->oin_node_map != lockres->oin_openmap) {
+		ocfs_node_map disk_map;
+		
+		ocfs_node_map_init(osb, &disk_map);
+		ocfs_get_disk_lock_open_map(osb, DISK_LOCK(fe), &disk_map);
+		
+		if (flags & DLOCK_FLAG_ADD_SELF)
+			ocfs_node_map_set_bit(&lockres->oin_openmap, osb->node_num);
+
+		if (!ocfs_node_map_is_equal(&disk_map, &lockres->oin_openmap)) {
 			if (!changed) {
 				OCFS_BH_PUT_DATA(*bh);
 				fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_WRITE(*bh); /* write */
 			}
 			changed = 1;
-			DISK_LOCK(fe)->oin_node_map = lockres->oin_openmap;
+			ocfs_set_disk_lock_open_map(osb, DISK_LOCK(fe), &lockres->oin_openmap);
 	       }
 	}
 
@@ -725,14 +758,14 @@
 	if (S_ISDIR (inode->i_mode) ||
 	    lockres->master_node_num == OCFS_INVALID_NODE_NUM ||
 	    (!(lockres->lock_state & FLAG_ALWAYS_UPDATE_OPEN) &&
-	     IS_NODE_ALIVE (lockres->oin_openmap, osb->node_num, OCFS_MAXIMUM_NODES))) {
+	     IS_NODE_ALIVE (&lockres->oin_openmap, osb->node_num, osb->max_nodes))) {
 		status = 0;
 		goto bail;
 	}
 
 	while (status == -EAGAIN) {
-		if (!IS_NODE_ALIVE (osb->publ_map, lockres->master_node_num,
-				    OCFS_MAXIMUM_NODES)) {
+		if (!IS_NODE_ALIVE (&osb->publ_map, lockres->master_node_num,
+				    osb->max_nodes)) {
 			LOG_TRACE_ARGS ("Master (%u) dead, lockid %llu\n",
 				lockres->master_node_num,
 				GET_INODE_FEOFF(inode));
@@ -743,11 +776,7 @@
 		ocfs_acquire_lockres(lockres, 0); // ocfs_file_open ocfs_symlink
 
 		if (lockres->master_node_num == osb->node_num) {
-			LOG_TRACE_ARGS ("Added node to map 0x%08x, lockid %llu\n",
-			     (__u32)(lockres->oin_openmap & 0xFFFFFFFFULL),
-			     GET_INODE_FEOFF(inode));
-
-			lockres->oin_openmap |= (1 << osb->node_num);
+			ocfs_node_map_set_bit(&lockres->oin_openmap, osb->node_num);
 			status = ocfs_update_disk_lock (osb, DLOCK_FLAG_OPEN_MAP, 
 							&bh, inode, handle);
 			if (bh)
@@ -872,7 +901,8 @@
 		    lockres->master_node_num != DISK_LOCK(disklock)->curr_master) {
 			lockres->master_node_num = DISK_LOCK(disklock)->curr_master;
 			lockres->lock_type = DISK_LOCK(disklock)->file_lock;
-			lockres->oin_openmap = DISK_LOCK(disklock)->oin_node_map;	
+			ocfs_get_disk_lock_open_map(osb, DISK_LOCK(disklock), 
+						    &lockres->oin_openmap);
 		}
 		updated = 1;
 		OCFS_BH_PUT_DATA(*b);
@@ -882,7 +912,7 @@
 	no_owner = (lockres->master_node_num == OCFS_INVALID_NODE_NUM);
 
 	/* master node is an invalid node */
-	if (unlikely(lockres->master_node_num >= OCFS_MAXIMUM_NODES && !no_owner)) {
+	if (unlikely(lockres->master_node_num >= osb->max_nodes && !no_owner)) {
 		LOG_ERROR_ARGS("lockres: master_node=%d, owner=%s, lockid=%llu\n",
 			       lockres->master_node_num, no_owner?"no":"yes",
 			       GET_INODE_FEOFF(inode));
@@ -892,8 +922,8 @@
 	}
 
 	wait_on_recovery = TEST_NODE_IN_RECOVERY(osb, lockres->master_node_num);
-	owner_dead = !(no_owner || IS_NODE_ALIVE(osb->publ_map, 
-			 lockres->master_node_num, OCFS_MAXIMUM_NODES));
+	owner_dead = !(no_owner || IS_NODE_ALIVE(&osb->publ_map, 
+			 lockres->master_node_num, osb->max_nodes));
 	if ((owner_dead || wait_on_recovery) && 
 	    lockres->readonly_node == lockres->master_node_num) {
 		// if owner is dead or in recovery and the lockres 
@@ -977,9 +1007,9 @@
 		       lockres->master_node_num, lockres->lock_type, flags|extra_lock_flags);
 	
 #ifdef VERBOSE_LOCKING_TRACE
-	printk("lockres: lockid=%llu, this=%d, master=%d, locktype=%d, flags=%08x, ronode=%d, romap=%08x\n",
+	printk("lockres: lockid=%llu, this=%d, master=%d, locktype=%d, flags=%08x, ronode=%d\n",
 		       GET_INODE_FEOFF(inode), osb->node_num, lockres->master_node_num, lockres->lock_type, 
-		       flags|extra_lock_flags, lockres->readonly_node, (__u32)(lockres->readonly_map & 0xFFFFFFFFULL));
+		       flags|extra_lock_flags, lockres->readonly_node);
 #endif	
 	if (wait_on_recovery && !((flags|extra_lock_flags) & FLAG_FILE_RECOVERY)) {
 		int waitcnt = 0;
@@ -1034,8 +1064,7 @@
  */
 int ocfs_disk_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, struct buffer_head *bh, struct inode *inode)
 {
-	__u64 votemap = 0ULL;
-	__u32 i;
+	ocfs_node_map votemap;
 	int status = 0, vote_status = 0;
 	int tmpstat;
 	__u64 lockseqno;
@@ -1043,14 +1072,25 @@
 	int disk_vote = 0;
 	ocfs_file_entry *fe = NULL;
 	struct buffer_head *tmpbh = NULL, **b = NULL;
-	__u64 oin_node_map;
 	__u32 curr_master;
 	int lockflags = (lock_id >= osb->vol_layout.bitmap_off ? OCFS_BH_CACHED : 0);
 	int clear_tmp = 0;
 	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 
+	/* TODO: the ifdefed out code here used to be used
+	 *       right now, we *broadcast* on lock releases
+	 *       because of the issues surrounding lookup_file_allocation
+	 *       need to restrict this to only the openmap
+	 *       at some later date */
+#if 0
+	ocfs_node_map openmap;
+#endif
+
 	LOG_ENTRY_ARGS ("(0x%p, %llu, %u, %u, 0x%p)\n",
-			osb, lock_id, lock_type, flags, lockres);
+			osb, lock_id, lock_type, flags, lockres);	
+	
+	/* TODO: figure out how to properly handle inode updates w/no oin */
+	ocfs_node_map_dup(osb, &votemap, &osb->publ_map);  // temporary hack, forces broadcast
 
 	if (bh != NULL)
 		b = &bh;
@@ -1067,7 +1107,10 @@
 		}
 	}
 	fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_READ(*b); /* read */
-	oin_node_map = DISK_LOCK(fe)->oin_node_map;
+#if 0
+	ocfs_node_map_init(osb, &openmap);
+	ocfs_get_disk_lock_open_map(osb, DISK_LOCK(fe), &openmap);
+#endif
 	curr_master = DISK_LOCK(fe)->curr_master;
 	OCFS_BH_PUT_DATA(*b);
 
@@ -1082,25 +1125,15 @@
 		goto finito;
 	}
 
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
-		if (((1 << i) & oin_node_map) &&
-		    IS_NODE_ALIVE (osb->publ_map, i, OCFS_MAXIMUM_NODES)) {
-			votemap |= (1ULL << i);
-		}
-	}
+#if 0
+	/* publish_map & openmap for operations that dont need broadcast */
+	if (!(flags & (FLAG_FILE_RENAME | FLAG_FILE_DELETE | 
+		       FLAG_FILE_TRUNCATE | FLAG_FILE_EXTEND)))
+		ocfs_node_map_and(&votemap, &openmap);
+#endif
 
-	/* Send an update to all nodes alive, can be optimized later TODO */
-	if ((flags & FLAG_FILE_RENAME) || (flags & FLAG_FILE_DELETE)
-	    || (flags & FLAG_FILE_TRUNCATE) || (flags & FLAG_FILE_EXTEND))
-		votemap = osb->publ_map;
-
-	/* TODO: figure out how to properly handle inode updates w/no oin */
-	votemap = osb->publ_map;	// temporary hack, forces broadcast
-
-	/* remove current node from the votemap */
-	votemap &= ~(1ULL << osb->node_num);
-
-	if (votemap == 0ULL)
+	ocfs_node_map_clear_bit(&votemap, osb->node_num);
+	if (ocfs_node_map_is_empty(&votemap))
 		goto finally;
 
 	if (!(flags & FLAG_FILE_UPDATE_OIN) && !(flags & FLAG_FILE_DELETE))
@@ -1131,9 +1164,9 @@
 
 		LOG_ERROR_ARGS("DISKVOTE!!: lock_type=%u, flags=%08x, offset=%llu, inode=%llu\n",
 		       lock_type, flags, lock_id, inode?GET_INODE_FEOFF(inode):0ULL);
-		LOG_ERROR_ARGS("DISKVOTE!!: this=%d, master=%d, locktype=%d, ronode=%d, romap=%08x\n",
+		LOG_ERROR_ARGS("DISKVOTE!!: this=%d, master=%d, locktype=%d, ronode=%d\n",
 		       osb->node_num, lockres->master_node_num, lockres->lock_type, 
-		       lockres->readonly_node, (__u32)(lockres->readonly_map & 0xFFFFFFFFULL));
+		       lockres->readonly_node);
 
 		ocfs_show_trace(NULL);
 
@@ -1303,7 +1336,8 @@
 /* inode is definitely non NULL */
 int new_lock_function(ocfs_super * osb, __u32 requested_lock, __u32 flags, struct buffer_head *bh, int *disk_vote, struct inode *inode)	
 {
-	__u64 vote_map = 0ULL, open_map = 0ULL;
+	ocfs_node_map vote_map;
+	ocfs_node_map open_map;
 	__u64 lockseqnum = 0;
 	int tmpstat;
 	ocfs_file_entry *fe = NULL;
@@ -1359,19 +1393,21 @@
 		goto vote_success;
 
 
-	
+	ocfs_node_map_init(osb, &open_map);
+
 	/* figure out who to vote with */
-	if (flags & (FLAG_REMASTER | FLAG_FILE_DELETE | FLAG_FILE_RENAME))
-		vote_map = osb->publ_map; /* broadcast */
-	else if (flags & FLAG_DROP_READONLY) {
-		/* all nodes that see this is readonly */
-		vote_map = osb->publ_map & lockres->readonly_map;
+	if (flags & (FLAG_REMASTER | FLAG_FILE_DELETE | FLAG_FILE_RENAME | FLAG_DROP_READONLY)) {
+		ocfs_node_map_dup(osb, &vote_map, &osb->publ_map); /* broadcast */
+		/* only nodes that see this is readonly */
+		if (flags & FLAG_DROP_READONLY)
+			ocfs_node_map_and(&vote_map, &lockres->readonly_map);
 	} else {
-		vote_map = (1 << lockres->master_node_num);  /* just owner */
+		ocfs_node_map_init(osb, &vote_map);
+		ocfs_node_map_set_bit(&vote_map, lockres->master_node_num); /* just owner */
 		lock_type = lockres->lock_type;
 	}
-	vote_map &= ~(1 << osb->node_num); // remove this node
-	if (vote_map == 0) {
+	ocfs_node_map_clear_bit(&vote_map, osb->node_num);
+	if (ocfs_node_map_is_empty(&vote_map)) {
 		/* As this is the only node alive, make it master of the lock */
 		/* no need to update open map */
 		lock_write_flags &= ~(DLOCK_FLAG_OPEN_MAP);
@@ -1401,9 +1437,9 @@
 
 	LOG_ERROR_ARGS("DISKVOTE!!: req_lock=%u, flags=%08x, offset=%llu, inode=%llu\n",
 		       requested_lock, flags, lock_id, inode?GET_INODE_FEOFF(inode):0ULL);
-	LOG_ERROR_ARGS("DISKVOTE!!: this=%d, master=%d, locktype=%d, ronode=%d, romap=%08x\n",
+	LOG_ERROR_ARGS("DISKVOTE!!: this=%d, master=%d, locktype=%d, ronode=%d\n",
 		       osb->node_num, lockres->master_node_num, lockres->lock_type, 
-		       lockres->readonly_node, (__u32)(lockres->readonly_map & 0xFFFFFFFFULL));
+		       lockres->readonly_node);
 
 	ocfs_show_trace(NULL);
 
@@ -1419,7 +1455,7 @@
 
 vote_success:
 	if (status >= 0 && flags & (FLAG_FILE_EXTEND | FLAG_FILE_UPDATE))
-		lockres->oin_openmap = open_map;
+		ocfs_node_map_set(&lockres->oin_openmap, &open_map);
 
 	if (need_to_zap_buffers)
 		ocfs_break_cache_lock_zap_buffers(osb, inode);
@@ -1430,7 +1466,7 @@
 
 	/* drop readonly should remove anyone who has responded */
        	if (flags & FLAG_DROP_READONLY) {
-		lockres->readonly_map = vote_map;
+		ocfs_node_map_set(&lockres->readonly_map, &vote_map);
 		goto bail;
 	}
 
@@ -1455,7 +1491,8 @@
 	/* pick up any change to the open map */
 	if (bh) {
 		fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_READ(bh); /* read */
-		lockres->oin_openmap = DISK_LOCK(fe)->oin_node_map;
+		ocfs_get_disk_lock_open_map(osb, DISK_LOCK(fe), 
+					    &lockres->oin_openmap);
 		OCFS_BH_PUT_DATA(bh);
 	}
 bail:
@@ -1488,7 +1525,7 @@
 	int status = 0;
 	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 
-	if (lockres->readonly_map == 0ULL)
+	if (ocfs_node_map_is_empty(&lockres->readonly_map))
 		return status;
 	status = ocfs_drop_readonly_cache_lock(osb, inode, 0);
 	return status;	

Modified: branches/format-changes/src/file.c
===================================================================
--- branches/format-changes/src/file.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/file.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -650,7 +650,7 @@
 	ocfs_fe_set_attributes(fileEntry, attr);
 
 	/* Set the valid bit here */
-	SET_VALID_BIT(fileEntry->i_flags);
+	fileEntry->i_flags |= OCFS2_VALID_FL;
 	fileEntry->i_flags &= ~(OCFS2_CHANGE_FL);
 
 	OCFS_BH_PUT_DATA(bh);
@@ -1036,7 +1036,7 @@
 	}
 
 	DISK_LOCK(fe)->dlock_seq_num = 0;
-	SET_VALID_BIT(fe->i_flags);
+	fe->i_flags |= OCFS2_VALID_FL;
 	fe->i_flags &= ~(OCFS2_CHANGE_FL);
 	fe->i_mtime = OCFS_CURRENT_TIME;
 	
@@ -1242,7 +1242,7 @@
 			}
 		}
 
-		ext_alloc_inode = igrab(osb->system_inodes[FILE_ALLOC_BITMAP_SYSTEM_INODE]);
+		ext_alloc_inode = igrab(osb->system_inodes[EXTENT_ALLOC_BITMAP_SYSTEM_INODE]);
 		if (!ext_alloc_inode) {
 			status = -EFAIL;
 			LOG_ERROR_STATUS(status);
@@ -1279,7 +1279,7 @@
 	if (attr)
 		ocfs_fe_set_attributes(fe, attr);
 	/* Set the Valid bit and reset the change bit here... TODO */
-	SET_VALID_BIT(fe->i_flags);
+	fe->i_flags |= OCFS2_VALID_FL;
 	fe->i_flags &= ~(OCFS2_CHANGE_FL);
 	fe->i_mtime = OCFS_CURRENT_TIME;
 

Modified: branches/format-changes/src/heartbeat.c
===================================================================
--- branches/format-changes/src/heartbeat.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/heartbeat.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -85,7 +85,6 @@
 		/* Dissallow 0 */
 		if (!publish->time)
 			publish->time = 1;
-		publish->hbm[osb->node_num] = osb->hbm;
 		spin_lock (&OcfsGlobalCtxt.comm_seq_lock);
 		publish->comm_seq_num = OcfsGlobalCtxt.comm_seq_num;
 		spin_unlock (&OcfsGlobalCtxt.comm_seq_lock);
@@ -132,8 +131,8 @@
 
 	LOG_ENTRY_ARGS ("(0x%p, 0x%p, %u)\n", osb, bhs, first_time);
 
-	num_nodes = OCFS_MAXIMUM_NODES;
-	node_map = &(osb->vol_node_map);
+	num_nodes = osb->max_nodes;
+	node_map = osb->vol_node_map;
 
 	/* First time thru, update buffer with timestamps for all nodes */
 	if (first_time) {
@@ -148,15 +147,15 @@
 		/* Refresh local buffers */
 		for (i = 0;  i < num_nodes; i++) {
 			publish = (ocfs_publish *) OCFS_BH_GET_DATA_READ(bhs[i]); /* read */
-			node_map->time[i] = publish->time;
+			node_map[i].time = publish->time;
 			if (publish->mounted && i != osb->node_num) {
 				printk("ocfs2: Adding %s (node %d) to "
 				       "clustered device (%u,%u)\n",
 				       osb->node_cfg_info[i]->node_name, i,
 				       MAJOR(osb->sb->s_dev), 
 				       MINOR(osb->sb->s_dev));
-				node_map->miss_cnt[i] = 0;
-				UPDATE_PUBLISH_MAP(osb->publ_map, i, 
+				node_map[i].miss_cnt = 0;
+				UPDATE_PUBLISH_MAP(&osb->publ_map, i, 
 						   OCFS_PUBLISH_SET, 
 						   num_nodes);
 			}
@@ -176,18 +175,18 @@
 
 		/* Check if the node is hung or not by comparing the disk */
 		/* and memory timestamp values */
-		if (node_map->time[i] == publish->time) {
-			if (IS_NODE_ALIVE(osb->publ_map, i, num_nodes)) {
-				if (atomic_read (&(node_map->dismount[i]))) {
-					node_map->miss_cnt[i] = MISS_COUNT_VALUE;
-					atomic_set (&(node_map->dismount[i]), 0);
-					UPDATE_PUBLISH_MAP (osb->publ_map, i,
+		if (node_map[i].time == publish->time) {
+			if (IS_NODE_ALIVE(&osb->publ_map, i, num_nodes)) {
+				if (atomic_read (&(node_map[i].dismount))) {
+					node_map[i].miss_cnt = MISS_COUNT_VALUE;
+					atomic_set (&(node_map[i].dismount), 0);
+					UPDATE_PUBLISH_MAP (&osb->publ_map, i,
 							    OCFS_PUBLISH_CLEAR,
 							    num_nodes);
 				} else
-					(node_map->miss_cnt[i])++;
+					(node_map[i].miss_cnt)++;
 
-				if (node_map->miss_cnt[i] > MISS_COUNT_VALUE) {
+				if (node_map[i].miss_cnt > MISS_COUNT_VALUE) {
 #if !defined(USERSPACE_TOOL)
 					printk ("ocfs2: Removing %s (node %d) "
 						"from clustered device (%u,%u)\n",
@@ -197,7 +196,7 @@
 #endif
 
 					SET_NODE_IN_RECOVERY(osb, i);
-					UPDATE_PUBLISH_MAP (osb->publ_map, i,
+					UPDATE_PUBLISH_MAP (&osb->publ_map, i,
 					    OCFS_PUBLISH_CLEAR, num_nodes);
 
 					/* Ok, we'd better recover him now...*/
@@ -206,34 +205,16 @@
 			}
 		} else {
 #if !defined(USERSPACE_TOOL)
-			if (!IS_NODE_ALIVE(osb->publ_map, i, num_nodes) && osb->node_num != i)
+			if (!IS_NODE_ALIVE(&osb->publ_map, i, num_nodes) && osb->node_num != i)
 				printk ("ocfs2: Adding %s (node %d) to clustered device (%u,%u)\n",
 					osb->node_cfg_info[i]->node_name, i,
 					MAJOR(osb->sb->s_dev), MINOR(osb->sb->s_dev));
 #endif
-			node_map->miss_cnt[i] = 0;
-			node_map->time[i] = publish->time;
-			UPDATE_PUBLISH_MAP (osb->publ_map, i, OCFS_PUBLISH_SET,
+			node_map[i].miss_cnt = 0;
+			node_map[i].time = publish->time;
+			UPDATE_PUBLISH_MAP (&osb->publ_map, i, OCFS_PUBLISH_SET,
 					    num_nodes);
 
-#if !defined(USERSPACE_TOOL)
-			/* Update the multiple the other node wants us to beat */
-			if ((publish->hbm[osb->node_num] != DISK_HBEAT_INVALID)
-			    && (osb->hbm > publish->hbm[osb->node_num])) {
-				/* Go to the lowest multiplier any of the nodes */
-				/* alive want us to heartbeat with. */
-				osb->hbm = publish->hbm[osb->node_num];
-
-				if (osb->hbm == 0)
-					osb->hbm = DISK_HBEAT_NO_COMM;
-
-				if (OcfsGlobalCtxt.hbm > osb->hbm)
-						OcfsGlobalCtxt.hbm = osb->hbm;
-
-				if (OcfsGlobalCtxt.hbm == 0)
-					OcfsGlobalCtxt.hbm = DISK_HBEAT_NO_COMM;
-			}
-#endif
 		}
 		OCFS_BH_PUT_DATA(bhs[i]);
 	}

Modified: branches/format-changes/src/inc/ocfs.h
===================================================================
--- branches/format-changes/src/inc/ocfs.h	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/inc/ocfs.h	2004-06-04 00:59:41 UTC (rev 1001)
@@ -235,8 +235,6 @@
 #define  OCFS_MAX_FILENAME_LENGTH    255
 #define  OCFS_MAX_OSB_ID             65536
 
-/* change this to some other sector, change format TODO */
-#define  OCFS_BITMAP_LOCK_OFFSET     (OCFS_SECTOR_SIZE * 2)
 
 #define  HEARTBEAT_METHOD_DISK       (1)
 #define  HEARTBEAT_METHOD_IPC        (2)
@@ -335,16 +333,12 @@
 ** File Entry contains this information
 */
 /* OCFS2 file flags */
-#define  OCFS2_DELETED_FL		(0)
 #define  OCFS2_VALID_FL			(0x1)
 #define  OCFS2_CHANGE_FL		(0x2)
 #define  OCFS2_MARK_FOR_DELETION_FL	(0x4)
 #define  OCFS2_NAME_DELETED_FL		(0x8)
 
-#define  IS_VALIDBIT_SET(flags)   ((flags) & OCFS2_VALID_FL)
-#define  SET_VALID_BIT(flags)     ((flags) |= OCFS2_VALID_FL)
 
-
 #define  INVALID_NODE_POINTER                -1
 #define  OCFS_FILE_ENTRY_SIGNATURE           "FIL"
 #define  OCFS_EXTENT_HEADER_SIGNATURE        "EXTHDR2"
@@ -365,8 +359,18 @@
 #define EWARNING                   998
 
 #define OCFS_MAGIC                 0xa156f7eb
-#define OCFS_ROOT_INODE_NUMBER     3
-#define OCFS_ROOT_INODE_FE_OFF(osb) (OCFS_ROOT_INODE_NUMBER << osb->sb->s_blocksize_bits)
+
+/* TODO: no hardcoding of this stuff!!! */
+/* TODO: these should be stored in the on-disk superblock */
+#define OCFS_VOLUME_LOCK_INODE_NUMBER	1   // unused !!!
+#define OCFS_BITMAP_LOCK_INODE_NUMBER	2
+#define OCFS_ROOT_INODE_NUMBER		3
+#define OCFS_SYS_ROOT_INODE_NUMBER	4
+#define OCFS_VOLUME_LOCK_OFFSET(osb)	(OCFS_VOLUME_LOCK_INODE_NUMBER << osb->sb->s_blocksize_bits) // unused !!!
+#define OCFS_BITMAP_LOCK_OFFSET(osb)	(OCFS_BITMAP_LOCK_INODE_NUMBER << osb->sb->s_blocksize_bits)
+#define OCFS_ROOT_INODE_FE_OFF(osb)	(OCFS_ROOT_INODE_NUMBER << osb->sb->s_blocksize_bits)
+#define OCFS_SYS_ROOT_INODE_OFF(osb)	(OCFS_SYS_ROOT_INODE_NUMBER << osb->sb->s_blocksize_bits)
+	
 #define OCFS_LINUX_MAX_FILE_SIZE   9223372036854775807LL
 #define INITIAL_EXTENT_MAP_SIZE    10
 
@@ -475,46 +479,7 @@
 ** Structures...
 */
 
-#define  IS_NODE_ALIVE(pubmap, i, numnodes)  \
-				  (((pubmap) >> ((i) % (numnodes))) & 0x1)
 
-#define  NODE_NEEDS_RECOVERY(osb,i)  (((i)!=OCFS_INVALID_NODE_NUM) && (i)!=(osb)->node_num && \
-					  !IS_NODE_ALIVE((osb)->publ_map,i,OCFS_MAXIMUM_NODES))
-
-/*
-**  All structures have a type, and a size associated with it.
-**  The type serves to identify the structure. The size is used for
-**  consistency checking ...
-*/
-#define  UPDATE_PUBLISH_MAP(pubmap, num, flag, numnodes)          \
-		do {                                              \
-		  __u64 var = 0x1;                                  \
-		  if((flag) == OCFS_PUBLISH_CLEAR)                \
-		    (pubmap) &= (~(var << ((num) % (numnodes)))); \
-		  else                                            \
-		    (pubmap) |= (var << ((num) % (numnodes)));    \
-		} while(0)
-
-/* update the recovery map here */
-#define SET_NODE_IN_RECOVERY(osb, num)  				\
-	do {    							\
-		spin_lock(&osb->recovery_map_lock);			\
-		(osb->vol_state) = VOLUME_IN_RECOVERY;			\
-		(osb->recovery_map) |= (0x1 << (num));			\
-		spin_unlock(&osb->recovery_map_lock);			\
-	} while(0);
-					
-#define CLEAR_NODE_IN_RECOVERY(osb, num)				\
-	do {    							\
-		spin_lock(&osb->recovery_map_lock);			\
-		(osb->recovery_map) &= (~(0x1 << (num)));		\
-		if ((osb->recovery_map) == 0)				\
-			(osb->vol_state) = VOLUME_ENABLED;		\
-		spin_unlock(&osb->recovery_map_lock);			\
-	} while(0);
-
-#define TEST_NODE_IN_RECOVERY(osb, num)	((osb->recovery_map) & (0x1 << (num)))
-
 #define ocfs_malloc(size)						      \
 ({									      \
 	void *__ptr = kmalloc((size_t)(size), GFP_KERNEL);		      \
@@ -730,15 +695,15 @@
 }
 ocfs_vol_disk_hdr;				   // END CLASS
 
+
 typedef struct _ocfs_disk_lock
 {
 /*00*/	__u32 curr_master;	/* Node number of current master */
 	__u8 file_lock;		/* Lock level */
 	__u8 odl_pad[3];	/* Pad to u64 */
 	__u64 dlock_seq_num;	/* Lock transaction seqnum */
-/*10*/	__u64 oin_node_map;	/* Bitmap of interested nodes */
-	__u64 odl_reserved[3];	/* Space for larger node map */
-/*20*/
+/*10*/	__u32 oin_node_map[8];	/* Bitmap of interested nodes, was __u32 */ 
+/*30*/
 }
 ocfs_disk_lock;
 
@@ -872,6 +837,17 @@
 typedef struct _ocfs_io_runs ocfs_io_runs;
 typedef struct _ocfs_lock_res ocfs_lock_res;
 
+/* this limits us to 256 nodes
+ * if we need more, we can do a kmalloc for the map */
+#define OCFS_NODE_MAP_MAX_NODES    256
+typedef struct _ocfs_node_map
+{
+	__u32 num_nodes;
+	unsigned long map[BITS_TO_LONGS(OCFS_NODE_MAP_MAX_NODES)];
+} ocfs_node_map;
+
+
+
 /* XXX: fields that can go if we move this to the inode private */
 struct _ocfs_lock_res
 {
@@ -884,8 +860,8 @@
 	atomic_t lr_ref_cnt;	/* When 0, freed */  // XXX
 	spinlock_t lock_mutex;  // XXX
 	__u32 readonly_node;
-	__u64 readonly_map;
-	__u64 oin_openmap;
+	ocfs_node_map readonly_map;
+	ocfs_node_map oin_openmap;
 	__u64 last_upd_seq_num;
 };
 
@@ -1029,10 +1005,9 @@
 
 typedef struct _ocfs_vol_node_map
 {
-	__u64 time[OCFS_MAXIMUM_NODES];
-	__u32 miss_cnt[OCFS_MAXIMUM_NODES];
-	atomic_t dismount[OCFS_MAXIMUM_NODES];
-	__u64 largest_seq_num;
+	__u64 time;
+	__u32 miss_cnt;
+	atomic_t dismount;
 }
 ocfs_vol_node_map;
 
@@ -1093,13 +1068,21 @@
 
 enum {
 	GLOBAL_BITMAP_SYSTEM_INODE = 0,
-	FILE_ALLOC_BITMAP_SYSTEM_INODE,
+	GLOBAL_INODE_ALLOC_SYSTEM_INODE,
+	PUBLISH_SYSTEM_INODE,
+	VOTE_SYSTEM_INODE,
+	AUTOCONFIG_SYSTEM_INODE,
+	EXTENT_ALLOC_SYSTEM_INODE,
+	EXTENT_ALLOC_BITMAP_SYSTEM_INODE,
+	INODE_ALLOC_SYSTEM_INODE,
 	INODE_ALLOC_BITMAP_SYSTEM_INODE,
 	JOURNAL_SYSTEM_INODE,
 	NUM_SYSTEM_INODES
 };
 
+extern char *system_file_names[];
 
+
 struct _ocfs_journal;
 
 /*
@@ -1118,21 +1101,22 @@
 	ocfs_commit_task *commit;
 	__u32 osb_flags;
 	__s64 file_open_cnt;	/* num of open files/dirs. vol cannot be dismounted if > 0 */
-	__u64 publ_map;		/* each bit represents state of node */
+	ocfs_node_map publ_map;
 	struct list_head cache_lock_list;
 	struct super_block *sb;
 	struct inode *root_inode;
+	struct inode *sys_root_inode;
 	struct inode *system_inodes[NUM_SYSTEM_INODES];
 	ocfs_vol_layout vol_layout;
-	ocfs_vol_node_map vol_node_map;
+	ocfs_vol_node_map *vol_node_map;
 	struct semaphore cfg_lock;
-	BARF_BARF_BARF *node_cfg_info[OCFS_MAXIMUM_NODES];
+	BARF_BARF_BARF **node_cfg_info;
 	__u64 cfg_seq_num;
 	int cfg_initialized;
+	__u32 max_nodes;
 	__u32 num_cfg_nodes;
 	__u32 node_num;
 	int reclaim_id;		/* reclaim the original node number*/
-	__u8 hbm;
 	__u32 hbt;
 	__u32 sect_size;
 	__u32 sect_size_bits;
@@ -1149,7 +1133,7 @@
 	ocfs_vol_state vol_state;
 	struct semaphore recovery_lock;
 	spinlock_t recovery_map_lock;
-	__u32 recovery_map;
+	ocfs_node_map recovery_map;
 	int disable_recovery;
 	atomic_t num_recovery_threads;
 	struct timer_list lock_timer;
@@ -1173,8 +1157,8 @@
 	struct _ocfs_journal *journal;
 	atomic_t clean_buffer_seq;
 	spinlock_t clean_buffer_lock;
-	struct list_head lock_recovery_lists[OCFS_MAXIMUM_NODES];
-	__u64 last_publ_seq_num[OCFS_MAXIMUM_NODES];
+	struct list_head *lock_recovery_lists;
+	__u64 *last_publ_seq_num;
 	int have_local_alloc;
 	struct buffer_head *local_alloc_bh;
 	/* Protects local alloc */
@@ -1218,7 +1202,6 @@
 	char *cluster_name;		/* unused */
 	ocfs_comm_info comm_info;	/* ip address, etc for listener */
 	int comm_info_read;		/* ipc info loaded from config file */
-	__u8 hbm;
 	spinlock_t comm_seq_lock;	/* protects comm_seq_num */
 	__u64 comm_seq_num;		/* local node seq num used in ipcdlm */
 	struct list_head *bh_sem_hash;
@@ -1287,10 +1270,10 @@
 	__u32 dirty;                     // BOOL
 	__u32 vote_type;                  // FILEFLAG
 	__u32 mounted;                   /* used for journaling */
-	__u8 hbm[OCFS_MAXIMUM_NODES];	// UNUSED my ass
-	__u64 vote_map;                   // NODEBITMAP
+	__u32 reserved1[8];		// this is now used as the vote_map !!!!! was __u8[32]
+	__u64 vote_map;                   // NODEBITMAP  this is now unused!!!!
 	__u64 publ_seq_num;               // NUMBER RANGE(0,ULONG_LONG_MAX)
-	__u64 dir_ent;                    // NUMBER RANGE(0,ULONG_LONG_MAX)
+	__u64 lock_id;                    // NUMBER RANGE(0,ULONG_LONG_MAX)
 	/* last seq num used in comm voting */
 	__u64 comm_seq_num;		// NUMBER RANGE(0,ULONG_LONG_MAX)
 	__u64 fe_off;                   /* needed to create inodes. */
@@ -1298,9 +1281,11 @@
 
 typedef struct _ocfs_vote		// CLASS
 {
-	__u8 vote[OCFS_MAXIMUM_NODES];   // VOTEFLAG[OCFS_MAXIMUM_NODES]
+	__u8 type;
+	__u8 node;
+	__u8 reserved1[30];		// used to be vote[32]
 	__u64 vote_seq_num;              // NUMBER RANGE(0,ULONG_LONG_MAX)
-	__u64 dir_ent;                   // NUMBER RANGE(0,ULONG_LONG_MAX)
+	__u64 lock_id;                   // NUMBER RANGE(0,ULONG_LONG_MAX)
 	__u8 open_handle;                // BOOL
 	__u8 ov_pad[7]; 		// UNUSED
 } ocfs_vote;				// END CLASS
@@ -1433,9 +1418,9 @@
 	__u32 vote_state;
 	__u32 req_lock_type;
 	__u32 vote_status;
-	__u64 req_vote_map;
-	__u64 got_vote_map;
-	__u64 tmp_openmap;
+	ocfs_node_map req_vote_map;
+	ocfs_node_map got_vote_map;
+	ocfs_node_map tmp_openmap;
 	__u64 seq_num;
 	pid_t pid;
 	ocfs_dlm_msg m;
@@ -1522,8 +1507,8 @@
 {
 	int reply_method;
 	int *status;
-	__u64 *got_vote_map;
-	__u64 *open_map;
+	ocfs_node_map *got_vote_map;
+	ocfs_node_map *open_map;
 	__u32 flags;
 	union {
 		ocfs_dlm_reply_master *reply;
@@ -1904,4 +1889,45 @@
 
 #include "proto.h"
 
+static inline int IS_NODE_ALIVE(ocfs_node_map *pubmap, int index, int max)
+{
+	return ocfs_node_map_test_bit(pubmap, index);
+}	
+
+/*
+**  All structures have a type, and a size associated with it.
+**  The type serves to identify the structure. The size is used for
+**  consistency checking ...
+*/
+static inline void UPDATE_PUBLISH_MAP(ocfs_node_map *pubmap, int num, int flag, int max)
+{
+	if (flag == OCFS_PUBLISH_CLEAR)
+		ocfs_node_map_clear_bit(pubmap, num);
+	else
+		ocfs_node_map_set_bit(pubmap, num);
+}
+
+/* update the recovery map here */
+static inline void SET_NODE_IN_RECOVERY(ocfs_super *osb, int num)
+{
+	spin_lock(&osb->recovery_map_lock);
+	osb->vol_state = VOLUME_IN_RECOVERY;
+	ocfs_node_map_set_bit(&osb->recovery_map, num);
+	spin_unlock(&osb->recovery_map_lock);
+}
+
+static inline void CLEAR_NODE_IN_RECOVERY(ocfs_super *osb, int num)
+{
+	spin_lock(&osb->recovery_map_lock);
+	ocfs_node_map_clear_bit(&osb->recovery_map, num);
+	if (ocfs_node_map_is_empty(&osb->recovery_map))
+		osb->vol_state = VOLUME_ENABLED;
+	spin_unlock(&osb->recovery_map_lock);
+}
+
+static inline int TEST_NODE_IN_RECOVERY(ocfs_super *osb, int num)
+{
+	return ocfs_node_map_test_bit(&osb->recovery_map, num);
+}
+
 #endif /* !OCFS_H */

Modified: branches/format-changes/src/inc/ocfs_compat.h
===================================================================
--- branches/format-changes/src/inc/ocfs_compat.h	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/inc/ocfs_compat.h	2004-06-04 00:59:41 UTC (rev 1001)
@@ -86,5 +86,10 @@
 
 #endif  /* LINUX_VERSION_CODE < 2.6 */
 
+#ifndef BITS_TO_LONGS
+#define BITS_TO_LONGS(bits) \
+		(((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
+#endif
+
 #endif  /* OCFS_COMPAT_H */
 

Modified: branches/format-changes/src/inc/proto.h
===================================================================
--- branches/format-changes/src/inc/proto.h	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/inc/proto.h	2004-06-04 00:59:41 UTC (rev 1001)
@@ -101,7 +101,7 @@
 
 /* dir.c */
 int empty_dir(struct inode *inode);  /* FIXME: to namei.c */
-int ocfs_find_files_on_disk(ocfs_super *osb, struct dentry *dentry,
+int ocfs_find_files_on_disk(ocfs_super *osb, const char *name, int namelen,
 			    struct buffer_head **fe_bh,
 			    struct inode *inode,
 			    struct inode *file_inode, int take_lock,
@@ -131,6 +131,10 @@
 int ocfs_wait_for_lock_release(ocfs_super *osb, __u64 offset,
 			       __u32 time_to_wait, __u32 lock_type,
 			       struct inode *inode);
+void ocfs_set_publish_vote_map(ocfs_super *osb, ocfs_publish *publish, ocfs_node_map *vote_map);
+void ocfs_get_publish_vote_map(ocfs_super *osb, ocfs_publish *publish, ocfs_node_map *vote_map);
+void ocfs_set_disk_lock_open_map(ocfs_super *osb, ocfs_disk_lock *lock, ocfs_node_map *open_map);
+void ocfs_get_disk_lock_open_map(ocfs_super *osb, ocfs_disk_lock *lock, ocfs_node_map *open_map);
 
 /* extmap.c */
 int ocfs_add_extent_map_entry(ocfs_super *osb, ocfs_extent_map *Map,
@@ -268,8 +272,8 @@
 #else
 int ocfs_create (struct inode *dir, struct dentry *dentry, int mode);
 #endif
-struct buffer_head *ocfs_find_entry(struct dentry *dentry,
-				    struct ocfs2_dir_entry **res_dir);
+struct buffer_head * ocfs_find_entry (const char *name, int namelen, struct inode *dir,
+					struct ocfs2_dir_entry ** res_dir);
 int ocfs_link(struct dentry *old_dentry, struct inode *dir,
 	      struct dentry *dentry);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
@@ -317,6 +321,7 @@
 int ocfs_follow_link(struct dentry *dentry, struct nameidata *nd);
 
 /* sysfile.c */
+struct inode * ocfs_get_system_file_inode(ocfs_super *osb, int file_type, __u32 node);
 int ocfs_extend_system_file(ocfs_super *osb, __u32 FileId,
 			    __u64 FileSize, struct buffer_head *fe_bh,
 			    ocfs_journal_handle *handle,int zero);
@@ -364,14 +369,36 @@
 				 ocfs_vote_reply_ctxt *ctxt,
 				 __u32 node_num);
 int ocfs_recv_udp_msg(ocfs_recv_ctxt *recv_ctxt);
-int ocfs_send_dismount_msg(ocfs_super *osb, __u64 vote_map);
-int ocfs_send_dlm_request_msg(ocfs_super *osb, __u64 lock_id,
-			      __u32 lock_type, __u32 flags,
-			      __u64 *vote_map, __u64 *openmap,
-			      struct inode *inode, int *vote_status);
+int ocfs_send_dismount_msg(ocfs_super *osb);
+int ocfs_send_dlm_request_msg (ocfs_super * osb, __u64 lock_id, 
+			       __u32 lock_type, __u32 flags, 
+			       ocfs_node_map *votemap, ocfs_node_map *openmap, 
+			       struct inode *inode, int *vote_status);
 int ocfs_send_vote_reply(ocfs_super *osb, ocfs_dlm_msg *dlm_msg,
 			 __u32 vote_status, int inode_open);
 int ocfs_lookup_vote_request_obj (ocfs_super *osb, 
 				  ocfs_vote_obj_lookup_data *data);
 
+void ocfs_node_map_init(ocfs_super *osb, ocfs_node_map *map);
+void ocfs_node_map_set_bit(ocfs_node_map *map, int bit);
+void ocfs_node_map_clear_bit(ocfs_node_map *map, int bit);
+// clear all the bits in "target" which are set in "mask"
+void ocfs_node_map_clear_bits(ocfs_node_map *target, ocfs_node_map *mask);
+// 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);
+int ocfs_node_map_test_bit(ocfs_node_map *map, int bit);
+int ocfs_node_map_stringify(ocfs_node_map *map, char **str);
+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);
+// expects that "target" is already inited with correct 
+// num_nodes, and that "from" is of course wide enough
+void ocfs_node_map_set_from_disk(ocfs_node_map *target, void *from);
+void ocfs_node_map_set_to_disk(void *target, ocfs_node_map *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);
+
+
 #endif /* _PROTO_H_ */

Modified: branches/format-changes/src/inode.c
===================================================================
--- branches/format-changes/src/inode.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/inode.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -1725,7 +1725,7 @@
 		goto bail;
 	}
 
-	if (osb->publ_map == (1 << osb->node_num)) {
+	if (ocfs_node_map_is_only(osb, &osb->publ_map, osb->node_num)) {
 		LOG_TRACE_STR ("Only node alive.");
 		goto bail;
 	}

Modified: branches/format-changes/src/lockres.c
===================================================================
--- branches/format-changes/src/lockres.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/lockres.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -91,7 +91,7 @@
 
 		lockres->lock_type = DISK_LOCK(fe)->file_lock;
 		lockres->master_node_num = DISK_LOCK(fe)->curr_master;
-		lockres->oin_openmap = DISK_LOCK(fe)->oin_node_map;
+		ocfs_get_disk_lock_open_map(osb, DISK_LOCK(fe), &lockres->oin_openmap);
 
 		if (lockres->readonly_node != OCFS_INVALID_NODE_NUM &&
     	    	    lockres->readonly_node != lockres->master_node_num) {
@@ -231,14 +231,14 @@
 	lockres->lock_type = OCFS_DLM_NO_LOCK;
 	lockres->master_node_num = OCFS_INVALID_NODE_NUM;
 	lockres->last_upd_seq_num = 0;
-	lockres->oin_openmap = 0;
+	ocfs_node_map_init(osb, &lockres->oin_openmap);
 	lockres->in_use = 0;
 	lockres->lock_state = 0;
 
 	spin_lock_init (&lockres->lock_mutex);
 	atomic_set (&lockres->lr_ref_cnt, 0);
 
-	lockres->readonly_map = 0ULL;
+	ocfs_node_map_init(osb, &lockres->readonly_map);
 	lockres->readonly_node = OCFS_INVALID_NODE_NUM;
 
 	lockres->lock_holders = 0;

Modified: branches/format-changes/src/namei.c
===================================================================
--- branches/format-changes/src/namei.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/namei.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -40,7 +40,7 @@
 
 extern spinlock_t oin_num_ext_lock;
 
-static int inline search_dirblock(struct buffer_head * bh, struct inode *dir, struct dentry *dentry, unsigned long offset, struct ocfs2_dir_entry ** res_dir);
+static int inline search_dirblock(struct buffer_head * bh, struct inode *dir, const char *name, int namelen, unsigned long offset, struct ocfs2_dir_entry ** res_dir);
 static int ocfs_delete_entry (ocfs_journal_handle *handle, struct inode * dir, struct ocfs2_dir_entry * de_del, struct buffer_head * bh);
 static int ocfs_add_entry (ocfs_journal_handle *handle, struct dentry *dentry, struct inode *inode, __u64 inode_off, struct buffer_head *parent_fe_bh);
 static inline int ocfs_match (int len, const char * const name, struct ocfs2_dir_entry * de);
@@ -96,7 +96,8 @@
 		       dir);
 
 	inode = NULL;  // no inode yet 
-	status = ocfs_find_files_on_disk (osb, dentry, &fe_bh, dir, inode, 1, &dirent_bh, &dirent);
+	status = ocfs_find_files_on_disk (osb, dentry->d_name.name, dentry->d_name.len, 
+					  &fe_bh, dir, inode, 1, &dirent_bh, &dirent);
 	if (status < 0)
 		goto bail_add;
 	
@@ -324,12 +325,16 @@
 	__u64 disk_off = 0;
 	__u64 fileOffset = 0;
 	struct inode *inode_alloc_inode = NULL;
+	ocfs_node_map just_me;
 
 	LOG_ENTRY_ARGS ("(0x%p, 0x%p, %d, %d, '%*s')\n", dir, dentry, mode,
 			dev, dentry->d_name.len, dentry->d_name.name);
 
 	OCFS_ASSERT(new_fe_bh);
 	*new_fe_bh = NULL;
+	
+	ocfs_node_map_init(osb, &just_me);
+	ocfs_node_map_set_bit(&just_me, osb->node_num);
 
 	inode_alloc_inode = igrab(osb->system_inodes[INODE_ALLOC_BITMAP_SYSTEM_INODE]);
 	if (!inode_alloc_inode) {
@@ -387,12 +392,12 @@
 	fe->i_next_free_ext = 0;
 	fe->last_ext_ptr = 0;
 	strcpy (fe->i_signature, OCFS_FILE_ENTRY_SIGNATURE);
-	SET_VALID_BIT(fe->i_flags);
+	fe->i_flags |= OCFS2_VALID_FL;
 	fe->i_flags &= ~(OCFS2_CHANGE_FL);
 	DISK_LOCK(fe)->dlock_seq_num = 0;
 	DISK_LOCK(fe)->curr_master = osb->node_num;
 	DISK_LOCK(fe)->file_lock = OCFS_DLM_ENABLE_CACHE_LOCK;
-	DISK_LOCK(fe)->oin_node_map = (1 << osb->node_num);
+	ocfs_set_disk_lock_open_map(osb, DISK_LOCK(fe), &just_me);
 	fe->i_atime = fe->i_ctime = fe->i_mtime = OCFS_CURRENT_TIME;
         fe->i_dtime = 0;
 	OCFS_BH_PUT_DATA(*new_fe_bh);
@@ -559,7 +564,8 @@
 
 	/* this will re-read the directory now with the EXCLUSIVE */
 	/* lock already held; it will also return the fe_bh to us */
-	status = ocfs_find_files_on_disk (osb, dentry, &fe_bh, parentInode, 
+	status = ocfs_find_files_on_disk (osb, dentry->d_name.name, dentry->d_name.len, 
+					  &fe_bh, parentInode, 
 					  inode, 0, &dirent_bh, &dirent);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -998,7 +1004,9 @@
 	}
 	
 	status = -ENOENT;
-	old_de_bh = ocfs_find_entry (old_dentry, &old_de);
+	old_de_bh = ocfs_find_entry (old_dentry->d_name.name, 
+				     old_dentry->d_name.len,
+				     old_dir, &old_de);
 	if (!old_de_bh)
 		goto finally;
 
@@ -1013,8 +1021,8 @@
 
 	/* check if the target already exists (in which case we need
 	 * to delete it */
-	status = ocfs_find_files_on_disk(osb, new_dentry, &newfe_bh, 
-					 new_dir, new_inode, 0, &new_de_bh, &new_de);
+	status = ocfs_find_files_on_disk(osb, new_dentry->d_name.name, new_dentry->d_name.len, 
+					 &newfe_bh, new_dir, new_inode, 0, &new_de_bh, &new_de);
 	/* The only error we allow here is -ENOENT because the new
 	 * file not existing is perfectly valid. */
 	if ((status < 0) && (status != -ENOENT)) {
@@ -1625,15 +1633,13 @@
  */
 static int inline search_dirblock(struct buffer_head * bh,
 				  struct inode *dir,
-				  struct dentry *dentry,
+				  const char *name, int namelen,
 				  unsigned long offset,
 				  struct ocfs2_dir_entry ** res_dir)
 {
 	struct ocfs2_dir_entry * de;
 	char * dlimit;
 	int de_len;
-	const char *name = dentry->d_name.name;
-	int namelen = dentry->d_name.len;
 	int ret = 0;
 
 	de = (struct ocfs2_dir_entry *) OCFS_BH_GET_DATA_READ(bh); /* read */
@@ -1669,7 +1675,7 @@
 
 
 
-struct buffer_head * ocfs_find_entry (struct dentry *dentry,
+struct buffer_head * ocfs_find_entry (const char *name, int namelen, struct inode *dir,
 					struct ocfs2_dir_entry ** res_dir)
 {
 	struct super_block * sb;
@@ -1682,7 +1688,6 @@
 				   buffer */
 	int num = 0;
 	int nblocks, i, err;
-	struct inode *dir = dentry->d_parent->d_inode;
 
 	*res_dir = NULL;
 	sb = dir->i_sb;
@@ -1730,8 +1735,8 @@
 			brelse(bh);
 			goto next;
 		}
-		i = search_dirblock(bh, dir, dentry,
-			    block << OCFS_SB(sb)->sect_size_bits, res_dir);
+		i = search_dirblock(bh, dir, name, namelen,
+				    block << OCFS_SB(sb)->sect_size_bits, res_dir);
 		if (i == 1) {
 			OCFS_I(dir)->i_dir_start_lookup = block;
 			ret = bh;

Modified: branches/format-changes/src/nm.c
===================================================================
--- branches/format-changes/src/nm.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/nm.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -266,7 +266,6 @@
 	__u32 num_nodes = 0;
 	__u32 vote_node;
 	ocfs_node_config_hdr *node_cfg_hdr = NULL;
-	__u64 curr_node_map;
 	__u64 cfg_seq_num;
 	int which, pruned, prune_iters = 0;
 	struct buffer_head *bh = NULL;
@@ -291,9 +290,6 @@
 		vote_node = OCFS_INVALID_NODE_NUM;
 		highest_vote_node = 0;
 
-		if (OcfsGlobalCtxt.hbm == 0)
-			OcfsGlobalCtxt.hbm = DISK_HBEAT_NO_COMM;
-
 		if (!time_after (jiffies, (unsigned long) (osb->hbt)))
 			goto finally;
 
@@ -356,7 +352,7 @@
 			}
 		}
 
-		num_nodes = OCFS_MAXIMUM_NODES;
+		num_nodes = osb->max_nodes;
 
 		/* Refresh the publish map */
 		ocfs_update_publish_map (osb, &(osb->cfg_bhs[OCFS_VOLCFG_NEWCFG_SECTORS]), 0);
@@ -369,21 +365,19 @@
 			atomic_inc (&osb->nm_init);
 		}
 
-		LOG_TRACE_ARGS ("Publish map: 0x%08X\n", (__u32)(osb->publ_map & 0xFFFFFFFFULL));
-
-		/* map of local node */
-		curr_node_map = (__u64) ((__u64)1 << osb->node_num);
-
 		/* Check for the highest node looking for a vote, if anybody is looking */
 		for (i = 0, which = OCFS_VOLCFG_NEWCFG_SECTORS; i < num_nodes; i++, which++) {
+			ocfs_node_map vote_map;
 			publish = (ocfs_publish *) OCFS_BH_GET_DATA_READ(osb->cfg_bhs[which]); /* read */
 
 			if (publish->time == (__u64) 0)
 				goto loop;
 
-			if (publish->vote != FLAG_VOTE_NODE ||
-			    !(publish->vote_map & curr_node_map))
+			if (publish->vote != FLAG_VOTE_NODE)
 				goto loop;
+			ocfs_get_publish_vote_map(osb, publish, &vote_map);
+			if (!ocfs_node_map_test_bit(&vote_map, osb->node_num))
+				goto loop;
 
 			LOG_TRACE_ARGS ("node(%u): vote=%d dirty=%d type=%u\n",
 					i, publish->vote, publish->dirty, 
@@ -392,7 +386,7 @@
 			highest_vote_node = i;
 
 			/* Check if the node is alive or not */
-			if (IS_NODE_ALIVE (osb->publ_map, highest_vote_node, 
+			if (IS_NODE_ALIVE (&osb->publ_map, highest_vote_node, 
 					   num_nodes)) {
 				vote_node = highest_vote_node;
 			} else {
@@ -518,8 +512,8 @@
 		}
 	} else if (lockres) {
 		*master_alive = lockres->master_node_num != OCFS_INVALID_NODE_NUM &&
-			IS_NODE_ALIVE(osb->publ_map, 
-			 lockres->master_node_num, OCFS_MAXIMUM_NODES);
+			IS_NODE_ALIVE(&osb->publ_map, 
+			 lockres->master_node_num, osb->max_nodes);
 
 		// if an outstanding vote request is found on this lockid
 		// and this node number is higher, this node wins
@@ -626,7 +620,7 @@
 	int status = 0;
 	int tmpstat = 0;
 	ocfs_lock_res *lockres = NULL;
-	__u32 flags, num_nodes, i;
+	__u32 flags, num_nodes;
 	__u64 offset;
 	ocfs_file_entry *fe = NULL;
 	ocfs_vote *vote = NULL;
@@ -646,6 +640,7 @@
 	__u32 node_num = ctxt->node_num;
 	__u64 lock_id, seq_num;
 	int needs_trunc = 0;
+	ocfs_node_map disk_map;
 
 	LOG_ENTRY_ARGS ("(0x%p, 0x%p)\n", osb, ctxt);
 
@@ -659,10 +654,10 @@
 		return status;
 	}
 
-	num_nodes = OCFS_MAXIMUM_NODES;
+	num_nodes = osb->max_nodes;
 	if (disk_vote) {
 		flags = publish->vote_type;
-		lock_id = publish->dir_ent;
+		lock_id = publish->lock_id;
 		seq_num = publish->publ_seq_num;
 	} else {
 		ocfs_dlm_req_master *req_master = (ocfs_dlm_req_master *)dlm_msg->msg_buf;
@@ -743,10 +738,10 @@
 	 */
 
 	if (disk_vote) {
-		/* Zero out the vote for everybody, if any already set and hung */
+		/* Zero out the vote, if any already set and hung */
 		vote = (ocfs_vote *) OCFS_BH_GET_DATA_WRITE(vote_bh); /* write */
-		for (i = 0; i < num_nodes; i++)
-			vote->vote[i] = 0;
+		vote->node = (__u8)-1;
+		vote->type = 0;
 		OCFS_BH_PUT_DATA(vote_bh);
 		status = ocfs_write_bh(osb, vote_bh, 0, NULL);
 		if (status < 0) {
@@ -913,7 +908,7 @@
 #endif
 #endif
 			}
-			lockres->readonly_map |= (1 << node_num);
+			ocfs_node_map_set_bit(&lockres->readonly_map, node_num);
 			lockres->readonly_node = osb->node_num;
 			vote_response = FLAG_VOTE_NODE;
 			status = 0;
@@ -950,12 +945,12 @@
 			 * map that lock will be changing to RW before we
 			 * continue.  RETRY this request while we spawn 
 			 * off a thread to collect up the communication */
-			if (lockres->readonly_map != 0ULL) {
+			if (!ocfs_node_map_is_empty(&lockres->readonly_map)) {
 				// assumption: node asking for vote has already dropped readonly_node
-				lockres->readonly_map &= ~(1 << node_num);
+				ocfs_node_map_clear_bit(&lockres->readonly_map, node_num);
 				// should not be in there, but...
-				lockres->readonly_map &= ~(1 << osb->node_num);
-				if (lockres->readonly_map != 0ULL) {
+				ocfs_node_map_clear_bit(&lockres->readonly_map, osb->node_num);
+				if (!ocfs_node_map_is_empty(&lockres->readonly_map)) {
 					OCFS_ASSERT(lockres->readonly_node == osb->node_num);
 #warning need to make sure inode is not NULL in process_vote
 					status = ocfs_drop_readonly_cache_lock(osb, inode, 1);
@@ -999,8 +994,12 @@
 			if (vote_type == CHANGE_MASTER) {
 				OCFS_BH_PUT_DATA(fe_bh);
 				fe = (ocfs_file_entry *) OCFS_BH_GET_DATA_WRITE(fe_bh); /* write */
-				if (inode && OCFS_I(inode)->open_hndl_cnt)
-					DISK_LOCK(fe)->oin_node_map |= (1 << osb->node_num);
+				if (inode && OCFS_I(inode)->open_hndl_cnt) {
+					ocfs_node_map_init(osb, &disk_map);
+					ocfs_get_disk_lock_open_map(osb, DISK_LOCK(fe), &disk_map);
+					ocfs_node_map_set_bit(&disk_map, osb->node_num);
+					ocfs_set_disk_lock_open_map(osb, DISK_LOCK(fe), &disk_map);
+				}
 				DISK_LOCK(fe)->curr_master = node_num;
 			}
 			OCFS_BH_PUT_DATA(fe_bh);
@@ -1051,12 +1050,12 @@
 				vote_response = FLAG_VOTE_FILE_DEL;
 				OCFS_BH_PUT_DATA(fe_bh);
 			} else {
-				__u64 tmpmap;
-			
+				ocfs_node_map_init(osb, &disk_map);
 				OCFS_BH_PUT_DATA(fe_bh);
 				fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_WRITE(fe_bh); /* write */
-				DISK_LOCK(fe)->oin_node_map |= (1 << node_num);
-				tmpmap = DISK_LOCK(fe)->oin_node_map;
+				ocfs_get_disk_lock_open_map(osb, DISK_LOCK(fe), &disk_map);
+				ocfs_node_map_set_bit(&disk_map, node_num);
+				ocfs_set_disk_lock_open_map(osb, DISK_LOCK(fe), &disk_map);
 				OCFS_BH_PUT_DATA(fe_bh);
 
 				/* Write new map on the disk */
@@ -1068,7 +1067,7 @@
 				}
 
 				/* Add this node to the oin map on the file entry */
-				lockres->oin_openmap = tmpmap;
+				ocfs_node_map_set(&lockres->oin_openmap, &disk_map);
 				vote_response = FLAG_VOTE_NODE;
 			}
 			brelse(fe_bh);
@@ -1092,10 +1091,10 @@
 			 * even in the error case.  do nothing for error. */	
 			if (lockres->master_node_num != node_num ||
 			    lockres->lock_type != OCFS_DLM_ENABLE_CACHE_LOCK ||
-			    lockres->readonly_map != 0ULL)
-				LOG_ERROR_ARGS("(drop-ro) master=%d node_num=%d locktype=%d map=%16llX ronode=%d\n",
+			    !ocfs_node_map_is_empty(&lockres->readonly_map))
+				LOG_ERROR_ARGS("(drop-ro) master=%d node_num=%d locktype=%d ronode=%d\n",
 				       lockres->master_node_num, node_num, lockres->lock_type, 
-				       lockres->readonly_map, lockres->readonly_node);
+				       lockres->readonly_node);
 			else
 				lockres->readonly_node = OCFS_INVALID_NODE_NUM;
 
@@ -1197,10 +1196,11 @@
 
 	if (disk_vote) {
 		vote = (ocfs_vote *) OCFS_BH_GET_DATA_WRITE(vote_bh); /* write */
-		vote->dir_ent = lock_id;
+		vote->lock_id = lock_id;
 		vote->vote_seq_num = seq_num;
 		vote->open_handle = open_handle;
-		vote->vote[node_num] = vote_response;
+		vote->node = node_num;
+		vote->type = vote_response;
 		OCFS_BH_PUT_DATA(vote_bh);
 		status = ocfs_write_bh(osb, vote_bh, 0, NULL);
 		brelse(vote_bh);
@@ -1384,13 +1384,15 @@
 	}
 
 	lockres->lock_state |= FLAG_READONLY_DROPPING;
-	lockres->readonly_map &= ~(1 << osb->node_num);  /* remove this node */
+	/* remove this node */
+	ocfs_node_map_clear_bit(&lockres->readonly_map, osb->node_num);
 	
 	status = 0;
-	while (lockres->readonly_map != 0ULL) {
+	while (!ocfs_node_map_is_empty(&lockres->readonly_map)) {
 		int disk_vote = 0;
 
-		lockres->readonly_map &= osb->publ_map;      /* remove all dead nodes */
+		/* remove all dead nodes */
+		ocfs_node_map_and(&lockres->readonly_map, &osb->publ_map);
 		status = new_lock_function(osb, OCFS_DLM_ENABLE_CACHE_LOCK, FLAG_DROP_READONLY, 
 					   NULL, &disk_vote, inode);
 		if (status == -EAGAIN) {
@@ -1406,8 +1408,8 @@
 			LOG_ERROR_STATUS (status);
 		break;
 	}
-					
-	if (lockres->readonly_map == 0ULL && 
+			
+	if (ocfs_node_map_is_empty(&lockres->readonly_map) &&	
 	    lockres->readonly_node == osb->node_num)
 		lockres->readonly_node = OCFS_INVALID_NODE_NUM;
 

Modified: branches/format-changes/src/proc.c
===================================================================
--- branches/format-changes/src/proc.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/proc.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -487,8 +487,8 @@
 	}
 
 	ptr = pubmap;
-	for (i = 0; i < 32; i++) {
-		if (osb->publ_map & (1 << i))
+	for (i = 0; i < osb->max_nodes; i++) {
+		if (ocfs_node_map_test_bit(&osb->publ_map, i))
 			ptr += sprintf (ptr, "%d ", i);
 	}
 	if (pubmap != ptr)
@@ -555,7 +555,6 @@
 	int ret;
 	ocfs_super *osb;
 	BARF_BARF_BARF *node;
-	__u32 publ_map;
 	char mount;
 
 	LOG_ENTRY ();
@@ -564,12 +563,11 @@
 
 	if (osb) {
 		down (&(osb->cfg_lock));
-		publ_map = (__u32)osb->publ_map;
-		for (i = 0; i < OCFS_MAXIMUM_NODES; ++i, publ_map >>= 1) {
+		for (i = 0; i < osb->max_nodes; i++) {
 			node = osb->node_cfg_info[i];
 			if (!node)
 				continue;
-			mount = (publ_map & 0x1) ? 'M' : ' ';
+			mount = ocfs_node_map_test_bit(&osb->publ_map, i) ? 'M' : ' ';
 			len += sprintf (page + len,
 				       	"%2d %c %-32s %-15s %-6d ",
 				       	i, mount, node->node_name,

Modified: branches/format-changes/src/super.c
===================================================================
--- branches/format-changes/src/super.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/super.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -212,56 +212,26 @@
 static int ocfs_init_system_inodes(ocfs_super *osb)
 {
 	struct inode *new = NULL;
-	__u64 sys_off = 0;
 	int status = 0;
+	int i;
 
 	LOG_ENTRY();
 
-	/* the vol bitmap */
-	sys_off = OCFS_BITMAP_LOCK_OFFSET;
-	new = ocfs_iget(osb, sys_off, NULL);
+	new = ocfs_iget(osb, OCFS_SYS_ROOT_INODE_OFF(osb), NULL);
 	if (!new) {
-		status = -EINVAL;
-		LOG_ERROR_STATUS(status);
+		LOG_ERROR_STATUS(status = -EINVAL);
 		goto bail;
 	}
-	osb->system_inodes[GLOBAL_BITMAP_SYSTEM_INODE] = new;
-
-	/* file alloc bitmap */
-	sys_off = osb->vol_layout.root_int_off + 
-		((OCFS_FILE_FILE_ALLOC_BITMAP + osb->node_num) 
-		 * osb->sect_size);
-	new = ocfs_iget(osb, sys_off, NULL);
-	if (!new) {
-		status = -EINVAL;
-		LOG_ERROR_STATUS(status);
-		goto bail;
+	osb->sys_root_inode = new;
+	for (i=0; i<NUM_SYSTEM_INODES; i++) {
+		new = ocfs_get_system_file_inode(osb, i, osb->node_num);
+		if (!new) {
+			ocfs_release_system_inodes(osb);
+			LOG_ERROR_STATUS(status=-EINVAL);
+			goto bail;
+		}
+		osb->system_inodes[i] = new;
 	}
-	osb->system_inodes[FILE_ALLOC_BITMAP_SYSTEM_INODE] = new;
-
-	/* inode alloc bitmap */
-	sys_off = osb->vol_layout.root_int_off + 
-		((OCFS_INODE_BITMAP + osb->node_num) 
-		 * osb->sect_size);
-	new = ocfs_iget(osb, sys_off, NULL);
-	if (!new) {
-		status = -EINVAL;
-		LOG_ERROR_STATUS(status);
-		goto bail;
-	}
-	osb->system_inodes[INODE_ALLOC_BITMAP_SYSTEM_INODE] = new;
-
-	/* journal file */
-	sys_off = osb->vol_layout.root_int_off + 
-		((OCFS_JOURNAL_FILE + osb->node_num) * osb->sect_size);
-	new = ocfs_iget(osb, sys_off, NULL);
-	if (!new) {
-		status = -EINVAL;
-		LOG_ERROR_STATUS(status);
-		goto bail;
-	}
-	osb->system_inodes[JOURNAL_SYSTEM_INODE] = new;
-
 bail:
 	LOG_EXIT_STATUS(status);
 	return(status);
@@ -278,8 +248,15 @@
 	LOG_ENTRY();
 
 	for (i=0; i<NUM_SYSTEM_INODES; i++) {
-		iput(osb->system_inodes[i]);
+		if (osb->system_inodes[i]) {
+			iput(osb->system_inodes[i]);
+			osb->system_inodes[i] = NULL;
+		}
 	}
+	if (osb->sys_root_inode) {
+		iput(osb->sys_root_inode);
+		osb->sys_root_inode = NULL;
+	}
 	LOG_EXIT_STATUS(status);
 	return(status);
 } /* ocfs_release_system_inodes */
@@ -520,8 +497,6 @@
 		goto leave;
 	}
 
-	OcfsGlobalCtxt.hbm = DISK_HBEAT_COMM_ON;
-
 	spin_lock_init (&osb_id_lock);
 	spin_lock (&osb_id_lock);
 	osb_id = 0;
@@ -583,15 +558,9 @@
 
 	/* Read remaining insmod params */
 	if (node_number != OCFS_INVALID_NODE_NUM) {
-		if (node_number >= 0 && node_number < OCFS_MAXIMUM_NODES) {
-			OcfsGlobalCtxt.pref_node_num = node_number;
-			LOG_TRACE_ARGS("Preferred node number: %d\n",
-				       node_number);
-		}
-		else {
-			status = -EINVAL;
-			LOG_ERROR_STR("'node_number' must be between 0 and 31");
-		}
+		// this will be validated later
+		OcfsGlobalCtxt.pref_node_num = node_number;
+		LOG_TRACE_ARGS("Preferred node number: %d\n", node_number);
 	}
 
 	if (ip_port_v2 == 0)
@@ -719,7 +688,7 @@
 	osb = OCFS_SB(sb);
 	numbits = osb->cluster_bitmap.validbits;
  
-	status = ocfs_read_bh (osb, OCFS_BITMAP_LOCK_OFFSET, &bh, 0, NULL);
+	status = ocfs_read_bh (osb, OCFS_BITMAP_LOCK_OFFSET(osb), &bh, 0, NULL);
 	if (status < 0) {
 		LOG_ERROR_STR("failed to read bitmap data");
 		return -EIO;
@@ -947,13 +916,11 @@
 	ocfs_wait (osb->nm_init_event, (atomic_read (&osb->nm_init) >= OCFS_HEARTBEAT_INIT ), 0);
 
 	down(&(osb->osb_res));
-	osb->hbm = DISK_HBEAT_COMM_ON;
-	
 	down (&(osb->publish_lock));
 	ocfs_nm_heart_beat (osb, HEARTBEAT_METHOD_DISK, 1);
 	up (&(osb->publish_lock));
-	
-	osb->publ_map |= (1 << osb->node_num);
+
+	ocfs_node_map_set_bit(&osb->publ_map, osb->node_num);
 	osb->vol_state = VOLUME_ENABLED;
 	up (&(osb->osb_res));
 
@@ -1034,8 +1001,6 @@
 	int status = 0;
 	int AcquiredOSB = 0;
 	ocfs_super *osb = NULL;
-	__u32 nodemap;
-	__u32 tempmap;
 	int i;
 
 	LOG_ENTRY_ARGS ("(0x%p)\n", sb);
@@ -1105,13 +1070,9 @@
 	}
 
 
-	/* create map of all active nodes except self */
-	nodemap = (__u32)osb->publ_map;
-	tempmap = (1 << osb->node_num);
-	nodemap &= (~tempmap);
 
 	/* send dismount msg to all */
-	status = ocfs_send_dismount_msg (osb, (__u64)nodemap);
+	status = ocfs_send_dismount_msg (osb);
 	if (status < 0)
 		LOG_ERROR_STATUS (status);
 
@@ -1145,7 +1106,7 @@
 		osb->node_cfg_info[osb->node_num]->node_name, osb->node_num);
 
 	/* Free all nodecfgs */
-	for (i = 0; i < OCFS_MAXIMUM_NODES; ++i) {
+	for (i = 0; i < osb->max_nodes; ++i) {
 		BARF_BARF_BARF *p;
 
 		p = osb->node_cfg_info[i];
@@ -1296,7 +1257,6 @@
 	return(retval);
 }
 
-
 /*
  * ocfs_initialize_osb()
  *
@@ -1311,11 +1271,14 @@
 	__u64 offset;
 	ocfs_vol_layout *vol_layout;
 	struct buffer_head *publish_bh = NULL;  /* our own publish sector */
-	struct buffer_head *publish_bhs[OCFS_MAXIMUM_NODES]; /* all the publish sectors */
+	struct buffer_head **publish_bhs = NULL; /* all the publish sectors */
 	int i;
 
 	LOG_ENTRY ();
 
+	/* FIXME: before getting started, this MUST be set */
+	osb->max_nodes = 32;  // noNONONO!
+	
         /* FIXME
          * This should be done in ocfs_journal_init(), but unknown
          * ordering issues will cause the filesystem to crash.
@@ -1332,12 +1295,44 @@
 	}
 	memset(osb->journal, 0, sizeof(ocfs_journal));
 
-	memset(publish_bhs, 0, OCFS_MAXIMUM_NODES * sizeof (struct buffer_head *));
-	if (osb == NULL) {
-		LOG_ERROR_STATUS(status = -EFAIL);
+	publish_bhs = kmalloc(sizeof(struct buffer_head *) * osb->max_nodes, GFP_KERNEL);
+	if (publish_bhs == NULL) {
+		LOG_ERROR_STATUS(status = -ENOMEM);
 		goto finally;
 	}
+	memset(publish_bhs, 0, sizeof(struct buffer_head *) * osb->max_nodes);
 
+	osb->vol_node_map = kmalloc(sizeof(ocfs_vol_node_map) * osb->max_nodes, GFP_KERNEL);
+	if (!osb->vol_node_map) {
+		LOG_ERROR_STATUS(status = -ENOMEM);
+		goto bail;
+	}
+	memset(osb->vol_node_map, 0, sizeof(ocfs_vol_node_map) * osb->max_nodes);
+
+	osb->lock_recovery_lists = kmalloc(sizeof(struct list_head) * osb->max_nodes, GFP_KERNEL);
+	if (!osb->lock_recovery_lists) {
+		LOG_ERROR_STATUS(status = -ENOMEM);
+		goto bail;
+	}
+	memset(osb->lock_recovery_lists, 0, sizeof(struct list_head) * osb->max_nodes);
+
+	osb->last_publ_seq_num = kmalloc(sizeof(__u64) * osb->max_nodes, GFP_KERNEL);
+	if (!osb->last_publ_seq_num) {
+		LOG_ERROR_STATUS(status = -ENOMEM);
+		goto bail;
+	}
+	memset(osb->last_publ_seq_num, 0, sizeof(__u64) * osb->max_nodes);
+	
+	osb->node_cfg_info = kmalloc(sizeof(BARF_BARF_BARF *) * osb->max_nodes, GFP_KERNEL);
+	if (!osb->node_cfg_info) {
+		LOG_ERROR_STATUS(status = -ENOMEM);
+		goto bail;
+	}
+	memset(osb->node_cfg_info, 0, sizeof(BARF_BARF_BARF *) * osb->max_nodes);
+
+	ocfs_node_map_init(osb, &osb->publ_map);
+
+		
 	OCFS_CLEAR_FLAG (osb->osb_flags, OCFS_OSB_FLAGS_SHUTDOWN);
 
 	vol_layout = &(osb->vol_layout);
@@ -1360,7 +1355,7 @@
 	init_MUTEX (&(osb->local_alloc_sem));
 
 	spin_lock_init(&osb->recovery_map_lock);
-	osb->recovery_map = 0;
+	ocfs_node_map_init(osb, &osb->recovery_map);
 
 	osb->needs_flush = 0;
 	osb->disable_recovery = 0;
@@ -1383,7 +1378,7 @@
 	INIT_LIST_HEAD (&(osb->vote_obj_queue));
 	INIT_LIST_HEAD (&(osb->cache_lock_list));
 	INIT_LIST_HEAD (&(osb->needs_flush_head));
-	for (i=0; i<32; i++) {
+	for (i=0; i<osb->max_nodes; i++) {
 		INIT_LIST_HEAD(&(osb->lock_recovery_lists[i]));
 	}
 	osb->sect_size = sect_size;
@@ -1455,7 +1450,7 @@
 
 	osb->prealloc_lock = 0;
 
-	osb->cfg_numblocks = OCFS_MAXIMUM_NODES + OCFS_VOLCFG_NEWCFG_SECTORS;
+	osb->cfg_numblocks = osb->max_nodes + OCFS_VOLCFG_NEWCFG_SECTORS;
 	osb->cfg_len = osb->cfg_numblocks * osb->sect_size;
 	osb->cfg_bhs = ocfs_malloc (osb->cfg_numblocks
 				    * sizeof(struct buffer_head *));
@@ -1501,7 +1496,7 @@
 	brelse(publish_bh);
 
 	/*  Read disk for all Publish Sectors  */
-	length = OCFS_MAXIMUM_NODES * osb->sect_size;
+	length = osb->max_nodes * osb->sect_size;
 	status = ocfs_read_bhs(osb, vol_layout->publ_sect_off, length, 
 			       publish_bhs, 0, NULL);
 	if (status < 0) {
@@ -1511,7 +1506,7 @@
 
 	ocfs_update_publish_map (osb, publish_bhs, 1);
 
-	for(i = 0; i < OCFS_MAXIMUM_NODES; i++)
+	for(i = 0; i < osb->max_nodes; i++)
 		osb->last_publ_seq_num[i] = (__u64) (-1);
 
 	/* We might need to add a variable in Global List of osb to */
@@ -1543,8 +1538,16 @@
 	goto finally;
 
 bail:
-	ocfs_safefree (osb->cfg_bhs);
-
+	if (osb->cfg_bhs)
+		kfree(osb->cfg_bhs);
+	if (osb->vol_node_map)
+		kfree(osb->vol_node_map);
+	if (osb->lock_recovery_lists)
+		kfree(osb->lock_recovery_lists);
+	if (osb->last_publ_seq_num)
+		kfree(osb->last_publ_seq_num);
+	if (osb->node_cfg_info)
+		kfree(osb->node_cfg_info);
 finally:
 	if (publish) {
 		if (publish_bh) {
@@ -1554,7 +1557,7 @@
 	}
 	if (publish_bhs[0]) {
 		int i;
-		for(i = 0; i < OCFS_MAXIMUM_NODES; i++)
+		for(i = 0; i < osb->max_nodes; i++)
 			if (publish_bhs[i])
 				brelse(publish_bhs[i]);
 	}
@@ -1725,14 +1728,24 @@
 		list_del (&(osb->osb_next));
 	up (&(OcfsGlobalCtxt.global_res));
 
-	for (i=0; i<32; i++)
+	for (i=0; i<osb->max_nodes; i++)
 		ocfs_recover_oin_locks(osb, i);
 
 	for(i = 0; i < osb->cfg_numblocks; i++)
 		if (osb->cfg_bhs[i])
 			brelse(osb->cfg_bhs[i]);
-	ocfs_safefree(osb->cfg_bhs);
 
+	if (osb->cfg_bhs)
+		kfree(osb->cfg_bhs);
+	if (osb->vol_node_map)
+		kfree(osb->vol_node_map);
+	if (osb->lock_recovery_lists)
+		kfree(osb->lock_recovery_lists);
+	if (osb->last_publ_seq_num)
+		kfree(osb->last_publ_seq_num);
+	if (osb->node_cfg_info)
+		kfree(osb->node_cfg_info);
+
         /* FIXME
          * This belongs in journal shutdown, but because we have to
          * allocate osb->journal at the start of ocfs_initalize_osb(),

Modified: branches/format-changes/src/sysfile.c
===================================================================
--- branches/format-changes/src/sysfile.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/sysfile.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -43,7 +43,71 @@
 
 static int ocfs_find_extents_of_system_file (ocfs_super * osb, __u64 file_off, __u64 Length, ocfs_file_entry * fe, void **Buffer, __u32 * NumEntries);
 
+static struct inode * _ocfs_get_system_file_inode(ocfs_super *osb, int file_type, __u32 node);
 
+char *system_file_names[] = {
+	"global_bitmap",
+	"global_inode_alloc",
+	"publish",
+	"vote",
+	"autoconfig",
+	"extent_alloc:%04d",
+	"extent_alloc_bitmap:%04d",
+	"inode_alloc:%04d",
+	"inode_alloc_bitmap:%04d",
+	"journal:%04d"
+};
+
+struct inode * ocfs_get_system_file_inode(ocfs_super *osb, int file_type, __u32 node)
+{
+	struct inode *inode = NULL;
+
+	// avoid the lookup if cached in local system file array
+	if ((node == osb->node_num || file_type==GLOBAL_BITMAP_SYSTEM_INODE) && 
+	    (inode = osb->system_inodes[file_type]) != NULL) {
+		// get a ref in addition to the array ref
+		igrab(inode);
+		return inode;
+	}
+	return _ocfs_get_system_file_inode(osb, file_type, node);
+}
+
+static struct inode * _ocfs_get_system_file_inode(ocfs_super *osb, int file_type, __u32 node)
+{
+	char namebuf[40];
+	struct inode *inode = NULL;
+	struct buffer_head *fe_bh = NULL;
+	struct buffer_head *dirent_bh = NULL;
+	struct ocfs2_dir_entry *de = NULL;
+	int status = 0;
+
+	if (file_type == GLOBAL_BITMAP_SYSTEM_INODE)
+		// "There Can Be Only One!"
+		sprintf(namebuf, system_file_names[file_type]);
+	else
+		sprintf(namebuf, system_file_names[file_type], node);
+
+	status = ocfs_find_files_on_disk (osb, namebuf, strlen(namebuf),
+					  &fe_bh, osb->sys_root_inode, 
+					  NULL, 1, &dirent_bh, &de);
+	if (status < 0) {
+		goto bail;
+	}
+
+	inode = ocfs_iget(osb, 0, fe_bh);
+	if (!inode) {
+		LOG_ERROR_STR("Could not create inode!");
+		goto bail;
+	}
+bail:
+	if (fe_bh)
+		brelse(fe_bh);
+	if (dirent_bh)
+		brelse(dirent_bh);
+	return inode;
+}
+
+
 /*
  * ocfs_read_system_file()
  *

Modified: branches/format-changes/src/volcfg.c
===================================================================
--- branches/format-changes/src/volcfg.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/volcfg.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -140,12 +140,17 @@
 	__u32 node_num;
 	__u32 sect_size;
 	__u32 size;
-	struct buffer_head *cfg_bhs[OCFS_MAXIMUM_NODES];
+	struct buffer_head **cfg_bhs = NULL;
 	int done = 0;
 
 	LOG_ENTRY ();
 
-	memset(cfg_bhs, 0, OCFS_MAXIMUM_NODES * sizeof(*cfg_bhs));
+	cfg_bhs = kmalloc(sizeof(struct buffer_head *) * osb->max_nodes, GFP_KERNEL);
+	if (cfg_bhs == NULL) {
+		LOG_ERROR_STATUS(status = -ENOMEM);
+		goto finally;
+	}
+	memset(cfg_bhs, 0, osb->max_nodes * sizeof(struct buffer_head *));
 
 	sect_size = osb->sect_size;
 
@@ -162,7 +167,7 @@
 
 	/* Check if preferred node num is available */
 	node_num = OCFS_INVALID_NODE_NUM;
-	if (pref_node_num >= 0 && pref_node_num < OCFS_MAXIMUM_NODES) {
+	if (pref_node_num >= 0 && pref_node_num < osb->max_nodes) {
 		p = OCFS_BH_GET_DATA_READ(cfg_bhs[pref_node_num]); /* read */
 		disk_node = (ocfs_node_config_info *)p;
 		if (disk_node->node_name[0] == '\0')
@@ -172,7 +177,7 @@
 
 	/* if not, find the first available empty slot */
 	if (node_num == OCFS_INVALID_NODE_NUM) {
-		for (node_num = 0; node_num < OCFS_MAXIMUM_NODES; node_num++) {
+		for (node_num = 0; node_num < osb->max_nodes; node_num++) {
 			p = OCFS_BH_GET_DATA_READ(cfg_bhs[node_num]); /* read */
 			disk_node = (ocfs_node_config_info *) p;
 			if (disk_node->node_name[0] == '\0')
@@ -184,7 +189,7 @@
 	}
 
 	/* If no free slots, error out */
-	if (node_num >= OCFS_MAXIMUM_NODES) {
+	if (node_num >= osb->max_nodes) {
 		LOG_ERROR_STR ("Unable to allocate node number as no slots " \
 			       "are available");
 		status = -ENOSPC;
@@ -211,9 +216,11 @@
 	}
 
 finally:
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++)
+	for (i = 0; i < osb->max_nodes; i++)
 		if (cfg_bhs[i])
 			brelse(cfg_bhs[i]);
+	if (cfg_bhs)
+		kfree(cfg_bhs);
 
 	LOG_EXIT_STATUS (status);
 	return status;
@@ -799,7 +806,7 @@
 
 	/* Read the nodecfg for all possible nodes as there may be holes */
 	/* i.e., node numbers need not be dolled out in sequence */
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {//, p += sect_size) {
+	for (i = 0; i < osb->max_nodes; i++) {//, p += sect_size) {
 		int which;
 		which = i + OCFS_VOLCFG_HDR_SECTORS;
 		disk = (ocfs_node_config_info *) 
@@ -1022,7 +1029,7 @@
 	BARF_BARF_BARF *node;
 	__u32 i;
 
-	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
+	for (i = 0; i < osb->max_nodes; i++) {
 		node = osb->node_cfg_info[i];
 
 		if (!node || node->node_name[0] == '\0')

Modified: branches/format-changes/src/vote.c
===================================================================
--- branches/format-changes/src/vote.c	2004-06-03 21:00:43 UTC (rev 1000)
+++ branches/format-changes/src/vote.c	2004-06-04 00:59:41 UTC (rev 1001)
@@ -47,13 +47,14 @@
 
 static const char vote_state_str[] = { 'U', 'S', 'P', 'F', 'D' };
 
-static ocfs_vote_obj * ocfs_alloc_vote_obj (int bytes, __u32 reqlock, __u64 votemap);
+static ocfs_vote_obj * ocfs_alloc_vote_obj (ocfs_super *osb, int bytes, __u32 reqlock, ocfs_node_map * votemap);
 static void ocfs_dlm_recv_msg (void *val);
 static int ocfs_check_ipc_msg (__u8 * msg, __u32 msg_len);
 static int ocfs_comm_process_vote_reply (ocfs_super * osb, ocfs_dlm_msg * dlm_msg);
 static int ocfs_comm_process_msg (__u8 * msg);
 static void ocfs_init_dlm_msg (ocfs_super * osb, ocfs_dlm_msg * dlm_msg, __u32 msg_len, __u32 type);
 
+static int ocfs_send_bcast (ocfs_super * osb, ocfs_node_map *votemap, ocfs_dlm_msg * dlm_msg);
 
 static spinlock_t vote_obj_lock = SPIN_LOCK_UNLOCKED;
 
@@ -147,23 +148,22 @@
  * ocfs_send_bcast()
  *
  */
-static int ocfs_send_bcast (ocfs_super * osb, __u64 votemap, ocfs_dlm_msg * dlm_msg)
+static int ocfs_send_bcast (ocfs_super * osb, ocfs_node_map *votemap, ocfs_dlm_msg * dlm_msg)
 {
 	int status = 0, error;
-	__u32 map, num;
+	__u32 num;
 	BARF_BARF_BARF *node;
 	struct sockaddr_in sin;
 	mm_segment_t oldfs;
 
-	LOG_ENTRY_ARGS ("(votemap=0x%x)\n",
-			(__u32)(votemap & 0xFFFFFFFFULL));
+	LOG_ENTRY ();
 
 	oldfs = get_fs ();
-	for (map = (__u32)(votemap & 0xFFFFFFFFULL), num = 0; map != 0; map >>= 1, num++) {
+	for (num=0; num<osb->max_nodes; num++) {
 		if (num == osb->node_num)
 			continue;
 
-		if (!(map & 0x1))
+		if (!ocfs_node_map_test_bit(votemap, num))
 			continue;
 
 		node = osb->node_cfg_info[num];
@@ -285,19 +285,21 @@
 	ocfs_dlm_reply_master *reply_master;
 	ocfs_dlm_msg *send_dlm_msg;
 	ocfs_vote_obj *obj;
-	__u64 vote_map;
 	int status = 0;
 	__u8 *buf = NULL;
 	__u32 msg_len, obj_len;
+	ocfs_node_map vote_map;
 
 	LOG_ENTRY ();
 
+	ocfs_node_map_init(osb, &vote_map);
+
 	req_master = (ocfs_dlm_req_master *) dlm_msg->msg_buf;
 
 	msg_len = sizeof (ocfs_dlm_msg) + sizeof (ocfs_dlm_reply_master);
 	obj_len = sizeof (ocfs_vote_obj) + sizeof (ocfs_dlm_reply_master);
 
-	obj = ocfs_alloc_vote_obj (obj_len, 0, 0ULL);
+	obj = ocfs_alloc_vote_obj (osb, obj_len, 0, NULL);
 	if (obj == NULL) {
 		LOG_ERROR_STATUS (status = -ENOMEM);
 		goto finally;
@@ -313,14 +315,15 @@
 	reply_master->h.lock_seq_num = req_master->lock_seq_num;
 	reply_master->h.open_handle = inode_open;
 	reply_master->h.flags = req_master->flags;
-	vote_map = (1 << dlm_msg->src_node);
-	obj->req_vote_map = vote_map;
 
+	ocfs_node_map_set_bit(&vote_map, dlm_msg->src_node);
+	ocfs_node_map_set(&obj->req_vote_map, &vote_map);
+
 	spin_lock(&osb->vote_obj_queue_lock);
 	list_add_tail(&obj->list, &osb->vote_obj_queue);
 	spin_unlock(&osb->vote_obj_queue_lock);
 
-	ocfs_send_bcast (osb, vote_map, send_dlm_msg);
+	ocfs_send_bcast (osb, &vote_map, send_dlm_msg);
 	spin_lock (&obj->lock);
 	obj->vote_state = VOTE_OBJ_STATE_SENT;
 	spin_unlock (&obj->lock);
@@ -372,12 +375,6 @@
 		goto bail;
 	}
 
-	if ((dlm_msg->src_node < 0) ||
-	    (dlm_msg->src_node > OCFS_MAXIMUM_NODES)) {
-		LOG_TRACE_ARGS ("Invalid source node in netdlm message: %d\n",
-				dlm_msg->src_node);
-		goto bail;
-	}
 
 	ret = 1;
 
@@ -397,6 +394,7 @@
 	int max = data->u.proc.max - *len;
 	char *p = data->u.proc.page + *len;
 	int ret = 0;
+	char *reqstr=NULL, *gotstr=NULL, *openstr=NULL;
 
 	/* just run thru everything to populate /proc */
 	/* return -ENOENT to keep going */
@@ -405,23 +403,32 @@
 	switch (dlm_msg->msg_type) {
 		case OCFS_VOTE_REQUEST:
 			request = (ocfs_dlm_msg_hdr *) dlm_msg->msg_buf;
-			ret = snprintf(p, max, "REQST: %d %c %3d %08x %21llu %21llu %08x | %08x %08x\n",
+
+			if (ocfs_node_map_stringify(&obj->req_vote_map, &reqstr) < 0)
+				break;
+			if (ocfs_node_map_stringify(&obj->got_vote_map, &gotstr) < 0)
+				break;
+			if (ocfs_node_map_stringify(&obj->tmp_openmap, &openstr) < 0)
+				break;
+			ret = snprintf(p, max, "REQST: %d %c %3d %s %21llu %21llu %08x | %s %s\n",
 				obj->pid,
 				vote_state_str[obj->vote_state],
 				obj->vote_status,
-				(__u32)(obj->req_vote_map & 0xFFFFFFFFULL),
+				reqstr,
 				request->lock_id,
-				request->lock_seq_num, request->flags, 
-				(__u32)(obj->got_vote_map & 0xFFFFFFFFULL),
-				(__u32)(obj->tmp_openmap & 0xFFFFFFFFULL));
+				request->lock_seq_num, 
+				request->flags, 
+				gotstr, openstr);
 			break;
 		case OCFS_VOTE_REPLY:
 			reply = (ocfs_dlm_reply_master *) dlm_msg->msg_buf;
-			ret = snprintf(p, max, "REPLY: %d %c %3d %08x %21llu %21llu %08x | %3d %c\n",
+			if (ocfs_node_map_stringify(&obj->req_vote_map, &reqstr) < 0)
+				break;
+			ret = snprintf(p, max, "REPLY: %d %c %3d %s %21llu %21llu %08x | %3d %c\n",
 				obj->pid,
 				vote_state_str[obj->vote_state],
 				obj->vote_status,
-				(__u32)(obj->req_vote_map & 0xFFFFFFFFULL),
+				reqstr,
 				reply->h.lock_id,
 				reply->h.lock_seq_num,
 				reply->h.flags, 
@@ -438,6 +445,13 @@
 	}
 	(*len) += ret;
 	p[max-1] = '\0';
+
+	if (reqstr)
+		kfree(reqstr);
+	if (gotstr)
+		kfree(gotstr);
+	if (openstr)
+		kfree(openstr);
 	return status;
 }
 
@@ -577,7 +591,7 @@
 
 	ocfs_process_one_vote_reply(osb, &ctxt, dlm_msg->src_node);
 
-	if (obj->got_vote_map == obj->req_vote_map)
+	if (ocfs_node_map_is_equal(&obj->got_vote_map, &obj->req_vote_map))
 		obj->vote_state = VOTE_OBJ_STATE_FULL_REPLY;
 	else 
 		obj->vote_state = VOTE_OBJ_STATE_PARTIAL_REPLY;
@@ -632,7 +646,6 @@
 	int status = 0;
 	ocfs_super *osb = NULL;
 	ocfs_dlm_msg *dlm_msg;
-	__u64 nodemap;
 	ocfs_dlm_req_master *req_master;
 	struct list_head *iter_osb, *temp_iter;
 	ocfs_vote_request_ctxt ctxt;
@@ -653,12 +666,18 @@
 	up (&(OcfsGlobalCtxt.global_res));
 	
 	if (osb == NULL) {
-		LOG_TRACE_STR("Ignoring netdlm message with invalid volume id");
+		LOG_ERROR_STR("Ignoring netdlm message with invalid volume id");
 		goto bail;
 	}
 
-	nodemap = (1 << dlm_msg->src_node);
-	if (!(osb->publ_map & nodemap)) {
+	if ((dlm_msg->src_node < 0) ||
+	    (dlm_msg->src_node > osb->max_nodes)) {
+		LOG_ERROR_ARGS ("Invalid source node in netdlm message: %d\n",
+				dlm_msg->src_node);
+		goto bail;
+	}
+
+	if (!ocfs_node_map_test_bit(&osb->publ_map, dlm_msg->src_node)) {
 		LOG_TRACE_STR("Ignoring netdlm message from dead node");
 		goto bail;
 	}
@@ -683,7 +702,7 @@
 			"from %s (node %d)\n", MAJOR(osb->sb->s_dev),
 			MINOR(osb->sb->s_dev), osb->node_cfg_info[src_node]->node_name,
 			src_node);
-		atomic_set (&(osb->vol_node_map.dismount[src_node]), 1);
+		atomic_set (&(osb->vol_node_map[src_node].dismount), 1);
 		break;
 
 	default:
@@ -696,25 +715,29 @@
 }				/* ocfs_comm_process_msg */
 
 
+
 /*
  * ocfs_send_dismount_msg()
  *
  */
-int ocfs_send_dismount_msg (ocfs_super * osb, __u64 vote_map)
+int ocfs_send_dismount_msg (ocfs_super * osb)
 {
 	int status = 0;
 	ocfs_dlm_msg *dlm_msg = NULL;
 	ocfs_dlm_msg_hdr *req;
 	ocfs_vote_obj *obj;
 	__u32 msg_len, obj_len;
+	ocfs_node_map map;
 
-	LOG_ENTRY_ARGS ("(osb=0x%p, vm=0x%08x)\n", osb,
-			(__u32)(vote_map & 0xFFFFFFFFULL));
+	LOG_ENTRY_ARGS ("(osb=0x%p)\n", osb);
 
+	ocfs_node_map_dup(osb, &map, &osb->publ_map);
+	ocfs_node_map_clear_bit(&map, osb->node_num);
+
 	msg_len = sizeof (ocfs_dlm_msg) + sizeof (ocfs_dlm_req_master);
 	obj_len = sizeof (ocfs_vote_obj) + sizeof (ocfs_dlm_req_master);
 
-	obj = ocfs_alloc_vote_obj (obj_len, 0, 0ULL);
+	obj = ocfs_alloc_vote_obj (osb, obj_len, 0, NULL);
 	if (obj == NULL) {
 		LOG_ERROR_STATUS (status = -ENOMEM);
 		goto finally;
@@ -731,7 +754,7 @@
 	list_add_tail(&obj->list, &osb->vote_obj_queue);
 	spin_unlock(&osb->vote_obj_queue_lock);
 
-	ocfs_send_bcast (osb, vote_map, dlm_msg);
+	ocfs_send_bcast (osb, &map, dlm_msg);
 	spin_lock (&obj->lock);
 	obj->vote_state = VOTE_OBJ_STATE_SENT;
 	spin_unlock (&obj->lock);
@@ -770,10 +793,10 @@
 }				/* ocfs_init_dlm_msg */
 
 
-static ocfs_vote_obj * ocfs_alloc_vote_obj (int bytes, __u32 reqlock, __u64 votemap)
+static ocfs_vote_obj * ocfs_alloc_vote_obj (ocfs_super *osb, int bytes, __u32 reqlock, ocfs_node_map *votemap)
 {
 	ocfs_vote_obj *obj = NULL;
-	
+
 	obj = ocfs_malloc (bytes);
 	if (obj == NULL)
 		return NULL;
@@ -786,9 +809,13 @@
 	init_waitqueue_head (&obj->voted_event);
 	INIT_LIST_HEAD (&obj->list);
 
-	obj->req_vote_map = votemap;
-	obj->got_vote_map = 0ULL;
-	obj->tmp_openmap = 0ULL;
+	if (votemap)
+		ocfs_node_map_dup(osb, &obj->req_vote_map, votemap);
+	else
+		ocfs_node_map_init(osb, &obj->req_vote_map);
+	ocfs_node_map_init(osb, &obj->got_vote_map);
+	ocfs_node_map_init(osb, &obj->tmp_openmap);
+
 	obj->seq_num = 0ULL;
 	obj->req_lock_type = reqlock;
 	obj->vote_status = 0;
@@ -803,7 +830,7 @@
  * ocfs_send_dlm_request_msg()
  * inode is definitely non NULL
  */
-int ocfs_send_dlm_request_msg (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 * vote_map, __u64 *openmap, struct inode *inode, int *vote_status)
+int ocfs_send_dlm_request_msg (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_node_map *votemap, ocfs_node_map *openmap, struct inode *inode, int *vote_status)
 {
 	int status = 0;
 	ocfs_dlm_msg *dlm_msg = NULL;
@@ -811,13 +838,13 @@
 	ocfs_vote_obj *obj;
 	__u32 msg_len, obj_len;
 
-	LOG_ENTRY_ARGS ("(osb=0x%p, id=%llu, ty=%u, fl=%u, vm=0x%08x)\n",
-			osb, lock_id, lock_type, flags, (__u32)(*vote_map & 0xFFFFFFFFULL));
+	LOG_ENTRY_ARGS ("(osb=0x%p, id=%llu, ty=%u, fl=%u)\n",
+			osb, lock_id, lock_type, flags);
 
 	msg_len = sizeof (ocfs_dlm_msg) + sizeof (ocfs_dlm_req_master);
 	obj_len = sizeof (ocfs_vote_obj) + sizeof (ocfs_dlm_req_master);
 
-	obj = ocfs_alloc_vote_obj (obj_len, lock_type, *vote_map);
+	obj = ocfs_alloc_vote_obj (osb, obj_len, lock_type, votemap);
 	if (obj == NULL) {
 		LOG_ERROR_STATUS (status = -ENOMEM);
 		goto finally;
@@ -843,7 +870,7 @@
 	list_add_tail(&obj->list, &osb->vote_obj_queue);
 	spin_unlock(&osb->vote_obj_queue_lock);
 
-	ocfs_send_bcast (osb, *vote_map, dlm_msg);
+	ocfs_send_bcast (osb, votemap, dlm_msg);
 	spin_lock (&obj->lock);
 	obj->vote_state = VOTE_OBJ_STATE_SENT;
 	spin_unlock (&obj->lock);
@@ -856,19 +883,15 @@
 		// extend and update need to update the openmap
  	    	if (flags & (FLAG_FILE_EXTEND | FLAG_FILE_UPDATE)) 
 			if (openmap)
-				*openmap = obj->tmp_openmap;
-		LOG_TRACE_ARGS ("OK vote, lockid=%llu, map: 0x%08x\n",
-			lock_id, (__u32)(obj->got_vote_map & 0xFFFFFFFFULL));
+				ocfs_node_map_set(openmap, &obj->tmp_openmap);
+		LOG_TRACE_ARGS ("OK vote, lockid=%llu\n", lock_id);
 	} else {
-		LOG_ERROR_ARGS("vote_status=%d, vote_state=%d, lockid=%llu, map=0x%08x, got=0x%08x\n",
-			       obj->vote_status, obj->vote_state,
-			       lock_id,
-			       (__u32)(obj->req_vote_map & 0xFFFFFFFFULL),
-			       (__u32)(obj->got_vote_map & 0xFFFFFFFFULL));
+		LOG_ERROR_ARGS("vote_status=%d, vote_state=%d, lockid=%llu\n",
+			       obj->vote_status, obj->vote_state, lock_id);
 	}
 	*vote_status = obj->vote_status;
 	obj->vote_state = VOTE_OBJ_STATE_DESTROYING;
-	*vote_map = (*vote_map) & ~(obj->got_vote_map);
+	ocfs_node_map_clear_bits(votemap, &obj->got_vote_map);
 	spin_unlock (&obj->lock);
 
 	spin_lock(&osb->vote_obj_queue_lock);
@@ -893,10 +916,14 @@
 	int status;
 	int reply_status;
 	int open_handle = 0;
-	__u64 mask = 0;
 
 	if (ctxt->reply_method == DISK_VOTE) {
-		reply_status = ctxt->u.vote->vote[osb->node_num];
+		if (ctxt->u.vote->node != osb->node_num) {
+			LOG_ERROR_ARGS("vote->node(%hu) != this(%u)\n",
+				       ctxt->u.vote->node, osb->node_num);
+			reply_status = 0;
+		} else
+			reply_status = ctxt->u.vote->type;
 		open_handle = ctxt->u.vote->open_handle;
 	} else {
 		reply_status = ctxt->u.reply->status;
@@ -904,24 +931,23 @@
 	}
 
 	status = 0;
-	mask = 1 << node_num;
 
 	switch (reply_status) {
 		case FLAG_VOTE_NODE:
-			*(ctxt->got_vote_map) |= mask;
+			ocfs_node_map_set_bit(ctxt->got_vote_map, node_num);
 			if (ctxt->flags & (FLAG_FILE_EXTEND|FLAG_FILE_UPDATE) && 
 			    open_handle && ctxt->open_map)
-				*(ctxt->open_map) |= mask;
+				ocfs_node_map_set_bit(ctxt->open_map, node_num);
 			break;
 		case FLAG_VOTE_OIN_ALREADY_INUSE:
-			*(ctxt->got_vote_map) |= mask;
+			ocfs_node_map_set_bit(ctxt->got_vote_map, node_num);
 			status = -EFAIL;
 			if (ctxt->flags & FLAG_FILE_DELETE)
 				status = -EBUSY;
 			break;
 		case FLAG_VOTE_OIN_UPDATED:
 			status = 0;
-			*(ctxt->got_vote_map) |= mask;
+			ocfs_node_map_set_bit(ctxt->got_vote_map, node_num);
 			break;
 		case FLAG_VOTE_UPDATE_RETRY:
 			status = -EAGAIN;
@@ -932,3 +958,178 @@
 	}
 	*(ctxt->status) = status;
 }
+
+
+void ocfs_node_map_init(ocfs_super *osb, ocfs_node_map *map)
+{
+	map->num_nodes = osb->max_nodes;
+	memset(map->map, 0, BITS_TO_LONGS(OCFS_NODE_MAP_MAX_NODES) * 
+	       sizeof(unsigned long));
+}
+
+void ocfs_node_map_set_bit(ocfs_node_map *map, int bit)
+{
+	OCFS_ASSERT(bit < map->num_nodes);
+	set_bit(bit, (char *)map->map);
+}
+
+void ocfs_node_map_clear_bit(ocfs_node_map *map, int bit)
+{
+	OCFS_ASSERT(bit < map->num_nodes);
+	clear_bit(bit, (char *)map->map);
+}
+
+// clear all the bits in "target" which are set in "mask"
+void ocfs_node_map_clear_bits(ocfs_node_map *target, ocfs_node_map *mask)
+{
+	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;
+	}
+}
+
+// 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)
+{
+	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;
+	}
+}
+
+int ocfs_node_map_test_bit(ocfs_node_map *map, int bit)
+{
+	OCFS_ASSERT(bit < map->num_nodes);
+	return test_bit(bit, (char *)map->map);
+}
+
+int ocfs_node_map_stringify(ocfs_node_map *map, char **str)
+{
+	int i, n;
+	char *s;
+
+	OCFS_ASSERT(map->num_nodes > 0);
+
+	*str = kmalloc( strlen("123 ") * map->num_nodes, GFP_KERNEL);
+	if (!(*str))
+		return -ENOMEM;
+
+	s = *str;	
+	for (i=0; i<map->num_nodes; i++) {
+		if (ocfs_node_map_test_bit(map, i)) {
+			n = sprintf(s, "%3d ", i);
+			if (n != strlen("123 ")) {
+				kfree(*str);
+				return -ENOMEM;
+			}
+			s += n;
+		}
+	}
+	return 0;
+}
+
+int ocfs_node_map_is_empty(ocfs_node_map *map)
+{
+	int bit;
+	OCFS_ASSERT(map->num_nodes > 0);
+       	bit = find_first_bit(map->map, map->num_nodes);
+	if (bit < map->num_nodes)
+		return 0;
+	return 1;
+}
+
+int ocfs_node_map_is_equal(ocfs_node_map *map1, ocfs_node_map *map2)
+{
+	int num_longs, i; 
+
+	OCFS_ASSERT(map1->num_nodes == map2->num_nodes);
+	OCFS_ASSERT(map1->num_nodes > 0);
+	
+	num_longs = BITS_TO_LONGS(map1->num_nodes);
+	for (i=0; i<num_longs; i++) {
+		if (map1->map[i] != map2->map[i])
+			return 0;
+	}
+	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)
+{
+	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_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);
+}
+
+// expects that "target" is already inited with correct 
+// num_nodes, and that "from" is of course wide enough
+void ocfs_node_map_set_from_disk(ocfs_node_map *target, void *from)
+{
+	int i, num_longs; 
+	unsigned long *p = from;
+
+	OCFS_ASSERT(target->num_nodes > 0);
+
+	num_longs = BITS_TO_LONGS(target->num_nodes);
+#warning need le32_to_cpu or whatever here
+	for (i=0; i<num_longs; i++)
+		target->map[i] = p[i];
+}
+
+void ocfs_node_map_set_to_disk(void *target, ocfs_node_map *from)
+{
+	int i, num_longs; 
+	unsigned long *p = target;
+
+	OCFS_ASSERT(from->num_nodes > 0);
+
+	num_longs = BITS_TO_LONGS(from->num_nodes);
+#warning need cpu_to_le32 or whatever here
+	for (i=0; i<num_longs; i++)
+		p[i] = from->map[i];
+}
+
+/* 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;
+}



More information about the Ocfs2-commits mailing list