[Ocfs2-commits] khackel commits r890 - in trunk/src: . inc

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Tue May 4 19:27:55 CDT 2004


Author: khackel
Date: 2004-05-04 18:27:54 -0500 (Tue, 04 May 2004)
New Revision: 890

Added:
   trunk/src/lockres.c
Modified:
   trunk/src/Makefile
   trunk/src/alloc.c
   trunk/src/dcache.c
   trunk/src/dir.c
   trunk/src/dlm.c
   trunk/src/file.c
   trunk/src/hash.c
   trunk/src/inc/journal.h
   trunk/src/inc/ocfs.h
   trunk/src/inc/proto.h
   trunk/src/inode.c
   trunk/src/journal.c
   trunk/src/namei.c
   trunk/src/nm.c
   trunk/src/oin.c
   trunk/src/osb.c
   trunk/src/proc.c
   trunk/src/super.c
   trunk/src/sysfile.c
   trunk/src/vote.c
Log:
big huge commit for removing the lockres hash, en route to eliminating 
the lockres recursive lock altogether.  this code does not yet do that
but does merge down the lockres structure inline in the inode private.
you can no longer externally lookup a lockres.  you must get it off of
an inode (and look up the inode thru iget or inode hash if necessary).
currently, i am forcing acquire_lockres to BUG if it ever attempts to 
use its recursiveness.  please let me know if you see this, because 
the next step is to convert this to a simple semaphore.  ultimately i
want to use i_sem to protect all the lock state, but that will take a
bit more work.

blame me for anything that happens as a result of this commit ;-)  but
tell me right away if you see any lockres related problems (like a NULL
lockres, or lock state that seems just incorrect).



Modified: trunk/src/Makefile
===================================================================
--- trunk/src/Makefile	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/Makefile	2004-05-04 23:27:54 UTC (rev 890)
@@ -128,10 +128,10 @@
 SUPPORT =
 endif
 ifeq ($(OCFS_PROCESSOR),i686)
-SUPPORT = divdi3.c
+SUPPORT = 
 endif
 ifeq ($(OCFS_PROCESSOR),i586)
-SUPPORT = divdi3.c
+SUPPORT =
 endif
 
 OSOURCES = \
@@ -148,6 +148,7 @@
 	io.c		\
 	ioctl.c		\
 	journal.c	\
+	lockres.c	\
 	namei.c		\
 	nm.c		\
 	oin.c		\

Modified: trunk/src/alloc.c
===================================================================
--- trunk/src/alloc.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/alloc.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -36,6 +36,8 @@
 /* Tracing */
 #define OCFS_DEBUG_CONTEXT    OCFS_DEBUG_CONTEXT_ALLOC
 
+static int ocfs_kill_this_tree(ocfs_super *osb, struct buffer_head *extent_grp_bh, 
+			       ocfs_journal_handle *handle, struct inode *inode);
 static int ocfs_allocate_new_data_node (ocfs_super * osb, 
 				 ocfs_file_entry * FileEntry,
 				 __u64 actualDiskOffset, __u64 actualLength, 
@@ -184,9 +186,6 @@
 	ocfs_free_rec **free_dir_node = NULL;
 	ocfs_free_rec **free_ext_node = NULL;
 	ocfs_free_rec *free_vol_bits = NULL;
-	ocfs_lock_res **dirnode_lockres = NULL;
-	ocfs_lock_res **extnode_lockres = NULL;
-	ocfs_lock_res *vol_lockres = NULL;
 	ocfs_free_rec *tmp_log;
 	struct inode **dirnode_inode = NULL;
 	struct inode **extnode_inode = NULL;
@@ -210,10 +209,6 @@
 		    OCFS_MAXIMUM_NODES * sizeof (ocfs_free_rec *), status);
 	ALLOC_BLOCK(free_ext_node,
 		    OCFS_MAXIMUM_NODES * sizeof (ocfs_free_rec *), status);
-	ALLOC_BLOCK(dirnode_lockres,
-		    OCFS_MAXIMUM_NODES * sizeof (ocfs_lock_res *), status);
-	ALLOC_BLOCK(extnode_lockres,
-		    OCFS_MAXIMUM_NODES * sizeof (ocfs_lock_res *), status);
 	ALLOC_BLOCK(dirnode_inode,
 		    OCFS_MAXIMUM_NODES * sizeof (struct inode *), status);
 	ALLOC_BLOCK(extnode_inode,
@@ -311,7 +306,6 @@
 			status = ocfs_acquire_lock (osb, lock_id,
 						    OCFS_DLM_EXCLUSIVE_LOCK,
 						    FLAG_FILE_CREATE,
-						    &(dirnode_lockres[i]), 
 						    NULL, dirnode_inode[i]);
 			if (status < 0) {
 				if (status != -EINTR)
@@ -335,7 +329,6 @@
 			status = ocfs_acquire_lock (osb, lock_id,
 				 		    OCFS_DLM_EXCLUSIVE_LOCK,
 						    FLAG_FILE_CREATE,
-						    &(extnode_lockres[i]), 
 						    NULL, extnode_inode[i]);
 			if (status < 0) {
 				if (status != -EINTR)
@@ -355,7 +348,7 @@
 
 		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
 					    OCFS_DLM_EXCLUSIVE_LOCK,
-					    FLAG_FILE_CREATE, &vol_lockres, 
+					    FLAG_FILE_CREATE,
 					    &globalbh, vol_inode);
 		if (status < 0) {
 			if (status != -EINTR)
@@ -396,7 +389,7 @@
 		}
 		status = ocfs_release_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
 					    OCFS_DLM_EXCLUSIVE_LOCK,
-					    FLAG_FILE_CREATE, vol_lockres, globalbh, vol_inode);
+					    FLAG_FILE_CREATE, globalbh, vol_inode);
 		if (status < 0) {
 			LOG_ERROR_STATUS (status);
 			goto finally;
@@ -410,8 +403,7 @@
 			status = ocfs_release_lock (osb, lock_id,
 						    OCFS_DLM_EXCLUSIVE_LOCK,
 						    FLAG_FILE_CREATE,
-						    dirnode_lockres[i], NULL, 
-						    dirnode_inode[i]);
+						    NULL, dirnode_inode[i]);
 			if (status < 0) {
 				LOG_ERROR_STATUS (status);
 				goto finally;
@@ -426,8 +418,7 @@
 			status = ocfs_release_lock (osb, lock_id,
 						    OCFS_DLM_EXCLUSIVE_LOCK,
 						    FLAG_FILE_CREATE,
-						    extnode_lockres[i], NULL,
-						    extnode_inode[i]);
+						    NULL, extnode_inode[i]);
 			if (status < 0) {
 				LOG_ERROR_STATUS (status);
 				goto finally;
@@ -439,10 +430,6 @@
 finally:
 
 	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
-		if (free_dir_node[i])
-			ocfs_put_lockres (dirnode_lockres[i]);
-		if (free_ext_node[i])
-			ocfs_put_lockres (extnode_lockres[i]);
 		if (extnode_inode[i])
 			iput(extnode_inode[i]);
 		if (dirnode_inode[i])
@@ -453,8 +440,6 @@
 	if (vol_inode)
 		iput(vol_inode);
 
-	ocfs_put_lockres (vol_lockres);
-
 	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
 		ocfs_safefree (free_dir_node[i]);
 		ocfs_safefree (free_ext_node[i]);
@@ -462,8 +447,6 @@
 
 	ocfs_safefree (free_dir_node);
 	ocfs_safefree (free_ext_node);
-	ocfs_safefree (dirnode_lockres);
-	ocfs_safefree (extnode_lockres);
 	ocfs_safefree (dirnode_inode);
 	ocfs_safefree (extnode_inode);
 
@@ -532,7 +515,7 @@
 	__u64 offset = 0;
 	__u64 allocSize = 0;
 	__u32 foundBit = -1;
-	__u32 blockSize = 0;
+	__u32 blockSize = 0, blockSizeBits = 0;
 	__u32 fileId = 0;
 	__u32 bitmapblocks = 0;
 	ocfs_alloc_bm AllocBitmap;
@@ -552,6 +535,7 @@
 	    case DISK_ALLOC_DIR_NODE:
 		    fileId = OCFS_FILE_DIR_ALLOC_BITMAP + NodeNum;
 		    blockSize = (__u32) osb->vol_layout.dir_node_size;
+		    blockSizeBits = osb->dir_alloc_bits;
 
 		    if (!IS_VALID_NODE_NUM (NodeNum)) {
 			    LOG_ERROR_STATUS(status = -EINVAL);
@@ -562,7 +546,8 @@
 	    case DISK_ALLOC_EXTENT_NODE:
 		    fileId = OCFS_FILE_FILE_ALLOC_BITMAP + NodeNum;
 		    blockSize = (__u32) osb->vol_layout.file_node_size;
-
+		    blockSizeBits = osb->file_alloc_bits;
+	
 		    if (!IS_VALID_NODE_NUM (NodeNum)) {
 			    LOG_ERROR_STATUS(status = -EINVAL);
 			    goto leave;
@@ -627,9 +612,8 @@
 				foundBit = (__u32) FreeLog->update[i].file_off;
 			else
 				foundBit = (__u32) 
-					(FreeLog->update[i].file_off / 
-					 blockSize);
-			
+					(FreeLog->update[i].file_off >>
+					 blockSizeBits);
 			ocfs_clear_bits(tmpbitmap, (__u32) foundBit,
 				       (__u32) FreeLog->update[i].length);
 		}
@@ -900,7 +884,7 @@
 /* ocfs_grow_extent_tree()
  *
  */
-int ocfs_grow_extent_tree (ocfs_super * osb, struct buffer_head *fe_bh, ocfs_journal_handle *handle, __u64 disk_off, __u64 length, struct inode *inode)
+static int ocfs_grow_extent_tree (ocfs_super * osb, struct buffer_head *fe_bh, ocfs_journal_handle *handle, __u64 disk_off, __u64 length, struct inode *inode)
 {
 	int status = 0;
 	__s32 k, i;
@@ -953,7 +937,10 @@
 	}
 
 	for (i = 0; i < numbhs; i++) {
-		bhs[i] = getblk(OCFS_GET_BLOCKDEV(osb->sb), (physicalOffset + i * osb->sect_size) / osb->sect_size, osb->sb->s_blocksize);
+		bhs[i] = getblk(OCFS_GET_BLOCKDEV(osb->sb), 
+				(physicalOffset + i * osb->sect_size) >> 
+				  osb->sect_size_bits, 
+				osb->sb->s_blocksize);
 		if (bhs[i] == NULL) {
 			status = -EIO;
 			LOG_ERROR_STATUS(status);
@@ -1525,7 +1512,7 @@
         int status = 0;
 	bool FirstTime = true;
         ocfs_alloc_ext *ext; 
-        __u32 i, csize = osb->vol_layout.cluster_size, 
+        __u32 i, csize = osb->cluster_size_bits,
             numBitsAllocated = 0, bitmapOffset = 0, 
             firstfree = *freeExtent;
         __u64 bytes, foff, doff, 
@@ -1550,8 +1537,8 @@
                                         *freeExtent = i; 
                                         FirstTime = false; 
                                 } 
-                                numBitsAllocated = (__u32) (bytes/csize); 
-                                bitmapOffset = (__u32) ((doff - dstart) / csize); 
+                                numBitsAllocated = (__u32) (bytes>>csize); 
+                                bitmapOffset = (__u32) ((doff - dstart) >> csize); 
                                 ext->num_bytes = ext->disk_off = ext->file_off = 0; 
                         } else { 
                                 if (FirstTime) { 
@@ -1564,9 +1551,9 @@
                                 if (lengthTobeFreed == 0) { 
                                         continue; 
                                 } 
-                                numBitsAllocated = (__u32) (lengthTobeFreed / csize); 
+                                numBitsAllocated = (__u32) (lengthTobeFreed >> csize); 
                                 diskOffsetTobeFreed = doff + bytes; 
-                                bitmapOffset = (__u32) ((diskOffsetTobeFreed - dstart) / csize); 
+                                bitmapOffset = (__u32) ((diskOffsetTobeFreed - dstart) >> csize); 
                         } 
                         status = ocfs_handle_add_commit_bits(handle, 
 							   numBitsAllocated, 
@@ -1603,12 +1590,12 @@
  */
 
 /* We can't recurse, so we keep a simple stack of ocfs_extent_groups. */
-int ocfs_kill_this_tree(ocfs_super *osb, struct buffer_head *extent_grp_bh, ocfs_journal_handle *handle, struct inode *inode) 
+static int ocfs_kill_this_tree(ocfs_super *osb, struct buffer_head *extent_grp_bh, ocfs_journal_handle *handle, struct inode *inode) 
 {
 	int status = -EFAIL;
 	int i;
 	__u32 victim;
-	__u32 csize = osb->vol_layout.cluster_size;
+	__u32 csize = osb->cluster_size_bits;
 	__u64 dstart = osb->vol_layout.data_start_off;
 	__u64 tmp_off;
 	__u32 num_sectors = 0, bitmap_offset = 0;
@@ -1641,8 +1628,8 @@
 			for(i = 0; i < cur_extent->next_free_ext; i++) {
 				/* Free the data associated with each header */
 				ext = &cur_extent->extents[i];
-				num_sectors = (__u32) (ext->num_bytes / csize);
-				bitmap_offset = (__u32) ((ext->disk_off - dstart) / csize);
+				num_sectors = (__u32) (ext->num_bytes >> csize);
+				bitmap_offset = (__u32) ((ext->disk_off - dstart) >> csize);
 				status = ocfs_handle_add_commit_bits(handle, num_sectors, bitmap_offset, -1, DISK_ALLOC_VOLUME);
 				if (status < 0) {
 					LOG_ERROR_STATUS (status);
@@ -1720,7 +1707,7 @@
 
 #ifndef USERSPACE_TOOL
 
-int ocfs_fix_extent_group(ocfs_super *osb, struct buffer_head *group_bh, struct inode *inode) 
+static int ocfs_fix_extent_group(ocfs_super *osb, struct buffer_head *group_bh, struct inode *inode) 
 {
 	ocfs_alloc_ext *ext;
 	ocfs_extent_group *group = NULL;
@@ -1784,7 +1771,8 @@
 	struct buffer_head *tmp_bh = NULL, *tmp_bh2 = NULL;
 	int tos = 0;
 	int i, victim;
-	__u64 bytes, foff, doff, orig_bytes, dstart = osb->vol_layout.data_start_off, total_bytes, csize = osb->vol_layout.cluster_size, tmp_off;
+	__u64 bytes, foff, doff, orig_bytes, dstart = osb->vol_layout.data_start_off, total_bytes, tmp_off;
+       	__u32 csize = osb->cluster_size_bits;
 	__u32 num_sectors, bitmap_offset;
 	bool done = false;
 	int gran = fe->granularity;
@@ -2011,8 +1999,8 @@
 					if (ext->file_off >= newsize) {
 						total_bytes+=ext->num_bytes;
 
-						num_sectors = (__u32) (ext->num_bytes / csize);
-						bitmap_offset = (__u32) ((ext->disk_off - dstart) / csize);
+						num_sectors = (__u32) (ext->num_bytes >> csize);
+						bitmap_offset = (__u32) ((ext->disk_off - dstart) >> csize);
 						ext->file_off = 0;
 						ext->num_bytes = 0;
 						ext->disk_off = 0;
@@ -2022,8 +2010,8 @@
 						doff = ext->disk_off; 
 						foff = ext->file_off;
 						bytes = ext->num_bytes = newsize - foff;
-						num_sectors = (__u32) ((orig_bytes - bytes) / csize);
-						bitmap_offset = (__u32) (((doff + bytes) - dstart) / csize);
+						num_sectors = (__u32) ((orig_bytes - bytes) >> csize);
+						bitmap_offset = (__u32) (((doff + bytes) - dstart) >> csize);
 						/* we want to exit the
 						 * for loop now */
 						total_bytes+= (orig_bytes - bytes);
@@ -2277,7 +2265,7 @@
  *  various ext headers and dats off the system previously in the
  *  truncate path.
  */
-int ocfs_update_last_ext_ptr(ocfs_super *osb, ocfs_file_entry *fe, struct inode *inode) 
+static int ocfs_update_last_ext_ptr(ocfs_super *osb, ocfs_file_entry *fe, struct inode *inode) 
 {
 	int status = -EFAIL;
 	ocfs_extent_group *extent = NULL;
@@ -2726,12 +2714,12 @@
 	static __u32 LargeAllocOffset = 0;
 	static __u32 SmallAllocOffset = 0;
 	bool bLockAcquired = false;
-	ocfs_lock_res *lockres = NULL;
         struct buffer_head *bh = NULL;
         ocfs_bitmap_lock *bm_lock = NULL;
 	__u32 bitmapblocks; /* we only care about the valid blocks */
 	bool local_lock = true;
 	bool local_inode = false;
+	__u32 five_percent;
 
 	LOG_ENTRY ();
 
@@ -2757,7 +2745,7 @@
 		/* Get the allocation lock here */
 		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
 					    OCFS_DLM_EXCLUSIVE_LOCK, 0, 
-					    &lockres, &bh, bitmap_inode);
+					    &bh, bitmap_inode);
 		if (status < 0) {
 			if (status != -EINTR)
 				LOG_ERROR_STATUS (status);
@@ -2767,25 +2755,23 @@
 	}
 	bm_lock = (ocfs_bitmap_lock *)OCFS_BH_GET_DATA_WRITE(bh); /* write */
 
-	ByteCount = file_size;
-
-	/* Round off the byte count to next clustersize (bytes per cluster) */
-	ByteCount += (ByteCount % (osb->vol_layout.cluster_size)) ?
-		(osb->vol_layout.cluster_size -
-		 (ByteCount % (osb->vol_layout.cluster_size))) : 0;
-
+	ClusterCount = (__u32) ((__u64) (file_size + (osb->vol_layout.cluster_size-1)) >> 
+				osb->cluster_size_bits);
+	if (ClusterCount == 0) {
+		LOG_ERROR_STR ("DISK_FULL?: ClusterCount==0");
+		status = 0;
+		goto leave;
+	}
+	ByteCount = ClusterCount << osb->cluster_size_bits;
 	if (ByteCount == 0) {
 		LOG_ERROR_STR ("DISK_FULL?: Bytecount==0");
 		status = 0;
 		goto leave;
 	}
 
-	ClusterCount = (__u32) 
-		((__u64) ByteCount / (__u64) osb->vol_layout.cluster_size);
-
 	if (sysfile ? (ClusterCount > osb->vol_layout.num_clusters) :
 	    (ClusterCount > (osb->vol_layout.num_clusters - 
-			     ((8 * ONE_MEGA_BYTE) / osb->vol_layout.cluster_size)))){
+			     ((8 * ONE_MEGA_BYTE) >> osb->cluster_size_bits)))){
 		LOG_ERROR_STR ("Disk Full");
 		status = -ENOSPC;
 		goto leave;
@@ -2800,9 +2786,11 @@
 	/* allocation at 5%, so that small files stay in the beginning
 	 * as much as possible */
 
-	if (ClusterCount > (osb->vol_layout.num_clusters / 20)) {
+	// ok because num_clusters should not even be a __u64
+	five_percent = ((__u32)osb->vol_layout.num_clusters) / 20;
+	if (ClusterCount > five_percent) {
 		LargeAlloc = 1;
-		LargeAllocOffset = (osb->vol_layout.num_clusters / 20);
+		LargeAllocOffset = five_percent;
 	}
 
 	bitmapblocks = (OCFS_ALIGN(osb->cluster_bitmap.validbits, 
@@ -2820,8 +2808,8 @@
 					  ClusterCount,
 					  LargeAlloc ? LargeAllocOffset :
 					  SmallAllocOffset, sysfile ? 0 :
-					  ((8 * ONE_MEGA_BYTE) / 
-					   osb->vol_layout.cluster_size));
+					  ((8 * ONE_MEGA_BYTE) >>
+					   osb->cluster_size_bits));
 
 	/* if fails we should try again from the beginning of the disk. */
 	/* in the end we pass # of bits we want to keep for system
@@ -2898,14 +2886,12 @@
 			tmpstat = ocfs_release_lock(osb, 
 						    OCFS_BITMAP_LOCK_OFFSET,
 						    OCFS_DLM_EXCLUSIVE_LOCK, 
-						    0, lockres, bh, 
-						    bitmap_inode);
+						    0, bh, bitmap_inode);
 			if (tmpstat < 0)
 				LOG_ERROR_STATUS (tmpstat);
 		}
 		if (bh != NULL)
 			brelse(bh);
-		ocfs_put_lockres (lockres);
 	}
 
 	if (local_inode)
@@ -2937,9 +2923,8 @@
 	ocfs_alloc_bm bitmap;
 	__u32 numBits = 0;
 	__u32 foundBit = -1;
-	__u32 blockSize = 0;
+	__u32 blockSize = 0, blockSizeBits = 0;
 	bool bLockAcquired = false;
-	ocfs_lock_res *lockres = NULL;
 	__u32 bm_file = 0;
 	__u32 alloc_file = 0;
 	struct buffer_head *bh = NULL;
@@ -2953,6 +2938,7 @@
 	if (Type == DISK_ALLOC_DIR_NODE) {
 		bm_file = OCFS_FILE_DIR_ALLOC_BITMAP + NodeNum;
 		blockSize = (__u32) osb->vol_layout.dir_node_size;
+		blockSizeBits = osb->dir_alloc_bits;
 		alloc_file = OCFS_FILE_DIR_ALLOC + NodeNum;
 
 		atomic_inc(&osb->alloc_stats.dir_allocs);
@@ -2960,6 +2946,7 @@
 		bm_file = OCFS_FILE_FILE_ALLOC_BITMAP + NodeNum;
 		alloc_file = OCFS_FILE_FILE_ALLOC + NodeNum;
 		blockSize = (__u32) osb->vol_layout.file_node_size;
+		blockSizeBits = osb->file_alloc_bits;
 
 		atomic_inc(&osb->alloc_stats.ext_allocs);
 	}
@@ -2978,17 +2965,16 @@
 
 	/* Get a lock on the file */
 	status = ocfs_acquire_lock (osb, lockId, OCFS_DLM_EXCLUSIVE_LOCK,
-			     FLAG_FILE_CREATE, &lockres, &bh, inode);
+			     FLAG_FILE_CREATE, &bh, inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
 		goto leave;
 	}
 	bLockAcquired = true;
 
+	numBits = ((FileSize + (blockSize-1)) >> blockSizeBits);
+	numBytes = numBits << blockSizeBits;
 
-	numBytes = OCFS_ALIGN ((FileSize), blockSize);
-	numBits = (__u32) (numBytes / blockSize);
-
 	/* Read in the bitmap file for the dir alloc and look for the
 	 * required space, if found */
 	fe = (ocfs_file_entry *) OCFS_BH_GET_DATA_READ(bh); /* read */
@@ -3024,16 +3010,8 @@
 
 	if (foundBit == -1) {
 		/* if not found add more allocation to the file and try again. */
-		/* Lets get a 1MB chunks every time or clustersize which ever */
-		/* is greater or the number of bit asked */
-		extent = ((1 * ONE_MEGA_BYTE) > osb->vol_layout.cluster_size) ?
-			(1 * ONE_MEGA_BYTE) : 
-			osb->vol_layout.cluster_size; 
-		extent = (extent > (numBits * blockSize)) ? extent :
-			(numBits * blockSize);
+		extent = ( ((numBits * blockSize) + (ONE_MEGA_BYTE-1)) >> 20 ) << 20;
 		
-		extent = OCFS_ALIGN (extent, ONE_MEGA_BYTE);
-		
 		status = ocfs_get_system_file_size (osb, alloc_file,
 						    &newFileSize, &allocSize);
 		if (status < 0) {
@@ -3056,7 +3034,8 @@
 		}
 		
 		newFileSize += extent;
-		bitMapSize = newFileSize / (blockSize * 8);
+//		bitMapSize = newFileSize / (blockSize * 8);
+		bitMapSize = newFileSize >> (blockSizeBits+3);
 
 		/* Does this need the buffer_head? if so, we need to
 		 * do a put_data first! */
@@ -3140,14 +3119,13 @@
 	if (bLockAcquired && delay_lockrel) {
 		ocfs_journal_add_lock(handle, OCFS_DLM_EXCLUSIVE_LOCK, 
 				      FLAG_FILE_CREATE, 
-				      lockres, bh, inode);
+				      bh, inode);
 		tmpstat = 0;
-	} else 	if (bLockAcquired) {
+	} else if (bLockAcquired) {
 		tmpstat =
 		    ocfs_release_lock (osb, lockId, OCFS_DLM_EXCLUSIVE_LOCK,
-				     FLAG_FILE_CREATE, lockres, bh, inode);
+				     FLAG_FILE_CREATE, bh, inode);
 
-		ocfs_put_lockres (lockres);
 	}
 
 	if (inode)
@@ -3264,14 +3242,13 @@
 
 	if (fe->local_ext) {
 		for (i = 0; i < fe->next_free_ext; i++) {
-			numBitsAllocated = (__u32) (fe->extents[i].num_bytes /
-						  (osb->vol_layout.
-						   cluster_size));
+			numBitsAllocated = (__u32) (fe->extents[i].num_bytes >>
+						  osb->cluster_size_bits);
 
 			bitmapOffset =
 			    (__u32) ((fe->extents[i].disk_off -
-				    osb->vol_layout.data_start_off) /
-				   (osb->vol_layout.cluster_size));
+				    osb->vol_layout.data_start_off) >>
+				   osb->cluster_size_bits);
 
 			ocfs_handle_add_commit_bits(handle, numBitsAllocated, 
 						    bitmapOffset, -1, 
@@ -3420,12 +3397,11 @@
 				   bool in_recovery)
 {
 	int status = 0, tmpstat;
-	ocfs_lock_res *lockres = NULL;
 	__u32 bitmapblocks;
 	struct buffer_head *bh = NULL;
 	int bit_off, left;
 	ocfs_local_alloc *alloc = NULL;
-	bool local_lock = true;
+	bool local_lock = true, got_lock = false;
 	void *bitmap;
 	struct inode *local_inode = NULL;
 
@@ -3466,13 +3442,13 @@
 		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
 					    OCFS_DLM_EXCLUSIVE_LOCK, 
 					    (in_recovery) ? FLAG_FILE_RECOVERY 
-					    : 0, 
-					    &lockres, &bh, local_inode);
+					    : 0, &bh, local_inode);
 		if (status < 0) {
 			if (status != -EINTR)
 				LOG_ERROR_STATUS (status);
 			goto bail;
 		}
+		got_lock = true;
 	}
 
 	bitmapblocks = (OCFS_ALIGN(osb->cluster_bitmap.validbits, 
@@ -3529,15 +3505,13 @@
 	if (local_lock) {
 		up (&(osb->vol_alloc_sem));
 
-		if (lockres) {
+		if (got_lock) {
 			tmpstat = ocfs_release_lock (osb, 
 						     OCFS_BITMAP_LOCK_OFFSET,
 						     OCFS_DLM_EXCLUSIVE_LOCK, 
-						     0, lockres, bh, 
-						     local_inode);
+						     0, bh, local_inode);
 			if (tmpstat < 0)
 				LOG_ERROR_STATUS (tmpstat);
-			ocfs_put_lockres (lockres);
 		}
 		if (bh != NULL)
 			brelse(bh);
@@ -3561,7 +3535,6 @@
 {
 	int status = 0;
 	__u64 alloc_bytes, cluster_off, cluster_count;
-	__u32 csize = osb->vol_layout.cluster_size;
 	ocfs_local_alloc *alloc = NULL;
 
 	LOG_ENTRY();
@@ -3573,7 +3546,7 @@
 	OCFS_BH_PUT_DATA(osb->local_alloc_bh);
 
 	/* we try to use find_contig_space_from_bitmap here for now. */
-	alloc_bytes = ocfs_local_alloc_window_bits(osb) * csize;
+	alloc_bytes = ocfs_local_alloc_window_bits(osb) << osb->cluster_size_bits;
 	LOG_TRACE_ARGS("Allocating %llu bytes (%u clusters) for a "
 		       "new window.\n", alloc_bytes, 
 		       ocfs_local_alloc_window_bits(osb));
@@ -3696,7 +3669,6 @@
 	/* main bitmap variables. */
 	struct buffer_head *main_bm_bh = NULL;
 	struct inode *main_bm_inode = NULL;
-	ocfs_lock_res *lockres = NULL;
 	void *bitmap;
 
 	LOG_ENTRY_ARGS("(bitswanted = %u)\n", bitswanted);
@@ -3783,7 +3755,7 @@
 		/* Get the allocation lock here */
 		status = ocfs_acquire_lock (osb, OCFS_BITMAP_LOCK_OFFSET,
 					    OCFS_DLM_EXCLUSIVE_LOCK, 0, 
-					    &lockres, &main_bm_bh, 
+					    &main_bm_bh, 
 					    main_bm_inode);
 		if (status < 0) {
 			up (&(osb->vol_alloc_sem));
@@ -3851,11 +3823,10 @@
 		tmpstat = ocfs_release_lock (osb, 
 					     OCFS_BITMAP_LOCK_OFFSET,
 					     OCFS_DLM_EXCLUSIVE_LOCK, 
-					     0, lockres, main_bm_bh, 
+					     0, main_bm_bh, 
 					     main_bm_inode);
 		if (tmpstat < 0)
 			LOG_ERROR_STATUS (tmpstat);
-		ocfs_put_lockres (lockres);
 		brelse(main_bm_bh);
 	}
 
@@ -3898,7 +3869,7 @@
 	}
 
 	/* need to calculate a couple of things for below... */
-	bitswanted = (file_size + (csize-1)) / csize;
+	bitswanted = (file_size + (csize-1)) >> osb->cluster_size_bits;
 
 	/* Ok, now decide if we can use local alloc bitmap.
 	 * We *always* use global bitmap for clustersize > 128k,
@@ -3945,52 +3916,6 @@
 	return(status);
 } /* ocfs_find_space */
 
-/*
- * ocfs_create_new_local_alloc
- *
- * significantly different enough from init_system_file that it
- * deserves it's own function 
- */
-int ocfs_create_new_local_alloc(ocfs_super *osb, int node_num)
-{
-	int status = 0;
-	__u64 offset;
-	struct buffer_head *alloc_bh = NULL;
-	ocfs_local_alloc *alloc;
-
-	LOG_ENTRY_ARGS("(node_num = %d)\n", node_num);
-
-	offset = ((OCFS_VOL_BITMAP_FILE + node_num) * osb->sect_size) +
-		osb->vol_layout.root_int_off;
-
-	status = ocfs_read_bh(osb, offset, &alloc_bh, OCFS_BH_CACHED, NULL);
-	if (status < 0) {
-		LOG_ERROR_STATUS(status);
-		goto leave;
-	}
-
-	alloc = (ocfs_local_alloc *) OCFS_BH_GET_DATA_WRITE(alloc_bh); /* write */
-
-	memset(alloc, 0, sizeof(ocfs_local_alloc));
-	strcpy (alloc->signature, OCFS_LOCAL_ALLOC_SIGNATURE);
-	alloc->this_sector = offset;
-	alloc->node_num = node_num;
-
-	OCFS_BH_PUT_DATA(alloc_bh);
-
-	status = ocfs_write_bh(osb, alloc_bh, 0, NULL);
-	if (status < 0) {
-		LOG_ERROR_STATUS (status);
-		goto leave;
-	}
-
-leave:
-	if (alloc_bh)
-		brelse(alloc_bh);
-	LOG_EXIT_STATUS(status);
-	return(status);
-} /* ocfs_create_new_local_alloc */
-
 /* 
  * ocfs_load_local_alloc 
  */
@@ -4134,4 +4059,3 @@
 	LOG_EXIT_STATUS(status);
 	return(status);
 } /* ocfs_recover_local_alloc */
-

Modified: trunk/src/dcache.c
===================================================================
--- trunk/src/dcache.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/dcache.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -42,11 +42,9 @@
 #endif
 {
 	int tmpstat, ret = 0;    /* if all else fails, just return false */
-	struct inode *inode;
+	struct inode *inode = dentry->d_inode;
 	ocfs_super *osb;
-	__u64 off;
 	int needs_trunc;
-	ocfs_lock_res *lockres  = NULL;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 	int flags = nd ? nd->flags : 0;
 #endif
@@ -54,9 +52,13 @@
         LOG_ENTRY_ARGS ("(0x%p, %d, '%*s')\n", dentry, flags,
                         dentry->d_name.len, dentry->d_name.name);
 
-	if ((inode = dentry->d_inode) == NULL ||
-	    (osb = OCFS_GENERIC_SB_P(inode->i_sb)) == NULL)
-                goto bail;
+	osb = OCFS_GENERIC_SB_P(inode->i_sb);
+	OCFS_ASSERT(osb);
+	
+	if (inode->i_ino == OCFS_ROOT_INODE_NUMBER) {
+		ret = 1;
+		goto bail;
+	}
 
 	if (osb->publ_map == (1 << osb->node_num)) {
 		LOG_TRACE_STR ("Only node alive.  revalidate=true.");
@@ -64,6 +66,12 @@
 		goto bail;
 	}
 
+	/* if I hold cache lock, no revalidate needed */
+	if (ocfs_is_local_cache_lock(osb, inode)) {
+		ret = 1;
+		goto bail;
+	}
+
 	/* did we or someone else delete this inode? */
 	if (INODE_DELETED(inode)) {
 		LOG_TRACE_ARGS("dentry_revalidate: inode %lu (%llu) deleted, "
@@ -72,29 +80,8 @@
 		goto bail;
 	}
 
-	if (inode->i_ino == OCFS_ROOT_INODE_NUMBER)
-		goto bail;
-
-	off = GET_INODE_FEOFF(inode);
-	if (!off) {
-		/* icky failure case */
-		LOG_ERROR_ARGS("icky failure case! i_ino = %lu\n", 
-			       inode->i_ino);
-		goto bail;
-	}
-
 	ret = 1;  /* with an oin we cannot fail revalidate */
 
-	if (ocfs_lookup_sector_node (osb, off, &lockres)==0) {
-		/* if I hold cache lock, no revalidate needed */
-		if (lockres->lock_type == OCFS_DLM_ENABLE_CACHE_LOCK &&
-		    lockres->master_node_num == osb->node_num) {
-			ocfs_put_lockres (lockres);
-			goto bail;
-		} else
-			ocfs_put_lockres (lockres);
-	}
-
 	/* hit the disk */
 	/* TODO: optimize */
 	down (&(OCFS_I(inode)->priv_sem));

Modified: trunk/src/dir.c
===================================================================
--- trunk/src/dir.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/dir.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -162,7 +162,6 @@
 	int status = -ENOENT;
 	__u64 thisDirNode;
 	int tmpstat;
-	ocfs_lock_res *lockres = NULL;
 	bool temp_bhs = false;
 	bool lock_acq = false;
 	bool sync = true;
@@ -197,7 +196,7 @@
 	if (take_lock) {
 		/* Get a lock on the directory... */
 		status = ocfs_acquire_lock (osb, parent_off, lock_type, FLAG_DIR|FLAG_READDIR, 
-					    &lockres, &bh, inode);
+					    &bh, inode);
 		if (status < 0) {
 			/* Volume should be disabled in this case */
 			if (status != -EINTR)
@@ -205,9 +204,9 @@
 			goto leave;
 		}
 		lock_acq = true;
-		if (lockres->master_node_num != osb->node_num ||
-		    lockres->lock_type < OCFS_DLM_EXCLUSIVE_LOCK)
-			sync = true;
+		// used to set sync if not locally owned
+		// should not need to anymore...
+		// sync = true;
 	}
 
 	if (bhs[0]==NULL || bhs[0]->b_blocknr != (thisDirNode >> 9)) {
@@ -237,7 +236,7 @@
 	if (take_lock && lock_acq)
 	{
 		tmpstat = ocfs_release_lock (osb, parent_off, lock_type,
-					     FLAG_DIR|FLAG_READDIR, lockres, bh, inode);
+					     FLAG_DIR|FLAG_READDIR, bh, inode);
 		if (tmpstat < 0) {
 			LOG_ERROR_STATUS (tmpstat);
 			/* Volume should be disabled in this case */
@@ -247,8 +246,6 @@
 	if (bh != NULL)
 		brelse(bh);
 
-	ocfs_put_lockres (lockres);
-
 	/* if we won't be brelsing/freeing on file */
 	/* close do all of the cleanup here */
 	if (temp_bhs) {
@@ -292,35 +289,7 @@
 	return;
 }				/* ocfs_initialize_dir_node */
 
-#if 0
 /*
- * ocfs_write_force_dir_node()
- *
- */
-int ocfs_write_force_dir_node (ocfs_super * osb, struct buffer_head *bhs[], __s32 idx)
-{
-	int status = 0;
-
-	LOG_ENTRY ();
-
-	/* Write the file entry at idx, if given */
-	if (idx != -1) {
-		status = ocfs_write_bh (osb, bhs[idx+1], 0);
-		if (status < 0)
-			LOG_ERROR_STATUS (status);
-	}
-	
-	/* Write the first sector last */
-	status = ocfs_write_bh (osb, bhs[0], 0);
-	if (status < 0)
-		LOG_ERROR_STATUS (status);
-
-	LOG_EXIT_STATUS (status);
-	return status;
-}				/* ocfs_write_force_dir_node */
-#endif
-
-/*
  * ocfs_write_dir_node()
  *
  */

Modified: trunk/src/dlm.c
===================================================================
--- trunk/src/dlm.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/dlm.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -33,28 +33,20 @@
 /* Tracing */
 #define OCFS_DEBUG_CONTEXT OCFS_DEBUG_CONTEXT_DLM
 
-int new_lock_function(ocfs_super * osb, __u32 requested_lock, __u32 flags, ocfs_lock_res * lockres, struct buffer_head *bh, bool *disk_vote, struct inode *inode);
+int new_lock_function(ocfs_super * osb, __u32 requested_lock, __u32 flags, struct buffer_head *bh, bool *disk_vote, struct inode *inode);
 
-static inline int ocfs_wait_for_readonly_drop(ocfs_super *osb, ocfs_lock_res *lockres, struct inode *inode);
+static inline int ocfs_wait_for_readonly_drop(ocfs_super *osb, struct inode *inode);
 
-static int ocfs_request_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 vote_map, __u64 * lock_seq_num, struct inode *inode);
-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, ocfs_lock_res * lockres);
+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_reset_voting (ocfs_super * osb);
-static int ocfs_wait_for_lock_release (ocfs_super * osb, __u64 offset, __u32 time_to_wait, ocfs_lock_res * lockres, __u32 lock_type, struct inode *inode);
 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_break_cache_lock (ocfs_super * osb, ocfs_lock_res * lockres, 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, __u64 feoff);
-int ocfs_update_disk_lock (ocfs_super * osb, ocfs_lock_res * lockres, __u32 flags, struct buffer_head **bh, struct inode *inode, ocfs_journal_handle *handle);
-static int ocfs_update_master_on_open (ocfs_super * osb, ocfs_lock_res * lockres, struct inode *inode, ocfs_journal_handle *handle);
-int ocfs_disk_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_lock_res * lockres, struct buffer_head *bh, struct inode *inode);
+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);
 
 
-/*
- * ocfs_disk_request_vote()
- *
- */
-static int ocfs_disk_request_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 vote_map, __u64 * lock_seq_num, __u64 feoff)
+/* 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)
 {
 	int status = 0;
 	__u64 offset = 0;
@@ -69,14 +61,14 @@
 	__u32 wait;
 	bool publish_flag = false;
 	struct buffer_head **bhs = NULL;
+	__u64 feoff;
 
 	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));
+			(__u32)(*vote_map & 0xFFFFFFFFULL));
 
-	LOG_TRACE_ARGS ("osb=0x%p, id=%llu, ty=%u, fl=%u, vm=0x%08x\n",
-			osb, lock_id, lock_type, flags,
-			(__u32)(vote_map & 0xFFFFFFFFULL));
+	feoff = inode ? GET_INODE_FEOFF(inode) : 0ULL;
+	*vote_map &= ~(1 << osb->node_num);
 
 	pubmap = osb->publ_map;
 	offset = osb->vol_layout.publ_sect_off;
@@ -139,7 +131,7 @@
 	pubsect->publ_seq_num = largestseqno;
 	pubsect->dirty = true;
 	pubsect->vote = FLAG_VOTE_NODE;
-	pubsect->vote_map = vote_map;
+	pubsect->vote_map = *vote_map;
 	pubsect->vote_type = flags;
 	pubsect->dir_ent = lock_id;
 	pubsect->fe_off = feoff;
@@ -172,6 +164,14 @@
 		ocfs_safefree(bhs);
 	}
 
+	if (status >= 0) {
+		status = ocfs_wait_for_vote (osb, lock_id, lock_type, flags, vote_map, 
+					     time_to_wait, *lock_seq_num, open_map);
+		if (status < 0 && status != -EAGAIN)
+			LOG_ERROR_STATUS (status);
+	}
+
+
 	LOG_EXIT_STATUS (status);
 	return status;
 }				/* ocfs_disk_request_vote */
@@ -257,9 +257,9 @@
 
 /*
  * ocfs_wait_for_lock_release()
- *
+ * inode is definitely non NULL
  */
-static int ocfs_wait_for_lock_release (ocfs_super * osb, __u64 offset, __u32 time_to_wait, ocfs_lock_res * lockres, __u32 lock_type, struct inode *inode)
+int ocfs_wait_for_lock_release (ocfs_super * osb, __u64 offset, __u32 time_to_wait, __u32 lock_type, struct inode *inode)
 {
 	int status = -ETIMEDOUT;
 	int tmpstat = -ETIMEDOUT;
@@ -269,6 +269,7 @@
 	__u32 curr_master;
 	__u8 lock_level;
 	bool is_dir = false, disk_vote = false;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 
 	LOG_ENTRY_ARGS ("(0x%p, %llu, %u, 0x%p, %u)\n",
 			osb, offset, time_to_wait,
@@ -311,7 +312,7 @@
 
 		/* The local node is not the master */
 		if (lock_level == OCFS_DLM_ENABLE_CACHE_LOCK) {
-			ocfs_acquire_lockres(lockres);
+			ocfs_acquire_lockres(lockres, 0); // ocfs_file_open ocfs_symlink
 			lockres->lock_type = lock_level;
 			lockres->master_node_num = curr_master;
 				
@@ -322,7 +323,7 @@
 #ifdef VERBOSE_LOCKING_TRACE
 						printk("ocfs_wait_for_lock_release: ronode=master=%d\n", curr_master);
 #endif
-						ocfs_release_lockres(lockres);
+						ocfs_release_lockres(lockres); // ocfs_file_open ocfs_symlink
 						goto got_it;
 					} else {
 						LOG_ERROR_ARGS("(1) readonly node changed! was %d, now master is %d\n",
@@ -334,13 +335,13 @@
 				// no readonly node, need to alert owner to get readonly access
 				status = new_lock_function(osb, lockres->lock_type, 
 							   FLAG_DIR | FLAG_READDIR | FLAG_ACQUIRE_LOCK,
-							   lockres, bh, &disk_vote, inode);
+							   bh, &disk_vote, inode);
 				if (status < 0) {
-					ocfs_release_lockres(lockres);
+					ocfs_release_lockres(lockres); // ocfs_file_open ocfs_symlink
 					if (status == -EAGAIN) {
 						if (ocfs_task_interruptible (osb)) {
 							LOG_TRACE_ARGS("interrupted... lockid=%llu\n",
-								lockres->sector_num);
+								offset);
 							status = -EINTR;
 							goto finally;
 						}
@@ -354,12 +355,17 @@
 				printk("ocfs_wait_for_lock_release: cache->readonly ronode=master=%d\n", curr_master);
 #endif
 				lockres->readonly_node = lockres->master_node_num;	
-				ocfs_release_lockres(lockres);
+				ocfs_release_lockres(lockres); // ocfs_file_open ocfs_symlink
 				goto got_it;
 			} else {
-				ocfs_release_lockres(lockres);
-#warning need to deal with this
-				status = ocfs_break_cache_lock (osb, lockres, inode);
+				for (status = -EAGAIN; status==-EAGAIN; ) {
+					status = new_lock_function(osb, OCFS_DLM_NO_LOCK, 
+						   FLAG_ACQUIRE_LOCK|FLAG_FILE_RELEASE_CACHE,
+						   NULL, &disk_vote, inode);
+					if (status == -EAGAIN)
+						ocfs_sleep(500);
+				}
+				ocfs_release_lockres(lockres); // ocfs_file_open ocfs_symlink
 				if (status < 0) {
 					if (status != -EINTR)
 						LOG_ERROR_STATUS (status);
@@ -400,25 +406,9 @@
 	}
 
 finally:
-	if (lockres && status >= 0) {
-		ocfs_acquire_lockres (lockres);
-		fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_READ(bh); /* read */
-		lockres->lock_type = DISK_LOCK_FILE_LOCK (fe);
-		lockres->master_node_num = DISK_LOCK_CURRENT_MASTER (fe);
-		lockres->oin_openmap = DISK_LOCK_OIN_MAP (fe);
-		if (lockres->readonly_node != OCFS_INVALID_NODE_NUM) {
-			if (lockres->readonly_node != lockres->master_node_num) {
-				LOG_ERROR_ARGS("(2) readonly node changed! was %d, now master is %d\n",
-				       lockres->readonly_node, lockres->master_node_num);
-				lockres->readonly_node = OCFS_INVALID_NODE_NUM;
-			} else if (lockres->lock_type != OCFS_DLM_ENABLE_CACHE_LOCK) {
-				LOG_ERROR_ARGS("readonly lock is not a cachelock any more!\n");
-				lockres->readonly_node = OCFS_INVALID_NODE_NUM;
-			}
-		}
-		ocfs_release_lockres (lockres);
-		OCFS_BH_PUT_DATA(bh);
-	}
+	if (lockres && status >= 0)
+		status = ocfs_update_lockres (osb, GET_INODE_VOTEOFF(inode), &bh, 
+				      NULL, 0, inode, false);
 
 	if (bh)
 		brelse(bh);
@@ -510,20 +500,17 @@
  * 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, ocfs_lock_res * lockres)
+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)
 {
 	int status = -EAGAIN;
 	__u32 timewaited = 0;
 	__u64 gotvotemap = 0;
-	__u64 fileopenmap = 0;
 
 	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);
+		(__u32)(*vote_map & 0xFFFFFFFFULL), lock_seq_num);
 
-	LOG_TRACE_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);
+	*vote_map &= ~(1 << osb->node_num);
 
 	while (time_to_wait > timewaited) {
 		ocfs_sleep (WAIT_FOR_VOTE_INCREMENT);
@@ -534,25 +521,16 @@
 			goto bail;
 		}
 
-		gotvotemap |= (1 << osb->node_num);
-
 		status = ocfs_get_vote_on_disk (osb, lock_id, lock_type, flags,
-				&gotvotemap, vote_map, lock_seq_num, &fileopenmap);
+				&gotvotemap, *vote_map, lock_seq_num, open_map);
 		if (status < 0) {
 			if (status != -EAGAIN)
 				LOG_ERROR_STATUS (status);
 			goto bail;
 		}
 
-		if (!(gotvotemap & (1 << osb->node_num))) {
-			status = -EAGAIN;
-			goto bail;
-		}
-
-		vote_map |= (1 << osb->node_num);
-		if (vote_map == gotvotemap) {
-			if ((flags & FLAG_FILE_EXTEND) || (flags & FLAG_FILE_UPDATE))
-				lockres->oin_openmap = fileopenmap;
+		*vote_map &= ~gotvotemap;
+		if (*vote_map == 0ULL) {
 			status = 0;
 			goto bail;
 		}
@@ -626,133 +604,24 @@
 	return (status);
 }				/* ocfs_reset_voting */
 
-/*
- * ocfs_request_vote()
- *
- */
-static int ocfs_request_vote (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, __u64 vote_map, __u64 * lock_seq_num, struct inode *inode)
-{
-	int status;
 
-	LOG_ENTRY ();
 
-	status = ocfs_disk_request_vote (osb, lock_id, lock_type, flags,
-					 vote_map, lock_seq_num, 
-					 inode ? GET_INODE_FEOFF(inode) : 0);
-
-	LOG_EXIT_STATUS (status);
-	return status;
-}				/* ocfs_request_vote */
-
 /*
- * ocfs_acquire_lockres_ex()
- *
- * @lockres: lockres to acquire
- * @timeout: timeout in ms, 0 == no timeout
- */
-int ocfs_acquire_lockres_ex (ocfs_lock_res * lockres, __u32 timeout)
-{
-	int mypid;
-	unsigned long jif = 0;
-	int status = 0;
-	int cnt = 0;
-#ifdef VERBOSE_LOCKING_TRACE
-	bool printed = false;
-#endif
-
-	LOG_ENTRY_ARGS ("(0x%p, %d)\n", lockres, timeout);
-
-	mypid = ocfs_getpid ();
-
-	if (timeout)
-		jif = jiffies + (timeout * HZ / 1000);
-
-	while (1) {
-		spin_lock (&lockres->lock_mutex);
-
-		if (lockres->in_use) {
-			if (lockres->thread_id != mypid) {
-				spin_unlock (&lockres->lock_mutex);
-#ifdef VERBOSE_LOCKING_TRACE
-				if (!printed) {
-					printk("ocfs2: waiting on lockres %llu, mypid = %u, thread_id = %u\n", lockres->sector_num, ocfs_getpid(), lockres->thread_id);
-					printed = true;
-				}
-#endif
-				if (jif && jif < jiffies) {
-					LOG_TRACE_ARGS ("lockpid=%d, newpid=%d,"
-						" timedout\n",
-						lockres->thread_id, mypid);
-					status = -ETIMEDOUT;
-					goto bail;
-				}
-
-				if (++cnt == 10) {
-					LOG_TRACE_ARGS ("lockpid=%d, newpid=%d\n",
-						lockres->thread_id, mypid);
-					cnt = 0;
-				}
-				ocfs_sleep (OCFS_NM_HEARTBEAT_TIME / 10);
-			}
-			else {
-				lockres->in_use++;
-				spin_unlock (&lockres->lock_mutex);
-				break;
-			}
-		} else {
-			lockres->in_use = 1;
-			lockres->thread_id = mypid;
-			spin_unlock (&lockres->lock_mutex);
-			break;
-		}
-	}
-
-bail:
-	LOG_EXIT_STATUS (status);
-	return status;
-}				/* ocfs_acquire_lockres_ex */
-
-/*
- * ocfs_release_lockres()
- *
- */
-void ocfs_release_lockres (ocfs_lock_res * lockres)
-{
-	LOG_ENTRY_ARGS ("(0x%p)\n", lockres);
-
-	spin_lock (&lockres->lock_mutex);
-	if (lockres->in_use == 0) {
-		LOG_ERROR_ARGS("Releasing lockres with inuse 0: 0x%p\n", lockres);
-		BUG();
-	} else {
-		if (lockres->thread_id != current->pid)
-			LOG_ERROR_ARGS("PID %d is trying to release lockres held by PID %d\n", 
-				       current->pid, lockres->thread_id);
-		lockres->in_use--;
-		if (lockres->in_use == 0) {
-			lockres->thread_id = 0;
-		}
-	}
-	spin_unlock (&lockres->lock_mutex);
-
-	LOG_EXIT ();
-	return;
-}				/* ocfs_release_lockres */
-
-/*
  * ocfs_update_disk_lock()
- *
+ * inode is definitely non NULL
  */
-int ocfs_update_disk_lock (ocfs_super * osb, ocfs_lock_res * lockres, __u32 flags, struct buffer_head **bh, struct inode *inode, ocfs_journal_handle *handle)
+int ocfs_update_disk_lock (ocfs_super * osb, __u32 flags, struct buffer_head **bh, struct inode *inode, ocfs_journal_handle *handle)
 {
 	int status = 0;
 	__u64 offset = 0;
 	ocfs_file_entry *fe = NULL;
 	bool changed = false;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
+	
 
 	LOG_ENTRY ();
 
-	offset = lockres->sector_num;
+	offset = GET_INODE_VOTEOFF(inode);
 	status = ocfs_read_bh (osb, offset, bh, 0, inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
@@ -789,14 +658,17 @@
 		DISK_LOCK_FILE_LOCK (fe) = lockres->lock_type;
 	}
 
-	if (flags & DLOCK_FLAG_OPEN_MAP &&
-	    DISK_LOCK_OIN_MAP (fe) != lockres->oin_openmap) {
-		if (!changed) {
-			OCFS_BH_PUT_DATA(*bh);
-			fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_WRITE(*bh); /* write */
-		}
-		changed = true;
-		DISK_LOCK_OIN_MAP (fe) = lockres->oin_openmap;
+	if (flags & DLOCK_FLAG_OPEN_MAP) {
+	       if (flags & DLOCK_FLAG_ADD_SELF)
+		       lockres->oin_openmap |= (1ULL << osb->node_num);
+	       if (DISK_LOCK_OIN_MAP (fe) != lockres->oin_openmap) {
+			if (!changed) {
+				OCFS_BH_PUT_DATA(*bh);
+				fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_WRITE(*bh); /* write */
+			}
+			changed = true;
+			DISK_LOCK_OIN_MAP (fe) = lockres->oin_openmap;
+	       }
 	}
 
 	if (flags & DLOCK_FLAG_SEQ_NUM &&
@@ -816,9 +688,8 @@
 			status = ocfs_journal_dirty(handle, *bh);
 			lockres->lock_holders++;
 #warning I hope these lock flags are alright.
-			ocfs_get_lockres(lockres);
 			ocfs_journal_add_lock(handle, lockres->lock_type, 0, 
-					      lockres, *bh, inode);
+					      *bh, inode);
 		} else
 			status = ocfs_write_bh (osb, *bh, 0, inode);
 		if (status < 0) 
@@ -832,37 +703,46 @@
 
 /*
  * ocfs_update_master_on_open()
- *
+ * inode is definitely non NULL
  */
-int ocfs_update_master_on_open (ocfs_super * osb, ocfs_lock_res * lockres, struct inode *inode, ocfs_journal_handle *handle)
+int ocfs_update_master_on_open (ocfs_super * osb, struct inode *inode, ocfs_journal_handle *handle)
 {
 	int status = -EAGAIN;
 	bool disk_vote = false;
 	struct buffer_head *bh = NULL;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 
 	LOG_ENTRY ();
 
+	/* no need to alert master for these cases */
+	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))) {
+		status = 0;
+		goto bail;
+	}
+
 	while (status == -EAGAIN) {
 		if (!IS_NODE_ALIVE (osb->publ_map, lockres->master_node_num,
 				    OCFS_MAXIMUM_NODES)) {
 			LOG_TRACE_ARGS ("Master (%u) dead, lockid %llu\n",
 				lockres->master_node_num,
-				lockres->sector_num);
+				GET_INODE_VOTEOFF(inode));
 			status = 0;
 			goto bail;
 		}
 
-		ocfs_acquire_lockres (lockres);
+		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),
-			     lockres->sector_num);
+			     GET_INODE_VOTEOFF(inode));
 
 			lockres->oin_openmap |= (1 << osb->node_num);
-			status = ocfs_update_disk_lock (osb, lockres,
-						DLOCK_FLAG_OPEN_MAP, &bh, 
-						inode, handle);
+			status = ocfs_update_disk_lock (osb, DLOCK_FLAG_OPEN_MAP, 
+							&bh, inode, handle);
 			if (bh)
 				brelse(bh);
 
@@ -870,19 +750,19 @@
 				LOG_ERROR_STATUS (status);
 				goto bail;
 			}
-			ocfs_release_lockres (lockres);
+			ocfs_release_lockres (lockres); // ocfs_file_open ocfs_symlink
 		} else {
-			status = new_lock_function(osb, lockres->lock_type, FLAG_ADD_OIN_MAP, lockres, 
+			status = new_lock_function(osb, lockres->lock_type, FLAG_ADD_OIN_MAP, 
 						   NULL, &disk_vote, inode);
 			if (status < 0) {
 				if (status != -EAGAIN)
 					LOG_ERROR_STATUS (status);
-				ocfs_release_lockres (lockres);
+				ocfs_release_lockres (lockres); // ocfs_file_open ocfs_symlink
 				if (status == -EAGAIN) {
 					ocfs_sleep (500);
 					if (ocfs_task_interruptible (osb)) {
 						LOG_TRACE_ARGS("interrupted... lockid=%llu\n",
-							lockres->sector_num);
+							GET_INODE_VOTEOFF(inode));
 						status = -EINTR;
 						goto bail;
 					}
@@ -891,7 +771,7 @@
 
 				goto bail;
 			}
-			ocfs_release_lockres (lockres);
+			ocfs_release_lockres (lockres); // ocfs_file_open ocfs_symlink
 		}
 	}
 
@@ -900,159 +780,6 @@
 	return status;
 }				/* ocfs_update_master_on_open */
 
-/*
- * ocfs_init_lockres()
- *
- */
-void ocfs_init_lockres (ocfs_super * osb, ocfs_lock_res * lockres, __u64 lock_id)
-{
-	LOG_ENTRY_ARGS ("(0x%p, 0x%p, %llu)\n", osb, lockres,
-			lock_id);
-
-	lockres->signature = 0x55AA;
-	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;
-	lockres->sector_num = lock_id;
-	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;
-	lockres->readonly_node = OCFS_INVALID_NODE_NUM;
-
-	lockres->lock_holders = 0;
-	LOG_TRACE_ARGS("lockres->lock_holders = %u\n", lockres->lock_holders);
-
-	LOG_EXIT ();
-	return;
-}				/* ocfs_init_lockres */
-
-/*
- * ocfs_create_update_lock()
- *
- */
-int ocfs_create_update_lock (ocfs_super * osb, __u64 lock_id, __u32 flags, bool new_file, struct inode *inode, ocfs_journal_handle *handle)
-{
-	int status = 0;
-	ocfs_lock_res *lockres = NULL;
-	ocfs_lock_res *tmp_lockres = NULL;
-	bool is_dir = false;
-
-	LOG_ENTRY_ARGS ("(0x%p, %llu, %u)\n",
-			osb, lock_id, flags);
-
-	is_dir = (flags & OCFS_OIN_DIRECTORY) ? true : false;
-
-	/* Check the lock state on the disk / in our resource map */
-	status = ocfs_lookup_sector_node (osb, lock_id, &lockres);
-	if (status >= 0) {
-		if (lockres->signature != 0x55AA) {
-			LOG_ERROR_STATUS (status = -EFAIL);
-			goto bail;
-		}
-
-		ocfs_acquire_lockres (lockres);
-		OCFS_I(inode)->oin_flags |= flags;
-		ocfs_get_lockres (lockres);
-		OCFS_I(inode)->lock_res = lockres;
-		ocfs_release_lockres (lockres);
-
-		status = ocfs_wait_for_lock_release (osb, lock_id, 30000, lockres,
-				(is_dir ? OCFS_DLM_EXCLUSIVE_LOCK : OCFS_DLM_NO_LOCK), inode);
-		if (status < 0) {
-			if (status != -EINTR) {
-				LOG_ERROR_STR ("Lock owner is alive and taking too much time");
-				LOG_ERROR_STATUS(status);
-			}
-			goto bail;
-		}
-	} else {
-		/* Create a resource and insert in the hash */
-		lockres = ocfs_allocate_lockres();
-		if (lockres == NULL) {
-			LOG_ERROR_STATUS (status = -ENOMEM);
-			goto bail;
-		}
-
-		ocfs_init_lockres (osb, lockres, lock_id);
-
-		ocfs_get_lockres (lockres);
-
-		status = ocfs_wait_for_lock_release (osb, lock_id, 30000, lockres,
-				(is_dir ? OCFS_DLM_EXCLUSIVE_LOCK : OCFS_DLM_NO_LOCK), inode);
-		if (status < 0) {
-			if (status != -EINTR) {
-				LOG_ERROR_STR ("Lock owner is alive and taking too much time");
-				LOG_ERROR_STATUS(status);
-			}
-			goto bail;
-		}
-
-		status = ocfs_insert_sector_node (osb, lockres, &tmp_lockres);
-		if (status < 0) {
-			LOG_ERROR_STATUS (status);
-			goto bail;
-		}
-
-		/* Check if another process added a lockres after our lookup */
-		if (tmp_lockres) {
-			/* If so, put the recently allocated lockres */
-			ocfs_put_lockres (lockres);
-			lockres = tmp_lockres;
-			status = ocfs_wait_for_lock_release (osb, lock_id, 30000, lockres,
-					(is_dir ? OCFS_DLM_EXCLUSIVE_LOCK : OCFS_DLM_NO_LOCK), inode);
-			if (status < 0) {
-				if (status != -EINTR) {
-					LOG_ERROR_STR ("Lock owner is alive and taking too much time");
-					LOG_ERROR_STATUS(status);
-				}
-				goto bail;
-			}
-		}
-	}
-
-	ocfs_acquire_lockres (lockres);
-
-	OCFS_I(inode)->oin_flags |= flags;
-	if (OCFS_I(inode)->lock_res != lockres) {
-		ocfs_put_lockres (OCFS_I(inode)->lock_res);
-		OCFS_I(inode)->lock_res = lockres;
-		ocfs_get_lockres (lockres);
-	}
-
-	LOG_TRACE_ARGS ("MasterNode=%d, ThisNode=%d\n",
-			lockres->master_node_num, osb->node_num);
-
-	if (!is_dir && !new_file &&
-	    (lockres->master_node_num != OCFS_INVALID_NODE_NUM) &&
-	    ((!IS_NODE_ALIVE (lockres->oin_openmap, osb->node_num, OCFS_MAXIMUM_NODES)) ||
-	     (lockres->lock_state & FLAG_ALWAYS_UPDATE_OPEN))) {
-		/* Send a message to master so that he can send the oin update to */
-		/* this node also. If u are the master then update File_entry */
-		/* and set the bit that this node has a open */
-		status = ocfs_update_master_on_open (osb, lockres, inode, handle);
-		if (status < 0) {
-			ocfs_release_lockres (lockres);
-			if (status != -EINTR)
-				LOG_ERROR_STATUS (status);
-			goto bail;
-		}
-	}
-	if (new_file) 
-		lockres->oin_openmap |= (1 << osb->node_num);
-
-	ocfs_release_lockres (lockres);
-
-bail:
-	ocfs_put_lockres(lockres);
-	LOG_EXIT_STATUS (status);
-	return status;
-}				/* ocfs_create_update_lock */
-
 enum {
 	invalid_path = 0,
 	fast_path, 
@@ -1076,16 +803,15 @@
 
 /*
  * ocfs_acquire_lock()
- *
+ * inode is definitely non NULL
  */
-int
-ocfs_acquire_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type,
-		   __u32 flags, ocfs_lock_res **ret_lockres, struct buffer_head **bh, struct inode *inode)
+int ocfs_acquire_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type,
+		   __u32 flags, struct buffer_head **bh, struct inode *inode)
 {
 	int status = -EFAIL;
 	ocfs_file_entry *disklock = NULL;
 	__u32 updated = 0;
-	ocfs_lock_res *lockres = NULL;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 	int k = 0;
 	struct buffer_head *tmpbh = NULL, **b = NULL;
 	/* TODO: 40 bytes of "bool" sitting on the stack for now. move    */
@@ -1094,11 +820,9 @@
 	bool no_owner = false, owner_dead = false, wait_on_recovery = false;
 	__u32 extra_lock_flags = 0;
 
-	LOG_ENTRY_ARGS ("(0x%p, %llu, %u, %u, 0x%p, 0x%p)\n",
-			osb, lock_id, lock_type, flags,
-			ret_lockres, bh);
+	LOG_ENTRY_ARGS ("(0x%p, %llu, %u, %u, 0x%p)\n",
+			osb, lock_id, lock_type, flags, bh);
 	
-	
 	OCFS_ASSERT(lock_type != OCFS_DLM_NO_LOCK);
 	OCFS_ASSERT(lock_type != OCFS_DLM_SHARED_LOCK);
 	OCFS_ASSERT(inode);
@@ -1110,17 +834,14 @@
 
 	flags |= FLAG_ACQUIRE_LOCK;
 
-	status = ocfs_find_update_res (osb, lock_id, ret_lockres, b, &updated, 0, inode);
-	if (ret_lockres)
-		lockres = *ret_lockres;
+	status = ocfs_update_lockres (osb, lock_id, b, &updated, 0, inode, true);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
 		goto bail;
 	}
-	ocfs_get_lockres (lockres);
 
 again:
-	ocfs_acquire_lockres (lockres);
+	ocfs_acquire_lockres (lockres, 0);  // ocfs_acquire_lock
 
 	LOG_TRACE_ARGS("attempting to get lock, pass: %d\n", ++k);
 
@@ -1130,7 +851,7 @@
 	if (!updated) {
 		status = ocfs_read_bh (osb, lock_id, b, 0, inode);
 		if (status < 0) {
-			ocfs_release_lockres (lockres);
+			ocfs_release_lockres (lockres); // ocfs_acquire_lock
 			LOG_ERROR_STATUS (status);
 			goto finally;
 		}
@@ -1153,9 +874,9 @@
 	if (unlikely(lockres->master_node_num >= OCFS_MAXIMUM_NODES && !no_owner)) {
 		LOG_ERROR_ARGS("lockres: master_node=%d, owner=%s, lockid=%llu\n",
 			       lockres->master_node_num, no_owner?"no":"yes",
-			       lockres->sector_num);
+			       GET_INODE_VOTEOFF(inode));
 		LOG_ERROR_STATUS (status = -EINVAL);
-		ocfs_release_lockres (lockres);
+		ocfs_release_lockres (lockres); // ocfs_acquire_lock
 		goto finally;
 	}
 
@@ -1204,12 +925,15 @@
 	if (lockres->readonly_node != osb->node_num)
 		lockres->readonly_node = OCFS_INVALID_NODE_NUM; // clear any owner
 
-	status = ocfs_wait_for_readonly_drop(osb, lockres, inode);
+	status = ocfs_wait_for_readonly_drop(osb, inode);
 	if (status < 0) {
-		if (status == -ETIMEDOUT)
-			goto again;
-		if (status == -EAGAIN)
+		if (status == -EAGAIN) {
+			// the rodrop thread is already running and needs the lockres
+			ocfs_release_lockres(lockres); // ocfs_acquire_lock
+			ocfs_sleep (OCFS_NM_HEARTBEAT_TIME / 10);
+			ocfs_acquire_lockres(lockres, 0);  // ocfs_acquire_lock
 			goto reevaluate;
+		}
 		LOG_ERROR_STATUS(status);
 		goto finally;
 	}
@@ -1243,7 +967,7 @@
 	
 #ifdef VERBOSE_LOCKING_TRACE
 	printk("lockres: lockid=%llu, this=%d, master=%d, locktype=%d, flags=%08x, ronode=%d, romap=%08x\n",
-		       lockres->sector_num, osb->node_num, lockres->master_node_num, lockres->lock_type, 
+		       GET_INODE_VOTEOFF(inode), osb->node_num, lockres->master_node_num, lockres->lock_type, 
 		       flags|extra_lock_flags, lockres->readonly_node, (__u32)(lockres->readonly_map & 0xFFFFFFFFULL));
 #endif	
 	if (wait_on_recovery && !((flags|extra_lock_flags) & FLAG_FILE_RECOVERY)) {
@@ -1259,14 +983,14 @@
 	}
 
 	status = new_lock_function(osb, lock_type, flags|extra_lock_flags, 
-				   lockres, *b, &disk_vote, inode);
+				   *b, &disk_vote, inode);
 	if (status < 0) {
-		ocfs_release_lockres (lockres);
+		ocfs_release_lockres (lockres); // ocfs_acquire_lock
 		if (status == -EAGAIN) {
 			ocfs_sleep (500);
 			if (ocfs_task_interruptible (osb)) {
 				LOG_TRACE_ARGS("interrupted... lockid=%llu\n",
-					lockres->sector_num);
+					GET_INODE_VOTEOFF(inode));
 				status = -EINTR;
 				goto finally;
 			}
@@ -1282,11 +1006,9 @@
 skip_lock_write:
 	lockres->lock_holders++;
 	LOG_TRACE_ARGS("lockres->lock_holders = %u\n", lockres->lock_holders);
-	ocfs_release_lockres (lockres);
+	ocfs_release_lockres (lockres); // ocfs_acquire_lock
 
 finally:
-	ocfs_put_lockres (lockres);
-
 bail:
 	if (tmpbh)
 		brelse(tmpbh);
@@ -1297,26 +1019,24 @@
 
 /*
  * ocfs_disk_release_lock()
- *
+ * inode is definitely non NULL
  */
-int ocfs_disk_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_lock_res * lockres, struct buffer_head *bh, struct inode *inode)
+int ocfs_disk_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, struct buffer_head *bh, struct inode *inode)
 {
-	__u32 votemap = 0;
-	__u32 tempmap = 0;
+	__u64 votemap = 0ULL;
 	__u32 i;
 	int status = 0, vote_status = 0;
 	int tmpstat;
 	__u64 lockseqno;
 	bool cachelock = false;
 	bool disk_vote = false;
-	unsigned long jif;
-	bool disk_reset = true;
 	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);
 	bool clear_tmp = false;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 
 	LOG_ENTRY_ARGS ("(0x%p, %llu, %u, %u, 0x%p)\n",
 			osb, lock_id, lock_type, flags, lockres);
@@ -1354,24 +1074,22 @@
 	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 |= (1 << i);
+			votemap |= (1ULL << i);
 		}
 	}
 
 	/* 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 = (__u32) (osb->publ_map);
+		votemap = osb->publ_map;
 
 	/* TODO: figure out how to properly handle inode updates w/no oin */
-	votemap = (__u32) (osb->publ_map);	// temporary hack, forces broadcast
+	votemap = osb->publ_map;	// temporary hack, forces broadcast
 
 	/* remove current node from the votemap */
-	tempmap = (1 << osb->node_num);
-	votemap &= (~tempmap);
-	jif = jiffies;
+	votemap &= ~(1ULL << osb->node_num);
 
-	if (votemap == 0)
+	if (votemap == 0ULL)
 		goto finally;
 
 	if (!(flags & FLAG_FILE_UPDATE_OIN) && !(flags & FLAG_FILE_DELETE))
@@ -1382,13 +1100,15 @@
 		if (comm_voting && !disk_vote) {
 			LOG_TRACE_STR ("Network vote");
 			status = ocfs_send_dlm_request_msg (osb, lock_id, lock_type, flags, 
-							    lockres, votemap, inode, &vote_status);
+							    &votemap, NULL, inode, &vote_status);
 			if (status >= 0) {
 				status = vote_status;
 				if (status >= 0) {
 					goto finally;
 				} else if (status == -EAGAIN) {
-					goto loop;
+					LOG_TRACE_ARGS ("id=%llu\n", lock_id);
+					ocfs_sleep (500);
+					continue;
 				} else {
 					LOG_ERROR_STATUS (status);
 					goto finito;
@@ -1408,48 +1128,27 @@
 
 		LOG_TRACE_STR ("Disk vote");
 		disk_vote = true;
-		jif = jiffies;
 
-		disk_reset = false;
-		status = ocfs_request_vote (osb, lock_id, lock_type, flags, votemap, &lockseqno, inode);
+		status = ocfs_disk_request_vote (osb, lock_id, lock_type, flags, &votemap, &lockseqno, 5000, inode, NULL);
+		tmpstat = ocfs_reset_voting (osb);
 
-		if (status >= 0) {
-			status = ocfs_wait_for_vote (osb, lock_id, lock_type, FLAG_FILE_UPDATE_OIN, 
-						     votemap, 5000, lockseqno, lockres);
-		} else
-			LOG_ERROR_STR("ocfs_request_vote failed");
+		if (status >=0) {
+		       	if (tmpstat >= 0)
+				break;
+			LOG_ERROR_STATUS (status = tmpstat);
+			goto finito;
+		}
 		
-		if (status < 0 && status != -EAGAIN) {
+		if (status != -EAGAIN) {
 			LOG_ERROR_STATUS (status);
 			goto finito;
 		}
 
-		tmpstat = ocfs_reset_voting (osb);
-		if (tmpstat < 0) {
-			LOG_ERROR_STATUS (status = tmpstat);
-			goto finito;
-		}
-
-		disk_reset = true;
-
-		if (status != -EAGAIN)
-			break;
-
-loop:
 		LOG_TRACE_ARGS ("id=%llu\n", lock_id);
 		ocfs_sleep (500);
 	}
 
 finally:
-	jif = jiffies - jif;
-	LOG_TRACE_ARGS ("Lock time: %lu\n", jif);
-
-	if (disk_vote && !disk_reset) {
-		tmpstat = ocfs_reset_voting (osb);
-		if (tmpstat < 0)
-			LOG_ERROR_STATUS (tmpstat);
-	}
-
 	fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_WRITE(*b); /* write */
 
 	LOG_TRACE_ARGS("writing lock now... releasemaster: %s, level: %d, master: %d\n",
@@ -1492,12 +1191,13 @@
 
 /*
  * ocfs_release_lock()
- *
+ * inode is definitely non NULL
  */
-int ocfs_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_lock_res * lockres, struct buffer_head *bh, struct inode *inode)
+int ocfs_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, struct buffer_head *bh, struct inode *inode)
 {
 	int status = 0;
 	int tries = 0;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 
 	LOG_ENTRY_ARGS ("(0x%p, %llu, %u, %u, 0x%p)\n",
 			osb, lock_id, lock_type, flags, lockres);
@@ -1507,14 +1207,14 @@
 	flags |= FLAG_RELEASE_LOCK;
 
 again:
-	ocfs_acquire_lockres (lockres);
+	ocfs_acquire_lockres (lockres, 0); // ocfs_release_lock
 
 	if (bh) {
 		/* always get the write lock on the bh */
 		/* make sure to do this AFTER the lockres acquire */
 		if (OCFS_BH_GET_DATA_WRITE_TRYLOCK(bh) == NULL) {
 			tries++;
-			ocfs_release_lockres(lockres);
+			ocfs_release_lockres(lockres); // ocfs_release_lock
 			LOG_ERROR_ARGS("failed to get bh sem (%lu), attempt %d, trying again\n",
 				       bh->b_blocknr, tries);
 			ocfs_sleep(100);
@@ -1546,8 +1246,7 @@
 	if (flags & (FLAG_FILE_DELETE | FLAG_FILE_RELEASE_MASTER))
 		lockres->master_node_num = OCFS_INVALID_NODE_NUM;
 
-	status = ocfs_disk_release_lock (osb, lock_id, lock_type, flags,
-					 lockres, bh, inode);
+	status = ocfs_disk_release_lock (osb, lock_id, lock_type, flags, bh, inode);
 	if (status < 0) {
 		/* Disable the vol */
 		LOG_ERROR_STATUS (status);
@@ -1558,159 +1257,13 @@
 		ocfs_clear_buffer_modified(bh);
 	lockres->lock_holders--;
 	LOG_TRACE_ARGS("lockres->lock_holders = %u\n", lockres->lock_holders);
-	ocfs_release_lockres (lockres);
+	ocfs_release_lockres (lockres); // ocfs_release_lock
 	LOG_EXIT_STATUS (status);
 	return (status);
 }				/* ocfs_release_lock */
 
-/*
- * ocfs_break_cache_lock()
- *
- */
-/* TODO: merge down into new lock function */
-static int ocfs_break_cache_lock (ocfs_super * osb, ocfs_lock_res * lockres, struct inode *inode)
-{
-	int status, vote_status = 0;
-	int tmpstat;
-	__u32 votemap;
-	__u64 lockseqno = 0;
-	bool retry = false;
-	bool disk_vote = false;
-	unsigned long jif;
-	bool disk_reset = true;
 
-	LOG_ENTRY ();
-
-	ocfs_get_lockres(lockres);
-	ocfs_acquire_lockres (lockres);
-
-	/* Ask the node with cache to flush and revert to write thru on this file */
-	votemap = (1 << lockres->master_node_num);
-
-	jif = jiffies;
-
-	status = -EAGAIN;
-	while (status == -EAGAIN) {
-		if (!IS_NODE_ALIVE (osb->publ_map, lockres->master_node_num,
-				    OCFS_MAXIMUM_NODES)) {
-			LOG_TRACE_ARGS ("Master (%u) is dead, lockid %llu\n",
-				lockres->master_node_num, lockres->sector_num);
-			/* TODO recovery needs to be done here .....and then become master */
-			status = 0;
-			goto finally;
-		}
-
-		if (comm_voting && !disk_vote) {
-			LOG_TRACE_STR ("Network vote");
-			jif = jiffies;
-			status = ocfs_send_dlm_request_msg (osb, lockres->sector_num,
-							lockres->lock_type, 
-							FLAG_ACQUIRE_LOCK|FLAG_FILE_RELEASE_CACHE,
-							lockres, votemap, inode, &vote_status);
-			if (status >= 0) {
-				status = vote_status;
-				if (status >= 0) {
-					lockres->lock_type = OCFS_DLM_NO_LOCK;
-				} else if (status == -EAGAIN) {
-					goto loop;
-				} else {
-					LOG_ERROR_STATUS (status);
-				}
-				goto finally;
-			} else if (status == -ETIMEDOUT) {
-				LOG_TRACE_STR ("Network voting timed out");
-			}
-		}
-		
-		LOG_ERROR_ARGS("DISKVOTE!!: lock_type=%u, flags=%08x, offset=%llu, inode=%lu\n",
-		       lockres->lock_type, FLAG_ACQUIRE_LOCK|FLAG_FILE_RELEASE_CACHE, lockres->sector_num, inode?inode->i_ino:0);
-		LOG_ERROR_ARGS("DISKVOTE!!: this=%d, master=%d, locktype=%d, ronode=%d, romap=%08x\n",
-		       osb->node_num, lockres->master_node_num, lockres->lock_type, 
-		       lockres->readonly_node, (__u32)(lockres->readonly_map & 0xFFFFFFFFULL));
-
-		ocfs_show_trace(NULL);
-	
-		LOG_TRACE_STR ("Disk vote");
-		disk_vote = true;
-		jif = jiffies;
-
-		disk_reset = false;
-		status = ocfs_request_vote (osb, lockres->sector_num,
-					    lockres->lock_type,
-					    FLAG_ACQUIRE_LOCK|FLAG_FILE_RELEASE_CACHE, 
-					    votemap, &lockseqno, inode);
-		if (status < 0) {
-			if (status == -EAGAIN) {
-				retry = true;
-				goto reset;
-			}
-			LOG_ERROR_STATUS (status);
-			goto finally;
-		}
-
-		status = ocfs_wait_for_vote (osb, lockres->sector_num,
-					     lockres->lock_type,
-					     FLAG_ACQUIRE_LOCK|FLAG_FILE_RELEASE_CACHE, 
-					     votemap, 15000, lockseqno, lockres);
-		if (status < 0) {
-			if (status == -EAGAIN) {
-				retry = true;
-				goto reset;
-			}
-			LOG_ERROR_STATUS (status);
-			goto finally;
-		}
-
-reset:
-		tmpstat = ocfs_reset_voting (osb);
-		if (tmpstat < 0) {
-			LOG_ERROR_STATUS (status = tmpstat);
-			goto finally;
-		}
-
-		disk_reset = true;
-
-		if (status != -EAGAIN)
-			break;
-
-loop:
-		LOG_TRACE_ARGS ("id=%llu\n", lockres->sector_num);
-		ocfs_sleep (500);
-		if (ocfs_task_interruptible (osb)) {
-			LOG_TRACE_ARGS("interrupted.... lockid=%llu\n",
-				lockres->sector_num);
-			status = -EINTR;
-			goto finito;
-		}
-	}
-
-	lockres->lock_type = (__u8) OCFS_DLM_NO_LOCK;
-
-	LOG_TRACE_STR ("okie dokie... ocfs_break_cache_lock voting done\n");
-	
-
-finally:
-	if (status >= 0) {
-		ocfs_break_cache_lock_zap_buffers(osb, inode);
-		LOG_TRACE_STR ("okie dokie... ocfs_break_cache_lock zap buffers done\n");
-	}
-
-	jif = jiffies - jif;
-	LOG_TRACE_ARGS ("Lock time: %lu\n", jif);
-
-	if (disk_vote && !disk_reset) {
-		tmpstat = ocfs_reset_voting (osb);
-		if (tmpstat < 0)
-			LOG_ERROR_STATUS (tmpstat);
-	}
-finito:
-	ocfs_release_lockres (lockres);
-	ocfs_put_lockres (lockres);
-	LOG_EXIT_STATUS (status);
-	return (status);
-}				/* ocfs_break_cache_lock */
-
-
+/* inode is definitely non NULL */
 static int ocfs_zap_child_buffers_func(struct dentry *dentry, void *data)
 {
 	struct inode *inode = dentry->d_inode;
@@ -1737,67 +1290,10 @@
 }
 
 
-/* TODO: merge down into new lock function */
-int ocfs_send_readonly_drop_message(ocfs_super *osb, ocfs_lock_res *lockres, __u64 vote_map, struct inode *inode)
+/* inode is definitely non NULL */
+int new_lock_function(ocfs_super * osb, __u32 requested_lock, __u32 flags, struct buffer_head *bh, bool *disk_vote, struct inode *inode)	
 {
-	int status = 0, tmpstat, vote_status = 0;
-	__u64 lock_id = lockres->sector_num, lockseqnum = 0;
-	bool disk_vote = false;
-
-	LOG_ENTRY ();
-
-	if (comm_voting) {
-		status = ocfs_send_dlm_request_msg (osb, lock_id, OCFS_DLM_ENABLE_CACHE_LOCK,
-						    FLAG_DROP_READONLY, lockres, vote_map, inode, &vote_status);
-		if (status >= 0) {
-			status = vote_status;
-			goto bail;
-		} else if (status == -ETIMEDOUT)
-			LOG_TRACE_STR ("Network voting timed out");
-		else
-			LOG_ERROR_STATUS (status);
-	}
-
-	LOG_ERROR_ARGS("DISKVOTE!!: lock_type=%u, flags=%08x, offset=%llu, inode=%lu\n",
-	       OCFS_DLM_ENABLE_CACHE_LOCK, FLAG_DROP_READONLY, lock_id, 0UL);
-	LOG_ERROR_ARGS("DISKVOTE!!: this=%d, master=%d, locktype=%d, ronode=%d, romap=%08x\n",
-	       osb->node_num, lockres->master_node_num, lockres->lock_type, 
-	       lockres->readonly_node, (__u32)(lockres->readonly_map & 0xFFFFFFFFULL));
-
-	ocfs_show_trace(NULL);
-
-	disk_vote = true;
-	status = ocfs_request_vote (osb, lock_id, OCFS_DLM_ENABLE_CACHE_LOCK, FLAG_DROP_READONLY, 
-				    vote_map, &lockseqnum, NULL);
-	if (status < 0) {
-		if (status != -EAGAIN)
-			LOG_ERROR_STATUS (status);
-		goto bail;
-	}
-
-	status = ocfs_wait_for_vote (osb, lock_id, OCFS_DLM_ENABLE_CACHE_LOCK, FLAG_DROP_READONLY, 
-				     vote_map, 5000, lockseqnum, lockres);
-	if (status < 0) {
-		if (status != -EAGAIN)
-			LOG_ERROR_STATUS (status);
-		goto bail;
-	}
-
-bail:
-	if (disk_vote) {
-		tmpstat = ocfs_reset_voting (osb);
-		if (tmpstat < 0)
-			LOG_ERROR_STATUS (tmpstat);
-	}
-
-	LOG_EXIT_STATUS (status);
-	return status;
-}
-
-
-int new_lock_function(ocfs_super * osb, __u32 requested_lock, __u32 flags, ocfs_lock_res * lockres, struct buffer_head *bh, bool *disk_vote, struct inode *inode)	
-{
-	__u64 vote_map = 0;
+	__u64 vote_map = 0ULL, open_map = 0ULL;
 	__u64 lockseqnum = 0;
 	int tmpstat;
 	ocfs_file_entry *fe = NULL;
@@ -1807,11 +1303,11 @@
 	bool need_to_zap_buffers = false, need_lock_write = true;
 	bool is_readdir = (flags & FLAG_READDIR) ? true : false;
 	int status = 0, vote_status = 0;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 
 	LOG_ENTRY ();
 
-	ocfs_acquire_lockres (lockres);
-	lock_id = lockres->sector_num;
+	lock_id = GET_INODE_VOTEOFF(inode);
 
 	if (flags & FLAG_READDIR) {
 	        if (flags & (FLAG_CHANGE_MASTER | FLAG_REMASTER)) {
@@ -1826,27 +1322,29 @@
 			lockres->readonly_node = OCFS_INVALID_NODE_NUM;
 		}
 	}
-
 	if (flags & (FLAG_CHANGE_MASTER | FLAG_REMASTER)) {
 		/* on a master change... */
 		need_to_zap_buffers = true; /* need to dump local buffers */
 		need_lock_write = true;     /* and rewrite the lock */
-	} else if (flags & FLAG_ADD_OIN_MAP) {
+	} else if (flags & (FLAG_ADD_OIN_MAP | FLAG_DROP_READONLY)) {
 		need_lock_write = false;
 		need_to_zap_buffers = false;
-	} else if (flags & FLAG_READDIR) {
+	} else if (flags & (FLAG_READDIR | FLAG_FILE_RELEASE_CACHE)) {
 		need_lock_write = false;
 		need_to_zap_buffers = true;
 	} else {
-		fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_READ(bh); /* read */
-		/* may not need to rewrite the lock later if we already have a cachelock */
-		need_lock_write = (DISK_LOCK_CURRENT_MASTER (fe) != osb->node_num ||
+		if (bh) {
+			fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_READ(bh); /* read */
+			/* may not need to rewrite the lock later if we already have a cachelock */
+			need_lock_write = (DISK_LOCK_CURRENT_MASTER (fe) != osb->node_num ||
 					DISK_LOCK_FILE_LOCK (fe) != OCFS_DLM_ENABLE_CACHE_LOCK);
-		OCFS_BH_PUT_DATA(bh);
+			OCFS_BH_PUT_DATA(bh);
+		} else
+			need_lock_write = false;
 		need_to_zap_buffers = false; 
 	}
 
-	/* that's why it's called fast path */	
+	/* that's why it's called fast path */
 	if (flags & FLAG_FAST_PATH_LOCK)
 		goto vote_success;
 
@@ -1855,7 +1353,10 @@
 	/* figure out who to vote with */
 	if (flags & (FLAG_REMASTER | FLAG_FILE_DELETE | FLAG_FILE_RENAME))
 		vote_map = osb->publ_map; /* broadcast */
-	else {
+	else if (flags & FLAG_DROP_READONLY) {
+		/* all nodes that see this is readonly */
+		vote_map = osb->publ_map & lockres->readonly_map;
+	} else {
 		vote_map = (1 << lockres->master_node_num);  /* just owner */
 		lock_type = lockres->lock_type;
 	}
@@ -1873,7 +1374,7 @@
 	if (comm_voting && !*disk_vote) {
 		LOG_TRACE_STR ("Network vote");
 		status = ocfs_send_dlm_request_msg (osb, lock_id, lock_type, flags, 
-						    lockres, vote_map, inode, &vote_status);
+						    &vote_map, &open_map, inode, &vote_status);
 		if (status >= 0) {
 			status = vote_status;
 			if (status >= 0)
@@ -1899,28 +1400,30 @@
 	/* disk voting */
 	LOG_TRACE_STR ("Disk vote");
 	*disk_vote = true;
-	status = ocfs_request_vote (osb, lock_id, lock_type, flags, vote_map, &lockseqnum, inode);
+	status = ocfs_disk_request_vote (osb, lock_id, lock_type, flags, &vote_map, &lockseqnum, 5000, inode, &open_map);
 	if (status < 0) {
 		if (status != -EAGAIN)
 			LOG_ERROR_STATUS (status);
 		goto bail;
 	}
 
-	status = ocfs_wait_for_vote (osb, lock_id, lock_type, flags, vote_map, 5000, lockseqnum, lockres);
-	if (status < 0) {
-		if (status != -EAGAIN)
-			LOG_ERROR_STATUS (status);
-		goto bail;
-	}
-
 vote_success:
+	if (status >= 0 && flags & (FLAG_FILE_EXTEND | FLAG_FILE_UPDATE))
+		lockres->oin_openmap = open_map;
+
 	if (need_to_zap_buffers)
 		ocfs_break_cache_lock_zap_buffers(osb, inode);
 	
 	/* just alerting owner on open */
-	if (flags & FLAG_ADD_OIN_MAP) 
+	if (flags & FLAG_ADD_OIN_MAP)
 		goto bail;
 
+	/* drop readonly should remove anyone who has responded */
+       	if (flags & FLAG_DROP_READONLY) {
+		lockres->readonly_map = vote_map;
+		goto bail;
+	}
+
 	/* converted cachelock to readonly cachelock */
 	if (flags & FLAG_READDIR) {
 		lockres->readonly_node = lockres->master_node_num;
@@ -1928,104 +1431,57 @@
 	}
 	
 	/* update the lockres */
-	lockres->master_node_num = osb->node_num;
+	if (!(flags & FLAG_FILE_RELEASE_CACHE))
+		lockres->master_node_num = osb->node_num;
 	lockres->lock_type = requested_lock;
 
 	/* update the disk lock */
 	if (need_lock_write) {
-		status = ocfs_update_disk_lock (osb, lockres, lock_write_flags, &bh, inode, NULL);
+		status = ocfs_update_disk_lock (osb, lock_write_flags, &bh, inode, NULL);
 		if (status < 0)
 			LOG_ERROR_STATUS (status);
 	}
 
-	fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_READ(bh); /* read */
-	lockres->oin_openmap = DISK_LOCK_OIN_MAP (fe);
-	OCFS_BH_PUT_DATA(bh);
-
+	/* 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_OIN_MAP (fe);
+		OCFS_BH_PUT_DATA(bh);
+	}
 bail:
 	if (*disk_vote) {
 		tmpstat = ocfs_reset_voting (osb);
 		if (tmpstat < 0)
 			LOG_ERROR_STATUS (tmpstat);
 	}
-
+	
 	/* if we removed FLAG_READDIR above, set the readonly_node now */
 	if (is_readdir && !(flags & FLAG_READDIR)) {
 		lockres->readonly_node = lockres->master_node_num;
 	}
-	
-	ocfs_release_lockres (lockres);
 
+	if (status == -EAGAIN) {
+		if (ocfs_task_interruptible (osb)) {
+			LOG_TRACE_ARGS("interrupted.... lockid=%llu\n",
+				GET_INODE_VOTEOFF(inode));
+			status = -EINTR;
+		}
+	}
+
 	LOG_EXIT_STATUS (status);
 	return status;
 }
 
-static int _ocfs_wait_for_readonly_drop(ocfs_super *osb, ocfs_lock_res *lockres, struct inode *inode);
-
-static inline int ocfs_wait_for_readonly_drop(ocfs_super *osb, ocfs_lock_res *lockres, struct inode *inode)
+/* inode is definitely non NULL */
+static inline int ocfs_wait_for_readonly_drop(ocfs_super *osb, struct inode *inode)
 {
-	if (lockres->readonly_map == 0ULL)
-		return 0;
-	return _ocfs_wait_for_readonly_drop(osb, lockres, inode);
-}
-	
-#define READONLY_DROP_TRIES 5
-static int _ocfs_wait_for_readonly_drop(ocfs_super *osb, ocfs_lock_res *lockres, struct inode *inode)
-{
-	int tries = 0;
 	int status = 0;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
 
-	LOG_ENTRY();
-	
-	// should not be in map, but remove anyway
-	lockres->readonly_map &= ~(1 << osb->node_num);
-
-	if (lockres->readonly_map != 0ULL) {
-		// if this node is the owner, need to alert all nodes 
-		// in map, set map to 0, ro_node=-1, continue as if normal cache lock
-
-		// if there is a readonly_map, we had better be the owner
-		OCFS_ASSERT(lockres->readonly_node == osb->node_num);
-	
-		if (!(lockres->lock_state & FLAG_READONLY_DROPPING)) {	
-			ocfs_get_lockres(lockres);
-			status = ocfs_drop_readonly_cache_lock(osb, lockres, inode);
-			if (status < 0) {
-				LOG_ERROR_STATUS (status);
-				ocfs_release_lockres (lockres);
-				goto exit;
-			}
-		}
-		while (tries < READONLY_DROP_TRIES) {
-			if (lockres->readonly_node != osb->node_num) {
-				if (lockres->readonly_map != 0ULL)
-					LOG_ERROR_STR("readonly_node is not this node, but map is still set");
-				lockres->readonly_map = 0ULL;
-				status = -EAGAIN;
-				goto exit;
-			} else { 
-				OCFS_ASSERT(lockres->master_node_num == osb->node_num);
-				if (lockres->readonly_map == 0ULL) {
-					lockres->readonly_node = OCFS_INVALID_NODE_NUM;
-					status = -EAGAIN;
-					goto exit;
-				}
-			}
-
-			ocfs_release_lockres(lockres);
-			ocfs_sleep (OCFS_NM_HEARTBEAT_TIME / 10);
-			ocfs_acquire_lockres(lockres);
-		}
-
-		// not good.  could not get everyone to release in time.
-		// ????: what do we do here?!
-		ocfs_release_lockres(lockres);
-		status = -ETIMEDOUT;
-	}
-exit:
-
-	LOG_EXIT_STATUS(status);
-	return status;
+	if (lockres->readonly_map == 0ULL)
+		return status;
+	status = ocfs_drop_readonly_cache_lock(osb, inode, false);
+	return status;	
 }
 
 void ocfs_compute_dlm_stats(int status, int vote_status, ocfs_dlm_stats *stats)	

Modified: trunk/src/file.c
===================================================================
--- trunk/src/file.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/file.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -328,12 +328,6 @@
 			LOG_ERROR_STR("Not deleting lockrse on a last close! eek!");
 			goto bail;
 		}
-		if (!OCFS_I(inode)->lock_res)
-			LOG_ERROR_STR("My oin has no lockres!");
-		else {
-			ocfs_put_lockres(OCFS_I(inode)->lock_res);
-			OCFS_I(inode)->lock_res = NULL;
-		}
 
 		/* we might still be holding inode_extend_sem on
 		 * behalf of another node, so release it here. */
@@ -419,7 +413,6 @@
 	ocfs_file_entry *fileEntry = NULL;
 	__u64 dirOffset = 0;
 	bool bAcquiredLock = false;
-	ocfs_lock_res *lockres = NULL;
 	__u64 lockId = 0;
 	__u32 lockFlags = 0, locktype = 0;
 	bool bCacheLock = false;
@@ -466,7 +459,7 @@
 	ocfs_handle_set_sync(handle, false);
 
 	locktype = bCacheLock ? OCFS_DLM_ENABLE_CACHE_LOCK : OCFS_DLM_EXCLUSIVE_LOCK;
-	status = ocfs_acquire_lock (osb, lockId, locktype, lockFlags, &lockres, 
+	status = ocfs_acquire_lock (osb, lockId, locktype, lockFlags,
 				    &bh, inode);
 	if (status < 0) {
 		if (status != -EINTR)
@@ -517,7 +510,7 @@
 			ocfs_abort_trans(handle);
 		} else {
 			ocfs_journal_add_lock(handle, locktype, lockFlags, 
-					      lockres, bh, inode);
+					      bh, inode);
 			bAcquiredLock = false;
 
 			ocfs_commit_trans(handle);
@@ -525,10 +518,9 @@
 	}
 	if (bAcquiredLock) {
 		tmpstat = ocfs_release_lock (osb, lockId, locktype,
-					     lockFlags, lockres, bh, inode);
+					     lockFlags, bh, inode);
 		if (tmpstat < 0)
 			LOG_ERROR_STATUS (tmpstat);
-		ocfs_put_lockres (lockres);
 	}
 
 	if (bh != NULL)
@@ -555,7 +547,6 @@
 	struct inode *inode = filp->f_dentry->d_inode;
 	int status;
 	__u64 newsize;
-	ocfs_lock_res *lockres = NULL;
 	struct super_block *sb = inode->i_sb;
 	int needs_trunc = 0;
 
@@ -577,14 +568,6 @@
 
 	osb = OCFS_GENERIC_SB_P(inode->i_sb);
 
-	lockres = OCFS_I(inode)->lock_res;
-	if (lockres == NULL) {
-		ret = -EIO;
-		goto bail;
-	}
-
-	ocfs_get_lockres (lockres);
-
 	if (osb->osb_flags & OCFS_OSB_FLAGS_SHUTDOWN) {
 		LOG_TRACE_STR ("Volume has already started shutdown");
 		ret = -EIO;
@@ -706,7 +689,6 @@
 		OCFS_CLEAR_FLAG(OCFS_I(inode)->oin_flags, OCFS_OIN_OPEN_FOR_WRITE);
 	}
 
-	ocfs_put_lockres (lockres);
 
 #ifndef BH_SEM_LEAK_CHECKING	
 	if (ret < 0)
@@ -799,10 +781,8 @@
 	__u32 lockFlags = 0, locktype = 0;
 	bool bFileLockAcquired = false;
 	bool bAcquiredLock = false;
-	ocfs_lock_res *lockres = NULL;
 	bool bCacheLock = false;
         __u64 new_alloc_size;
-        __u32 csize = osb->vol_layout.cluster_size;
 	struct buffer_head *bh = NULL;
 	int flags = 0;
 	ocfs_journal_handle *handle = NULL;
@@ -810,7 +790,8 @@
 	LOG_ENTRY_ARGS ("(file_off = %llu, file_size = %llu\n", 
 		   file_off, file_size);
 
-        new_alloc_size = OCFS_ALIGN(file_size, csize);
+	new_alloc_size = (file_size + (osb->vol_layout.cluster_size - 1)) >> 
+				osb->cluster_size_bits;
 
 	status = ocfs_read_bh (osb, file_off, &bh, OCFS_BH_CACHED, inode);
 	if (status < 0) {
@@ -844,7 +825,7 @@
 	OCFS_BH_PUT_DATA(bh);
 
 	locktype = bCacheLock ? OCFS_DLM_ENABLE_CACHE_LOCK : OCFS_DLM_EXCLUSIVE_LOCK;
-	status = ocfs_acquire_lock (osb, lockId, locktype, lockFlags, &lockres, 
+	status = ocfs_acquire_lock (osb, lockId, locktype, lockFlags, 
 				    &bh, inode);
 	if (status < 0) {
 		if (status != -EINTR)
@@ -926,7 +907,7 @@
 
 		locktype = bCacheLock ? OCFS_DLM_ENABLE_CACHE_LOCK : OCFS_DLM_EXCLUSIVE_LOCK;
 		tmpstat = ocfs_release_lock (osb, lockId, locktype,
-					     lockFlags, lockres, bh, inode);
+					     lockFlags, bh, inode);
 		if (tmpstat < 0)
 			LOG_ERROR_STATUS (tmpstat);
 	}
@@ -934,8 +915,6 @@
 	if (bh != NULL)
 		brelse(bh);
 
-	ocfs_put_lockres (lockres);
-
 	if  (status < 0)
 		if (status != -ENOSPC && status != -EINTR)
 			LOG_ERROR_STATUS (status);
@@ -962,7 +941,6 @@
 	__u32 lockFlags = 0, locktype = 0;
 	bool bFileLockAcquired = false;
 	bool bAcquiredLock = false;
-	ocfs_lock_res *lockres = NULL;
 	__u64 actualDiskOffset = 0;
 	__u64 actualLength = 0;
 	bool bCacheLock = false;
@@ -1028,8 +1006,7 @@
 		bh = NULL;
 	
 		locktype = bCacheLock ? OCFS_DLM_ENABLE_CACHE_LOCK : OCFS_DLM_EXCLUSIVE_LOCK;	
-		status = ocfs_acquire_lock (osb, lockId, locktype, lockFlags, &lockres, 
-					    &bh, inode);
+		status = ocfs_acquire_lock (osb, lockId, locktype, lockFlags, &bh, inode);
 		if (status < 0) {
 			if (status != -EINTR)
 				LOG_ERROR_STATUS (status);
@@ -1061,14 +1038,21 @@
 		/* in order to try to use the Extents of File Entry only and ofcourse */
 		/* the file will have more contigous disk space. */
 		{
+			int one_percentish_bits = 7;
 			__u64 tempSize = fileEntry->alloc_size;
 
 			if (tempSize > ONE_MEGA_BYTE)
 				tempSize = ONE_MEGA_BYTE;
 			allocSize += (tempSize * 2);
-			if (allocSize < fileEntry->alloc_size / 100) {
-				allocSize = fileEntry->alloc_size / 100;
-				allocSize = OCFS_ALIGN(allocSize, (10*ONE_MEGA_BYTE));
+			
+			if (allocSize < fileEntry->alloc_size >> one_percentish_bits) {
+				allocSize = fileEntry->alloc_size >> one_percentish_bits;
+				tempSize = allocSize;
+				// avoid using 64 bit mod
+				while (tempSize > (10*ONE_MEGA_BYTE))
+					tempSize -= (10*ONE_MEGA_BYTE);
+				tempSize = (10*ONE_MEGA_BYTE) - tempSize;
+				allocSize += tempSize;					
 			}
 
 		}
@@ -1083,10 +1067,10 @@
 		}
 
 		actualDiskOffset =
-		    (bitmapOffset * osb->vol_layout.cluster_size) +
+		    (bitmapOffset << osb->cluster_size_bits) +
 		    osb->vol_layout.data_start_off;
 		actualLength =
-		    (__u64) (numClustersAlloc * osb->vol_layout.cluster_size);
+		    (__u64) (numClustersAlloc << osb->cluster_size_bits);
 
 		OCFS_BH_PUT_DATA(bh);
 		fileEntry = NULL;
@@ -1140,7 +1124,7 @@
 	fileEntry->modify_time = OCFS_CURRENT_TIME;
 
 	tempOffset = fileEntry->this_sector;
-	size = (__u32) OCFS_ALIGN (sizeof (ocfs_file_entry), osb->sect_size);
+	size = osb->sect_size;
 
 	flags = OCFS_FE_CACHE_FLAGS(osb, fileEntry);
 
@@ -1165,8 +1149,7 @@
 					lockFlags |= FLAG_FILE_UPDATE_OIN;
 
 				ocfs_journal_add_lock(handle, locktype,
-						      lockFlags, lockres,
-						      bh, inode);
+						      lockFlags, bh, inode);
 				bAcquiredLock = false;
 
 				ocfs_commit_trans(handle);
@@ -1180,10 +1163,9 @@
 
 		locktype = bCacheLock ? OCFS_DLM_ENABLE_CACHE_LOCK : OCFS_DLM_EXCLUSIVE_LOCK;	
 		tmpstat = ocfs_release_lock (osb, lockId, OCFS_DLM_EXCLUSIVE_LOCK,
-					     lockFlags, lockres, bh, inode);
+					     lockFlags, bh, inode);
 		if (tmpstat < 0)
 			LOG_ERROR_STATUS (tmpstat);
-		ocfs_put_lockres (lockres);
 	}
 
 	if (bh != NULL)

Modified: trunk/src/hash.c
===================================================================
--- trunk/src/hash.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/hash.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -43,601 +43,8 @@
 static inline struct _ocfs_inode_num * __ocfs_inode_hash_remove(ocfs_inode_hash *h, 
 						  __u64 off);
 
-/*
- * ocfs_insert_sector_node()
- *
- */
-int ocfs_insert_sector_node (ocfs_super * osb, ocfs_lock_res * lockres, ocfs_lock_res ** found_lockres)
-{
-	int status = 0;
-	__u32 tmp;
 
-	LOG_ENTRY_ARGS ("(0x%p, 0x%p)\n", osb, lockres);
 
-	if (HASHTABLE_DESTROYED (&(osb->root_sect_node))) {
-		LOG_TRACE_STATUS (status = -EFAIL);
-		goto bail;
-	}
-
-	if (lockres->signature != 0x55AA) {
-		LOG_ERROR_STATUS (status = -EFAIL);
-		goto bail;
-	}
-
-	if (!ocfs_hash_add (&(osb->root_sect_node), &(lockres->sector_num),
-			    sizeof (__u64), lockres, sizeof (ocfs_lock_res *),
-			    (void **)found_lockres, &tmp)) {
-		LOG_ERROR_STATUS(status = -EFAIL);
-		goto bail;
-	}
-
-	if (*found_lockres) {
-		ocfs_get_lockres (*found_lockres);
-		LOG_TRACE_ARGS ("isn: fres=0x%p, ref=%d, lid=%llu\n",
-				*found_lockres,
-				atomic_read (&((*found_lockres)->lr_ref_cnt)),
-				(*found_lockres)->sector_num);
-	}
-	else {
-		ocfs_get_lockres (lockres);
-		LOG_TRACE_ARGS ("isn: lres=0x%p, ref=%d, lid=%llu\n",
-				lockres,
-				atomic_read (&lockres->lr_ref_cnt),
-				lockres->sector_num);
-	}	
-
-bail:
-	LOG_EXIT_STATUS (status);
-	return status;
-}				/* ocfs_insert_sector_node */
-
-/*
- * ocfs_lookup_sector_node()
- *
- */
-int ocfs_lookup_sector_node (ocfs_super * osb, __u64 lock_id, ocfs_lock_res ** lockres)
-{
-	int status = 0;
-	__u32 len = 0;
-
-	LOG_ENTRY_ARGS ("(0x%p, %llu, 0x%p)\n", osb, lock_id,
-			lockres);
-
-	if (HASHTABLE_DESTROYED (&(osb->root_sect_node))) {
-		status = -EFAIL;
-		LOG_TRACE_STATUS(status);
-		goto bail;
-	}
-
-	if (ocfs_hash_get (&(osb->root_sect_node), &(lock_id), sizeof (__u64),
-			 (void **) lockres, &len)) {
-		if (len != sizeof (ocfs_lock_res *)) {
-			LOG_ERROR_STATUS (status = -EFAIL);
-			goto bail;
-		}
-
-		if ((*lockres)->signature != 0x55AA) {
-			LOG_ERROR_STATUS (status = -EFAIL);
-			goto bail;
-		}
-
-		ocfs_get_lockres (*lockres);
-		LOG_TRACE_ARGS ("lsn: lid=%llu, lres=0x%p, ref=%d\n",
-				lock_id, *lockres,
-				atomic_read (&((*lockres)->lr_ref_cnt)));
-	} else
-		status = -ENOENT;		
-
-bail:
-	LOG_EXIT_STATUS (status);
-	return status;
-}				/* ocfs_lookup_sector_node */
-
-/*
- * ocfs_remove_sector_node()
- *
- */
-void ocfs_remove_sector_node (ocfs_super * osb, ocfs_lock_res * lockres)
-{
-	LOG_ENTRY_ARGS ("(0x%p, 0x%p)\n", osb, lockres);
-
-	if (HASHTABLE_DESTROYED (&(osb->root_sect_node))) {
-		LOG_TRACE_STATUS (-EFAIL);
-		goto bail;
-	}
-
-	if (lockres->signature != 0x55AA) {
-		LOG_ERROR_STATUS (-EFAIL);
-		goto bail;
-	}
-
-	LOG_TRACE_ARGS ("rsn: lres=0x%p, ref=%d, lid=%llu\n", lockres,
-			atomic_read (&lockres->lr_ref_cnt),
-			lockres->sector_num);
-
-	ocfs_hash_del (&(osb->root_sect_node), &(lockres->sector_num),
-		       sizeof (__u64));
-
-	ocfs_put_lockres (lockres);
-
-bail:
-	LOG_EXIT ();
-	return ;
-}				/* ocfs_remove_sector_node */
-
-
-/*
- * ocfs_hash_create()
- *
- */
-int ocfs_hash_create (HASHTABLE *ht, __u32 noofbits)
-{
-	int ret = 0;
-	__u32 size = 0;
-
-	LOG_ENTRY ();
-
-	if (noofbits > 32 || noofbits < 1) {
-		LOG_ERROR_STR ("Error in noofbits");
-		goto bail;
-	}
-
-	ht->size = hashsize (noofbits);
-	ht->mask = hashmask (noofbits);
-	ht->inithash = 0x10325476;
-	ht->entries = 0;
-	ht->newbuckets = 0;
-	ht->reusedbuckets = 0;
-	ht->freelist = NULL;
-	ht->lastfree = NULL;
-
-	init_MUTEX (&(ht->hashlock));
-
-	size = ht->size * sizeof (HASHBUCKET);
-	ht->buckets = (HASHBUCKET *) ocfs_malloc (size);
-	if (!ht->buckets) {
-		LOG_ERROR_ARGS ("unable to allocate %u bytes of memory", size);
-		goto bail;
-	}
-
-	memset (ht->buckets, 0, (ht->size * sizeof (HASHBUCKET)));
-	ret = 1;
-
-bail:
-	LOG_EXIT_INT (ret);
-	return ret;
-}				/* ocfs_hash_create */
-
-/*
- * ocfs_hash_destroy()
- *
- * @ht: ptr to the hash table
- * @freefn: if not null, uses function to free bucket->val
- *
- */
-void ocfs_hash_destroy (HASHTABLE *ht, void (*freefn) (const void *p))
-{
-	HASHBUCKET *bucket;
-	HASHBUCKET *nxtbucket;
-	__u32 slot;
-
-	LOG_ENTRY ();
-
-	if (!ht || !ht->buckets)
-		goto bail;
-
-	if (ht->buckets) {
-		for (slot = 0; slot < ht->size; slot++) {
-			if (freefn) {
-				bucket = &(ht->buckets[slot]);
-				if (bucket->key && bucket->val)
-					freefn (bucket->val);
-			}
-
-			bucket = ht->buckets[slot].next;
-			while (bucket) {
-				if (freefn && bucket->key && bucket->val)
-					freefn (bucket->val);
-				nxtbucket = bucket->next;
-				ocfs_safefree (bucket);
-				bucket = nxtbucket;
-			}
-		}
-	}
-
-	bucket = ht->freelist;
-	while (bucket) {
-		nxtbucket = bucket->next;
-		ocfs_safefree (bucket);
-		bucket = nxtbucket;
-	}
-
-	ocfs_safefree (ht->buckets);
-	ht->buckets = NULL;
-
-bail:
-	LOG_EXIT ();
-	return;
-}				/* ocfs_hash_destroy */
-
-/*
- * ocfs_hash_add()
- *
- * @ht: ptr to the hash table
- * @key: key
- * @keylen: length of key
- * @val: value
- * @vallen: length of value
- *
- */
-int ocfs_hash_add (HASHTABLE * ht, void *key, __u32 keylen, void *val, __u32 vallen, void **found, __u32 *foundlen)
-{
-	HASHBUCKET *bucket;
-	HASHBUCKET *prvbucket = NULL;
-	HASHBUCKET *lastbucket;
-	__u32 slot;
-	int ret = 1;
-	int lockacqrd = false;
-
-	LOG_ENTRY ();
-
-	if (!ht || !ht->buckets) {
-		ret = 0;
-		goto bail;
-	}
-
-	*found = NULL;
-	*foundlen = 0;
-
-	slot = hash (key, keylen, ht->inithash) & ht->mask;
-	bucket = &(ht->buckets[slot]);
-
-	/* Acquire Lock */
-	down (&(ht->hashlock));
-	lockacqrd = true;
-
-	while (bucket) {
-		if (bucket->key) {
-			if (!memcmp (bucket->key, key, keylen)) {
-				/* return warning & val if key already exists */
-				LOG_TRACE_STR ("Duplicate key");
-				*found = bucket->val;
-				*foundlen = bucket->vallen;
-				ret = 2;
-				goto bail;
-			}
-		} else {
-			/* Fill the empty bucket */
-			bucket->key = key;
-			bucket->keylen = keylen;
-			bucket->val = val;
-			bucket->vallen = vallen;
-
-			/* Increment the number of entries */
-			ht->entries++;
-			ret = 1;
-			goto bail;
-		}
-		prvbucket = bucket;
-		bucket = bucket->next;
-	}
-
-	/* Save the last bucket for this slot */
-	lastbucket = prvbucket;
-
-	/* Check if any bucket in freelist ... */
-	if (ht->freelist) {
-		/* ... if so, attach it to the end of the slot list ... */
-		lastbucket->next = bucket = ht->freelist;
-
-		/* ... and detach it from the freelist */
-		if (ht->lastfree == ht->freelist)
-			ht->freelist = ht->lastfree = NULL;
-		else
-			ht->freelist = ht->freelist->next;
-
-		/* Fill the empty bucket */
-		bucket->key = key;
-		bucket->keylen = keylen;
-		bucket->val = val;
-		bucket->vallen = vallen;
-		bucket->next = NULL;
-		ht->reusedbuckets++;
-
-		/* Increment the number of entries */
-		ht->entries++;
-		ret = 1;
-		goto bail;
-	}
-
-	/* Create a new bucket and add to the end of list */
-	if ((bucket = (HASHBUCKET *) ocfs_malloc (sizeof (HASHBUCKET))) == NULL) {
-		LOG_ERROR_ARGS ("unable to allocate %u bytes of memory",
-				(unsigned int)sizeof (HASHBUCKET));
-		ret = 0;
-		goto bail;
-	}
-
-	bucket->key = key;
-	bucket->keylen = keylen;
-	bucket->val = val;
-	bucket->vallen = vallen;
-	bucket->next = NULL;
-	lastbucket->next = bucket;
-	ht->newbuckets++;
-
-	/* Increment the number of entries */
-	ht->entries++;
-
-bail:
-	/* Release Lock */
-	if (lockacqrd)
-		up(&(ht->hashlock));
-
-	LOG_EXIT_INT (ret);
-	return ret;
-}				/* ocfs_hash_add */
-
-/*
- * ocfs_hash_del()
- *
- * @ht: ptr to hash table
- * @key: key to be deleted
- * @keylen: length of key
- *
- */
-int ocfs_hash_del (HASHTABLE * ht, void *key, __u32 keylen)
-{
-	HASHBUCKET *bucket;
-	HASHBUCKET *prvbucket = NULL;
-	__u32 slot;
-	int ret = 0;
-	int lockacqrd = false;
-
-	LOG_ENTRY ();
-
-	if (!ht || !ht->buckets)
-		goto bail;
-
-	slot = hash (key, keylen, ht->inithash) & ht->mask;
-	bucket = &(ht->buckets[slot]);
-
-	/* Acquire Lock */
-	down (&(ht->hashlock));
-	lockacqrd = true;
-
-	while (bucket) {
-		if (bucket->key) {
-			if (!memcmp (bucket->key, key, keylen)) {
-				/* Found it */
-				if (!prvbucket) {
-					/* If first bucket, clear it */
-					bucket->key = NULL;
-				} else {
-					/* If not first bucket, detach the bucket from list ... */
-					prvbucket->next = bucket->next;
-
-					/* ... clear it ... */
-					bucket->key = NULL;
-					bucket->next = NULL;
-
-					/* ... and attach to the end of the free list */
-					if (ht->lastfree) {
-						ht->lastfree->next = bucket;
-						ht->lastfree = bucket;
-					} else {
-						ht->lastfree = ht->freelist =
-						    bucket;
-					}
-				}
-				/* Decrement the number of entries and exit */
-				ht->entries--;
-				ret = 1;
-				goto bail;
-			}
-		}
-		prvbucket = bucket;
-		bucket = bucket->next;
-	}
-
-bail:
-	/* Release Lock */
-	if (lockacqrd)
-		up (&(ht->hashlock));
-
-	LOG_EXIT_INT (ret);
-	return ret;
-}				/* ocfs_hash_del */
-
-/*
- * ocfs_hash_get()
- *
- */
-int ocfs_hash_get (HASHTABLE * ht, void *key, __u32 keylen, void **val, __u32 * vallen)
-{
-	HASHBUCKET *bucket;
-	__u32 slot;
-	int ret = 0;
-	int lockacqrd = false;
-
-	LOG_ENTRY ();
-
-	if (!ht || !ht->buckets)
-		goto bail;
-
-	slot = hash (key, keylen, ht->inithash) & ht->mask;
-	bucket = &(ht->buckets[slot]);
-
-	/* Acquire Lock */
-	down (&(ht->hashlock));
-	lockacqrd = true;
-
-	while (bucket) {
-		if (bucket->key) {
-			if (!memcmp (bucket->key, key, keylen)) {
-				/* found it */
-				*val = bucket->val;
-				*vallen = bucket->vallen;
-				ret = 1;
-				goto bail;
-			}
-		}
-		bucket = bucket->next;
-	}
-
-bail:
-	/* Release Lock */
-	if (lockacqrd)
-		up (&(ht->hashlock));
-
-	LOG_EXIT_INT (ret);
-	return ret;
-}				/* ocfs_hash_get */
-
-/*
- * ocfs_hash_stat()
- *
- */
-void ocfs_hash_stat (HASHTABLE * ht, char *data, __u32 datalen)
-{
-	HASHBUCKET *bucket;
-	__u32 slot;
-	__u32 i;
-	char *p;
-	__u32 len = 0;
-	__u32 stats[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-	int lockacqrd = false;
-
-	LOG_ENTRY ();
-
-	if (!ht || !ht->buckets)
-		goto bail;
-
-	if (!data || !datalen)
-		goto bail;
-
-	/* Acquire Lock */
-	down (&(ht->hashlock));
-	lockacqrd = true;
-
-	for (slot = 0; slot < ht->size; ++slot) {
-		bucket = &(ht->buckets[slot]);
-		i = 0;
-
-		while (bucket) {
-			if (bucket->key)
-				++i;
-			bucket = bucket->next;
-		}
-
-		if (i < 9)
-			stats[i]++;
-		else
-			stats[9]++;
-	}
-
-	for (i = 0, p = data; i < 10; ++i, p += len)
-		len = sprintf (p, "%2u: %u\n", i, stats[i]);
-
-	sprintf (p, "New: %u, Reused: %u\n", ht->newbuckets, ht->reusedbuckets);
-
-	data[datalen - 1] = '\0';
-
-bail:
-	/* Release Lock */
-	if (lockacqrd)
-		up (&(ht->hashlock));
-
-	LOG_EXIT ();
-	return;
-}				/* ocfs_hash_stat */
-
-/*
- * --------------------------------------------------------------------
- * hash() -- hash a variable-length key into a 32-bit value
- *   k       : the key (the unaligned variable-length array of bytes)
- *   len     : the length of the key, counting by bytes
- *   initval : can be any 4-byte value
- *
- * Returns a 32-bit value.  Every bit of the key affects every bit of
- * the return value.  Every 1-bit and 2-bit delta achieves avalanche.
- * About 6*len+35 instructions.
- *
- * The best hash table sizes are powers of 2.  There is no need to do
- * mod a prime (mod is sooo slow!).  If you need less than 32 bits,
- * use a bitmask.  For example, if you need only 10 bits, do
- * h = (h & hashmask(10));
- * In which case, the hash table should have hashsize(10) elements.
- *
- * If you are hashing n strings (__u8 **)k, do it like this:
- * for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
- *
- * By Bob Jenkins, 1996.  bob_jenkins at burtleburtle.net.  You may use this
- * code any way you wish, private, educational, or commercial.  It's free.
- *
- * See http://burtleburtle.net/bob/hash/evahash.html
- * Use for hash table lookup, or anything where one collision in 2^^32 is
- * acceptable.  Do NOT use for cryptographic purposes.
- * --------------------------------------------------------------------
- */
-__u32 hash (register __u8 *k, register __u32 length, register __u32 initval) 
-{
-	register __u32 a, b, c, len;
-
-	/* Set up the internal state */
-	len = length;
-	a = b = 0x9e3779b9;	/* the golden ratio; an arbitrary value */
-	c = initval;		/* the previous hash value */
-
-   /*---------------------------------------- handle most of the key */
-	while (len >= 12) {
-		a += (k[0] + ((__u32) k[1] << 8) + ((__u32) k[2] << 16) +
-		      ((__u32) k[3] << 24));
-		b += (k[4] + ((__u32) k[5] << 8) + ((__u32) k[6] << 16) +
-		      ((__u32) k[7] << 24));
-		c += (k[8] + ((__u32) k[9] << 8) + ((__u32) k[10] << 16) +
-		      ((__u32) k[11] << 24));
-		mix (a, b, c);
-		k += 12;
-		len -= 12;
-	}
-
-   /*------------------------------------- handle the last 11 bytes */
-	c += length;
-	switch (len) {		/* all the case statements fall through */
-	    case 11:
-		    c += ((__u32) k[10] << 24);
-	    case 10:
-		    c += ((__u32) k[9] << 16);
-	    case 9:
-		    c += ((__u32) k[8] << 8);
-		    /* the first byte of c is reserved for the length */
-	    case 8:
-		    b += ((__u32) k[7] << 24);
-	    case 7:
-		    b += ((__u32) k[6] << 16);
-	    case 6:
-		    b += ((__u32) k[5] << 8);
-	    case 5:
-		    b += k[4];
-	    case 4:
-		    a += ((__u32) k[3] << 24);
-	    case 3:
-		    a += ((__u32) k[2] << 16);
-	    case 2:
-		    a += ((__u32) k[1] << 8);
-	    case 1:
-		    a += k[0];
-		    /* case 0: nothing left to add */
-	}
-	mix (a, b, c);
-   /*-------------------------------------------- report the result */
-	return c;
-}				/* hash */
-
-
-
-
 /* bh semaphore hashtable stuff */
 
 
@@ -1314,7 +721,7 @@
 	return;
 } /* ocfs_inode_hash_destroy */
 
-#define OCFS_INODE_HASH(h, off) ((off / 512) % (h->size))
+#define OCFS_INODE_HASH(h, off) ((__u32)(off >> 9) % (h->size))
 
 /*
  * __ocfs_inode_hash_lookup()

Modified: trunk/src/inc/journal.h
===================================================================
--- trunk/src/inc/journal.h	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/inc/journal.h	2004-05-04 23:27:54 UTC (rev 890)
@@ -33,10 +33,8 @@
 
 #undef 	OCFS_JOURNAL_USE_CB
 
-struct _ocfs_lock_res;
 struct _ocfs_super;
 struct _ocfs_file_entry;
-struct _ocfs_lock_res;
 struct _ocfs_journal_handle;
 
 /* most of the ocfs_journal structure is protected by the
@@ -64,7 +62,6 @@
 					       * from (recovery,
 					       * etc)                     */
 	__u32                     node_num;   /* Whose journal are we?    */
-	struct _ocfs_lock_res     *lock_res;  /* Journal file lock        */
 	struct buffer_head        *lockbh;    /* Journal disk lock, used 
 						 to access file entry	  */
 	atomic_t                  num_trans;  /* Number of transactions 
@@ -90,7 +87,6 @@
 struct _ocfs_journal_lock {
 	__u32 type;
 	__u32 flags;
-	struct _ocfs_lock_res * res;
 	struct buffer_head *bh;
 	struct inode *inode;
 	struct list_head lock_list;
@@ -269,9 +265,7 @@
  *                          until after a transaction has been completed. Use
  *                          ocfs_journal_add_lock to indicate that a lock needs
  *                          to be released at the end of that handle. Locks 
- *                          will be released in the order that they are added, 
- *                          and afterwards the lockres will be passed to
- *                          ocfs_put_lockres.
+ *                          will be released in the order that they are added. 
  */
 /* You must always start_trans with a number of buffs > 0, but it's
  * perfectly legal to go through an entire transaction without having
@@ -318,7 +312,6 @@
 					struct buffer_head *bh);
 void                 ocfs_journal_add_lock(ocfs_journal_handle *handle, 
 					   __u32 type, __u32 flags, 
-					   struct _ocfs_lock_res *lockres, 
 					   struct buffer_head *bh, 
 					   struct inode *inode);
 

Modified: trunk/src/inc/ocfs.h
===================================================================
--- trunk/src/inc/ocfs.h	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/inc/ocfs.h	2004-05-04 23:27:54 UTC (rev 890)
@@ -131,7 +131,8 @@
 enum {
 	INVALID_REQUEST,      // reply with a NO vote
 	UPDATE_OIN_INODE,     // update both oin and inode
-	DELETE_RENAME,        // delete or rename request (EX)
+	DELETE_RENAME_ACQUIRE,// delete or rename acquire request
+	DELETE_RENAME_RELEASE,// delete or rename release request
 	RELEASE_CACHE,        // release a cache lock I hold
 	CHANGE_MASTER,        // request to change master to requestor
 	ADD_OIN_MAP,          // add requestor into oin map
@@ -607,6 +608,7 @@
                 (((__u64)buf % OCFS_SECTOR_SIZE) ?    \
                  (OCFS_SECTOR_SIZE - ((__u64)buf % OCFS_SECTOR_SIZE)):0))
 
+
 #define  OCFS_ALIGN(val, align)        \
                ((__u64)val  +            \
                 (((__u64)val % align) ? (align - ((__u64)val % align)): 0))
@@ -741,106 +743,19 @@
 
 /* lockres macros */
 #ifdef OCFS_MEM_DBG
-#define ocfs_allocate_clean_buffer_list()  (ocfs_extent *)ocfs_dbg_slab_alloc( \
-						OcfsGlobalCtxt.ocfs_clean_buffer_list, \
-						__FILE__, __LINE__)
-#define ocfs_free_clean_buffer_list(cbl)   ocfs_dbg_slab_free( \
-						OcfsGlobalCtxt.ocfs_clean_buffer_list, cbl)
-
-
 #define ocfs_allocate_extent_entry()  (ocfs_extent *)ocfs_dbg_slab_alloc( \
                                                     OcfsGlobalCtxt.extent_cache, \
                                                     __FILE__, __LINE__)
 #define ocfs_free_extent_entry(ext)   ocfs_dbg_slab_free( \
                                                     OcfsGlobalCtxt.extent_cache, ext)
-
-#define ocfs_allocate_lockres()						\
-({									\
-	ocfs_lock_res *_l = NULL;					\
-	 _l = (ocfs_lock_res *)ocfs_dbg_slab_alloc 			\
-	 	(OcfsGlobalCtxt.lockres_cache, __FILE__, __LINE__);	\
-	if (_l)	atomic_inc (&(OcfsGlobalCtxt.cnt_lockres));		\
-	_l;								\
-})
-
-#define ocfs_free_lockres(_r)						\
-do {									\
-	ocfs_dbg_slab_free (OcfsGlobalCtxt.lockres_cache, _r);		\
-	atomic_dec (&(OcfsGlobalCtxt.cnt_lockres));			\
-} while (0)
-
 #else  /* !OCFS_MEM_DBG */
 
-#define ocfs_allocate_clean_buffer_list()  (ocfs_extent *)kmem_cache_alloc( \
-						OcfsGlobalCtxt.ocfs_clean_buffer_list, GFP_NOFS)
-#define ocfs_free_clean_buffer_list(cbl)   kmem_cache_free(OcfsGlobalCtxt.ocfs_clean_buffer_list, cbl)
-
 #define ocfs_allocate_extent_entry()  (ocfs_extent *)kmem_cache_alloc ( \
                                                     OcfsGlobalCtxt.extent_cache, GFP_NOFS)
 #define ocfs_free_extent_entry(ext)   kmem_cache_free(OcfsGlobalCtxt.extent_cache, ext)
 
-#define ocfs_allocate_lockres()						\
-({									\
- 	ocfs_lock_res *_l = NULL;					\
-	_l = (ocfs_lock_res *)kmem_cache_alloc				\
-			(OcfsGlobalCtxt.lockres_cache, GFP_NOFS);	\
-	if (_l)	atomic_inc (&(OcfsGlobalCtxt.cnt_lockres));		\
-	_l;								\
-})
-
-#define ocfs_free_lockres(_r)						\
-do {									\
-	kmem_cache_free (OcfsGlobalCtxt.lockres_cache, _r);		\
-	atomic_dec (&(OcfsGlobalCtxt.cnt_lockres));			\
-} while (0)
-
 #endif
 
-#define _ocfs_get_lockres(_r)					\
-do {								\
-	if (_r) 						\
-		atomic_inc(&((_r)->lr_ref_cnt));		\
-} while (0)
-
-#define _ocfs_put_lockres(_r)					\
-do {								\
-	if (_r) {						\
-		if (atomic_dec_and_test(&((_r)->lr_ref_cnt))) 	\
-			ocfs_free_lockres(_r);			\
-	}							\
-} while (0)
-
-#ifdef OCFS_DBG_LOCKRES
-#define ocfs_get_lockres(_r)					\
-do {								\
-	if (_r) {						\
-		printk("(%d) get: 0x%08x, %d, %s, %d\n", 	\
-		       ocfs_getpid(), (_r),			\
-		       atomic_read(&((_r)->lr_ref_cnt)) + 1,	\
-		       __FUNCTION__, __LINE__);			\
-		_ocfs_get_lockres(_r);				\
-	} else							\
-		printk("(%d) get: null, -1, %s, %d\n",		\
-		       ocfs_getpid(), __FUNCTION__, __LINE__);	\
-} while (0)
-
-#define ocfs_put_lockres(_r)					\
-do {								\
-	if (_r) {						\
-		printk("(%d) put: 0x%08x, %d, %s, %d\n",	\
-		       ocfs_getpid(), (_r),			\
-		       atomic_read(&((_r)->lr_ref_cnt)) - 1,	\
-		       __FUNCTION__, __LINE__);			\
-		_ocfs_put_lockres(_r);				\
-	} else							\
-		printk("(%d) put: null, -1, %s, %d\n",		\
-		       ocfs_getpid(), __FUNCTION__, __LINE__);	\
-} while (0)
-#else	/* !OCFS_DBG_LOCKRES */
-#define ocfs_get_lockres(_r)		_ocfs_get_lockres(_r)
-#define	ocfs_put_lockres(_r)		_ocfs_put_lockres(_r)
-#endif
-
 /* ofile macros */
 #ifdef OCFS_MEM_DBG
 #define ocfs_allocate_ofile(flag)    ((ocfs_file *)({ \
@@ -929,8 +844,6 @@
 #define hashsize(n)             ((__u32)1<<(n))
 #define hashmask(n)             (hashsize(n)-1)
 
-#define HASHTABLE_DESTROYED(h)  (((HASHTABLE *)h)->buckets==NULL)
-
 /*
  * --------------------------------------------------------------------
  * mix -- mix 3 32-bit values reversibly.
@@ -1095,6 +1008,7 @@
 #define OCFS_DEBUG_CONTEXT_SUPER       0x00400000	/* super.c    */
 #define OCFS_DEBUG_CONTEXT_UTIL        0x00800000	/* util.c     */
 #define OCFS_DEBUG_CONTEXT_VOTE        0x01000000	/* vote.c     */
+#define OCFS_DEBUG_CONTEXT_LOCKRES     0x02000000	/* lockres.c  */
 
 
 #ifdef OCFS_DBG_TIMING
@@ -1358,6 +1272,7 @@
 #define DLOCK_FLAG_SEQ_NUM     (0x4)
 #define DLOCK_FLAG_MASTER      (0x8)
 #define DLOCK_FLAG_LAST_UPDATE (0x10)
+#define DLOCK_FLAG_ADD_SELF    (0x20)
 #define DLOCK_FLAG_ALL         (DLOCK_FLAG_OPEN_MAP | DLOCK_FLAG_LOCK | \
                                 DLOCK_FLAG_SEQ_NUM | DLOCK_FLAG_MASTER | \
                                 DLOCK_FLAG_LAST_UPDATE)
@@ -1397,39 +1312,6 @@
 
 /* =========================================================== */
 
-typedef struct _ocfs_clean_buffer_list ocfs_clean_buffer_list;
-
-struct _ocfs_clean_buffer_list
-{
-	unsigned long blocknr[BLOCKS_PER_CLEAN_LIST-1];
-	struct _ocfs_clean_buffer_list *next;
-};
-
-typedef struct _HASHBUCKET
-{
-	__u32 keylen;
-	__u32 vallen;
-	void *key;
-	void *val;
-	struct _HASHBUCKET *next;
-}
-HASHBUCKET;
-
-typedef struct
-{
-	__u32 size;
-	__u32 mask;
-	__u32 entries;
-	__u32 inithash;
-	__u32 newbuckets;		/* Used for statistics */
-	__u32 reusedbuckets;	/* Used for statistics */
-	struct semaphore hashlock;
-	HASHBUCKET *lastfree;
-	HASHBUCKET *freelist;
-	HASHBUCKET *buckets;
-}
-HASHTABLE;
-
 enum {
 	OCFS_BH_SEM_GOT_LOCK,
 	OCFS_BH_SEM_WAIT_ON_MODIFY,
@@ -1678,7 +1560,6 @@
 /* XXX: fields that can go if we move this to the inode private */
 struct _ocfs_lock_res
 {
-	__u32 signature;	// XXX
 	__u32 master_node_num;	/* Master Node */
 	__u32 lock_state;
 	__u32 lock_holders;
@@ -1691,7 +1572,6 @@
 	__u64 readonly_map;
 	__u64 oin_openmap;
 	__u64 last_upd_seq_num;
-	__u64 sector_num;	// XXX
 };
 
 /* OCFS2 Inode Private Data
@@ -1717,7 +1597,6 @@
 	bool              needs_verification;
 	__u64             chng_seq_num;
 	ocfs_extent_map   map;
-	ocfs_lock_res    *lock_res;
 	__s64             alloc_size;
 	__u32             oin_flags;
 
@@ -1729,6 +1608,8 @@
 
 	atomic_t          i_clean_buffer_seq;
 	__u32             flags; /* see below */
+
+	ocfs_lock_res     i_lockres;
 } ocfs_inode_private;
 
 /* Eventually, the 'flags' and 'oin_flags' fields need to be
@@ -1778,6 +1659,9 @@
 
 #define GET_INODE_FEOFF(i) OCFS_I(i)->feoff
 
+#warning take this out when all the lockres stuff checks out
+#define GET_INODE_LOCKRES(i) ({ if (i==NULL) BUG(); (&(OCFS_I(i)->i_lockres)); })
+
 typedef enum _ocfs_vol_state
 {
 	VOLUME_DISABLED,
@@ -1912,7 +1796,6 @@
 	__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 */
-	HASHTABLE root_sect_node;	/* lockres->sector_num hash */
 	struct list_head cache_lock_list;
 	struct super_block *sb;
 	struct inode *root_inode;
@@ -1928,6 +1811,10 @@
 	__u8 hbm;
 	__u32 hbt;
 	__u32 sect_size;
+	__u32 sect_size_bits;
+	__u32 cluster_size_bits;
+	__u32 dir_alloc_bits;
+	__u32 file_alloc_bits;
 	bool needs_flush;
 
 	ocfs_alloc_bm cluster_bitmap;
@@ -2003,7 +1890,6 @@
 	kmem_cache_t *inode_cache;
 	kmem_cache_t *ofile_cache;
 	kmem_cache_t *fe_cache;
-	kmem_cache_t *lockres_cache;
 	kmem_cache_t *extent_cache;
 	kmem_cache_t *bh_sem_cache;
 	kmem_cache_t *inum_cache;
@@ -2020,7 +1906,6 @@
 #ifdef OCFS_LINUX_MEM_DEBUG
         struct list_head item_list;
 #endif
-	atomic_t cnt_lockres;		/* count of allocated lockres */
 	struct list_head *bh_sem_hash;
 	spinlock_t bh_sem_hash_lock;
 	int bh_sem_hash_sz;
@@ -2311,7 +2196,6 @@
 	spinlock_t lock;
 	__u32 vote_state;
 	__u32 req_lock_type;
-	__u32 old_lock_type;
 	__u32 vote_status;
 	__u64 req_vote_map;
 	__u64 got_vote_map;
@@ -2603,9 +2487,7 @@
 }
 ocfs_timeout;
 
-#define ocfs_acquire_lockres(a)         ocfs_acquire_lockres_ex(a, 0)
 
-
 #define __ocfs_wait(wq, condition, timeo, ret)			\
 do {								\
 	ocfs_timeout __to;					\
@@ -2683,6 +2565,30 @@
 	return ret;
 }
 
+static inline int ocfs_is_local_cache_lock(ocfs_super *osb, struct inode *inode)
+{
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
+	if (lockres->lock_type == OCFS_DLM_ENABLE_CACHE_LOCK &&
+	    lockres->master_node_num == osb->node_num)
+		return 1;
+	return 0;
+}
+
+static inline int ocfs_get_right_shift_bits(int num)
+{
+	int i, ret;
+
+	ret = 0;
+	for (i=0; i<32; i++) {
+		if (1 << i == num) {
+			ret = i;
+			break;
+		}
+	}
+	return ret;
+}
+
+
 #define ocfs_trace(p) do { printk("Trace in %s line %d called from [<%lx>]\n", __FILE__, __LINE__, __builtin_return_address(0) ); ocfs_show_trace(NULL); } while (0)
 
 #include "proto.h"

Modified: trunk/src/inc/proto.h
===================================================================
--- trunk/src/inc/proto.h	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/inc/proto.h	2004-05-04 23:27:54 UTC (rev 890)
@@ -28,7 +28,6 @@
 #define _PROTO_H_
 
 int ocfs_allocate_extent (ocfs_super * osb, struct buffer_head *fe_bh, ocfs_journal_handle *handle,__u64 actualDiskOffset, __u64 actualLength, struct inode *inode);
-int ocfs_kill_this_tree(ocfs_super *osb, struct buffer_head *extent_grp_bh, ocfs_journal_handle *handle, struct inode *inode);
 int ocfs_free_extents_for_truncate (ocfs_super * osb, ocfs_file_entry * FileEntry, ocfs_journal_handle *handle, struct inode *inode);
 int ocfs_lookup_file_allocation (ocfs_super * osb, __s64 Vbo, __s64 * Lbo, __u32 sectors, u32 *sector_count, struct inode *inode);
 int ocfs_get_leaf_extent (ocfs_super * osb, ocfs_file_entry * FileEntry, __s64 Vbo, struct buffer_head **data_extent_bh, struct inode *inode);
@@ -46,17 +45,21 @@
 int ocfs_wait_for_disk_lock_release (ocfs_super * osb, __u64 offset, __u32 time_to_wait, __u32 lock_type);
 int ocfs_disk_reset_voting (ocfs_super * osb, __u64 lock_id, __u32 lock_type);
 void ocfs_init_dlm_msg (ocfs_super * osb, ocfs_dlm_msg * dlm_msg, __u32 msg_len, __u32 type);
-int ocfs_acquire_lockres_ex (ocfs_lock_res * lockres, __u32 timeout);
+
+int ocfs_update_lockres (ocfs_super * osb, __u64 lock_id, struct buffer_head **bh, __u32 * updated, __u32 timeout, struct inode *inode, bool reread);
+int ocfs_acquire_lockres (ocfs_lock_res * lockres, __u32 timeout);
 void ocfs_release_lockres (ocfs_lock_res * lockres);
-void ocfs_init_lockres (ocfs_super * osb, ocfs_lock_res * lockres, __u64 lock_id);
-int ocfs_create_update_lock (ocfs_super * osb, __u64 lock_id, __u32 flags, bool new_file, struct inode *inode, ocfs_journal_handle *handle);
-int ocfs_acquire_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type,
-		   __u32 flags, ocfs_lock_res **ret_lockres, struct buffer_head **bh, struct inode *inode);
-int ocfs_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_lock_res * lockres, struct buffer_head *bh, struct inode *inode);
+void ocfs_init_lockres (ocfs_super * osb, struct inode *inode);
+int ocfs_acquire_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, struct buffer_head **bh, struct inode *inode);
+int ocfs_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, struct buffer_head *bh, struct inode *inode);
+
+int new_lock_function(ocfs_super * osb, __u32 requested_lock, __u32 flags, struct buffer_head *bh, bool *disk_vote, struct inode *inode);
 void ocfs_process_one_vote_reply(ocfs_super *osb, ocfs_vote_reply_ctxt *ctxt, __u32 node_num);
 int ocfs_break_cache_lock_zap_buffers(ocfs_super * osb, struct inode * inode);
-int ocfs_send_readonly_drop_message(ocfs_super *osb, ocfs_lock_res *lockres, __u64 vote_map, struct inode *inode);
 void ocfs_compute_dlm_stats(int status, int vote_status, ocfs_dlm_stats *stats);
+int ocfs_update_disk_lock (ocfs_super * osb, __u32 flags, struct buffer_head **bh, struct inode *inode, ocfs_journal_handle *handle);
+int ocfs_wait_for_lock_release (ocfs_super * osb, __u64 offset, __u32 time_to_wait, __u32 lock_type, struct inode *inode);
+int ocfs_update_master_on_open (ocfs_super * osb, struct inode *inode, ocfs_journal_handle *handle);
 
 int ocfs_extend_system_file (ocfs_super * osb, __u32 FileId, __u64 FileSize, struct buffer_head *fe_bh, ocfs_journal_handle *handle, bool zero);
 
@@ -70,11 +73,7 @@
 bool ocfs_add_extent_map_entry (ocfs_super * osb, ocfs_extent_map * Map, __s64 Vbo, __s64 Lbo, __u64 ByteCount);
 
 
-int ocfs_insert_sector_node (ocfs_super * osb, ocfs_lock_res * lockres, ocfs_lock_res ** found_lockres);
-int ocfs_lookup_sector_node (ocfs_super * osb, __u64 lock_id, ocfs_lock_res ** lockres);
-void ocfs_remove_sector_node (ocfs_super * osb, ocfs_lock_res * lockres);
 
-
 int ocfs_file_open (struct inode *inode, struct file *file);
 int ocfs_file_release (struct inode *inode, struct file *file);
 int ocfs_flush (struct file *file);
@@ -108,12 +107,6 @@
 int ocfs_submit_vol_metadata(ocfs_super *osb, ocfs_offset_map *map_buf, __u32 num);
 int ocfs_commit_thread(void *arg);
 
-int ocfs_hash_create (HASHTABLE *ht, __u32 noofbits);
-void ocfs_hash_destroy (HASHTABLE *ht, void (*freefn) (const void *p));
-int ocfs_hash_del (HASHTABLE * ht, void *key, __u32 keylen);
-int ocfs_hash_get (HASHTABLE * ht, void *key, __u32 keylen, void **val, __u32 * vallen);
-int ocfs_hash_add (HASHTABLE * ht, void *key, __u32 keylen, void *val, __u32 vallen, void **found, __u32 *foundlen);
-void ocfs_hash_stat (HASHTABLE * ht, char *data, __u32 datalen);
 int ocfs_bh_sem_hash_init(void);
 int ocfs_bh_sem_hash_destroy(void);
 int ocfs_bh_sem_hash_prune(void);
@@ -198,14 +191,14 @@
 void ocfs_update_publish_map (ocfs_super * osb, struct buffer_head *bhs[], bool first_time);
 
 
-int ocfs_send_dlm_request_msg (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_lock_res * lockres, __u64 vote_map, struct inode *inode, int *vote_status);
+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_recv_thread (void *unused);
 int ocfs_volume_thread (void *arg);
 int ocfs_init_udp_sock (struct socket **send_sock, struct socket **recv_sock);
 int ocfs_recv_udp_msg (ocfs_recv_ctxt * recv_ctxt);
 int ocfs_send_dismount_msg (ocfs_super * osb, __u64 vote_map);
 int ocfs_send_vote_reply (ocfs_super * osb, ocfs_dlm_msg * dlm_msg, __u32 vote_status, bool inode_open);
-int ocfs_drop_readonly_cache_lock(ocfs_super *osb, ocfs_lock_res *lockres, struct inode *inode);
+int ocfs_drop_readonly_cache_lock(ocfs_super *osb, struct inode *inode, bool yield);
 
 
 void ocfs_initialize_bitmap (ocfs_alloc_bm * bitmap, __u32 validbits, __u32 allocbits);
@@ -272,12 +265,10 @@
 int ocfs_remove_file (ocfs_super * osb, struct buffer_head *febh, struct buffer_head *lockbh, ocfs_journal_handle *handle, struct inode *dir_inode, struct inode *file_inode);
 
 int ocfs_send_bcast (ocfs_super * osb, __u64 votemap, ocfs_dlm_msg * dlm_msg);
-int ocfs_process_update_inode_request (ocfs_super * osb, __u64 lock_id, ocfs_lock_res * lockres, __u32 node_num);
 
 
 void ocfs_recover_oin_locks(ocfs_super *osb, __u32 node_num);
 int ocfs_process_vote (ocfs_super * osb, ocfs_vote_request_ctxt *ctxt);
-int ocfs_find_update_res (ocfs_super * osb, __u64 lock_id, ocfs_lock_res ** lockres, struct buffer_head **bh, __u32 * updated, __u32 timeout, struct inode *inode);
 void ocfs_inc_inode_seq(ocfs_super *osb, struct inode *inode, bool sync_buffers);
 
 

Modified: trunk/src/inode.c
===================================================================
--- trunk/src/inode.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/inode.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -586,10 +586,11 @@
 	struct super_block *sb;
 	ocfs_super *osb;
 	umode_t mode;
-	__u64 voteoff;
+	__u64 voteoff = 0ULL;
 	ocfs_file_entry *fe = NULL;
 	struct buffer_head *bh = NULL;
 	int status;
+	bool sysfile = false, skip_bind = false;
 
 	LOG_ENTRY_ARGS ("(0x%p, 0x%p)\n", inode, args);
 
@@ -602,12 +603,11 @@
 	if (inode->i_ino == OCFS_ROOT_INODE_NUMBER) {
 		ocfs_read_inode_nofe(osb, inode, 
 				     osb->vol_layout.root_start_off);
-
 		/* should I set the sysfile flag or not? */
-		OCFS_SET_FLAG(OCFS_I(inode)->flags, OCFS_INODE_SYSFILE);
-
-		ocfs_inode_hash_bind(osb, GET_INODE_VOTEOFF(inode), inode);
-		goto bail;
+		sysfile = true;
+		skip_bind = false;
+		voteoff = GET_INODE_VOTEOFF(inode);
+		goto skip_fe;
 	}
 
 	if (!args) {
@@ -617,6 +617,8 @@
 	}
 
 	voteoff = args->voteoff;
+	sysfile = (args->flags & OCFS_FIND_INODE_FLAG_SYSFILE);
+	skip_bind = args->skip_bind;
 
 	if (args->flags & OCFS_FIND_INODE_FLAG_NOFE) {
 		ocfs_read_inode_nofe(osb, inode, args->voteoff);
@@ -675,11 +677,13 @@
 		BUG();
 
 skip_fe:
-	if (args->flags & OCFS_FIND_INODE_FLAG_SYSFILE)
+	if (sysfile)
 		OCFS_SET_FLAG(OCFS_I(inode)->flags, OCFS_INODE_SYSFILE);
 
-	if (!args->skip_bind)
+	if (!skip_bind)
 		ocfs_inode_hash_bind(osb, voteoff, inode);
+	
+	ocfs_init_lockres (osb, inode);
 
 bail:
 	if (fe)
@@ -816,7 +820,6 @@
 {
 	__u64 offset = 0;
 	ocfs_super *osb;
-	ocfs_lock_res *lockres = NULL;
 
 	LOG_ENTRY();
 
@@ -858,15 +861,6 @@
 		goto bail;
 	}
 
-	lockres = OCFS_I(inode)->lock_res;
-	if (lockres) {
-		ocfs_acquire_lockres (lockres);
-		ocfs_release_lockres (lockres);
-		OCFS_I(inode)->lock_res = NULL;
-		ocfs_put_lockres (lockres);
-		lockres = NULL;
-	}
-
 	ocfs_extent_map_destroy (&OCFS_I(inode)->map);
 	ocfs_extent_map_init (&OCFS_I(inode)->map);
 
@@ -877,16 +871,6 @@
 	/* clean out the inode private ... why?! */
 	memset(inode->u.generic_ip, 0, sizeof(ocfs_inode_private));
 
-	if (!ocfs_lookup_sector_node (osb, offset, &lockres)) {
-		if (lockres) {
-			ocfs_remove_sector_node (osb, lockres);
-			ocfs_put_lockres(lockres);
-		} else
-			LOG_TRACE_STR ("lockres in hash is null");
-	} else {
-		LOG_TRACE_STR("hashtable has already been destroyed.");
-	}
-
 bail:
 	if (inode && inode->u.generic_ip) {
 		kmem_cache_free(OcfsGlobalCtxt.inode_cache, 

Modified: trunk/src/journal.c
===================================================================
--- trunk/src/journal.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/journal.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -219,7 +219,6 @@
 	int status = 0;
 	int tmpstat;
 	struct list_head *p, *n;
-	__u64 id;
 
 	LOG_ENTRY();
 
@@ -233,27 +232,25 @@
 	list_for_each_safe(p, n, &(handle->locks)) {
 		lock = list_entry(p, ocfs_journal_lock, lock_list);
 
-		id = lock->res->sector_num;
-
 		/* The file may have been deleted before we got to
 		 * this lock release. If so, just skip it. 
 		 * *** This test of the deleted flag is not locked!!! */
 		if ((!lock->inode)
 		    || (lock->inode && !INODE_DELETED(lock->inode))) {
 
-			tmpstat = ocfs_release_lock(osb, lock->res->sector_num,
+			tmpstat = ocfs_release_lock(osb, 
+						    GET_INODE_VOTEOFF(lock->inode),
 						    lock->type, 
-						    lock->flags, lock->res, 
+						    lock->flags, 
 						    (abort ? NULL : lock->bh), 
 						    lock->inode);
 			if (tmpstat < 0) {
 				LOG_ERROR_ARGS("Could not release lock: "
-					       "%llu\n", id);
+					       "%llu\n", GET_INODE_VOTEOFF(lock->inode));
 				LOG_ERROR_STATUS(tmpstat);
 				status = tmpstat;
 			}
 		}
-		ocfs_put_lockres(lock->res);
 		if (lock->bh != NULL)
 			brelse(lock->bh);
 		if (lock->inode)
@@ -777,15 +774,12 @@
 /* We are expecting to be run on the current running transaction, so
  * we use the spin_lock here. You really shouldn't be calling this on
  * other transactions anyway... */
-void ocfs_journal_add_lock(ocfs_journal_handle *handle, __u32 type, 
-			   __u32 flags, struct _ocfs_lock_res *lockres, 
+void ocfs_journal_add_lock(ocfs_journal_handle *handle, __u32 type, __u32 flags, 
 			   struct buffer_head *bh, struct inode *inode) 
 {
 	ocfs_journal_lock *lock;
 
-	LOG_ENTRY_ARGS("(id=%llu, type=%u, flags=%u, res=0x%p, " 
-		       "bh=0x%p)\n", lockres->sector_num, type, flags, 
-		       lockres, bh);
+	LOG_ENTRY_ARGS("(id=%u, type=%u, flags=%u, bh=%p)\n", bh->b_blocknr, type, flags, bh);
 
 	lock = ocfs_malloc(sizeof(ocfs_journal_lock));
 	if (lock == NULL) {
@@ -797,7 +791,6 @@
 
 	lock->type  = type;
 	lock->flags = flags;
-	lock->res   = lockres;
 	lock->bh    = bh;
 	lock->inode = inode;
 
@@ -825,7 +818,6 @@
 	struct inode *inode = NULL; /* the journal inode */
 	journal_t * k_journal = NULL;
 	ocfs_file_entry *fe = NULL;
-	ocfs_lock_res *lockres = NULL;
 	__u32 journal_file_id = 0;
 	__u64 lock_id = 0;
 	struct buffer_head *bh = NULL;
@@ -864,7 +856,7 @@
 
 	/* TODO: Use another type of lock. */
 	status = ocfs_acquire_lock (osb, lock_id, OCFS_DLM_EXCLUSIVE_LOCK,
-				    FLAG_FILE_CREATE, &lockres, &bh, inode);
+				    FLAG_FILE_CREATE, &bh, inode);
 	if (status < 0) {
 		if (status != -EINTR)
 			LOG_ERROR_STR("Could not get lock on journal!");
@@ -908,7 +900,11 @@
 	/* we just changed this but extend_system_file doesn't know
 	 * about oins, so we update alloc_size ourselves. */
 	OCFS_I(inode)->alloc_size = alloc_size;
-	status = ocfs_create_update_lock(osb, lock_id, 0, false, inode, NULL);
+
+	/* add this node to openmap and update disk lock */
+	status = ocfs_update_disk_lock (osb, 
+					DLOCK_FLAG_OPEN_MAP|DLOCK_FLAG_ADD_SELF, 
+					&bh, inode, NULL);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto done;
@@ -937,14 +933,12 @@
 	osb->journal.k_inode = inode;
 	osb->journal.version = OCFS_JOURNAL_CURRENT_VERSION;
 	osb->journal.lockbh = bh;
-	osb->journal.lock_res = lockres;
 	osb->journal.lock_id = lock_id;
 	atomic_set(&(osb->journal.num_trans), 0);
 	osb->journal.state = OCFS_JOURNAL_LOADED;
 	status = 0;
 done:
 	if (status < 0) {
-		ocfs_put_lockres (lockres);
 		if (bh != NULL) {
 			if (fe)
 				OCFS_BH_PUT_DATA(bh);
@@ -1021,14 +1015,13 @@
 	/* unlock our journal */
 	status = ocfs_release_lock (osb, journal->lock_id,
 				    OCFS_DLM_EXCLUSIVE_LOCK,
-				    FLAG_FILE_CREATE, journal->lock_res,
+				    FLAG_FILE_CREATE, 
 				    journal->lockbh, inode);
 	if (status < 0)
 		LOG_ERROR_STATUS (status);
 	
 	brelse (journal->lockbh);
 	journal->lockbh = NULL;
-	ocfs_put_lockres (journal->lock_res);
 
 	journal->state = OCFS_JOURNAL_FREE;
 
@@ -1230,9 +1223,8 @@
 	struct buffer_head **bhs = NULL;
 
 	LOG_ENTRY();
+	totalblks = size >> osb->sect_size_bits;
 
-	totalblks = size / osb->sect_size;
-
 	/* Ok, allocate the maximum number of blocks we'll possibly
 	 * need. This is heavy, but it doesn't happen often. If need
 	 * be, we can change things to allocate a little memory at a
@@ -1378,13 +1370,12 @@
 	int status = -1;
 	__u64 lock_id = 0;
 	__u32 journal_file_id = 0;
-	ocfs_lock_res *lockres = NULL;
 	ocfs_file_entry *fe = NULL;
 	struct inode *inode = NULL;
 	journal_t *k_journal = NULL;
 	struct buffer_head *bh = NULL;
 	ocfs_journal * journal = NULL;
-	bool recovery_lock = false;
+	bool recovery_lock = false, got_lock = false;
 	__u64 alloc_size;
 
 	LOG_ENTRY_ARGS("(node_num=%d, osb->node_num = %d)\n", node_num,
@@ -1435,7 +1426,7 @@
 	status = ocfs_acquire_lock (osb, lock_id, 
 				    OCFS_DLM_EXCLUSIVE_LOCK,
 				    FLAG_FILE_CREATE|FLAG_FILE_RECOVERY, 
-				    &lockres, &bh, inode);
+				    &bh, inode);
 	if (status < 0) {
 		LOG_TRACE_ARGS("status returned from acquire_lock=%d\n", 
 			       status);
@@ -1443,6 +1434,7 @@
 			LOG_ERROR_STR("Could not lock journal!");
 		goto done;
 	}
+	got_lock = true;
 
 	/* check if that nodes publish sector has been reset (mounted
 	 * is set false) if so, we can unlock and quit. otherwise we
@@ -1459,11 +1451,14 @@
 	/* gonna need this later */
 	alloc_size = fe->alloc_size;
 	OCFS_BH_PUT_DATA(bh);
-
 	fe = NULL;
 
 	OCFS_I(inode)->alloc_size = alloc_size;
-	status = ocfs_create_update_lock(osb, lock_id, 0, false, inode, NULL);
+
+	/* add this node to openmap and update disk lock */
+	status = ocfs_update_disk_lock (osb, 
+					DLOCK_FLAG_OPEN_MAP|DLOCK_FLAG_ADD_SELF, 
+					&bh, inode, NULL);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto done;
@@ -1529,20 +1524,17 @@
 		up(&(osb->recovery_lock));
 
 	/* drop the lock on this nodes journal */
-	if (lockres)
+	if (got_lock)
 		status = ocfs_release_lock(osb, lock_id, 
 					   OCFS_DLM_EXCLUSIVE_LOCK, 
 					   FLAG_FILE_CREATE|FLAG_FILE_RECOVERY,
-					   lockres, bh, inode);
+					   bh, inode);
 	if (inode)
 		iput(inode);
 
 	if (bh)
 		brelse(bh);
 
-	if (lockres)
-		ocfs_put_lockres (lockres);
-
 	atomic_dec(&osb->num_recovery_threads);
 
 	LOG_EXIT_STATUS(status);

Added: trunk/src/lockres.c
===================================================================
--- trunk/src/lockres.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/lockres.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -0,0 +1,231 @@
+/*
+ * lockres.c
+ *
+ * lock resource handling
+ *
+ * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 021110-1307, USA.
+ *
+ * Authors: Kurt Hackel, Mark Fasheh, Sunil Mushran, Wim Coekaerts,
+ *	    Manish Singh, Neeraj Goyal, Suchit Kaura
+ */
+
+#include "inc/ocfs.h"
+
+/* Tracing */
+#define OCFS_DEBUG_CONTEXT      OCFS_DEBUG_CONTEXT_LOCKRES
+
+
+
+
+/*
+ * ocfs_update_lockres()
+ *
+ * @osb: ocfs super block for the volume
+ * @fe: corresponding file entry
+ * @updated: set to 1 if lockres is refreshed from disk
+ *
+ * the lockres is refreshed from the disk.
+ *
+ * Returns 0 if success, < 0 if error.
+ */
+int ocfs_update_lockres (ocfs_super * osb, __u64 lock_id, struct buffer_head **bh, __u32 * updated, __u32 timeout, struct inode *inode, bool reread)
+{
+	int status = 0;
+	struct buffer_head *tmpbh = NULL, **b = NULL;
+	ocfs_file_entry *fe;
+	int flags;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
+
+	LOG_ENTRY_ARGS ("(0x%08x, %llu, 0x%08x, 0x%08x, 0x%08x)\n", osb,
+			lock_id, lockres, bh, updated);
+
+	b = (bh == NULL) ? &tmpbh : bh;
+
+	if (reread) {
+		flags = OCFS_NONCACHED(osb, lock_id) ? 0 : 
+		  	lockres->master_node_num == osb->node_num ? 
+		    	OCFS_BH_CACHED : 0;	
+		status = ocfs_read_bh(osb, lock_id, b, flags, inode);
+		if (status < 0) {
+			LOG_ERROR_STATUS (status);
+			goto finally;
+		}
+	}
+
+	if (lockres->master_node_num != osb->node_num || !reread) {
+		status = ocfs_acquire_lockres (lockres, timeout); // ocfs_file_open ocfs_symlink ocfs_acquire_lock ocfs_process_vote ocfs_dentry_revalidate ocfs_file_write ocfs_file_read ocfs_setattr ocfs_getattr ocfs_direct_IO_get_blocks ocfs_rename
+		if (status < 0) {
+			LOG_TRACE_ARGS ("Timedout locking lockres for id: %llu\n",
+					GET_INODE_VOTEOFF(inode));
+			goto finally;
+		}
+
+		fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_READ(*b); /* read */
+		lockres->lock_type = DISK_LOCK_FILE_LOCK (fe);
+		lockres->master_node_num = DISK_LOCK_CURRENT_MASTER (fe);
+		lockres->oin_openmap = DISK_LOCK_OIN_MAP (fe);
+
+		if (lockres->readonly_node != OCFS_INVALID_NODE_NUM &&
+    	    	    lockres->readonly_node != lockres->master_node_num) {
+			LOG_ERROR_ARGS("no longer readonly! ronode=%d, master=%d, lockid=%llu\n",
+					lockres->readonly_node, lockres->master_node_num,
+					GET_INODE_VOTEOFF(inode));
+			lockres->readonly_node = OCFS_INVALID_NODE_NUM;
+		}
+
+		OCFS_BH_PUT_DATA(*b);
+
+		ocfs_release_lockres (lockres); // ocfs_file_open ocfs_symlink ocfs_acquire_lock ocfs_process_vote ocfs_dentry_revalidate ocfs_file_write ocfs_file_read ocfs_setattr ocfs_getattr ocfs_direct_IO_get_blocks ocfs_rename
+
+		if (updated)
+			*updated = 1;
+	}
+
+finally:
+	if (status < 0) {
+		if (status != -ETIMEDOUT) {
+			LOG_ERROR_STR ("Disabling Volume");
+			osb->vol_state = VOLUME_DISABLED;
+		}
+	}
+
+	if (tmpbh)
+		brelse(tmpbh);
+
+	LOG_EXIT_STATUS (status);
+	return status;
+}				/* ocfs_find_update_res */
+
+/*
+ * ocfs_acquire_lockres()
+ *
+ * @lockres: lockres to acquire
+ * @timeout: timeout in ms, 0 == no timeout
+ */
+int ocfs_acquire_lockres (ocfs_lock_res * lockres, __u32 timeout)
+{
+	int mypid;
+	unsigned long jif = 0;
+	int status = 0;
+	int cnt = 0;
+
+	LOG_ENTRY_ARGS ("(0x%08x, %d)\n", lockres, timeout);
+
+	mypid = ocfs_getpid ();
+
+	if (timeout)
+		jif = jiffies + (timeout * HZ / 1000);
+
+	while (1) {
+		spin_lock (&lockres->lock_mutex);
+
+		if (lockres->in_use) {
+			if (lockres->thread_id != mypid) {
+				spin_unlock (&lockres->lock_mutex);
+				if (jif && jif < jiffies) {
+					LOG_TRACE_ARGS ("lockpid=%d, newpid=%d,"
+						" timedout\n",
+						lockres->thread_id, mypid);
+					status = -ETIMEDOUT;
+					goto bail;
+				}
+
+				if (++cnt == 10) {
+					LOG_TRACE_ARGS ("lockpid=%d, newpid=%d\n",
+						lockres->thread_id, mypid);
+					cnt = 0;
+				}
+				ocfs_sleep (OCFS_NM_HEARTBEAT_TIME / 10);
+			}
+			else {
+				printk("lockres in_use=%d, pid=%d, mypid=%d\n", lockres->in_use, lockres->thread_id, mypid);
+				BUG();
+				lockres->in_use++;
+				spin_unlock (&lockres->lock_mutex);
+				break;
+			}
+		} else {
+			lockres->in_use = 1;
+			lockres->thread_id = mypid;
+			spin_unlock (&lockres->lock_mutex);
+			break;
+		}
+	}
+
+bail:
+	LOG_EXIT_STATUS (status);
+	return status;
+}				/* ocfs_acquire_lockres */
+
+/*
+ * ocfs_release_lockres()
+ *
+ */
+void ocfs_release_lockres (ocfs_lock_res * lockres)
+{
+	LOG_ENTRY_ARGS ("(0x%08x)\n", lockres);
+
+	spin_lock (&lockres->lock_mutex);
+	if (lockres->in_use == 0) {
+		LOG_ERROR_ARGS("Releasing lockres with inuse 0: 0x%08x\n", lockres);
+		BUG();
+	} else {
+		if (lockres->thread_id != current->pid)
+			LOG_ERROR_ARGS("PID %d is trying to release lockres held by PID %d\n", 
+				       current->pid, lockres->thread_id);
+		lockres->in_use--;
+		if (lockres->in_use == 0) {
+			lockres->thread_id = 0;
+		}
+	}
+	spin_unlock (&lockres->lock_mutex);
+
+	LOG_EXIT ();
+	return;
+}				/* ocfs_release_lockres */
+
+
+/*
+ * ocfs_init_lockres()
+ *
+ */
+void ocfs_init_lockres (ocfs_super * osb, struct inode *inode)
+{
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
+
+	LOG_ENTRY_ARGS ("(0x%08x, 0x%08x)\n", osb, lockres);
+
+	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;
+	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;
+	lockres->readonly_node = OCFS_INVALID_NODE_NUM;
+
+	lockres->lock_holders = 0;
+	LOG_TRACE_ARGS("lockres->lock_holders = %u\n", lockres->lock_holders);
+
+	LOG_EXIT ();
+	return;
+}				/* ocfs_init_lockres */

Modified: trunk/src/namei.c
===================================================================
--- trunk/src/namei.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/namei.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -40,10 +40,10 @@
 			     struct inode *inode);
 static int ocfs_double_lock(ocfs_super *osb, ocfs_journal_handle *handle,
 			    __u64 id1, __u32 type1, __u32 flags1, 
-			    ocfs_lock_res **res1, struct buffer_head **bh1,
+			    struct buffer_head **bh1,
 		     	    struct inode *inode1,
 			    __u64 id2, __u32 type2, __u32 flags2, 
-			    ocfs_lock_res **res2, struct buffer_head **bh2,
+			    struct buffer_head **bh2,
 		     	    struct inode *inode2);
 static int ocfs_fix_extent_pointers(ocfs_super *osb, 
 				    ocfs_journal_handle *handle,
@@ -127,7 +127,6 @@
 	__u64 parent_off;
 	__u64 file_off = 0;
 	__u64 dirnode_off;
-	ocfs_lock_res *lockres = NULL;
 	ocfs_journal_handle *handle = NULL;
 	ocfs_super *osb;
 	ocfs_file_entry *fe = NULL;
@@ -174,7 +173,7 @@
 	status = ocfs_acquire_lock (osb, parent_off, 
 				    OCFS_DLM_ENABLE_CACHE_LOCK,
 				    FLAG_FILE_CREATE | FLAG_DIR, 
-				    &lockres, &lock_bh, dir);
+				    &lock_bh, dir);
 	if (status < 0) {
 		if (status != -EINTR)
 			LOG_ERROR_STATUS (status);
@@ -183,8 +182,7 @@
 
 	/* Ok, we got the lock -- we'd better add it to our transaction */
 	ocfs_journal_add_lock(handle, OCFS_DLM_ENABLE_CACHE_LOCK, 
-			      FLAG_FILE_CREATE | FLAG_DIR, lockres, lock_bh, 
-			      dir);
+			      FLAG_FILE_CREATE | FLAG_DIR, lock_bh, dir);
 
 	/* do the real work now. */
 	status = ocfs_mknod_locked(osb, dir, dentry, mode, dev, lock_bh, 
@@ -210,33 +208,10 @@
 	OCFS_BH_PUT_DATA(new_fe_bh);
 	fe = NULL;
 
-	fe = (ocfs_file_entry *) OCFS_BH_GET_DATA_READ(new_fe_bh); /* read */
+	ocfs_init_lockres (osb, inode);
 
-        /*  Insert the OFile on the OIN list */
-	OCFS_I(inode)->chng_seq_num = DISK_LOCK_SEQNUM (fe);
-
-	if (OCFS_I(inode)->lock_res != NULL) {
-		ocfs_lock_res *tmp_lockres = OCFS_I(inode)->lock_res;
-		ocfs_acquire_lockres(tmp_lockres);
-		tmp_lockres->master_node_num = DISK_LOCK_CURRENT_MASTER (fe);
-		tmp_lockres->lock_type = DISK_LOCK_FILE_LOCK (fe);
-		if (tmp_lockres->readonly_node != OCFS_INVALID_NODE_NUM &&
-	    	    tmp_lockres->readonly_node != tmp_lockres->master_node_num) {
-			LOG_ERROR_ARGS("no longer readonly! ronode=%d, master=%d, lockid=%llu\n",
-					tmp_lockres->readonly_node, tmp_lockres->master_node_num,
-					tmp_lockres->sector_num);
-			tmp_lockres->readonly_node = OCFS_INVALID_NODE_NUM;
-		}
-		ocfs_release_lockres(tmp_lockres);
-	}
-	OCFS_BH_PUT_DATA(new_fe_bh);
-	fe = NULL;
-
-	LOG_TRACE_ARGS("Created inode %lu (voteoff: %llu, "
-		       "feoff: %llu), lockres = %p\n", inode->i_ino, 
-		       GET_INODE_VOTEOFF(inode), 
-		       GET_INODE_FEOFF(inode), OCFS_I(inode)->lock_res);
-
+	status = ocfs_update_lockres (osb, GET_INODE_VOTEOFF(inode), &new_fe_bh, 
+				      NULL, 0, inode, false);
 	d_instantiate (dentry, inode);
 	ocfs_commit_trans(handle);
 
@@ -514,10 +489,9 @@
  */
 int ocfs_unlink (struct inode *dir, struct dentry *dentry)
 {
-	int status, tmpstat;
+	int status;
 	struct inode *inode;
 	int retval = -EBUSY;
-	ocfs_lock_res *lockres;
 	ocfs_super *osb = NULL;
 	__u64 parentOff, fileOff;
 	bool do_release = false;
@@ -588,15 +562,6 @@
 
 	if (do_release)
 	{
-		if (!OCFS_I(inode)->lock_res) {
-			tmpstat = ocfs_lookup_sector_node (osb, fileOff, &lockres);
-			if (tmpstat >= 0 && lockres) {
-				ocfs_remove_sector_node (osb, lockres);
-				ocfs_put_lockres (lockres);
-			} else 
-				LOG_TRACE_STR ("lookup sectornode failed\n");
-                }
-
 		inode->i_nlink--;
 		retval = 0;
 	}
@@ -625,17 +590,16 @@
  */
 static int ocfs_double_lock(ocfs_super *osb, ocfs_journal_handle *handle,
 		     __u64 id1, __u32 type1, __u32 flags1, 
-		     ocfs_lock_res **res1, struct buffer_head **bh1,
+		     struct buffer_head **bh1,
 		     struct inode *inode1,
 		     __u64 id2, __u32 type2, __u32 flags2, 
-		     ocfs_lock_res **res2, struct buffer_head **bh2,
+		     struct buffer_head **bh2,
 		     struct inode *inode2)
 {
 	int status = 0;
 	bool id2_locked = false;
 	__u64 tmpid;
 	__u32 tmptype, tmpflags;
-	ocfs_lock_res **tmpres;
 	struct buffer_head **tmpbh;
 	struct inode *tmpinode;
 
@@ -646,7 +610,6 @@
 		*bh1 = NULL;
 	if (*bh2)
 		*bh2 = NULL;
-	*res1 = *res2 = NULL;
 
 	/* we always want to lock the one with the lower lockid first. */
 	if (id1 != id2) {
@@ -665,10 +628,6 @@
 			flags2 = flags1;
 			flags1 = tmpflags;
 
-			tmpres = res2;
-			res2 = res1;
-			res1 = tmpres;
-
 			tmpbh = bh2;
 			bh2 = bh1;
 			bh1 = tmpbh;
@@ -678,7 +637,7 @@
 			inode1 = tmpinode;
 		}
 		/* lock id2 */
-		status = ocfs_acquire_lock(osb, id2, type2, flags2, res2, bh2, inode2);
+		status = ocfs_acquire_lock(osb, id2, type2, flags2, bh2, inode2);
 		if (status < 0) {
 			LOG_ERROR_STATUS (status);
 			goto bail;
@@ -687,7 +646,7 @@
 	}
 	/* lock id1 */
 	status = ocfs_acquire_lock(osb, id1, type1, flags1, 
-				   res1, bh1, inode1);
+				   bh1, inode1);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
 		goto bail;
@@ -697,9 +656,7 @@
 	if (status < 0) {
 		if (id2_locked) {
 			status = ocfs_release_lock(osb, id2, type2, flags2, 
-						   *res2, *bh2, inode2);
-			ocfs_put_lockres(*res2);
-			*res2 = NULL;
+						   *bh2, inode2);
 			if (bh2) {
 				brelse(*bh2);
 				*bh2 = NULL;
@@ -708,8 +665,8 @@
 	} else if (handle) {
 		if (id2_locked)
 			ocfs_journal_add_lock(handle, type2, flags2, 
-					      *res2, *bh2, inode2);
-		ocfs_journal_add_lock(handle, type1, flags1, *res1, *bh1, 
+					      *bh2, inode2);
+		ocfs_journal_add_lock(handle, type1, flags1, *bh1, 
 				      inode1);
 	}
 
@@ -812,15 +769,10 @@
 	return(status);
 }
 
-static int ocfs_ugly_rename_lockres(ocfs_super *osb, __u64 oldoff, 
-				    __u64 newoff, ocfs_lock_res *lockres);
+static int ocfs_ugly_rename_thingy(ocfs_super *osb, __u64 oldoff, __u64 newoff);
 
-/* this assumes that lockres is already hashed! */
-static int ocfs_ugly_rename_lockres(ocfs_super *osb, __u64 oldoff, 
-				    __u64 newoff, ocfs_lock_res *lockres)
+static int ocfs_ugly_rename_thingy(ocfs_super *osb, __u64 oldoff, __u64 newoff)
 {
-	ocfs_lock_res *dest_lockres = NULL;
-	ocfs_lock_res *found_lockres = NULL;
 	int status = 0;
 	ocfs_journal *journal = &osb->journal;
 	ocfs_journal_handle *handle=NULL;
@@ -829,49 +781,6 @@
 
 	LOG_ENTRY();
 
-	if (!lockres)
-		goto bail;
-
-	ocfs_get_lockres(lockres);
-
-	/* lookup the destination 1st: 
-	 * We may be renaming on top of another file
-	 * and that files lockres is still in the
-	 * hash. Delete it now. */
-	status = ocfs_lookup_sector_node (osb, newoff, &dest_lockres);
-
-	if (dest_lockres) {
-			printk("ocfs2: old lockres = 0x%p, "
-			       "dest_lockres = 0x%p!\n", lockres, 
-			       dest_lockres);
-			/* this message is a warning that the line below is
-			 * not to be put in a released version of ocfs. ITS
-			 * BUGGY! */
-			ocfs_remove_sector_node (osb, dest_lockres);
-			ocfs_put_lockres(dest_lockres);
-			dest_lockres = NULL;
-	}
-
-	/* ok, now remove our own lockres from the hash. */
-	ocfs_remove_sector_node (osb, lockres);
-
-	/* change the value. */
-	ocfs_acquire_lockres(lockres);
-	lockres->sector_num = newoff;
-	ocfs_release_lockres(lockres);
-
-	/* and rehash it. */
-	status = ocfs_insert_sector_node(osb, lockres, &found_lockres);
-	if (status < 0) {
-		LOG_ERROR_STATUS(status);
-		goto bail;
-	}
-	if (found_lockres) {
-		LOG_ERROR_STR("Damn, we raced insert!");
-		
-		BUG();
-	}
-
 	/* and now for an ugly journal hack! */
 	down(&journal->commit_sem);
 	list_for_each(tmp1, &(journal->commited)) {
@@ -890,8 +799,6 @@
 
 	up(&journal->commit_sem);
 bail:
-	ocfs_put_lockres(lockres);
-
 	LOG_EXIT_STATUS(status);
 	return(status);
 }
@@ -918,10 +825,6 @@
 	ocfs_bitmap_free_head *free_head = NULL;
 	ocfs_journal_handle *handle = NULL;
 	__u32 dir_lock_flags = FLAG_FILE_CREATE | FLAG_DIR;
-	ocfs_lock_res * old_dir_lockres = NULL;
-	ocfs_lock_res * new_dir_lockres = NULL;
-	ocfs_lock_res * oldfe_lockres = NULL;
-	ocfs_lock_res * newfe_lockres = NULL;
 	struct buffer_head *old_dir_bh = NULL;
 	struct buffer_head *new_dir_bh = NULL;
 	__u32 oldfe_flags = 0;
@@ -929,6 +832,7 @@
 	__u32 newfe_flags = 0;
 	__u32 newfe_lockid = 0;
 	int needs_trunc = 0;
+	bool got_oldlock = false, got_newlock = false;
 
 	LOG_ENTRY_ARGS ("(0x%p, 0x%p, 0x%p, 0x%p, from='%*s' to='%*s')\n",
 			old_dir, old_dentry, new_dir, new_dentry,
@@ -1015,10 +919,10 @@
 	/* if old and new are the same, this'll just do one lock. */
 	status = ocfs_double_lock(osb, handle, 
 				  oldDirOff, OCFS_DLM_EXCLUSIVE_LOCK, 
-				  dir_lock_flags, &old_dir_lockres, 
+				  dir_lock_flags,
 				  &old_dir_bh, old_dir,
 				  newDirOff, OCFS_DLM_EXCLUSIVE_LOCK, 
-				  dir_lock_flags, &new_dir_lockres, 
+				  dir_lock_flags,
 				  &new_dir_bh, new_dir);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -1048,11 +952,12 @@
 		oldfe_flags |= FLAG_FILE_RENAME;
 
 	status = ocfs_acquire_lock(osb, oldfe_lockid, OCFS_DLM_EXCLUSIVE_LOCK,
-				   oldfe_flags, &oldfe_lockres, NULL, old_inode);
+				   oldfe_flags, NULL, old_inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto finally;
 	}
+	got_oldlock = true;
 
 	/* check if the target already exists (in which case we need
 	 * to delete it */
@@ -1091,12 +996,13 @@
 
 		status = ocfs_acquire_lock(osb, newfe_lockid, 
 					   OCFS_DLM_EXCLUSIVE_LOCK, 
-					   newfe_flags, &newfe_lockres, NULL, 
+					   newfe_flags, NULL, 
 					   new_inode);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
 			goto finally;
 		}
+		got_newlock = true;
 
 		status = ocfs_fe_smash (osb, newDirOff, 0, 
 					tmpoff, handle, new_dentry,
@@ -1188,10 +1094,9 @@
 			       tmpfe->this_sector);
 
 		/* move the inode offset over to the new entry */
-		status = ocfs_ugly_rename_lockres(osb, 
+		status = ocfs_ugly_rename_thingy(osb, 
 						  GET_INODE_FEOFF(old_inode), 
-						  tmpfe->this_sector, 
-						  oldfe_lockres);
+						  tmpfe->this_sector);
 		if (status < 0) {
 			up(&OCFS_I(old_inode)->priv_sem);
 			up(&old_inode->i_sem);
@@ -1265,18 +1170,16 @@
 	}
 
 bail:
-	if (oldfe_lockres) {
+	if (got_oldlock) {
 		ocfs_release_lock(osb, oldfe_lockid, 
 				  OCFS_DLM_EXCLUSIVE_LOCK, 
-				  oldfe_flags, oldfe_lockres, NULL, old_inode);
-		ocfs_put_lockres(oldfe_lockres);
+				  oldfe_flags, NULL, old_inode);
 	}
 
-	if (newfe_lockres) {
+	if (got_newlock) {
 		ocfs_release_lock(osb, newfe_lockid, 
 				  OCFS_DLM_EXCLUSIVE_LOCK, 
-				  newfe_flags, newfe_lockres, NULL, new_inode);
-		ocfs_put_lockres(newfe_lockres);
+				  newfe_flags, NULL, new_inode);
 	}
 
 	if (new_inode)
@@ -1329,7 +1232,7 @@
 	struct buffer_head *lock_bh = NULL;
 	ocfs_file_entry *fe = NULL;
 	ocfs_journal_handle *handle = NULL;
-	ocfs_lock_res *lockres = NULL;
+	bool got_lock = false;
 
 
 	LOG_ENTRY_ARGS ("(0x%p, 0x%p, symname='%s' actual='%*s')\n", dir, 
@@ -1372,12 +1275,13 @@
 	status = ocfs_acquire_lock (osb, parent_off, 
 				    OCFS_DLM_ENABLE_CACHE_LOCK,
 				    FLAG_FILE_CREATE | FLAG_DIR, 
-				    &lockres, &lock_bh, dir);
+				    &lock_bh, dir);
 	if (status < 0) {
 		if (status != -EINTR)
 			LOG_ERROR_STATUS (status);
 		goto abort_trans;
 	}
+	got_lock = true;
 
 	status = ocfs_mknod_locked(osb, dir, dentry, 
 				  S_IFLNK | S_IRWXUGO, OCFS_NODEV, lock_bh, 
@@ -1411,6 +1315,7 @@
 	inode->i_size = newsize;
 	inode->i_blocks = (newsize + sb->s_blocksize) >> sb->s_blocksize_bits;
 
+	ocfs_init_lockres (osb, inode);
 	status = ocfs_inode_open(osb, new_fe_bh, handle, inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -1437,14 +1342,13 @@
 			LOG_ERROR_STATUS(status);
 	}
 
-	if (lockres != NULL) {
+	if (got_lock) {
 		int tmpstat;
 		tmpstat = ocfs_release_lock (osb, parent_off, OCFS_DLM_ENABLE_CACHE_LOCK,
-		     FLAG_FILE_CREATE | FLAG_DIR, lockres, lock_bh, dir);
+		     FLAG_FILE_CREATE | FLAG_DIR, lock_bh, dir);
 		if (tmpstat < 0)
 			LOG_ERROR_STATUS (tmpstat);
 	}
-	ocfs_put_lockres (lockres);
 
 bail:
 	if (new_fe_bh) {
@@ -1552,7 +1456,7 @@
 
 	/* mark the dirnode as dirty */
 	pLockNode->index_dirty = 1;
-	pLockNode->bad_off = (fe->this_sector - dir_node_ptr) / osb->sect_size;
+	pLockNode->bad_off = (fe->this_sector - dir_node_ptr) >> osb->sect_size_bits;
 	pLockNode->bad_off -= 1;
 	cache_lock = (DISK_LOCK_FILE_LOCK (pLockNode) == OCFS_DLM_ENABLE_CACHE_LOCK);
 
@@ -1641,10 +1545,9 @@
 	__u64 lock_id = 0;
 	struct buffer_head *fe_bh = NULL, *lock_bh = NULL;
 	struct buffer_head *lock_node_bh = NULL; /* parent locknode */
-	ocfs_lock_res *parent_lockres = NULL;
-	ocfs_lock_res *file_lockres = NULL;
 	ocfs_journal_handle *handle = NULL;
 	struct inode *inode = dentry->d_inode;
+	bool got_parent = false, got_file = false;
 
 	LOG_ENTRY ();
 
@@ -1695,12 +1598,13 @@
 	/* lock parent directory, yes we use FLAG_FILE_CREATE even
 	 * though we're deleting ;) */
 	status = ocfs_acquire_lock(osb, lock_node_off, OCFS_DLM_EXCLUSIVE_LOCK,
-				   FLAG_FILE_CREATE|FLAG_DIR, &parent_lockres, 
+				   FLAG_FILE_CREATE|FLAG_DIR,
 				   &lock_node_bh, parent_inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto leave;
 	}
+	got_parent = true;
 
 	/* this will re-read the directory now with the EXCLUSIVE */
 	/* lock already held; it will also return the fe_bh to us */
@@ -1725,12 +1629,13 @@
 	OCFS_BH_PUT_DATA(fe_bh);
 
 	status = ocfs_acquire_lock (osb, lock_id, OCFS_DLM_EXCLUSIVE_LOCK,
-			lockFlags, &file_lockres, &lock_bh, inode);
+			lockFlags, &lock_bh, inode);
 	if (status < 0) {
 		if (status != -EINTR)
 			LOG_ERROR_STATUS (status);
 		goto leave;
 	}
+	got_file = true;
 
 skip_lock:
 	status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
@@ -1856,26 +1761,23 @@
         /* NEW: adding a fake release lock for the dead file entry here */
         /* need this to alert dentry-owners on other nodes */
         /* Release the file lock if we acquired it */
-	if (file_lockres) {
+	if (got_file) {
 		tmpstat = ocfs_release_lock(osb, lock_id, 
 					    OCFS_DLM_EXCLUSIVE_LOCK, 
-					    lockFlags, file_lockres, 
-					    lock_bh, inode);
+					    lockFlags, lock_bh, inode);
 		if (tmpstat < 0)
 			LOG_ERROR_STATUS(tmpstat);
 
-		ocfs_put_lockres (file_lockres);
 	}
 
-	if (parent_lockres) {
+	if (got_parent) {
 		tmpstat = ocfs_release_lock(osb, lock_node_off, 
 					    OCFS_DLM_EXCLUSIVE_LOCK,
 					    FLAG_FILE_CREATE|FLAG_DIR, 
-					    parent_lockres, lock_node_bh, parent_inode);
+					    lock_node_bh, parent_inode);
 		if (tmpstat < 0)
 			LOG_ERROR_STATUS(tmpstat);
 
-		ocfs_put_lockres (parent_lockres);
 	}
 
 	if (lock_bh != NULL && lock_bh != fe_bh)

Modified: trunk/src/nm.c
===================================================================
--- trunk/src/nm.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/nm.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -34,8 +34,7 @@
 struct semaphore recovery_list_sem;
 
 static inline int get_process_vote_action(ocfs_super * osb, ocfs_lock_res *lockres, __u32 node_num, __u32 flags, int status, bool *master_alive, struct inode *inode);
-static int ocfs_disk_update_resource (ocfs_super * osb, ocfs_lock_res * lockres, struct buffer_head **bh, __u32 timeout, struct inode *inode);
-static int ocfs_search_commited(ocfs_super *osb, ocfs_lock_res *lockres);
+static int ocfs_search_commited(ocfs_super *osb, struct inode *inode);
 static int ocfs_schedule_process_vote(ocfs_super *osb, struct buffer_head *bh, int vote_node);
 
 static int _ocfs_drop_readonly_cache_lock(void *arg);
@@ -45,6 +44,7 @@
 	ocfs_super *osb;
 	ocfs_lock_res *lockres;
 	struct inode *inode;
+	bool yield;
 } ocfs_ro_cache_drop_ctxt;
 
 
@@ -54,7 +54,8 @@
 static const char *process_vote_strings[] = {
 	"INVALID_REQUEST",      // reply with a NO vote
 	"UPDATE_OIN_INODE",     // update both oin and inode
-	"DELETE_RENAME",        // delete or rename request (EX)
+	"DELETE_RENAME_ACQUIRE",// delete or rename request
+	"DELETE_RENAME_RELEASE",// delete or rename release request
 	"RELEASE_CACHE",        // release a cache lock I hold
 	"CHANGE_MASTER",        // request to change master to requestor
 	"ADD_OIN_MAP",          // add requestor into oin map
@@ -481,191 +482,13 @@
 	return 0;
 }				/* ocfs_volume_thread */
 
-/*
- * ocfs_disk_update_resource()
- *
- * @osb: ocfs super block for the volume
- * @lockres: lockres to be updated
- * @file_ent: corresponding file entry
- *
- * Updates the in memory lock resource from the disklock info
- * stored in the file entry on disk.
- *
- * Returns 0 if success, < 0 if error.
- */
-static int ocfs_disk_update_resource (ocfs_super * osb, ocfs_lock_res * lockres, struct buffer_head **bh, __u32 timeout, struct inode *inode)
-{
-	int status = 0;
-	ocfs_file_entry *fe;
 
-	LOG_ENTRY_ARGS ("(0x%p, 0x%p, 0x%p)\n", osb, lockres, bh);
-
-	/* Don't sync-read if we already own the lock as it may not
-	 * have hit disk yet. */
-	status = ocfs_read_bh (osb, lockres->sector_num, bh, 
-			       (lockres->master_node_num == osb->node_num) ? 
-			       OCFS_BH_CACHED : 0, inode);
-	if (status < 0) {
-		LOG_ERROR_STATUS (status);
-		goto finally;
-	}
-
-	status = ocfs_acquire_lockres_ex (lockres, timeout);
-	if (status < 0) {
-		LOG_TRACE_ARGS ("Timedout locking lockres for id: %llu\n",
-				lockres->sector_num);
-		goto finally;
-	}
-
-	fe = (ocfs_file_entry *)OCFS_BH_GET_DATA_READ(*bh); /* read */
-	lockres->lock_type = DISK_LOCK_FILE_LOCK (fe);
-	lockres->master_node_num = DISK_LOCK_CURRENT_MASTER (fe);
-	lockres->oin_openmap = DISK_LOCK_OIN_MAP (fe);
-
-	if (lockres->readonly_node != OCFS_INVALID_NODE_NUM &&
-    	    lockres->readonly_node != lockres->master_node_num) {
-		LOG_ERROR_ARGS("no longer readonly! ronode=%d, master=%d, lockid=%llu\n",
-				lockres->readonly_node, lockres->master_node_num,
-				lockres->sector_num);
-		lockres->readonly_node = OCFS_INVALID_NODE_NUM;
-	}
-
-	OCFS_BH_PUT_DATA(*bh);
-
-	ocfs_release_lockres (lockres);
-
-finally:
-	LOG_EXIT_STATUS (status);
-	return status;
-}				/* ocfs_disk_update_resource */
-
-/*
- * ocfs_find_update_res()
- *
- * @osb: ocfs super block for the volume
- * @lock_id: sector number of the resource to be locked
- * @lockres: lockres of the resource
- * @fe: corresponding file entry
- * @updated: set to 1 if lockres is refreshed from disk
- *
- * Searches for the lockres for the given lockid in the hashtable.
- * If not found, it allocates a lockres for the lockid, and adds
- * it to the hashtable. If found and it's master node is not the
- * same as the current node, the lockres is refreshed from the disk.
- *
- * Returns 0 if success, < 0 if error.
- */
-int ocfs_find_update_res (ocfs_super * osb, __u64 lock_id, ocfs_lock_res ** lockres, struct buffer_head **bh, __u32 * updated, __u32 timeout, struct inode *inode)
-{
-	int status = 0;
-	ocfs_lock_res *tmp_lockres = NULL;
-	struct buffer_head *tmpbh = NULL, **b = NULL;
-
-	LOG_ENTRY_ARGS ("(0x%p, %llu, 0x%p, 0x%p, 0x%p)\n", osb,
-			lock_id, lockres, bh, updated);
-
-	if (bh == NULL)
-		b = &tmpbh;
-	else
-		b = bh;
-
-	status = ocfs_lookup_sector_node (osb, lock_id, lockres);
-	if (status < 0) {
-		*lockres = ocfs_allocate_lockres();
-		if (*lockres == NULL) {
-			LOG_ERROR_STATUS (status = -ENOMEM);
-			goto finally;
-		}
-
-		ocfs_init_lockres (osb, *lockres, lock_id);
-
-		ocfs_get_lockres (*lockres);
-
-		status = ocfs_disk_update_resource (osb, *lockres, b, timeout, inode);
-		if (status < 0) {
-			if (status != -ETIMEDOUT) {
-				LOG_ERROR_STR ("Disabling Volume");
-				osb->vol_state = VOLUME_DISABLED;
-			}
-			goto finally;
-		}
-
-		if (lock_id != (*lockres)->sector_num) {
-			LOG_ERROR_STATUS(status = -EFAIL);
-			goto finally;
-		}
-
-		if (updated)
-			*updated = 1;
-
-		status = ocfs_insert_sector_node (osb, *lockres, &tmp_lockres);
-		if (status < 0) {
-			LOG_ERROR_STATUS (status);
-			goto finally;
-		}
-
-		if (!tmp_lockres)
-			goto finally;
-		else {
-			ocfs_put_lockres (*lockres);
-			*lockres = tmp_lockres;
-		}
-	}
-
-	/* sanity checks */
-	if ((*lockres)->signature != 0x55AA) {
-		LOG_ERROR_STATUS(status = -EFAIL);
-		goto finally;
-	}
-
-	if (lock_id != (*lockres)->sector_num) {
-		LOG_ERROR_STATUS(status = -EFAIL);
-		goto finally;
-	}
-
-	/* If we found the lockres in the hash and it's asked for, we still
-	 * need to return a buffer_head */
-	if (status >= 0) {
-		int flags = (OCFS_NONCACHED(osb, (*lockres)->sector_num) ? 
-			     0 : OCFS_BH_CACHED);
-		status = ocfs_read_bh(osb, (*lockres)->sector_num, b, 
-				      flags, NULL);
-		if (status < 0) {
-			LOG_ERROR_STATUS(status);
-			goto finally;
-		}
-	}
-
-	if ((*lockres)->master_node_num != osb->node_num) {
-		status = ocfs_disk_update_resource (osb, *lockres, b, timeout, inode);
-		if (status < 0) {
-			if (status != -ETIMEDOUT) {
-				LOG_ERROR_STR ("Disabling Volume");
-				osb->vol_state = VOLUME_DISABLED;
-			}
-			goto finally;
-		}
-		if (updated)
-			*updated = 1;
-	}
-
-finally:
-	if (status < 0)
-		*lockres = NULL;
-
-	if (tmpbh != NULL)
-		brelse(tmpbh);
-
-	LOG_EXIT_STATUS (status);
-	return status;
-}				/* ocfs_find_update_res */
-
 static inline int get_process_vote_action(ocfs_super * osb, ocfs_lock_res *lockres, __u32 node_num, 
 					  __u32 flags, int status, bool *master_alive, struct inode *inode)
 {
 	int vote_type = INVALID_REQUEST;
 	bool my_node_wins = false;
-	__u64 lockid = lockres ? lockres->sector_num : 0ULL;
+	__u64 lockid = GET_INODE_VOTEOFF(inode);
 	ocfs_vote_obj_lookup_data data;
 
 	LOG_ENTRY_ARGS("(status=%d, lockid=%llu, node_num=%d, flags=%08x)\n", status,
@@ -703,9 +526,14 @@
 		goto done;
 	}
 		
-	if (flags & (FLAG_FILE_DELETE | FLAG_FILE_RENAME))
-		vote_type = DELETE_RENAME;
-	else if (flags & FLAG_FILE_RELEASE_CACHE)
+	if (flags & (FLAG_FILE_DELETE | FLAG_FILE_RENAME)) {
+		if (flags & FLAG_RELEASE_LOCK)
+			vote_type = DELETE_RENAME_RELEASE;
+		else if (flags & FLAG_RELEASE_LOCK)
+			vote_type = DELETE_RENAME_ACQUIRE;
+		else
+			vote_type = INVALID_REQUEST;
+	} else if (flags & FLAG_FILE_RELEASE_CACHE)
 		vote_type = RELEASE_CACHE;
 	else if (flags & FLAG_FILE_UPDATE_OIN) {
 		vote_type = UPDATE_OIN_INODE;
@@ -726,24 +554,19 @@
 		else
 			vote_type = REMASTER_REQUESTOR;
 	}
-done:
-	/* the only allowable action if we failed to */
-	/* get the lockres is a simple inode update */
-	if (status < 0) {
-		LOG_TRACE_STR("(INVALID_REQUEST) (status < 0)");
+	
+	if (inode == NULL && vote_type != DELETE_RENAME_RELEASE)
 		vote_type = INVALID_REQUEST;
-	}
-
+done:
 	LOG_EXIT_STATUS(vote_type);
-
 	return vote_type;
 }
 
 
 /* Search the journals committed transactions list for a given
- * lockres. If it's in there, return true, zero otherwise and -1 on
+ * inode. If it's in there, return true, zero otherwise and -1 on
  * error. Must hold the journal->commit_sem before going here! */
-static int ocfs_search_commited(ocfs_super *osb, ocfs_lock_res *lockres)
+static int ocfs_search_commited(ocfs_super *osb, struct inode *inode)
 {
 	struct list_head *handle_p;
 	struct list_head *lock_p;
@@ -762,12 +585,8 @@
 		list_for_each(lock_p, &(handle->locks)) {
 			lock= list_entry(lock_p, ocfs_journal_lock, lock_list);
 
-			if (lock->res->sector_num == lockres->sector_num) {
+			if (inode == lock->inode) {
 				found = 1;
-
-				if (lock->res != lockres)
-					BUG();
-
 				break;
 			}
 		}
@@ -868,22 +687,25 @@
 		}
 	}
 
-	status = ocfs_find_update_res (osb, lock_id, &lockres, NULL, NULL,
-					(OCFS_NM_HEARTBEAT_TIME/2), inode);
+	if (inode) {
+		lockres = GET_INODE_LOCKRES(inode);
+		status = ocfs_update_lockres (osb, lock_id, NULL, NULL,
+					(OCFS_NM_HEARTBEAT_TIME/2), inode, true);
+	}
 	if (status < 0) {
 		if (status == -ETIMEDOUT)
 			goto leave;
 		LOG_ERROR_STATUS (status);
 	} else {
-		status = ocfs_acquire_lockres_ex (lockres, (OCFS_NM_HEARTBEAT_TIME/2));
+		status = ocfs_acquire_lockres (lockres, (OCFS_NM_HEARTBEAT_TIME/2)); // ocfs_process_vote
 		if (status < 0) {
 			LOG_TRACE_ARGS ("Timedout locking lockres for id: %llu\n",
-				lockres->sector_num);
-			ocfs_put_lockres(lockres);
+				GET_INODE_VOTEOFF(inode));
 			goto leave;
 		}
 	}
 
+	/* fail here if no inode, unless this is a delete/rename release */
 	vote_type = get_process_vote_action(osb, lockres, node_num, flags, 
 					    status, &master_alive, inode);
 
@@ -900,7 +722,7 @@
 	 * data or metadata under the lock.
 	 */
 
-	if (inode && (vote_type != DELETE_RENAME)) {
+	if (inode && (vote_type != DELETE_RENAME_ACQUIRE)) {
 		/* Ok, for all operations where we no longer need
 		 * isem, drop it now. */
 		up(&inode->i_sem);
@@ -941,7 +763,12 @@
 			vote_response = FLAG_VOTE_OIN_UPDATED;
 			break;
 		
-		case DELETE_RENAME:
+		case DELETE_RENAME_RELEASE:
+			/* ACK and done */
+			vote_response = FLAG_VOTE_NODE;
+			break;
+
+		case DELETE_RENAME_ACQUIRE:
 			LOG_TRACE_STR("DELETE_RENAME");
 
 			/* all cases except open_hndl_cnt > 0 will vote YES */
@@ -970,8 +797,7 @@
 					} else {
 						OCFS_SET_FLAG (OCFS_I(inode)->oin_flags, OCFS_OIN_NEEDS_DELETION);
 						up(&(OCFS_I(inode)->priv_sem));
-						ocfs_release_lockres (lockres);
-						ocfs_put_lockres(lockres);
+						ocfs_release_lockres (lockres); // ocfs_process_vote
 						lockres = NULL;
 						oin_sem = false;
 						if (needs_trunc) {
@@ -1090,9 +916,9 @@
 			/* requestor will need to retry if anyone is using the lockres */
 			if (lockres->lock_holders > 0) {
 				LOG_TRACE_ARGS("Lock id (%llu) has %u holders\n", 
-				       lockres->sector_num, lockres->lock_holders);
+				       GET_INODE_VOTEOFF(inode), lockres->lock_holders);
 				down(&(osb->journal.commit_sem));
-				if (ocfs_search_commited(osb, lockres)) {
+				if (ocfs_search_commited(osb, inode)) {
 					// kick the commit thread
 					atomic_set (&osb->flush_event_woken, 1);
 					wake_up (&osb->flush_event);
@@ -1115,14 +941,10 @@
 				lockres->readonly_map &= ~(1 << osb->node_num);
 				if (lockres->readonly_map != 0ULL) {
 					OCFS_ASSERT(lockres->readonly_node == osb->node_num);
-					status = 0;
-					if (!(lockres->lock_state & FLAG_READONLY_DROPPING)) {
-						ocfs_get_lockres(lockres);
-						if (ocfs_drop_readonly_cache_lock(osb, lockres, inode) < 0) {
-							LOG_ERROR_STATUS(status = -ENOMEM);
-							ocfs_put_lockres(lockres);
-						}
-					}
+#warning need to make sure inode is not NULL in process_vote
+					status = ocfs_drop_readonly_cache_lock(osb, inode, true);
+					if (status < 0)
+						LOG_ERROR_STATUS(status);
 					vote_response = FLAG_VOTE_UPDATE_RETRY;
 					break;
 				}
@@ -1391,8 +1213,7 @@
 	}
 
 	if (lockres) {
-		ocfs_release_lockres (lockres);
-		ocfs_put_lockres(lockres);
+		ocfs_release_lockres (lockres); // ocfs_process_vote
 	}
 
 leave:
@@ -1411,6 +1232,7 @@
 }				/* ocfs_process_vote */
 
 
+/* inode is definitely non NULL */
 void ocfs_inc_inode_seq(ocfs_super *osb, struct inode *inode, bool sync_buffers)
 {
 	atomic_t *seq = GET_INODE_CLEAN_SEQ(inode);
@@ -1477,41 +1299,60 @@
 	LOG_EXIT();
 }
 
-int ocfs_drop_readonly_cache_lock(ocfs_super *osb, ocfs_lock_res *lockres, 
-				  struct inode *inode)
+static int _ocfs_drop_readonly_cache_lock_thread(void *arg);
+
+/* inode is definitely non NULL */
+int ocfs_drop_readonly_cache_lock(ocfs_super *osb, struct inode *inode, bool yield)
 {
 	ocfs_ro_cache_drop_ctxt *arg;
+	int status = 0;
+	ocfs_lock_res *lockres = GET_INODE_LOCKRES(inode);
+					
+	if (lockres->lock_state & FLAG_READONLY_DROPPING) {
+		// if coming from process_vote, go about our merry way
+		if (yield)
+			return 0;
+		// if coming from acquire_lock, we are holding the
+		// lockres and the rodrop thread needs it.
+		// return -EAGAIN to drop and try again.
+		return -EAGAIN;
+	}
+
 	arg = kmalloc(sizeof(ocfs_ro_cache_drop_ctxt), GFP_KERNEL);
 	if (arg == NULL) 
 		return -ENOMEM;
 
+	atomic_inc(&inode->i_count);
 	arg->osb = osb;
 	arg->lockres = lockres;
 	arg->inode = inode;
-	if (inode)
-		atomic_inc(&inode->i_count);
+	arg->yield = yield;
 
-	kernel_thread(_ocfs_drop_readonly_cache_lock, (void *) arg,
+	if (yield)
+		kernel_thread(_ocfs_drop_readonly_cache_lock_thread, arg,
 		      CLONE_VM | CLONE_FS | CLONE_FILES);
-	return 0;
+	else 
+		status = _ocfs_drop_readonly_cache_lock(arg);
+		
+	return status;
 }
 
 static int _ocfs_drop_readonly_cache_lock(void *arg)
 {
-	ocfs_ro_cache_drop_ctxt *ctxt = (ocfs_ro_cache_drop_ctxt *)arg;
+	ocfs_ro_cache_drop_ctxt *ctxt = arg;
 	ocfs_super *osb = ctxt->osb;
 	ocfs_lock_res *lockres = ctxt->lockres;
 	struct inode *inode = ctxt->inode;
 	__u64 map;
 	int status = 0;
+	siginfo_t info;
+	bool yield = ctxt->yield;
 
-#define OCFS_DROP_RO_THREAD_NAME   "ocfs2dropro"
+	if (yield) {
+		/* this will wait until process_vote gets to the release */
+		ocfs_acquire_lockres(lockres, 0); // ocfs_process_vote ocfs_acquire_lock
+	}
 
-	ocfs_daemonize (OCFS_DROP_RO_THREAD_NAME, strlen(OCFS_DROP_RO_THREAD_NAME));
-
-	/* this will wait until process_vote gets to the release */
-	ocfs_acquire_lockres(lockres);
-
 	/* check these under the lock */	
 	if (lockres->readonly_node != osb->node_num ||
 	    lockres->master_node_num != osb->node_num ||
@@ -1529,46 +1370,82 @@
 	}
 
 	lockres->lock_state |= FLAG_READONLY_DROPPING;
-	map = lockres->readonly_map;
-	map &= osb->publ_map;      /* remove all dead nodes */
+	lockres->readonly_map &= ~(1 << osb->node_num);  /* remove this node */
 	
 	status = 0;
-	while (map != 0ULL && map != (__u64)(1 << osb->node_num)) {
-		// TODO: need to check all members of the map
-		// in each run thru the loop to see if they died
-		// and eliminate them from the map
+	while (lockres->readonly_map != 0ULL) {
+		bool disk_vote = false;
 
-		/* cannot hold lockres while waiting for vote */
-		/* BUGBUGBUG!!! MUST hold lockres while waiting BUGBUGBUG!!! */
-#warning MUST FIX THIS WRONG WRONG WRONG
-		ocfs_release_lockres(lockres);
-
-		status = ocfs_send_readonly_drop_message(osb, lockres, map, 
-							 inode);
-		if (status >= 0) {
-			ocfs_acquire_lockres(lockres);
-			break;
-		} else if (status != -EAGAIN) {
-			LOG_ERROR_STATUS (status);
-			ocfs_acquire_lockres(lockres);
-			break;
+		lockres->readonly_map &= osb->publ_map;      /* remove all dead nodes */
+		status = new_lock_function(osb, OCFS_DLM_ENABLE_CACHE_LOCK, FLAG_DROP_READONLY, 
+					   NULL, &disk_vote, inode);
+		if (status == -EAGAIN) {
+			status = 0;
+			if (yield) {
+				/* from nm thread, give some time to waiters */
+				ocfs_release_lockres(lockres); // ocfs_process_vote ocfs_acquire_lock
+				ocfs_acquire_lockres(lockres, 0); // ocfs_process_vote ocfs_acquire_lock
+			}
+			continue;
 		}
-
-		/* yes, disgusting.  need a waitqueue on lockres */
-		ocfs_sleep (OCFS_NM_HEARTBEAT_TIME / 10);
-		ocfs_acquire_lockres(lockres);
-		map = lockres->readonly_map;
-		map &= osb->publ_map;      /* remove all dead nodes */
+		if (status < 0)
+			LOG_ERROR_STATUS (status);
+		break;
 	}
-	if (status >= 0)
-		lockres->readonly_map = 0ULL;
+					
+	if (lockres->readonly_map == 0ULL && 
+	    lockres->readonly_node == osb->node_num)
+		lockres->readonly_node = OCFS_INVALID_NODE_NUM;
+
 	lockres->lock_state &= ~FLAG_READONLY_DROPPING;
 
 leave:
-	ocfs_release_lockres(lockres);
-	ocfs_put_lockres(lockres);
+	if (yield)
+		ocfs_release_lockres(lockres); // ocfs_process_vote ocfs_acquire_lock
+
 	if (inode)
 		iput(inode);
 	kfree(arg);
+
 	return status;
 }
+
+static int _ocfs_drop_readonly_cache_lock_thread(void *arg)
+{
+	int status = 0;
+	siginfo_t info;
+
+#define OCFS_DROP_RO_THREAD_NAME   "ocfs2dropro"
+
+	ocfs_daemonize (OCFS_DROP_RO_THREAD_NAME, strlen(OCFS_DROP_RO_THREAD_NAME));
+	status = _ocfs_drop_readonly_cache_lock(arg);
+
+	/* this should all just be in some common function as
+	 * it's totally duplicated. */
+	if (signal_pending(current)) {
+		/* ignore the actual signal */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+		dequeue_signal_lock(current, &current->blocked, &info);
+#else
+#ifdef HAVE_NPTL
+		spin_lock_irq (&current->sighand->siglock);
+		dequeue_signal(&current->blocked, &info);
+		spin_unlock_irq(&current->sighand->siglock);
+#else 
+		spin_lock_irq(&current->sigmask_lock);
+		dequeue_signal(&current->blocked, &info);
+		spin_unlock_irq(&current->sigmask_lock);
+#endif /* !HAVE_NPTL */
+#endif /* 2.4.x kernel */
+	}
+
+        /* Flush all scheduled tasks */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+        flush_scheduled_work ();
+#else
+        flush_scheduled_tasks ();
+#endif
+
+#warning   need a way to wait on all of these threads on dismount
+	return status;
+}

Modified: trunk/src/oin.c
===================================================================
--- trunk/src/oin.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/oin.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -38,12 +38,10 @@
 	int status = 0;
 	struct buffer_head *fe_bh = NULL;
 	ocfs_file_entry *fe = NULL;
-	ocfs_lock_res *lockres;
         struct list_head *iter;
         struct list_head *temp_iter;
         int disk_len;
 	__u64 offset;
-	ocfs_disk_lock dlock;   /* ???: is this too much on the stack? */
 
 	/* We are setting the oin Updated flag in the end. */
 	LOG_ENTRY ();
@@ -216,29 +214,11 @@
 		}
 	}
 
-	/* ??? we need to the lock resource before updating it */
-	if (OCFS_I(inode)->lock_res) {
-		/* cannot hold bhsem while taking lockres... baaad */
-		memcpy(&dlock, (ocfs_disk_lock *)fe, sizeof(ocfs_disk_lock));
-		OCFS_BH_PUT_DATA(fe_bh);
-		fe = NULL;
-		lockres = OCFS_I(inode)->lock_res;
-		ocfs_acquire_lockres(lockres);
-		lockres->lock_type = DISK_LOCK_FILE_LOCK (&dlock);
-		lockres->master_node_num = DISK_LOCK_CURRENT_MASTER (&dlock);
-		lockres->oin_openmap = DISK_LOCK_OIN_MAP (&dlock);
+	OCFS_BH_PUT_DATA(fe_bh);
+	fe = NULL;
 
-		if (lockres->readonly_node != OCFS_INVALID_NODE_NUM &&
-		    lockres->readonly_node != lockres->master_node_num) {
-			LOG_ERROR_ARGS("no longer readonly! ronode=%d, master=%d, lockid=%llu\n",
-				       lockres->readonly_node, lockres->master_node_num,
-				       lockres->sector_num);
-			lockres->readonly_node = OCFS_INVALID_NODE_NUM;
-		}
-
-		ocfs_release_lockres(lockres);
-	}
-
+	status = ocfs_update_lockres (osb, GET_INODE_VOTEOFF(inode), &fe_bh, 
+				      NULL, 0, inode, false);
 	status = 0;
 leave:
 	if (status == 0)
@@ -256,8 +236,8 @@
 
 /* you should be holding i_sem and priv_sem in this function. 
  *
- * Put a lockres on the oin and if needed add ourselves to the open
- * map. Only call this on 1st open of a file. Marks the oin as "in use"
+ * If needed add ourselves to the open map. Only call this 
+ * on 1st open of a file. Marks the oin as "in use"
  */
 int ocfs_inode_open(ocfs_super *osb, struct buffer_head *fe_bh, 
 		    ocfs_journal_handle *handle, struct inode *inode)
@@ -281,28 +261,39 @@
 
 	OCFS_BH_PUT_DATA(fe_bh);
 
-	if (inode->i_ino != OCFS_ROOT_INODE_NUMBER) {
-		if (local_handle) {
-			handle = ocfs_start_trans(osb, OCFS_OPEN_CREDITS);
-			if (!handle) {
-				LOG_ERROR_STATUS(status = -ENOMEM);
-				goto leave;
-			}
-			/* we want this to be a really fast transaction. */
-			ocfs_handle_set_sync(handle, false);
-			ocfs_handle_set_checkpoint(handle, false);
-		}
+	if (inode->i_ino == OCFS_ROOT_INODE_NUMBER)
+		goto leave;
 
-		status = ocfs_create_update_lock(osb, GET_INODE_VOTEOFF(inode),
-						 OCFS_I(inode)->oin_flags, 
-						 false, inode, handle);
-		if (status < 0) {
-			if (status != -EINTR)
-				LOG_ERROR_STATUS (status);
+	if (local_handle) {
+		handle = ocfs_start_trans(osb, OCFS_OPEN_CREDITS);
+		if (!handle) {
+			LOG_ERROR_STATUS(status = -ENOMEM);
 			goto leave;
 		}
+		/* we want this to be a really fast transaction. */
+		ocfs_handle_set_sync(handle, false);
+		ocfs_handle_set_checkpoint(handle, false);
 	}
 
+	/* this will update the lock info from disk while also
+	 * ensuring that the lock level drops to something
+	 * compatible with a first-open of the file */
+	status = ocfs_wait_for_lock_release (osb, GET_INODE_VOTEOFF(inode), 
+					     30000, (S_ISDIR (inode->i_mode) ? 
+					      OCFS_DLM_EXCLUSIVE_LOCK : 
+					      OCFS_DLM_NO_LOCK), inode);
+	if (status < 0) {
+		if (status != -EINTR) {
+			LOG_ERROR_STR ("Lock owner is alive and taking too much time");
+			LOG_ERROR_STATUS(status);
+		}
+		goto leave;
+	}
+
+	status = ocfs_update_master_on_open (osb, inode, handle);
+	if (status < 0 && status != -EINTR)
+		LOG_ERROR_STATUS (status);
+
 leave:
 	if (local_handle && handle) {
 		if (status < 0)

Modified: trunk/src/osb.c
===================================================================
--- trunk/src/osb.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/osb.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -66,13 +66,6 @@
 	snprintf(osb->dev_str, sizeof(osb->dev_str), "%u,%u",
 		 MAJOR(osb->sb->s_dev), MINOR(osb->sb->s_dev));
 
-#define HASHBITS	12
-
-	if (!ocfs_hash_create (&(osb->root_sect_node), HASHBITS)) {
-		LOG_ERROR_STATUS (status = -ENOMEM);
-		goto bail;
-	}
-
 	init_MUTEX (&(osb->osb_res));
 	init_MUTEX (&(osb->recovery_lock));
 	init_MUTEX (&(osb->comm_lock));
@@ -111,6 +104,7 @@
 		INIT_LIST_HEAD(&(osb->lock_recovery_lists[i]));
 	}
 	osb->sect_size = sect_size;
+			
 	osb->node_num = OCFS_INVALID_NODE_NUM;
 
 	memcpy (vol_layout->mount_point, vdh->mount_point, strlen (vdh->mount_point));
@@ -138,6 +132,8 @@
 	vol_layout->uid = vdh->uid;
 	vol_layout->gid = vdh->gid;
 
+
+
 	memcpy (vol_layout->vol_id, vol_label->vol_id, MAX_VOL_ID_LENGTH);
 
 	if (vol_layout->dir_node_size == 0) 
@@ -146,8 +142,22 @@
 	if (vol_layout->file_node_size == 0) 
 		vol_layout->file_node_size = OCFS_DEFAULT_FILE_NODE_SIZE;
 
-	osb->max_dir_node_ent =
-		    (__u32) (vol_layout->dir_node_size / sect_size) - 2;
+	/* get some pseudo constants for >> bits */
+	osb->sect_size_bits = ocfs_get_right_shift_bits(sect_size);
+	osb->cluster_size_bits = ocfs_get_right_shift_bits(vol_layout->cluster_size);
+	osb->dir_alloc_bits = ocfs_get_right_shift_bits(vol_layout->dir_node_size);
+	osb->file_alloc_bits = ocfs_get_right_shift_bits(vol_layout->file_node_size);
+	printk("sectbits=%d, clusterbits=%d, dirbits=%d, filebits=%d\n",
+	       osb->sect_size_bits, osb->cluster_size_bits, 
+	       osb->dir_alloc_bits, osb->file_alloc_bits);
+	
+	OCFS_ASSERT(osb->sect_size_bits);
+	OCFS_ASSERT(osb->cluster_size_bits);
+	OCFS_ASSERT(osb->dir_alloc_bits);
+	OCFS_ASSERT(osb->file_alloc_bits);
+
+
+	osb->max_dir_node_ent = (__u32) (vol_layout->dir_node_size >> osb->sect_size_bits) - 2;
 	bitmap_bits = (__u32) vol_layout->num_clusters;
 
 	ocfs_initialize_bitmap (&osb->cluster_bitmap, bitmap_bits, ONE_MEGA_BYTE * 8);
@@ -162,7 +172,7 @@
 	osb->prealloc_lock = 0;
 
 	osb->cfg_numblocks = OCFS_MAXIMUM_NODES + OCFS_VOLCFG_NEWCFG_SECTORS;
-	osb->cfg_len = osb->cfg_numblocks * sect_size;
+	osb->cfg_len = osb->cfg_numblocks * osb->sect_size;
 	osb->cfg_bhs = ocfs_malloc (osb->cfg_numblocks
 				    * sizeof(struct buffer_head *));
 	if (!osb->cfg_bhs) {
@@ -251,8 +261,6 @@
 	goto finally;
 
 bail:
-	if (osb->root_sect_node.buckets)
-		ocfs_hash_destroy (&(osb->root_sect_node), NULL);
 	ocfs_safefree (osb->cfg_bhs);
 
 finally:

Modified: trunk/src/proc.c
===================================================================
--- trunk/src/proc.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/proc.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -41,7 +41,6 @@
 static int ocfs_proc_nodename (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_mountpoint (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_statistics (char *page, char **start, off_t off, int count, int *eof, void *data);
-static int ocfs_proc_hash_stats (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_device (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_nodes (char *page, char **start, off_t off, int count, int *eof, void *data);
 static int ocfs_proc_net_vote_obj (char *page, char **start, off_t off, int count, int *eof, void *data);
@@ -173,22 +172,12 @@
 		    case SLAB_ITEM:
 			if (item->u.slab == OcfsGlobalCtxt.ofile_cache)
 				slabname = "ofile";
-			else if (item->u.slab == OcfsGlobalCtxt.lockres_cache)
-				slabname = "lockres";
 			else if (item->u.slab == OcfsGlobalCtxt.fe_cache)
 				slabname = "fe";
 			else
 				slabname = "unknown";
 
-			if (item->u.slab == OcfsGlobalCtxt.lockres_cache) {
-				ocfs_lock_res *lockres = item->address;
-				sprintf(tmpstr,
-				       	"%08x  %9s  %-40s  %5d  %llu\n",
-				       	item->address, slabname, item->tag,
-				       	atomic_read(&lockres->lr_ref_cnt),
-				       	lockres->sector_num);
-			} else
-				sprintf(tmpstr, "%08x  %9s  %-40s\n", item->address,
+			sprintf(tmpstr, "%08x  %9s  %-40s\n", item->address,
 				       	slabname, item->tag);
 
 			printk("%s", tmpstr);
@@ -241,8 +230,6 @@
 
 	LOG_ENTRY ();
 
-	len += sprintf (page,       "lockres count: %d\n",
-		       	atomic_read (&OcfsGlobalCtxt.cnt_lockres));
 	len += sprintf (page + len, "comm voting  : %d\n", comm_voting);
 	len += sprintf (page + len, "ip addr/port : %s/%d\n",
 		       	OcfsGlobalCtxt.comm_info.ip_addr,
@@ -454,7 +441,6 @@
 	{ "nodenum", NULL, ocfs_proc_nodenum },
 	{ "mountpoint", NULL, ocfs_proc_mountpoint },
 	{ "statistics", NULL, ocfs_proc_statistics },
-	{ "hashstat", NULL, ocfs_proc_hash_stats },
 	{ "lockstat", NULL, ocfs_proc_dlm_stats },
 	{ "device", NULL, ocfs_proc_device },
 	{ "nodes", NULL, ocfs_proc_nodes },
@@ -621,32 +607,6 @@
 }				/* ocfs_proc_statistics */
 
 /*
- * ocfs_proc_hash_stats()
- *
- */
-static int ocfs_proc_hash_stats (char *page, char **start, off_t off,
-				 int count, int *eof, void *data)
-{
-	int len;
-	int ret;
-	ocfs_super *osb;
-
-	LOG_ENTRY ();
-
-	osb = (ocfs_super *) data;
-
-	*page = '\0';
-	ocfs_hash_stat (&(osb->root_sect_node), page, 1024);
-
-	len = strlen (page);
-
-	ret = ocfs_proc_calc_metrics (page, start, off, count, eof, len);
-
-	LOG_EXIT_INT (ret);
-	return ret;
-}				/* ocfs_proc_hash_stats */
-
-/*
  * ocfs_proc_device()
  *
  */

Modified: trunk/src/super.c
===================================================================
--- trunk/src/super.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/super.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -130,7 +130,6 @@
 static int __init ocfs_driver_entry (void);
 static void __exit ocfs_driver_exit (void);
 static void ocfs_put_super (struct super_block *sb);
-static void lockres_hash_free_func (const void *p);
 static int ocfs_mount_volume (struct super_block *sb, bool reclaim_id, struct inode *root);
 static int ocfs_read_params(void);
 static int ocfs_initialize_mem_lists (void);
@@ -802,10 +801,6 @@
 		sizeof (ocfs_file) + OCFS_POINTER_SIZE, 0, SLAB_NO_REAP | SLAB_HWCACHE_ALIGN,
 		NULL, NULL);
 
-	OcfsGlobalCtxt.lockres_cache = kmem_cache_create ("ocfs2_lockres",
-		sizeof (ocfs_lock_res) + OCFS_POINTER_SIZE, 0, SLAB_NO_REAP | SLAB_HWCACHE_ALIGN,
-		NULL, NULL);
-
 	OcfsGlobalCtxt.fe_cache = kmem_cache_create ("ocfs2_fileentry",
 		OCFS_SECTOR_SIZE, 0, SLAB_NO_REAP | SLAB_HWCACHE_ALIGN, NULL, NULL);
 
@@ -835,7 +830,6 @@
 	kmem_cache_destroy (OcfsGlobalCtxt.inode_cache);
 	kmem_cache_destroy (OcfsGlobalCtxt.ofile_cache);
 	kmem_cache_destroy (OcfsGlobalCtxt.fe_cache);
-	kmem_cache_destroy (OcfsGlobalCtxt.lockres_cache);
 	kmem_cache_destroy (OcfsGlobalCtxt.extent_cache);
 	kmem_cache_destroy (OcfsGlobalCtxt.bh_sem_cache);
 	kmem_cache_destroy (OcfsGlobalCtxt.inum_cache);
@@ -1060,16 +1054,6 @@
 
 
 /*
- * lockres_hash_free_func()
- *
- */
-static void lockres_hash_free_func (const void *p)
-{
-       ocfs_free_lockres((ocfs_lock_res *)p);
-}				/* lockres_hash_free_func */
-
-
-/*
  * ocfs_dismount_volume()
  *
  */
@@ -1133,9 +1117,6 @@
 
 	ocfs_sync_blockdev(sb);
 
-	/* Destroy the Hash table */
-	ocfs_hash_destroy (&(osb->root_sect_node), lockres_hash_free_func);
-
 	/* Remove the proc element for this volume */
 	ocfs_proc_remove_volume (osb);
 
@@ -1208,13 +1189,9 @@
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
 	spin_lock (&mount_cnt_lock);
-	if (!mount_cnt && !atomic_read(&OcfsGlobalCtxt.cnt_lockres) && mount_cnt_inc) {
+	if (!mount_cnt && mount_cnt_inc) {
 		MOD_DEC_USE_COUNT;
 		mount_cnt_inc = false;
-	} else {
-		LOG_TRACE_ARGS("Could not decrement use count, there are %u"  \
-			       " lockres' that haven't been freed.\n",        \
-			       atomic_read(&OcfsGlobalCtxt.cnt_lockres));
 	}
 	spin_unlock (&mount_cnt_lock);
 #endif

Modified: trunk/src/sysfile.c
===================================================================
--- trunk/src/sysfile.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/sysfile.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -115,7 +115,7 @@
 			goto leave;
 		}
 
-		numblocks = tmplen / osb->sect_size;
+		numblocks = tmplen >> osb->sect_size_bits;
 
 		j += numblocks;
 	}
@@ -452,7 +452,7 @@
 		}
 		size *= sizeof (ocfs_io_runs);
 	}
-	size = OCFS_ALIGN (size, osb->sect_size);
+	size = OCFS_SECTOR_ALIGN (size);
 	IoRuns = vmalloc(size);
 
 	if (IoRuns == NULL) {

Modified: trunk/src/vote.c
===================================================================
--- trunk/src/vote.c	2004-05-04 22:25:00 UTC (rev 889)
+++ trunk/src/vote.c	2004-05-04 23:27:54 UTC (rev 890)
@@ -35,7 +35,7 @@
 
 static const char vote_state_str[] = { 'U', 'S', 'P', 'F', 'D' };
 
-static ocfs_vote_obj * ocfs_alloc_vote_obj (int bytes, __u32 reqlock, __u32 oldlock, __u64 votemap);
+static ocfs_vote_obj * ocfs_alloc_vote_obj (int bytes, __u32 reqlock, __u64 votemap);
 static void ocfs_dlm_recv_msg (void *val);
 static bool ocfs_check_ipc_msg (__u8 * msg, __u32 msg_len);
 static int ocfs_comm_process_vote_reply (ocfs_super * osb, ocfs_dlm_msg * dlm_msg);
@@ -284,7 +284,7 @@
 	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, 0, 0ULL);
+	obj = ocfs_alloc_vote_obj (obj_len, 0, 0ULL);
 	if (obj == NULL) {
 		LOG_ERROR_STATUS (status = -ENOMEM);
 		goto finally;
@@ -656,12 +656,10 @@
 		ctxt.u.dlm_msg = dlm_msg;
 		ctxt.node_num = dlm_msg->src_node;
 		ctxt.status = 0;
-		// this calls acquire_lockres
 		ocfs_process_vote (osb, &ctxt);
 		break;
 
 	case OCFS_VOTE_REPLY:
-		// this DOES NOT call acquire_lockres
 		ocfs_comm_process_vote_reply (osb, dlm_msg);
 		break;
 
@@ -703,7 +701,7 @@
 	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, 0, 0ULL);
+	obj = ocfs_alloc_vote_obj (obj_len, 0, 0ULL);
 	if (obj == NULL) {
 		LOG_ERROR_STATUS (status = -ENOMEM);
 		goto finally;
@@ -759,7 +757,7 @@
 }				/* ocfs_init_dlm_msg */
 
 
-static ocfs_vote_obj * ocfs_alloc_vote_obj (int bytes, __u32 reqlock, __u32 oldlock, __u64 votemap)
+static ocfs_vote_obj * ocfs_alloc_vote_obj (int bytes, __u32 reqlock, __u64 votemap)
 {
 	ocfs_vote_obj *obj = NULL;
 	
@@ -780,7 +778,6 @@
 	obj->tmp_openmap = 0ULL;
 	obj->seq_num = 0ULL;
 	obj->req_lock_type = reqlock;
-	obj->old_lock_type = oldlock;
 	obj->vote_status = 0;
 	obj->pid = ocfs_getpid();
 	
@@ -791,10 +788,9 @@
 
 /*
  * ocfs_send_dlm_request_msg()
- *
- * lockres should be held when calling this
+ * inode is definitely non NULL
  */
-int ocfs_send_dlm_request_msg (ocfs_super * osb, __u64 lock_id, __u32 lock_type, __u32 flags, ocfs_lock_res * lockres, __u64 vote_map, struct inode *inode, int *vote_status)
+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 status = 0;
 	ocfs_dlm_msg *dlm_msg = NULL;
@@ -803,13 +799,12 @@
 	__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));
+			osb, lock_id, lock_type, flags, (__u32)(*vote_map & 0xFFFFFFFFULL));
 
 	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, lockres->lock_type, vote_map);
+	obj = ocfs_alloc_vote_obj (obj_len, lock_type, *vote_map);
 	if (obj == NULL) {
 		LOG_ERROR_STATUS (status = -ENOMEM);
 		goto finally;
@@ -839,7 +834,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, *vote_map, dlm_msg);
 	spin_lock (&obj->lock);
 	obj->vote_state = VOTE_OBJ_STATE_SENT;
 	spin_unlock (&obj->lock);
@@ -849,21 +844,22 @@
 
 	spin_lock (&obj->lock);
 	if (obj->vote_status >= 0 && obj->vote_state == VOTE_OBJ_STATE_FULL_REPLY) {
+		// extend and update need to update the openmap
  	    	if (flags & (FLAG_FILE_EXTEND | FLAG_FILE_UPDATE)) 
-			// extend and update need to update the openmap
-			lockres->oin_openmap = obj->tmp_openmap;
+			if (openmap)
+				*openmap = obj->tmp_openmap;
 		LOG_TRACE_ARGS ("OK vote, lockid=%llu, map: 0x%08x\n",
-			lockres->sector_num,
-			(__u32)(obj->got_vote_map & 0xFFFFFFFFULL));
+			lock_id, (__u32)(obj->got_vote_map & 0xFFFFFFFFULL));
 	} 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,
-			       lockres->sector_num,
+			       lock_id,
 			       (__u32)(obj->req_vote_map & 0xFFFFFFFFULL),
 			       (__u32)(obj->got_vote_map & 0xFFFFFFFFULL));
 	}
 	*vote_status = obj->vote_status;
 	obj->vote_state = VOTE_OBJ_STATE_DESTROYING;
+	*vote_map = (*vote_map) & ~(obj->got_vote_map);
 	spin_unlock (&obj->lock);
 
 	spin_lock(&osb->vote_obj_queue_lock);
@@ -905,7 +901,7 @@
 		case FLAG_VOTE_NODE:
 			*(ctxt->got_vote_map) |= mask;
 			if (ctxt->flags & (FLAG_FILE_EXTEND|FLAG_FILE_UPDATE) && 
-			    open_handle)
+			    open_handle && ctxt->open_map)
 				*(ctxt->open_map) |= mask;
 			break;
 		case FLAG_VOTE_OIN_ALREADY_INUSE:



More information about the Ocfs2-commits mailing list