[Ocfs2-commits] mfasheh commits r1568 - trunk/src

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Wed Oct 13 18:51:49 CDT 2004


Author: mfasheh
Date: 2004-10-13 18:51:47 -0500 (Wed, 13 Oct 2004)
New Revision: 1568

Modified:
   trunk/src/24io.c
   trunk/src/alloc.c
   trunk/src/alloc.h
   trunk/src/aops.c
   trunk/src/bitmap.c
   trunk/src/bitmap.h
   trunk/src/buffer_head_io.c
   trunk/src/dir.c
   trunk/src/dlm.c
   trunk/src/extmap.c
   trunk/src/extmap.h
   trunk/src/file.c
   trunk/src/inode.c
   trunk/src/journal.c
   trunk/src/localalloc.c
   trunk/src/namei.c
   trunk/src/nm.c
   trunk/src/ocfs.h
   trunk/src/ocfs_journal.h
   trunk/src/suballoc.c
   trunk/src/super.c
Log:
* massive local locking changes.
  - get rid of ip_sem - everywhere we used to use it uses the ip_lock
    spinlock now.
  - turn the zillion identical extent_map_init/extent_map_destroy
    calls into extent_map_trunc, which requires you hold ip_lock.
  - ip_io_sem has now been relegated to protecting io in the read/write
    function and journal_access.
  - instead, we use i_sem to serialize changes on everything, including
    system files.
  - implement a proper local node alloc_sem, much like ext3's truncate_sem. 
    This protects read/write from looking up the allocation while
    extend/truncate is changing it.
  - rename ip_extend_sem -> ip_node_extend_sem. This is going away soon
    anyway.



Modified: trunk/src/24io.c
===================================================================
--- trunk/src/24io.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/24io.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -42,7 +42,7 @@
 
 	vbo = (__s64) iblock << osb->s_sectsize_bits;
 	err = ocfs_lookup_file_allocation(osb, vbo, &lbo, len, NULL, 
-					   inode, 1);
+					   inode);
 	if (err < 0) {
 		LOG_ERROR_STATUS (err);
 		err = -1;

Modified: trunk/src/alloc.c
===================================================================
--- trunk/src/alloc.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/alloc.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -169,7 +169,7 @@
 		goto bail;
 	}
 
-	status = ocfs_journal_access(handle, bitmap_bh, 
+	status = ocfs_journal_access(handle, bitmap_inode, bitmap_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -177,7 +177,8 @@
 	}
 	fe = (ocfs2_dinode *) bitmap_bh->b_data;
 
-	ocfs_clear_bits(osb->sb, handle, bitmap, start_cluster, num_clusters);
+	ocfs_clear_bits(osb->sb, handle, bitmap_inode, bitmap, start_cluster, 
+			num_clusters);
 	fe->id1.bitmap1.i_used -= num_clusters;
 
 	status = ocfs_journal_dirty(handle, bitmap_bh);
@@ -275,7 +276,7 @@
 			set_buffer_uptodate(bhs[i]);
 			SET_BH_SEQNUM(inode, bhs[i]);
 
-			status = ocfs_journal_access(handle, bhs[i],
+			status = ocfs_journal_access(handle, inode, bhs[i],
 						     OCFS_JOURNAL_ACCESS_CREATE);
 			if (status < 0) {
 				LOG_ERROR_STATUS(status);
@@ -403,7 +404,7 @@
 		OCFS_ASSERT(IS_VALID_EXTENT_BLOCK(eb));
 		eb_el = &eb->h_list;
 
-		status = ocfs_journal_access(handle, bh, 
+		status = ocfs_journal_access(handle, inode, bh, 
 					     OCFS_JOURNAL_ACCESS_CREATE);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
@@ -434,20 +435,20 @@
 	 * journal_dirty erroring as it won't unless we've aborted the
 	 * handle (in which case we would never be here) so reserving
 	 * the write with journal_access is all we need to do. */
-	status = ocfs_journal_access(handle, last_eb_bh, 
+	status = ocfs_journal_access(handle, inode, last_eb_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
 	}
-	status = ocfs_journal_access(handle, fe_bh, 
+	status = ocfs_journal_access(handle, inode, fe_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
 	}
 	if (eb_bh) {
-		status = ocfs_journal_access(handle, eb_bh, 
+		status = ocfs_journal_access(handle, inode, eb_bh, 
 					     OCFS_JOURNAL_ACCESS_WRITE);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
@@ -531,7 +532,7 @@
 	fe = (ocfs2_dinode *) fe_bh->b_data;
 	fe_el = &fe->id2.i_list;
 
-	status = ocfs_journal_access(handle, new_eb_bh, 
+	status = ocfs_journal_access(handle, inode, new_eb_bh, 
 				     OCFS_JOURNAL_ACCESS_CREATE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -553,7 +554,7 @@
 		goto bail;
 	}
 
-	status = ocfs_journal_access(handle, fe_bh, 
+	status = ocfs_journal_access(handle, inode, fe_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -617,7 +618,7 @@
 
 	LOG_ENTRY();
 
-	status = ocfs_journal_access(handle, fe_bh, 
+	status = ocfs_journal_access(handle, inode, fe_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -658,7 +659,7 @@
 			eb = (ocfs2_extent_block *) eb_bhs[i]->b_data;
 			OCFS_ASSERT_RO(IS_VALID_EXTENT_BLOCK(eb));
 
-			status = ocfs_journal_access(handle, eb_bhs[i], 
+			status = ocfs_journal_access(handle, inode, eb_bhs[i], 
 						    OCFS_JOURNAL_ACCESS_WRITE);
 			if (status < 0) {
 				LOG_ERROR_STATUS(status);
@@ -944,7 +945,7 @@
 int ocfs_lookup_file_allocation(ocfs_super *osb, __s64 Vbo,
 				__s64 *Lbo, __u32 bytecount,
 				__s64 *contig_bytes,
-				struct inode *inode, int locked)
+				struct inode *inode)
 {
 	int status;
 	ocfs2_dinode *fe = NULL;
@@ -956,7 +957,6 @@
 	__s64 localVbo;
 	__u64 cnt;
 	__u32 NumIndex;
-	int have_io_sem = 0;
 
 	LOG_ENTRY_ARGS("(vbo=%llu, bytecount=%u, inode=%llu)\n", Vbo, bytecount, 
 		       OCFS_I(inode)->ip_blkno);
@@ -964,40 +964,19 @@
 	OCFS_ASSERT (osb);
 	OCFS_ASSERT (inode);
 
-	/* for direct io we want to skip all locking. If you're a
-	 * system file, ip_io_sem should already have been taken
-	 * before coming here.  */
-	if (((OCFS_I(inode)->ip_open_flags & OCFS_OIN_OPEN_FOR_DIRECTIO) 
-	     || OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE)
-	    && (!locked))
-		printk("ocfs2: inode %lu, locked = %d, open direct = %u, "
-		       "sysfile = %u\n", inode->i_ino, locked,
-		       (OCFS_I(inode)->ip_open_flags & OCFS_OIN_OPEN_FOR_DIRECTIO),
-		       (OCFS_I(inode)->ip_flags & OCFS_INODE_SYSTEM_FILE));
-
-	if (!locked)
-		down(&(OCFS_I(inode)->ip_sem));
-
 	/* Make sure we're not trying to read past end of file --
 	 * alloc_size should be up to date as any nodes changing it
 	 * will have sent us an UPDATE_INODE message. */
 	if (Vbo >= OCFS_I(inode)->ip_alloc_size) {
-		if (!locked)
-			up(&(OCFS_I(inode)->ip_sem));
 		status = -EIO;
 		LOG_ERROR_STATUS(status);
 		goto finally;
 	}
 
-check_alloc_sz:
-	status = 0;
-
 	status = ocfs_lookup_extent_map_entry(osb, 
 					      &(OCFS_I(inode)->ip_ext_map), 
 					      Vbo, Lbo, &cnt, &NumIndex);
 
-	if (!locked)
-		up(&(OCFS_I(inode)->ip_sem));
 
 	if (status &&
 	    (cnt >= (u64)bytecount)) {
@@ -1008,19 +987,6 @@
 
 	/* Ok, we didn't find it in the extent map (or we need to
 	 * refresh as alloc sizes don't match up. */
-
-	if (!locked && !have_io_sem) {
-		/* yay for lock ordering. We must take ip_io_sem
-		 * before ip_sem. */
-		down_read(&OCFS_I(inode)->ip_io_sem);
-		down(&OCFS_I(inode)->ip_sem);
-		have_io_sem = 1;
-
-		/* check one more time in case someone has updated the
-		 * extent map underneath us. */
-		goto check_alloc_sz;
-	}
-
 	remainingLength = (u64)bytecount;
 	localVbo = Vbo;
 
@@ -1054,13 +1020,9 @@
 	}
 
 	if (!fe->id2.i_list.l_tree_depth) {
-		if (!locked)
-			down(&(OCFS_I(inode)->ip_sem));
 		status = ocfs_update_extent_map(osb,
 						&OCFS_I(inode)->ip_ext_map, fe,
 						NULL, NULL, LOCAL_EXT);
-		if (!locked)
-			up(&(OCFS_I(inode)->ip_sem));
 		if (status < 0) {
 			LOG_ERROR_STATUS (status);
 			goto finally;
@@ -1078,15 +1040,11 @@
 
 		eb = (ocfs2_extent_block *) eb_bh->b_data;
 		while (1) {
-			if (!locked)
-				down(&(OCFS_I(inode)->ip_sem));
 			status = ocfs_update_extent_map(osb,
 							&OCFS_I(inode)->ip_ext_map,
 							eb, &localVbo,
 							&remainingLength,
 							NONLOCAL_EXT);
-			if (!locked)
-				up(&(OCFS_I(inode)->ip_sem));
 			if (status < 0) {
 				LOG_ERROR_STATUS(status);
 				goto finally;
@@ -1131,8 +1089,6 @@
 		}
 	}
 
-	if (!locked)
-		down(&(OCFS_I(inode)->ip_sem));
 	status = ocfs_lookup_extent_map_entry(osb, 
 					      &(OCFS_I(inode)->ip_ext_map),
 					      Vbo, Lbo, &cnt, &NumIndex);
@@ -1147,8 +1103,6 @@
 			       OCFS_I(inode)->ip_ext_map.count, inode->i_ino, 
 			       OCFS_I(inode)->ip_alloc_size, cnt);
 	}
-	if (!locked)
-		up(&(OCFS_I(inode)->ip_sem));
 
 success:
 	/* want to return cnt only if asked for it */
@@ -1158,8 +1112,6 @@
 	LOG_TRACE_ARGS("returning contig_bytes=%lld, lbo=%lld\n", cnt, *Lbo);
 
 finally:
-	if (have_io_sem)
-		up_read(&OCFS_I(inode)->ip_io_sem);
 
 	if (fe_bh)
 		brelse(fe_bh);
@@ -1387,7 +1339,8 @@
 	*num_bits = best_fit_bits;
 
 	/* cool, we've got some. set them now. */
-	status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, bitmap_inode, bh, 
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -1401,8 +1354,8 @@
 		goto bail;
 	}
 
-	ocfs_set_bits(osb->sb, handle, &osb->cluster_bitmap, *bit_off,
-		      *num_bits);
+	ocfs_set_bits(osb->sb, handle, bitmap_inode, &osb->cluster_bitmap, 
+		      *bit_off, *num_bits);
 	atomic_inc(&osb->alloc_stats.bitmap_data);
 
 #warning "implement this"
@@ -1504,6 +1457,7 @@
 		goto bail;
 	}
 
+	ocfs_handle_add_inode(handle, bitmap_inode);
 	status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 
 				   0, &bh, bitmap_inode);
 	if (status < 0) {
@@ -1513,7 +1467,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 			     0, bitmap_inode);
-	ocfs_handle_add_inode(handle, bitmap_inode);
 
 	fe = (ocfs2_dinode *) bh->b_data;
 	free_bits = le32_to_cpu(fe->id1.bitmap1.i_total) - 
@@ -1657,17 +1610,18 @@
 	if (last_eb_bh)
 		last_eb = (ocfs2_extent_block *) last_eb_bh->b_data;
 
-	status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, inode, fe_bh, 
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
 	}
 	el = &(fe->id2.i_list);
 
-	down (&(OCFS_I(inode)->ip_sem));
+	spin_lock(&OCFS_I(inode)->ip_lock);
 	OCFS_I(inode)->ip_alloc_size =
 		(u64)(fe->i_clusters - clusters_to_del) << osb->s_clustersize_bits;
-	up (&(OCFS_I(inode)->ip_sem));
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 	fe->i_clusters -= clusters_to_del;
 	fe->i_mtime = OCFS_CURRENT_TIME;
 
@@ -1712,7 +1666,7 @@
 		/* If there will be a new last extent block, then by
 		 * definition, there cannot be any leaves to the right of
 		 * him. */
-		status = ocfs_journal_access(handle, last_eb_bh, 
+		status = ocfs_journal_access(handle, inode, last_eb_bh, 
 					     OCFS_JOURNAL_ACCESS_WRITE);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
@@ -1740,7 +1694,7 @@
 		OCFS_ASSERT(IS_VALID_EXTENT_BLOCK(eb));
 		el = &(eb->h_list);
 
-		status = ocfs_journal_access(handle, eb_bh,
+		status = ocfs_journal_access(handle, inode, eb_bh,
 					     OCFS_JOURNAL_ACCESS_WRITE);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
@@ -1844,6 +1798,8 @@
 
 	LOG_ENTRY();
 
+	down_write(&OCFS_I(inode)->ip_alloc_sem);
+
 	last_eb_bh = tc->tc_last_eb_bh;
 	tc->tc_last_eb_bh = NULL;
 	handle = tc->tc_handle;
@@ -1929,6 +1885,7 @@
 	if (fe->i_clusters > target_i_clusters)
 		goto start;
 bail:
+	up_write(&OCFS_I(inode)->ip_alloc_sem);
 	ocfs_commit_trans(handle);
 	tc->tc_handle = NULL;
 
@@ -2018,6 +1975,7 @@
 			goto bail;
 		}
 
+		ocfs_handle_add_inode(handle, ext_alloc_inode);
 		status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 0, 
 					   &ext_alloc_bh, ext_alloc_inode);
 		if (status < 0) {
@@ -2027,7 +1985,6 @@
 		}
 		ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 				     0, ext_alloc_inode);
-		ocfs_handle_add_inode(handle, ext_alloc_inode);
 	}
 
 	data_alloc_inode = ocfs_get_system_file_inode(osb, GLOBAL_BITMAP_SYSTEM_INODE, -1);
@@ -2037,6 +1994,7 @@
 		goto bail;
 	}
 
+	ocfs_handle_add_inode(handle, data_alloc_inode);
 	status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 
 				   0, &data_alloc_bh, data_alloc_inode);
 	if (status < 0) {
@@ -2046,7 +2004,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 			     0, data_alloc_inode);
-	ocfs_handle_add_inode(handle, data_alloc_inode);
 
 	(*tc)->tc_bitmap_inode    = data_alloc_inode;
 	(*tc)->tc_bitmap_bh       = data_alloc_bh;

Modified: trunk/src/alloc.h
===================================================================
--- trunk/src/alloc.h	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/alloc.h	2004-10-13 23:51:47 UTC (rev 1568)
@@ -42,8 +42,7 @@
 int ocfs_lookup_file_allocation(ocfs_super *osb, __s64 Vbo,
 				__s64 *Lbo, __u32 blocks,
 				__s64 *contig_bytes,
-				struct inode *inode,
-				int locked);
+				struct inode *inode);
 
 typedef struct _ocfs2_alloc_context {
 	struct inode *ac_inode;    /* which bitmap are we allocating from? */

Modified: trunk/src/aops.c
===================================================================
--- trunk/src/aops.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/aops.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -144,32 +144,30 @@
 
 	if (S_ISLNK(inode->i_mode)) {
 		/* this always does I/O for some reason. */
-		down_read(&OCFS_I(inode)->ip_io_sem);
 		err = ocfs_symlink_get_block (inode, iblock, bh_result, 
 					      create);
-		up_read(&OCFS_I(inode)->ip_io_sem);
 		goto bail;
 	}
 
 	vbo = (__s64) iblock << inode->i_sb->s_blocksize_bits;
 
 	/* this can happen if another node truncs after our extend! */
-	down(&OCFS_I(inode)->ip_sem);
+	spin_lock(&OCFS_I(inode)->ip_lock);
 	if (vbo >= OCFS_I(inode)->ip_alloc_size) {
-		up(&OCFS_I(inode)->ip_sem);
+		spin_unlock(&OCFS_I(inode)->ip_lock);
 		err = -EIO;
 		goto bail;
 	}
-	up(&OCFS_I(inode)->ip_sem);
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 
 	len = inode->i_sb->s_blocksize;
 	if (!open_direct)
-		down_read(&OCFS_I(inode)->ip_extend_sem);
+		down_read(&OCFS_I(inode)->ip_node_extend_sem);
 	err = ocfs_lookup_file_allocation(OCFS2_SB(inode->i_sb),
 					  vbo, &lbo, len, NULL, 
-					  inode, open_direct);
+					  inode);
 	if (!open_direct)
-		up_read(&OCFS_I(inode)->ip_extend_sem);
+		up_read(&OCFS_I(inode)->ip_node_extend_sem);
 
 	if (err < 0) {
 		LOG_ERROR_ARGS("vbo=%lld lbo=%lld len=%u", vbo, lbo, len);
@@ -457,7 +455,7 @@
 	vbo = (__s64) block << inode->i_sb->s_blocksize_bits;
 	len = osb->sb->s_blocksize;
 	err = ocfs_lookup_file_allocation(osb, vbo, &lbo, len, NULL, 
-					   inode, 1);
+					   inode);
 	if (err < 0) {
 		LOG_ERROR_ARGS ("vbo=%lld lbo=%lld len=%u", vbo,
 				lbo, len);
@@ -547,7 +545,7 @@
 	 * our logical offset */	
 	/* TODO: Try our damndest to give sizes in multiples of PAGE_SIZE */
 	status = ocfs_lookup_file_allocation(osb, vbo, &lbo, max_blocks << blocksize_bits, 
-					     &new_size, inode, 1);
+					     &new_size, inode);
 
 	/* Do whatever we need to the buffer_head */
 	if (set_new) {

Modified: trunk/src/bitmap.c
===================================================================
--- trunk/src/bitmap.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/bitmap.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -349,8 +349,12 @@
  * ocfs_set_bits()
  *
  */
-void ocfs_set_bits(struct super_block *sb, ocfs_journal_handle *handle,
-		   ocfs_alloc_bm * bitmap, __u32 start, __u32 num)
+void ocfs_set_bits(struct super_block *sb,
+		   ocfs_journal_handle *handle,
+		   struct inode *inode,
+		   ocfs_alloc_bm * bitmap,
+		   u32 start,
+		   u32 num)
 {
 	struct buffer_head *currbh = NULL;
 	void *buff;
@@ -369,7 +373,8 @@
 	ocfs_bitmap_block_for_off(sb, start, &i, &local);
 	currbh = bitmap->chunk[i];
 
-	status = ocfs_journal_access(handle, currbh, OCFS_JOURNAL_ACCESS_UNDO);
+	status = ocfs_journal_access(handle, inode, currbh, 
+				     OCFS_JOURNAL_ACCESS_UNDO);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -390,7 +395,7 @@
 			i++;
 			currbh = bitmap->chunk[i];
 
-			status = ocfs_journal_access(handle, currbh, 
+			status = ocfs_journal_access(handle, inode, currbh, 
 						     OCFS_JOURNAL_ACCESS_UNDO);
 			if (status < 0) {
 				LOG_ERROR_STATUS(status);
@@ -416,8 +421,11 @@
  *
  */
 void ocfs_clear_bits(struct super_block *sb,
-		     ocfs_journal_handle *handle, ocfs_alloc_bm *bitmap,
-		      __u32 start, __u32 num)
+		     ocfs_journal_handle *handle,
+		     struct inode *inode,
+		     ocfs_alloc_bm *bitmap,
+		     u32 start,
+		     u32 num)
 {
 	struct buffer_head *currbh = NULL;
 	void *buff;
@@ -436,7 +444,8 @@
 	ocfs_bitmap_block_for_off(sb, start, &i, &local);
 	currbh = bitmap->chunk[i];
 
-	status = ocfs_journal_access(handle, currbh, OCFS_JOURNAL_ACCESS_UNDO);
+	status = ocfs_journal_access(handle, inode, currbh, 
+				     OCFS_JOURNAL_ACCESS_UNDO);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -462,7 +471,7 @@
 			i++;
 			currbh = bitmap->chunk[i];
 
-			status = ocfs_journal_access(handle, currbh,
+			status = ocfs_journal_access(handle, inode, currbh,
 						     OCFS_JOURNAL_ACCESS_UNDO);
 			if (status < 0) {
 				LOG_ERROR_STATUS(status);

Modified: trunk/src/bitmap.h
===================================================================
--- trunk/src/bitmap.h	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/bitmap.h	2004-10-13 23:51:47 UTC (rev 1568)
@@ -28,8 +28,11 @@
 
 int ocfs_count_bits(struct super_block *sb, ocfs_alloc_bm *bitmap);
 void ocfs_clear_bits(struct super_block *sb,
-		     ocfs_journal_handle *handle, ocfs_alloc_bm *bitmap,
-		     __u32 start, __u32 num);
+		     ocfs_journal_handle *handle,
+		     struct inode *inode,
+		     ocfs_alloc_bm *bitmap,
+		     u32 start,
+		     u32 num);
 int ocfs_find_clear_bits(ocfs_super *osb, ocfs_alloc_bm * bitmap,
 			 u32 numBits, u32 *bitoff, u32 *best_fit_bits);
 void ocfs_initialize_bitmap(struct super_block *sb,
@@ -38,8 +41,12 @@
 void ocfs_reinitialize_bitmap(struct super_block *sb,
 			      ocfs_alloc_bm *bitmap, __u32 validbits,
 			      __u32 allocbits);
-void ocfs_set_bits(struct super_block *sb, ocfs_journal_handle *handle,
-		   ocfs_alloc_bm *bitmap, __u32 start, __u32 num);
+void ocfs_set_bits(struct super_block *sb,
+		   ocfs_journal_handle *handle,
+		   struct inode *inode,
+		   ocfs_alloc_bm * bitmap,
+		   u32 start,
+		   u32 num);
 void ocfs_uninitialize_bitmap(ocfs_alloc_bm *bitmap);
 
 #endif /* OCFS2_BITMAP_H */

Modified: trunk/src/buffer_head_io.c
===================================================================
--- trunk/src/buffer_head_io.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/buffer_head_io.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -92,9 +92,13 @@
 
 	sb = osb->sb;
 
+	if (inode)
+		down(&OCFS_I(inode)->ip_io_sem);
 	for (i = 0 ; i < nr ; i++) {
 		bh = bhs[i];
 		if (bh == NULL) {
+			if (inode)
+				up(&OCFS_I(inode)->ip_io_sem);
 			LOG_TRACE_STR("bh == NULL");
 			status = -EIO;
 			LOG_ERROR_STATUS(status);
@@ -158,7 +162,9 @@
 		else
 			CLEAR_BH_SEQNUM(bh);
 	}
-	
+	if (inode)
+		up(&OCFS_I(inode)->ip_io_sem);
+
 bail:
 
 #ifdef OCFS_DBG_TIMING
@@ -214,10 +220,14 @@
 
 	sb = osb->sb;
 
+	if (inode)
+		down(&OCFS_I(inode)->ip_io_sem);
 	for (i = 0 ; i < nr ; i++) {
 		if (bhs[i] == NULL) {
 			bhs[i] = sb_getblk(sb, block++);
 			if (bhs[i] == NULL) {
+				if (inode)
+					up(&OCFS_I(inode)->ip_io_sem);
 				LOG_TRACE_STR("bh == NULL");
 				status = -EIO;
 				LOG_ERROR_STATUS(status);
@@ -296,6 +306,9 @@
 		else
 			CLEAR_BH_SEQNUM(bh);
 	}
+	if (inode)
+		up(&OCFS_I(inode)->ip_io_sem);
+
 	LOG_TRACE_ARGS("block=(%llu), nr=(%d), cached=%s\n", block, nr, 
 		       (!(flags & OCFS_BH_CACHED) || ignore_cache) ? "no" : "yes");
 

Modified: trunk/src/dir.c
===================================================================
--- trunk/src/dir.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/dir.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -85,7 +85,6 @@
 	struct super_block * sb = inode->i_sb;
 	int have_disk_lock = 0;
 	ocfs_super *osb = OCFS_SB(sb);
-	int have_sem = 0;
 
 	LOG_SET_CONTEXT(READDIR);
 
@@ -103,8 +102,6 @@
 		goto bail;
 	}
 	have_disk_lock = 1;
-	down_read(&OCFS_I(inode)->ip_io_sem);
-	have_sem = 1;
 
 	offset = filp->f_pos & (sb->s_blocksize - 1);
 
@@ -203,9 +200,6 @@
 
 	stored = 0;
 bail:
-	if (have_sem)
-		up_read(&OCFS_I(inode)->ip_io_sem);
-
 	if (have_disk_lock) {
 		error = ocfs_release_lock_ro (osb, inode);
 		if (error < 0)
@@ -219,7 +213,7 @@
 
 
 /* ocfs_find_files_on_disk()
- * NOTE: this should always be called with parent dir ip_io_sem taken!
+ * NOTE: this should always be called with parent dir i_sem taken!
  */
 /* parent off changed to file entry offset of parent! */
 int ocfs_find_files_on_disk(ocfs_super *osb, const char *name,
@@ -244,7 +238,6 @@
 				LOG_ERROR_STATUS (status);
 			goto leave;
 		}
-		down_read(&OCFS_I(inode)->ip_io_sem);
 		lock_acq = 1;
 	}
 
@@ -261,7 +254,6 @@
 
 	if (take_lock && lock_acq)
 	{
-		up_read(&OCFS_I(inode)->ip_io_sem);
 		tmpstat = ocfs_release_lock_ro (osb, inode);
 		if (tmpstat < 0) {
 			LOG_ERROR_STATUS (tmpstat);
@@ -358,9 +350,9 @@
 	s64 vbo, lbo;
 	int extend;
 
-	down(&OCFS_I(dir)->ip_sem);
+	spin_lock(&OCFS_I(dir)->ip_lock);
 	extend = (dir->i_size == OCFS_I(dir)->ip_alloc_size);
-	up(&OCFS_I(dir)->ip_sem);
+	spin_unlock(&OCFS_I(dir)->ip_lock);
 
 	if (extend) {
 		status = ocfs_extend_allocation(OCFS_SB(sb), dir, 1,
@@ -377,7 +369,7 @@
 	lbo = 0;
 
 	status = ocfs_lookup_file_allocation(OCFS_SB(sb), vbo, &lbo, 
-					     sb->s_blocksize, NULL, dir, 1);
+					     sb->s_blocksize, NULL, dir);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -423,9 +415,9 @@
 	}
 
 	/* dir->i_size is always block aligned. */
-	down(&OCFS_I(dir)->ip_sem);
+	spin_lock(&OCFS_I(dir)->ip_lock);
 	if (dir->i_size == OCFS_I(dir)->ip_alloc_size) {
-		up(&OCFS_I(dir)->ip_sem);
+		spin_unlock(&OCFS_I(dir)->ip_lock);
 		num_free_extents = ocfs_num_free_extents(osb, dir, fe);
 		if (num_free_extents < 0) {
 			status = num_free_extents;
@@ -450,7 +442,7 @@
 
 		credits = ocfs_calc_extend_credits(sb, fe, 1);
 	} else {
-		up(&OCFS_I(dir)->ip_sem);
+		spin_unlock(&OCFS_I(dir)->ip_lock);
 		credits = OCFS_SIMPLE_DIR_EXTEND_CREDITS;
 	}
 
@@ -469,7 +461,7 @@
 
 	set_buffer_uptodate(new_bh);
 	SET_BH_SEQNUM(dir, new_bh);
-	status = ocfs_journal_access(handle, new_bh, 
+	status = ocfs_journal_access(handle, dir, new_bh, 
 				     OCFS_JOURNAL_ACCESS_CREATE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);

Modified: trunk/src/dlm.c
===================================================================
--- trunk/src/dlm.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/dlm.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -232,9 +232,6 @@
 
 	updated = 0;
 again:
-	/* yay, lock ordering. at least we don't hold io sem across
-	 * the whole thing now. */
-	down_read(&OCFS_I(inode)->ip_io_sem);
 	ocfs_acquire_lockres_write (inode);
 
 	LOG_TRACE_ARGS("attempting to get lock, pass: %d\n", ++k);
@@ -247,14 +244,12 @@
 	if (!updated) {
 		status = ocfs_update_lockres(osb, *bh, inode, 1);
 		if (status < 0) {
-			up_read(&OCFS_I(inode)->ip_io_sem);
 			ocfs_release_lockres_write (inode);
 			LOG_ERROR_STATUS (status);
 			goto finally;
 		}
 		updated = 1;
 	}
-	up_read(&OCFS_I(inode)->ip_io_sem);
 
 reevaluate:
 	no_owner = (lockres->master_node_num == OCFS_INVALID_NODE_NUM);

Modified: trunk/src/extmap.c
===================================================================
--- trunk/src/extmap.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/extmap.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -70,17 +70,13 @@
 	return;
 }				/* ocfs_extent_map_init */
 
-
-/*
- * ocfs_extent_map_destroy()
- *
- */
-void ocfs_extent_map_destroy (ocfs_extent_map * map)
+/* expects you to hold ip_lock. */
+void ocfs_extent_map_trunc(ocfs_extent_map *map)
 {
 	LOG_ENTRY ();
 
-	OCFS_ASSERT (map != NULL);
-	spin_lock(&EM_IP(map)->ip_lock);
+	OCFS_ASSERT(map);
+
 	if (map->initialized) {
 		struct list_head *tmp, *tmp2;
 		ocfs_extent *ext;
@@ -91,20 +87,18 @@
 					ext);
 			map->count--;
 		}
-		if (map->count!=0) {
+		if (map->count)
 			LOG_ERROR_ARGS("count too high by %d!",
 				       map->count);
-			map->count = 0;
-		}
-		map->initialized = 0;
 	}
-	spin_unlock(&EM_IP(map)->ip_lock);
+	map->count = 0;
+	map->initialized = 1;
+	INIT_LIST_HEAD(&map->head);
 
 	LOG_EXIT ();
 	return;
-}				/* ocfs_extent_map_destroy */
+}
 
-
 /*
  * get_overlap_type()
  *

Modified: trunk/src/extmap.h
===================================================================
--- trunk/src/extmap.h	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/extmap.h	2004-10-13 23:51:47 UTC (rev 1568)
@@ -31,8 +31,9 @@
 				       ocfs2_extent_rec *rec);
 int ocfs_add_extent_map_entry(ocfs_super *osb, ocfs_extent_map *Map,
 			      __s64 Vbo, __s64 Lbo, __u64 ByteCount);
-void ocfs_extent_map_destroy(ocfs_extent_map *map);
 void ocfs_extent_map_init(ocfs_extent_map *map);
+void ocfs_extent_map_trunc(ocfs_extent_map *map);
+
 unsigned int ocfs_extent_map_get_count(ocfs_extent_map *map);
 int ocfs_get_next_extent_map_entry(ocfs_super *osb,
 				   ocfs_extent_map *Map, __u32 RunIndex,

Modified: trunk/src/file.c
===================================================================
--- trunk/src/file.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/file.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -100,16 +100,16 @@
 		goto bail;
 	}
 
-	down(&(OCFS_I(inode)->ip_sem));
+	spin_lock(&OCFS_I(inode)->ip_lock);
 	if (!(OCFS_I(inode)->ip_open_flags & OCFS_IN_FIRST_OPEN))
 		goto bail;
-	up(&(OCFS_I(inode)->ip_sem));
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 
 	interruptible_sleep_on(&osb->open_event);
 	goto again;
 
 bail:
-	up(&(OCFS_I(inode)->ip_sem));
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 	ocfs_unblock_sigs(tmpsig);
 
 	return(status);
@@ -142,21 +142,21 @@
 	}
 
 	if (atomic_read(&oip->ip_needs_verification)) {
-		down_read (&oip->ip_io_sem);
+		down(&inode->i_sem);
 		status = ocfs_verify_update_inode (osb, inode);
-		up_read(&oip->ip_io_sem);
+		up(&inode->i_sem);
 		if (status < 0) {
 			LOG_ERROR_STATUS (status);
 			goto leave;
 		}
 	}
 
-	down(&oip->ip_sem);
+	spin_lock(&oip->ip_lock);
 	if (!oip->ip_open_cnt++) {
 		first_open = 1;
 		oip->ip_open_flags |= OCFS_IN_FIRST_OPEN;
 	}
-	up(&oip->ip_sem);
+	spin_unlock(&oip->ip_lock);
 
 	if (!first_open)
 		status = ocfs_wait_on_first_open(osb, inode);
@@ -164,7 +164,7 @@
 	if (status < 0) {
 		if (status != -EINTR)
 			LOG_ERROR_STATUS(status);
-		down(&oip->ip_sem);
+		spin_lock(&oip->ip_lock);
 		oip->ip_open_cnt--;
 		goto leave_unlock;
 	}
@@ -178,7 +178,7 @@
 	    && (first_open || (mode & (O_WRONLY|O_RDWR))))
 		status = ocfs_notify_on_open(osb, inode);
 
-	down(&oip->ip_sem);
+	spin_lock(&oip->ip_lock);
 	if (first_open) {
 		oip->ip_open_flags &= ~OCFS_IN_FIRST_OPEN;
 		ocfs_notify_openers(osb);
@@ -225,7 +225,8 @@
 	}
 
 leave_unlock:
-	up(&oip->ip_sem);
+	spin_unlock(&oip->ip_lock);
+
 leave:
 	if (status < 0) {
 		if (status != -ENOENT && status != -ENOMEM &&
@@ -254,10 +255,10 @@
 		       file->f_dentry->d_name.len, 
 		       file->f_dentry->d_name.name);
 
-	down(&oip->ip_sem);
+	spin_lock(&oip->ip_lock);
 	if (!--oip->ip_open_cnt)
 		oip->ip_open_flags &= ~OCFS_OIN_OPEN_FOR_DIRECTIO;
-	up(&oip->ip_sem);
+	spin_unlock(&oip->ip_lock);
 
 	LOG_EXIT_INT(0);
 	LOG_CLEAR_CONTEXT();
@@ -437,7 +438,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, FLAG_FILE_UPDATE_OIN, 
 			     inode);
-	ocfs_handle_add_inode(handle, inode);
 
 	/* Start a transaction - need a minimal amount of block credits (1) */
 	handle = ocfs_start_trans(osb, handle, 1);
@@ -450,7 +450,8 @@
 
 	OCFS_ASSERT_RO(IS_VALID_FILE_ENTRY(fe));
 
-	status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, inode, bh, 
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto leave;
@@ -600,9 +601,7 @@
 	}
 	if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
 		LOG_TRACE_STR ("OIN_NEEDS_VERIFICATION");
-		down_read (&(OCFS_I(inode)->ip_io_sem));
 		status = ocfs_verify_update_inode (osb, inode);
-		up_read (&(OCFS_I(inode)->ip_io_sem));
 		if (status < 0) {
 			LOG_TRACE_STR ("ocfs_verify_update_inode failed");
 			LOG_TRACE_STR ("TODO: disable volume");
@@ -638,6 +637,7 @@
 		}
 	}
 
+	down_read(&OCFS_I(inode)->ip_alloc_sem);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 	/* 
 	 * On a 2.6 kernel, all a filesystem needs to do to support
@@ -663,6 +663,7 @@
 	else
 		ret = generic_file_write_nolock (filp, buf, count, ppos);
 #endif
+	up_read(&OCFS_I(inode)->ip_alloc_sem);
 	if (writingAtEOF) {
 		LOG_TRACE_STR
 		    ("Generic_file_write ok, asking for OIN update now");
@@ -743,9 +744,9 @@
 			do_direct_io = 1;
 	}
 	if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
-		down_read(&OCFS_I(inode)->ip_io_sem);
+		down(&inode->i_sem);
 		status = ocfs_verify_update_inode (osb, inode);
-		up_read(&OCFS_I(inode)->ip_io_sem);
+		up(&inode->i_sem);
 		if (status < 0) {
 			LOG_TRACE_STR ("ocfs_verify_update_inode failed");
 			LOG_TRACE_STR ("TODO: disable volume");
@@ -754,6 +755,7 @@
 		}
 	}
 
+	down_read(&OCFS_I(inode)->ip_alloc_sem);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 	/* 
 	 * On a 2.6 kernel, all a filesystem needs to do to support
@@ -777,6 +779,7 @@
 	else
 		ret = generic_file_read (filp, buf, count, ppos);
 #endif
+	up_read(&OCFS_I(inode)->ip_alloc_sem);
 	if (ret == -EINVAL)
 		LOG_ERROR_STR ("Generic_file_read returned -EINVAL");
 
@@ -833,11 +836,10 @@
 		goto bail;
 	}
 
-	down(&oip->ip_sem);
+	spin_lock(&oip->ip_lock);
 	oip->ip_mmu_private = inode->i_size;
-	ocfs_extent_map_destroy(&oip->ip_ext_map);
-	ocfs_extent_map_init (&oip->ip_ext_map);
-	up(&oip->ip_sem);
+	ocfs_extent_map_trunc(&oip->ip_ext_map);
+	spin_unlock(&oip->ip_lock);
 bail:
 	LOG_EXIT_STATUS(status);
 	return status;
@@ -907,7 +909,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 			     FLAG_FILE_TRUNCATE|FLAG_FILE_UPDATE_OIN, inode);
-	ocfs_handle_add_inode(handle, inode);
 
 	fe = (ocfs2_dinode *) fe_bh->b_data;
 	OCFS_ASSERT(IS_VALID_FILE_ENTRY(fe));
@@ -1086,7 +1087,8 @@
 	OCFS_ASSERT(num_bits <= clusters_to_add);
 
 	/* reserve our write early -- insert_extent may update the inode */
-	status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, inode, fe_bh,
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto leave;
@@ -1103,10 +1105,10 @@
 	}
 
 	fe->i_clusters += num_bits;
-	down (&(OCFS_I(inode)->ip_sem));
+	spin_lock(&OCFS_I(inode)->ip_lock);
 	OCFS_I(inode)->ip_alloc_size =
 		(u64)fe->i_clusters << osb->s_clustersize_bits;
-	up (&(OCFS_I(inode)->ip_sem));
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 
 	status = ocfs_journal_dirty(handle, fe_bh);
 	if (status < 0) {
@@ -1154,6 +1156,7 @@
 	int status = 0;
 	int restart_func = 0;
 	int skip_overalloc = 0;
+	int drop_alloc_sem = 0;
 	int credits, num_free_extents;
 	unsigned int overalloc_bits = 0;
 	u32 clusters_to_add;
@@ -1188,7 +1191,6 @@
 			     OCFS_LKM_EXMODE,
 			     FLAG_FILE_EXTEND|FLAG_FILE_UPDATE_OIN,
 			     inode);
-	ocfs_handle_add_inode(handle, inode);
 
 	fe = (ocfs2_dinode *) bh->b_data;
 	OCFS_ASSERT(IS_VALID_FILE_ENTRY(fe));
@@ -1250,6 +1252,12 @@
 		goto leave;
 	}
 
+	/* blocks peope in read/write from reading our allocation
+	 * until we're done changing it. We depend on i_sem to block
+	 * other extend/truncate calls while we're here. Ordering wrt
+	 * start_trans is important here -- always do it before! */
+	down_write(&OCFS_I(inode)->ip_alloc_sem);
+	drop_alloc_sem = 1;
 do_start_trans:
 	credits = ocfs_calc_extend_credits(osb->sb, fe, clusters_to_add);
 	handle = ocfs_start_trans(osb, handle, credits);
@@ -1262,7 +1270,8 @@
 	/* reserve a write to the file entry early on - that we if we
 	 * run out of credits in the allocation path, we can still
 	 * update i_size. */
-	status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, inode, bh,
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto leave;
@@ -1349,6 +1358,10 @@
 	}
 
 leave:
+	if (drop_alloc_sem) {
+		up_write(&OCFS_I(inode)->ip_alloc_sem);
+		drop_alloc_sem = 0;
+	}
 	if (handle) {
 		ocfs_commit_trans(handle);
 		handle = NULL;
@@ -1430,19 +1443,6 @@
 
 	/* get the file and parent offsets, and the file oin if present */
 	if (attr->ia_valid & ATTR_SIZE) {
-		if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
-			LOG_TRACE_STR ("OIN_NEEDS_VERIFICATION");
-			down_read(&OCFS_I(inode)->ip_io_sem);
-			status = ocfs_verify_update_inode (osb, inode);
-			up_read(&OCFS_I(inode)->ip_io_sem);
-			if (status < 0) {
-				LOG_ERROR_STATUS (status);
-				LOG_TRACE_STR ("TODO: disable volume");
-				error = -EIO;
-				goto bail;
-			}
-		}
-
 		if (inode->i_size > newsize) {
 			ocfs_truncate_inode_pages(inode, newsize);
 			status = ocfs_truncate_file(osb, newsize, 
@@ -1457,7 +1457,7 @@
 			goto bail;
 		}
 
-		down (&(OCFS_I(inode)->ip_sem));
+		spin_lock(&OCFS_I(inode)->ip_lock);
 		inode->i_size = newsize;
 		inode->i_blocks = (newsize + sb->s_blocksize - 1) >> sb->s_blocksize_bits;
 		if (OCFS_I(inode)->ip_open_flags &
@@ -1465,7 +1465,7 @@
 			/* This is a total broken hack for O_DIRECT crack */
 			OCFS_I(inode)->ip_mmu_private = inode->i_size;
 		}
-		up (&(OCFS_I(inode)->ip_sem));
+		spin_unlock(&OCFS_I(inode)->ip_lock);
 		status = ocfs2_zero_extend(inode);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);

Modified: trunk/src/inode.c
===================================================================
--- trunk/src/inode.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/inode.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -307,8 +307,7 @@
 
 	i->ip_flags = 0;
 	atomic_set(&i->ip_clean_buffer_seq, 0);
-	init_MUTEX(&(i->ip_sem));
-	init_rwsem(&(i->ip_extend_sem));
+	init_rwsem(&(i->ip_node_extend_sem));
 	i->ip_open_cnt = 0;
 	spin_lock_init(&i->ip_lock);
 	ocfs_extent_map_init (&i->ip_ext_map);
@@ -317,8 +316,8 @@
 	i->ip_handle = NULL;
 	i->ip_next_orphan = NULL;
 
-	init_rwsem(&i->ip_io_sem);
-
+	init_rwsem(&i->ip_alloc_sem);
+	init_MUTEX(&(i->ip_io_sem));
 	atomic_set(&i->ip_needs_verification, 0);
 	INIT_LIST_HEAD(&i->ip_pending_locks);
 	INIT_LIST_HEAD(&i->ip_j_inode);
@@ -686,6 +685,7 @@
 		LOG_ERROR_STATUS(status);
 		goto bail;
 	}
+	ocfs_handle_add_inode(handle, orphan_dir_inode);
 	status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 0,
 				   &orphan_dir_bh, orphan_dir_inode);
 	if (status < 0) {
@@ -694,7 +694,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0,
 			     orphan_dir_inode);
-	ocfs_handle_add_inode(handle, orphan_dir_inode);
 
 	/* we do this while holding the orphan dir lock because we
 	 * don't want recovery being run from another node to vote for
@@ -712,6 +711,7 @@
 		LOG_ERROR_STATUS(status);
 		goto bail;
 	}
+	ocfs_handle_add_inode(handle, inode_alloc_inode);
 	status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 0,
 				   &inode_alloc_bh, inode_alloc_inode);
 	if (status < 0) {
@@ -720,7 +720,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0,
 			     inode_alloc_inode);
-	ocfs_handle_add_inode(handle, inode_alloc_inode);
 
 	handle = ocfs_start_trans(osb, handle, OCFS_FILE_DELETE_CREDITS);
 	if (handle == NULL) {
@@ -737,7 +736,8 @@
 	}
 
 	/* set the inodes dtime */
-	status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, inode, fe_bh,
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -818,8 +818,7 @@
 		goto bail;
 	}
 
-	ocfs_extent_map_destroy (&OCFS_I(inode)->ip_ext_map);
-	ocfs_extent_map_init (&OCFS_I(inode)->ip_ext_map);
+	ocfs_extent_map_trunc(&OCFS_I(inode)->ip_ext_map);
 
 	down(&recovery_list_sem);
 	list_del(&OCFS_I(inode)->ip_recovery_list);
@@ -878,7 +877,7 @@
 	 */
 	tmperr = ocfs_lookup_file_allocation(osb, vbo, &lbo, 
 					     osb->sb->s_blocksize, NULL,
-					     inode, 1);
+					     inode);
 	if (tmperr < 0)
 		goto fail;
 
@@ -923,20 +922,19 @@
 	if (!inode) {
 		LOG_TRACE_STR("eep, no inode!\n");
 		status = -ENOENT;
-		goto no_inode;
+		goto bail;
 	}
 
 	osb = OCFS_SB(inode->i_sb);
 
-	down_read (&(OCFS_I(inode)->ip_io_sem));
-	down (&(OCFS_I(inode)->ip_sem));
+	spin_lock(&OCFS_I(inode)->ip_lock);
 	if (INODE_DELETED(inode)) {
-		up (&(OCFS_I(inode)->ip_sem));
+		spin_unlock(&OCFS_I(inode)->ip_lock);
 		LOG_TRACE_STR("inode deleted!\n");
 		status = -ENOENT;
 		goto bail;
 	}
-	up (&(OCFS_I(inode)->ip_sem));
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 
 	if (ocfs_node_map_is_only(osb, &osb->publ_map, osb->node_num)) {
 		LOG_TRACE_STR ("Only node alive.");
@@ -961,9 +959,6 @@
 	}
 
 bail:
-	up_read (&(OCFS_I(inode)->ip_io_sem));
-
-no_inode:
 	LOG_EXIT_STATUS(status);
 
 	LOG_CLEAR_CONTEXT();
@@ -975,7 +970,7 @@
  * 
  * Updates a disk inode from a 
  * struct inode.
- * Only takes ip_sem. 
+ * Only takes ip_lock. 
  */
 int ocfs_mark_inode_dirty(ocfs_journal_handle *handle, 
 			  struct inode *inode, 
@@ -988,13 +983,14 @@
 #warning "need to check the casts and the endian-ness in this function"
 	LOG_ENTRY_ARGS("(inode %llu)\n", OCFS_I(inode)->ip_blkno);
 
-	status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, inode, bh,
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto leave;
 	}
 
-	down(&OCFS_I(inode)->ip_sem);
+	spin_lock(&OCFS_I(inode)->ip_lock);
 	if (le32_to_cpu(fe->i_flags) & OCFS2_BITMAP_FL) {
 		fe->id1.bitmap1.i_used = 
 			cpu_to_le32(OCFS_I(inode)->u.ip_bitinfo.used_bits);
@@ -1004,7 +1000,7 @@
 
 	fe->i_clusters = 
 		(u32)OCFS_I(inode)->ip_alloc_size >> osb->s_clustersize_bits;
-	up(&OCFS_I(inode)->ip_sem);
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 
 	fe->i_size = (u64)inode->i_size;
 	fe->i_links_count = inode->i_nlink;
@@ -1035,23 +1031,21 @@
  * ocfs_refresh_inode
  * 
  * Updates a struct inode from a disk inode.
- * does no i/o, only takes ip_sem. 
+ * does no i/o, only takes ip_lock. 
  */
 int ocfs_refresh_inode(struct inode *inode, 
 		       ocfs2_dinode *fe)
 {
-	ocfs2_extent_list *fel;
 	int status = 0;
-	u32 j;
 	ocfs_super *osb = OCFS2_SB(inode->i_sb);
 
-	down(&OCFS_I(inode)->ip_sem);
+	spin_lock(&OCFS_I(inode)->ip_lock);
 
 	if (INODE_DELETED(inode)) {
 		LOG_TRACE_ARGS("Inode %llu was marked as deleted!", 
 			       OCFS_I(inode)->ip_blkno);
 		status = -ENOENT;
-		goto leave;
+		goto bail;
 	}
 
 	/* Add checks as needed */
@@ -1063,7 +1057,7 @@
 			LOG_TRACE_STR ("File Entry is invalid");
 
 		status = -ENOENT;
-		goto leave;
+		goto bail;
 	}
 
 	if (inode->i_generation != le32_to_cpu(fe->i_generation)) {
@@ -1073,7 +1067,7 @@
 			       le32_to_cpu(fe->i_generation));
 		SET_INODE_DELETED(inode);
 		status = -ENOENT;
-		goto leave;
+		goto bail;
 	}
 
 	if ((OCFS_I(inode)->ip_alloc_size !=
@@ -1091,8 +1085,7 @@
 				       OCFS_I(inode)->ip_blkno, 
 				       OCFS_I(inode)->ip_alloc_size, 
 				       fe->i_clusters);
-			ocfs_extent_map_destroy (&OCFS_I(inode)->ip_ext_map);
-			ocfs_extent_map_init (&OCFS_I(inode)->ip_ext_map);
+			ocfs_extent_map_trunc (&OCFS_I(inode)->ip_ext_map);
 		}
 
 		if (le32_to_cpu(fe->i_flags) & OCFS2_BITMAP_FL) {
@@ -1133,23 +1126,12 @@
 			init_special_inode(inode, inode->i_mode,
 					   huge_decode_dev(le64_to_cpu(fe->id1.dev1.i_rdev)));
 		}
-
-		fel = &fe->id2.i_list;
-		if (!fel->l_tree_depth) {
-			for (j = 0; j < fel->l_next_free_rec; j++) {
-				if (!ocfs_add_extent_map_entry_from_rec(osb->sb, 
-									&OCFS_I(inode)->ip_ext_map,
-									&fel->l_recs[j]))
-					goto leave;
-			}
-		}
 	}
 
-leave:
-	if (status == 0)
-		atomic_set(&OCFS_I(inode)->ip_needs_verification, 0);
+	atomic_set(&OCFS_I(inode)->ip_needs_verification, 0);
+bail:
 
-	up(&OCFS_I(inode)->ip_sem);
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 
 	return(status);
 }				/* ocfs_refresh_inode */
@@ -1174,15 +1156,15 @@
 		goto leave;
 	}
 
-	down(&OCFS_I(inode)->ip_sem);
+	spin_lock(&OCFS_I(inode)->ip_lock);
 	if (INODE_DELETED(inode)) {
-		up(&OCFS_I(inode)->ip_sem);
+		spin_unlock(&OCFS_I(inode)->ip_lock);
 		LOG_TRACE_ARGS("Inode %llu was marked as deleted!", 
 			       OCFS_I(inode)->ip_blkno);
 		status = -ENOENT;
 		goto leave;
 	}
-	up(&OCFS_I(inode)->ip_sem);
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 
 	status = ocfs_read_block(osb, OCFS_I(inode)->ip_blkno, &fe_bh, 
 				 OCFS_BH_CACHED, inode);

Modified: trunk/src/journal.c
===================================================================
--- trunk/src/journal.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/journal.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -474,7 +474,7 @@
 	atomic_inc(&inode->i_count);
 
 	/* we're obviously changing it... */
-	down_write(&OCFS_I(inode)->ip_io_sem);
+	down(&inode->i_sem);
 
 	/* sanity check */
 	OCFS_ASSERT(!OCFS_I(inode)->ip_handle);
@@ -500,7 +500,7 @@
 		OCFS_I(inode)->ip_handle = NULL;
 		list_del_init(&OCFS_I(inode)->ip_handle_list);
 
-		up_write(&OCFS_I(inode)->ip_io_sem);
+		up(&inode->i_sem);
 		iput(inode);
 	}
 	return;
@@ -658,10 +658,14 @@
 /*
  * ocfs_journal_access
  */
-int ocfs_journal_access(ocfs_journal_handle *handle, struct buffer_head *bh, int type) 
+int ocfs_journal_access(ocfs_journal_handle *handle,
+			struct inode *inode,
+			struct buffer_head *bh,
+			int type)
 {
 	int status;
 
+	OCFS_ASSERT(inode);
 	OCFS_ASSERT(handle);
 	OCFS_ASSERT(bh);
 	OCFS_ASSERT((handle->flags & OCFS_HANDLE_STARTED));
@@ -681,6 +685,7 @@
 		BUG();
 	}
 
+	down(&OCFS_I(inode)->ip_io_sem);
 	switch (type) {
 	case OCFS_JOURNAL_ACCESS_CREATE:
 	case OCFS_JOURNAL_ACCESS_WRITE:
@@ -694,16 +699,12 @@
 	default:
 		status = -EINVAL;
 		LOG_ERROR_STR("Uknown access type!");
-		goto done;
 	}
+	up(&OCFS_I(inode)->ip_io_sem);
 
-	if (status < 0) {
+	if (status < 0)
 		LOG_ERROR_ARGS("Error %d getting %d access to buffer!\n",
 			       status, type);
-		goto done;
-	}
-
-done:
 	LOG_EXIT_STATUS(status);
 	return(status);
 } /* ocfs_journal_access */
@@ -1095,7 +1096,7 @@
 	LOG_TRACE_ARGS("Force reading %u blocks\n", totalblks);
 
 	status = ocfs_lookup_file_allocation(osb, vbo, &lbo, size, NULL, 
-					     inode, 1);
+					     inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -1426,8 +1427,10 @@
 		goto bail;
 	}
 
+	down(&orphan_dir_inode->i_sem);
 	status = ocfs_acquire_lock_ro(osb, orphan_dir_inode);
 	if (status < 0) {
+		up(&orphan_dir_inode->i_sem);
 		LOG_ERROR_STATUS(status);
 		goto bail;
 	}
@@ -1435,7 +1438,6 @@
 
 	offset = 0;
 	iter = NULL;
-	down_read(&OCFS_I(orphan_dir_inode)->ip_io_sem);
 	while(offset < orphan_dir_inode->i_size) {
 		blk = offset >> sb->s_blocksize_bits;
 
@@ -1443,7 +1445,7 @@
 		if (!bh)
 			status = -EINVAL;
 		if (status < 0) {
-			up_read(&OCFS_I(orphan_dir_inode)->ip_io_sem);
+			up(&orphan_dir_inode->i_sem);
 			if (bh)
 				brelse(bh);
 			LOG_ERROR_STATUS(status);
@@ -1457,7 +1459,7 @@
 
 			if (!ocfs_check_dir_entry(orphan_dir_inode,
 						  de, bh, local)) {
-				up_read(&OCFS_I(orphan_dir_inode)->ip_io_sem);
+				up(&orphan_dir_inode->i_sem);
 				status = -EINVAL;
 				LOG_ERROR_STATUS(status);
 				brelse (bh);
@@ -1498,7 +1500,7 @@
 		}
 		brelse(bh);
 	}
-	up_read(&OCFS_I(orphan_dir_inode)->ip_io_sem);
+	up(&orphan_dir_inode->i_sem);
 
 	status = ocfs_release_lock_ro(osb, orphan_dir_inode);
 	have_disk_lock = 0;
@@ -1525,7 +1527,7 @@
 			LOG_ERROR_STATUS(tmpstat);
 	}
 
-	if (orphan_dir_inode) 
+	if (orphan_dir_inode)
 		iput(orphan_dir_inode);
 
 	return(status);

Modified: trunk/src/localalloc.c
===================================================================
--- trunk/src/localalloc.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/localalloc.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -240,13 +240,13 @@
 
 	/* Take io_sem here to turn off local alloc before another guy
 	 * can come in and start using him. */
-	down_write(&oip->ip_io_sem);
+	down(&local_alloc_inode->i_sem);
 	if (!osb->have_local_alloc) {
-		up_write(&oip->ip_io_sem);
+		up(&local_alloc_inode->i_sem);
 		goto bail;
 	}
 	osb->have_local_alloc = 0;
-	up_write(&oip->ip_io_sem);
+	up(&local_alloc_inode->i_sem);
 
 	handle = ocfs_alloc_handle(osb);
 	if (!handle) {
@@ -264,6 +264,7 @@
 		goto bail;
 	}
 
+	ocfs_handle_add_inode(handle, main_bm_inode);
 	status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 
 				   0, &main_bm_bh, main_bm_inode);
 	if (status < 0) {
@@ -273,7 +274,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 			     0, main_bm_inode);
-	ocfs_handle_add_inode(handle, main_bm_inode);
 
 	/* WINDOW_MOVE_CREDITS is a bit heavy... */
 	handle = ocfs_start_trans(osb, handle, OCFS_WINDOW_MOVE_CREDITS);
@@ -292,7 +292,8 @@
 	}
 	memcpy(alloc_copy, alloc, bh->b_size);
 
-	status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, local_alloc_inode, bh,
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -433,6 +434,7 @@
 		goto bail;
 	}
 
+	ocfs_handle_add_inode(handle, main_bm_inode);
 	status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 
 				   0, &main_bm_bh, main_bm_inode);
 	if (status < 0) {
@@ -442,7 +444,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 			     0, main_bm_inode);
-	ocfs_handle_add_inode(handle, main_bm_inode);
 
 	handle = ocfs_start_trans(osb, handle, OCFS_WINDOW_MOVE_CREDITS);
 	if (!handle) {
@@ -476,7 +477,7 @@
  * ocfs_reserve_local_alloc_bits
  *
  * make sure we've got at least bitswanted contiguous bits in the
- * local alloc. You lose them when you drop ip_io_sem.
+ * local alloc. You lose them when you drop i_sem.
  * 
  * We will add ourselves to the transaction passed in, but may start
  * our own in order to shift windows.
@@ -591,7 +592,8 @@
 	 * delete bits from it! */
 	*num_bits = bits_wanted;
 
-	status = ocfs_journal_access(handle, osb->local_alloc_bh, 
+	status = ocfs_journal_access(handle, local_alloc_inode,
+				     osb->local_alloc_bh,
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -771,7 +773,7 @@
 	}
 
 	bm_fe = (ocfs2_dinode *) main_bm_bh->b_data;
-	status = ocfs_journal_access(handle, main_bm_bh, 
+	status = ocfs_journal_access(handle, main_bm_inode, main_bm_bh,
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -801,7 +803,8 @@
 
 		LOG_TRACE_ARGS("Clearing bit %u in main bitmap\n", 
 			       bit_off + LOCAL_ALLOC(alloc)->la_bm_off);
-		ocfs_clear_bits(osb->sb, handle, &osb->cluster_bitmap, 
+		ocfs_clear_bits(osb->sb, handle, main_bm_inode, 
+				&osb->cluster_bitmap, 
 				bit_off + LOCAL_ALLOC(alloc)->la_bm_off,
 				1);
 		bm_fe->id1.bitmap1.i_used--;
@@ -980,7 +983,8 @@
 	}
 	memcpy(alloc_copy, alloc, osb->local_alloc_bh->b_size);
 
-	status = ocfs_journal_access(handle, osb->local_alloc_bh, 
+	status = ocfs_journal_access(handle, local_alloc_inode,
+				     osb->local_alloc_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);

Modified: trunk/src/namei.c
===================================================================
--- trunk/src/namei.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/namei.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -213,7 +213,7 @@
 
 	set_buffer_uptodate(new_bh);
 	SET_BH_SEQNUM(inode, new_bh);
-	status = ocfs_journal_access(handle, new_bh, 
+	status = ocfs_journal_access(handle, inode, new_bh, 
 				     OCFS_JOURNAL_ACCESS_CREATE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -329,7 +329,6 @@
 		goto leave;
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, dir);
-	ocfs_handle_add_inode(handle, dir);
 
 	dirfe = (ocfs2_dinode *) parent_fe_bh->b_data;
 	if (!dirfe->i_links_count) {
@@ -404,7 +403,7 @@
 			goto leave;
 		}
 
-		status = ocfs_journal_access(handle, parent_fe_bh, 
+		status = ocfs_journal_access(handle, dir, parent_fe_bh, 
 					     OCFS_JOURNAL_ACCESS_WRITE);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
@@ -504,7 +503,7 @@
 	set_buffer_uptodate(*new_fe_bh);
 	SET_BH_SEQNUM(inode, *new_fe_bh);
 
-	status = ocfs_journal_access(handle, *new_fe_bh,
+	status = ocfs_journal_access(handle, inode, *new_fe_bh,
 				     OCFS_JOURNAL_ACCESS_CREATE);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
@@ -668,7 +667,6 @@
 		goto bail;
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, dir);
-	ocfs_handle_add_inode(handle, dir);
 
 	err = ocfs_prepare_dir_for_insert(osb, dir, parent_fe_bh, 
 					     dentry->d_name.name, 
@@ -686,7 +684,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, FLAG_FILE_UPDATE_OIN, 
 			     inode);
-	ocfs_handle_add_inode(handle, inode);
 
 	fe = (ocfs2_dinode *) fe_bh->b_data;
 	if (fe->i_links_count >= OCFS2_LINK_MAX) {
@@ -701,7 +698,8 @@
 		goto bail;
 	}
 
-	err = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+	err = ocfs_journal_access(handle, inode, fe_bh,
+				  OCFS_JOURNAL_ACCESS_WRITE);
 	if (err < 0) {
 		LOG_ERROR_STATUS(err);
 		goto bail;
@@ -797,7 +795,6 @@
 		goto leave;
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, dir);
-	ocfs_handle_add_inode(handle, dir);
 
 	/* this will re-read the directory now with the EXCLUSIVE */
 	/* lock already held; it will also return the blkno to us */
@@ -822,7 +819,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, FLAG_RELEASE_DENTRY, 
 			     inode);
-	ocfs_handle_add_inode(handle, inode);
 
 	if (S_ISDIR (inode->i_mode)) {
 	       	if (!ocfs_empty_dir(inode)) {
@@ -850,7 +846,8 @@
 		goto leave;
 	}
 
-	status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, inode, fe_bh,
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
 		goto leave;
@@ -893,7 +890,7 @@
 
 	if (S_ISDIR (inode->i_mode)) {
 		ocfs2_dinode *dirfe;
-		status = ocfs_journal_access(handle, parent_node_bh, 
+		status = ocfs_journal_access(handle, dir, parent_node_bh, 
 					     OCFS_JOURNAL_ACCESS_WRITE);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
@@ -1014,7 +1011,6 @@
 			goto bail;
 		}
 		ocfs_handle_add_lock(handle, type2, flags2, inode2);
-		ocfs_handle_add_inode(handle, inode2);
 	}
 	/* lock id1 */
 	status = ocfs_acquire_lock(osb, type1, flags1, 
@@ -1024,7 +1020,6 @@
 		goto bail;
 	}
 	ocfs_handle_add_lock(handle, type1, flags1, inode1);
-	ocfs_handle_add_inode(handle, inode1);
 bail:
 	LOG_EXIT_STATUS(status);
 	return(status);
@@ -1134,7 +1129,6 @@
 		ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 				     FLAG_RELEASE_DENTRY|FLAG_FILE_RENAME,
 				     old_inode);
-		ocfs_handle_add_inode(handle, old_inode);
 
 		status = -EIO;
 		old_inode_de_bh = ocfs_bread (old_inode, 0, &status, 0);
@@ -1212,7 +1206,6 @@
 		}
 		ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 				     FLAG_RELEASE_DENTRY, new_inode);
-		ocfs_handle_add_inode(handle, new_inode);
 
 		newfe = (ocfs2_dinode *) newfe_bh->b_data;
 
@@ -1256,7 +1249,7 @@
 				goto bail;
 			}
 		}
-		status = ocfs_journal_access(handle, newfe_bh, 
+		status = ocfs_journal_access(handle, new_inode, newfe_bh, 
 					     OCFS_JOURNAL_ACCESS_WRITE);
 		if (status < 0) {
 			LOG_ERROR_STATUS (status);
@@ -1274,7 +1267,7 @@
 		}
 
 		/* change the dirent to point to the correct inode */
-		status = ocfs_journal_access(handle, new_de_bh, 
+		status = ocfs_journal_access(handle, new_dir, new_de_bh, 
 					     OCFS_JOURNAL_ACCESS_WRITE);
 		if (status < 0) {
 			LOG_ERROR_STATUS (status);
@@ -1323,7 +1316,8 @@
 	}
 	old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
 	if (old_inode_de_bh) {
-		status = ocfs_journal_access(handle, old_inode_de_bh, 
+		status = ocfs_journal_access(handle, old_inode,
+					     old_inode_de_bh,
 					     OCFS_JOURNAL_ACCESS_WRITE);
 		PARENT_INO(old_inode_de_bh->b_data) =
 			le64_to_cpu(OCFS_I(new_dir)->ip_blkno);
@@ -1348,7 +1342,10 @@
 				       (int)new_dir_nlink, new_dir->i_nlink);
 			} else {
 				ocfs2_dinode *fe;
-				status = ocfs_journal_access(handle, new_dir_bh, OCFS_JOURNAL_ACCESS_WRITE);
+				status = ocfs_journal_access(handle,
+							     new_dir,
+							     new_dir_bh,
+							     OCFS_JOURNAL_ACCESS_WRITE);
 				fe = (ocfs2_dinode *) new_dir_bh->b_data;
 				fe->i_links_count = new_dir->i_nlink;
 				status = ocfs_journal_dirty(handle, new_dir_bh);
@@ -1362,7 +1359,8 @@
 				       (int)old_dir_nlink, old_dir->i_nlink);
 		} else {
 			ocfs2_dinode *fe;
-			status = ocfs_journal_access(handle, old_dir_bh, OCFS_JOURNAL_ACCESS_WRITE);
+			status = ocfs_journal_access(handle, old_dir,
+						     old_dir_bh, OCFS_JOURNAL_ACCESS_WRITE);
 			fe = (ocfs2_dinode *) old_dir_bh->b_data;
 			fe->i_links_count = old_dir->i_nlink;
 			status = ocfs_journal_dirty(handle, old_dir_bh);
@@ -1446,7 +1444,7 @@
 	memset(bhs, 0, sizeof(struct buffer_head *) * blocks);
 
 	status = ocfs_lookup_file_allocation(osb, 0, &logical, sb->s_blocksize, &contig,
-					     inode, 1);
+					     inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -1479,7 +1477,7 @@
 
 		set_buffer_uptodate(bhs[virtual]);
 		SET_BH_SEQNUM(inode, bhs[virtual]);
-		status = ocfs_journal_access(handle, bhs[virtual], 
+		status = ocfs_journal_access(handle, inode, bhs[virtual], 
 					     OCFS_JOURNAL_ACCESS_CREATE);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
@@ -1583,7 +1581,6 @@
 		goto bail;
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, dir);
-	ocfs_handle_add_inode(handle, dir);
 
 	dirfe = (ocfs2_dinode *) parent_fe_bh->b_data;
 	if (!dirfe->i_links_count) {
@@ -1773,7 +1770,7 @@
 		     (le16_to_cpu(de->rec_len) >= rec_len)) ||
 		    (le16_to_cpu(de->rec_len) >=
 		     (OCFS2_DIR_REC_LEN(de->name_len) + rec_len))) {
-			status = ocfs_journal_access(handle, insert_bh, 
+			status = ocfs_journal_access(handle, dir, insert_bh,
 						    OCFS_JOURNAL_ACCESS_WRITE);
 			/* By now the buffer is marked for journaling */
 			offset += le16_to_cpu(de->rec_len);
@@ -1835,7 +1832,8 @@
 			goto bail;
 		}
 		if (de == de_del)  {
-			status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+			status = ocfs_journal_access(handle, dir, bh, 
+						     OCFS_JOURNAL_ACCESS_WRITE);
 			if (status < 0) {
 				status = -EIO;
 				goto bail;
@@ -2072,7 +2070,7 @@
 		goto leave;
 	}
 
-	/* disk lock orphan dir here. */
+	ocfs_handle_add_inode(handle, orphan_dir_inode);
 	status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 0,
 				   &orphan_dir_bh, orphan_dir_inode);
 	if (status < 0) {
@@ -2081,7 +2079,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 0, 
 			     orphan_dir_inode);
-	ocfs_handle_add_inode(handle, orphan_dir_inode);
 
 	status = ocfs_prepare_dir_for_insert(osb, orphan_dir_inode, 
 					     orphan_dir_bh, name, namelen, 
@@ -2141,7 +2138,7 @@
 		goto leave;
 	}
 
-	status = ocfs_journal_access(handle, orphan_dir_bh, 
+	status = ocfs_journal_access(handle, orphan_dir_inode, orphan_dir_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -2233,7 +2230,7 @@
 		goto leave;
 	}
 
-	status = ocfs_journal_access(handle, orphan_dir_bh, 
+	status = ocfs_journal_access(handle,orphan_dir_inode,  orphan_dir_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);

Modified: trunk/src/nm.c
===================================================================
--- trunk/src/nm.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/nm.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -299,8 +299,8 @@
 	}
 
 	/* ok, we're going to have to take the extend sem. We can't do
-	 * this holding ip_sem so we drop it and recheck after we've
-	 * got it. */
+	 * this holding ip_node_extend_sem so we drop it and recheck after
+	 * we've got it. */
 	spin_unlock(&oin_num_ext_lock);
 
 	/* take the extend_sem on behalf of
@@ -310,7 +310,7 @@
 	 * effect of locking out
 	 * lookup_file_allocation on this
 	 * inode. */
-	down_write(&OCFS_I(inode)->ip_extend_sem);
+	down_write(&OCFS_I(inode)->ip_node_extend_sem);
 
 	atomic_inc(&inode->i_count);
 
@@ -366,7 +366,7 @@
 		list_del(&OCFS_I(inode)->ip_recovery_list);
 		INIT_LIST_HEAD(&OCFS_I(inode)->ip_recovery_list);
 
-		up_write(&OCFS_I(inode)->ip_extend_sem);
+		up_write(&OCFS_I(inode)->ip_node_extend_sem);
 
 		dec = 1;
 	}
@@ -393,16 +393,16 @@
 	/* force this as ours may be out of date. */
 	inode->i_nlink = 0;
 
-	down (&(OCFS_I(inode)->ip_sem));
+	spin_lock(&OCFS_I(inode)->ip_lock);
 	/* vote no if the file is still open. */
 	if (OCFS_I(inode)->ip_open_cnt > 0) {
 		LOG_TRACE_PROCESS_VOTE("open count = %u\n", 
 		       OCFS_I(inode)->ip_open_cnt);
-		up(&(OCFS_I(inode)->ip_sem));
+		spin_unlock(&OCFS_I(inode)->ip_lock);
 		status = 0;
 		goto done;
 	}
-	up(&(OCFS_I(inode)->ip_sem));
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 
 	/* vote no if someone's extending it. */
 	spin_lock(&oin_num_ext_lock);
@@ -441,10 +441,9 @@
 	d_prune_aliases (inode);
 	sync_mapping_buffers(inode->i_mapping);
 	ocfs_truncate_inode_pages(inode, 0);
-	down(&OCFS_I(inode)->ip_sem);
-	ocfs_extent_map_destroy(&OCFS_I(inode)->ip_ext_map);
-	ocfs_extent_map_init(&OCFS_I(inode)->ip_ext_map);
-	up(&OCFS_I(inode)->ip_sem);
+	spin_lock(&OCFS_I(inode)->ip_lock);
+	ocfs_extent_map_trunc(&OCFS_I(inode)->ip_ext_map);
+	spin_unlock(&OCFS_I(inode)->ip_lock);
 }
 
 
@@ -694,13 +693,13 @@
 				BUG();
 			}
 			ocfs_truncate_inode_pages(inode, 0);
-			down(&OCFS_I(inode)->ip_sem);
-			ocfs_extent_map_destroy(&OCFS_I(inode)->ip_ext_map);
-			ocfs_extent_map_init(&OCFS_I(inode)->ip_ext_map);
+			spin_lock(&OCFS_I(inode)->ip_lock);
+			ocfs_extent_map_trunc(&OCFS_I(inode)->ip_ext_map);
+			
 			/* truncate may send this */
 			if (flags & FLAG_FILE_UPDATE_OIN)
 				atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
-			up(&OCFS_I(inode)->ip_sem);
+			spin_unlock(&OCFS_I(inode)->ip_lock);
 		}
 		return 0;
 	}
@@ -992,7 +991,7 @@
 			OCFS_I(inode)->ip_num_extends = 0;
 			list_del(&OCFS_I(inode)->ip_recovery_list);
 			INIT_LIST_HEAD(&OCFS_I(inode)->ip_recovery_list);
-			up_write(&OCFS_I(inode)->ip_extend_sem);
+			up_write(&OCFS_I(inode)->ip_node_extend_sem);
 
 			spin_unlock(&oin_num_ext_lock);
 			up (&recovery_list_sem);

Modified: trunk/src/ocfs.h
===================================================================
--- trunk/src/ocfs.h	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/ocfs.h	2004-10-13 23:51:47 UTC (rev 1568)
@@ -333,7 +333,6 @@
 
 typedef struct _ocfs_extent_map
 {
-	spinlock_t lock;
 	__u32 count;
 	int initialized;
 	struct list_head head;
@@ -377,22 +376,20 @@
 
 	u64             ip_blkno;
 
-	/* These fields are protected by ip_sem */
-	struct semaphore  ip_sem;
+	/* protects allocation changes on this inode. */
+	struct rw_semaphore  ip_alloc_sem;
+
+	/* These fields are protected by ip_lock */
+	spinlock_t	  ip_lock;
 	__u32             ip_open_cnt;
 	__s64             ip_alloc_size;
 	__s64		  ip_mmu_private;
 	__u32             ip_open_flags;
-
-	spinlock_t	  ip_lock;
 	ocfs_extent_map   ip_ext_map;
 
 	atomic_t          ip_needs_verification;
 
-	/* This protects io on the metadata buffers related to this
-	 * inode. We also consider an "abort_trans" an I/O as it will
-	 * revert the buffer back to a previous state. */
-	struct rw_semaphore  ip_io_sem;
+	struct semaphore  ip_io_sem;
 
 	/* Used by the journalling code to attach an inode to a
 	 * handle.  These are protected by ip_io_sem in order to lock
@@ -401,8 +398,8 @@
 	struct list_head            ip_handle_list;
 	struct _ocfs_journal_handle *ip_handle;
 
-	/* ip_extend_sem locks out extends on behalf of other nodes. */
-	struct rw_semaphore  ip_extend_sem;
+	/* ip_node_extend_sem locks out extends on behalf of other nodes. */
+	struct rw_semaphore  ip_node_extend_sem;
 
 	struct list_head  ip_recovery_list;/* protected by recovery_list_sem */
 	__s32             ip_num_extends; /* protected by oin_num_ext_lock */

Modified: trunk/src/ocfs_journal.h
===================================================================
--- trunk/src/ocfs_journal.h	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/ocfs_journal.h	2004-10-13 23:51:47 UTC (rev 1568)
@@ -269,7 +269,9 @@
 #define OCFS_JOURNAL_ACCESS_WRITE  1
 #define OCFS_JOURNAL_ACCESS_UNDO   2
 int                  ocfs_journal_access(ocfs_journal_handle *handle, 
-					 struct buffer_head *bh, int type);
+					 struct inode *inode,
+					 struct buffer_head *bh, 
+					 int type);
 /*
  * A word about the journal_access/journal_dirty "dance". It is
  * entirely legal to journal_access a buffer more than once (as long
@@ -292,7 +294,8 @@
 int                  ocfs_journal_dirty(ocfs_journal_handle *handle, 
 					struct buffer_head *bh);
 void                 ocfs_handle_add_lock(ocfs_journal_handle *handle, 
-					  __u32 type, __u32 flags, 
+					  __u32 type,
+					  __u32 flags, 
 					  struct inode *inode);
 /*
  * Use this to protect from other processes reading buffer state while

Modified: trunk/src/suballoc.c
===================================================================
--- trunk/src/suballoc.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/suballoc.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -74,11 +74,13 @@
 					    u16 *bit_off,
 					    u16 *bits_found);
 static inline int ocfs_block_group_set_bits(ocfs_journal_handle *handle,
+					    struct inode *alloc_inode,
 					    ocfs2_group_desc *bg, 
 					    struct buffer_head *group_bh,
 					    unsigned int bit_off, 
 					    unsigned int num_bits);
 static int ocfs_relink_block_group(ocfs_journal_handle *handle,
+				   struct inode *alloc_inode,
 				   struct buffer_head *fe_bh,
 				   struct buffer_head *bg_bh,
 				   struct buffer_head *prev_bg_bh,
@@ -104,6 +106,7 @@
 	set_buffer_uptodate(bg_bh);
 	SET_BH_SEQNUM(alloc_inode, bg_bh);
 	status = ocfs_journal_access(handle, 
+				     alloc_inode,
 				     bg_bh, 
 				     OCFS_JOURNAL_ACCESS_CREATE);
 	if (status < 0) {
@@ -303,7 +306,8 @@
 
 	bg = (ocfs2_group_desc *) bg_bh->b_data;
 
-	status = ocfs_journal_access(handle, bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, alloc_inode,
+				     bh, OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -320,18 +324,18 @@
 	fe->i_clusters += cl->cl_cpg;
 
 	status = ocfs_journal_dirty(handle, bh);
-		if (status < 0) {
+	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
 	}
 
-	down (&(OCFS_I(alloc_inode)->ip_sem));
+	spin_lock(&OCFS_I(alloc_inode)->ip_lock);
 	OCFS_I(alloc_inode)->ip_alloc_size = 
 		(u64)fe->i_clusters << osb->s_clustersize_bits;
 	fe->i_size = OCFS_I(alloc_inode)->ip_alloc_size;
 	OCFS_I(alloc_inode)->u.ip_bitinfo.used_bits = fe->id1.bitmap1.i_used;
 	OCFS_I(alloc_inode)->u.ip_bitinfo.total_bits = fe->id1.bitmap1.i_total;
-	up (&(OCFS_I(alloc_inode)->ip_sem));
+	spin_unlock(&OCFS_I(alloc_inode)->ip_lock);
 	alloc_inode->i_size = fe->i_size;
 	alloc_inode->i_blocks = (alloc_inode->i_size + osb->sb->s_blocksize - 1) >> osb->sb->s_blocksize_bits;
 
@@ -368,6 +372,7 @@
 
 	OCFS_ASSERT(!(handle->flags & OCFS_HANDLE_STARTED));
 
+	ocfs_handle_add_inode(handle, alloc_inode);
 	status = ocfs_acquire_lock(osb, OCFS_LKM_EXMODE, 
 				   0, &bh, alloc_inode);
 	if (status < 0) {
@@ -377,7 +382,6 @@
 	}
 	ocfs_handle_add_lock(handle, OCFS_LKM_EXMODE, 
 			     0, alloc_inode);
-	ocfs_handle_add_inode(handle, alloc_inode);
 
 	fe = (ocfs2_dinode *) bh->b_data;
 	OCFS_ASSERT_RO(IS_VALID_FILE_ENTRY(fe));
@@ -562,6 +566,7 @@
 }
 
 static inline int ocfs_block_group_set_bits(ocfs_journal_handle *handle,
+					    struct inode *alloc_inode,
 					    ocfs2_group_desc *bg, 
 					    struct buffer_head *group_bh,
 					    unsigned int bit_off, 
@@ -578,7 +583,8 @@
 	LOG_TRACE_ARGS("block_group_set_bits: off = %u, num = %u\n", bit_off, 
 		       num_bits);
 
-	status = ocfs_journal_access(handle, 
+	status = ocfs_journal_access(handle,
+				     alloc_inode,
 				     group_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
@@ -622,6 +628,7 @@
 }
 
 static int ocfs_relink_block_group(ocfs_journal_handle *handle,
+				   struct inode *alloc_inode,
 				   struct buffer_head *fe_bh,
 				   struct buffer_head *bg_bh,
 				   struct buffer_head *prev_bg_bh,
@@ -647,7 +654,7 @@
 	bg_ptr = bg->bg_next_group;
 	prev_bg_ptr = prev_bg->bg_next_group;
 
-	status = ocfs_journal_access(handle, prev_bg_bh, 
+	status = ocfs_journal_access(handle, alloc_inode, prev_bg_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -662,7 +669,8 @@
 		goto bail;
 	}
 
-	status = ocfs_journal_access(handle, bg_bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, alloc_inode, bg_bh,
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -676,7 +684,8 @@
 		goto bail;
 	}
 
-	status = ocfs_journal_access(handle, fe_bh, OCFS_JOURNAL_ACCESS_WRITE);
+	status = ocfs_journal_access(handle, alloc_inode, fe_bh,
+				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -802,7 +811,8 @@
 	if ((prev_group_bh) 
 	    && (groups_read > OCFS2_BG_RELINK_TRIGGER) 
 	    && (ocfs_block_group_reasonably_empty(bg))) {
-		status = ocfs_relink_block_group(handle, ac->ac_bh, group_bh, 
+		status = ocfs_relink_block_group(handle, alloc_inode,
+						 ac->ac_bh, group_bh, 
 						 prev_group_bh, chain);
 		if (status < 0) {
 			LOG_ERROR_STATUS(status);
@@ -826,7 +836,8 @@
 	/* we found some. set the info on dinode, chainlist and then
 	 * the group */
 	status = ocfs_journal_access(handle, 
-				     ac->ac_bh, 
+				     alloc_inode,
+				     ac->ac_bh,
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -844,6 +855,7 @@
 	}
 
 	status = ocfs_block_group_set_bits(handle, 
+					   alloc_inode,
 					   bg, 
 					   group_bh, 
 					   *bit_off, 
@@ -856,9 +868,10 @@
 	LOG_TRACE_ARGS("Allocated %u bits from suballocator %llu\n", 
 		       *num_bits, fe->i_blkno);
 
-	down (&(OCFS_I(alloc_inode)->ip_sem));
+	spin_lock(&OCFS_I(alloc_inode)->ip_lock);
 	OCFS_I(alloc_inode)->u.ip_bitinfo.used_bits = fe->id1.bitmap1.i_used;
-	up (&(OCFS_I(alloc_inode)->ip_sem));
+	spin_unlock(&OCFS_I(alloc_inode)->ip_lock);
+
 	*bg_blkno = bg->bg_blkno;
 bail:
 	if (group_bh)
@@ -992,7 +1005,7 @@
 	group = (ocfs2_group_desc *) group_bh->b_data;
 	OCFS_ASSERT_RO(IS_VALID_GROUP_DESC(group));
 
-	status = ocfs_journal_access(handle, group_bh, 
+	status = ocfs_journal_access(handle, alloc_inode, group_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -1010,7 +1023,7 @@
 		goto bail;
 	}
 
-	status = ocfs_journal_access(handle, alloc_bh, 
+	status = ocfs_journal_access(handle, alloc_inode, alloc_bh, 
 				     OCFS_JOURNAL_ACCESS_WRITE);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
@@ -1026,9 +1039,9 @@
 		goto bail;
 	}
 
-	down (&(OCFS_I(alloc_inode)->ip_sem));
+	spin_lock(&OCFS_I(alloc_inode)->ip_lock);
 	OCFS_I(alloc_inode)->u.ip_bitinfo.used_bits = fe->id1.bitmap1.i_used;
-	up (&(OCFS_I(alloc_inode)->ip_sem));
+	spin_unlock(&OCFS_I(alloc_inode)->ip_lock);
 bail:
 	if (group_bh)
 		brelse(group_bh);

Modified: trunk/src/super.c
===================================================================
--- trunk/src/super.c	2004-10-13 22:44:14 UTC (rev 1567)
+++ trunk/src/super.c	2004-10-13 23:51:47 UTC (rev 1568)
@@ -750,10 +750,8 @@
 		goto bail;
 	}
 
-	down_read(&OCFS_I(inode)->ip_io_sem);
 	status = ocfs_read_block(osb, OCFS_I(inode)->ip_blkno, &bh, 
 				 OCFS_BH_CACHED, inode);
-	up_read(&OCFS_I(inode)->ip_io_sem);
 	if (status < 0) {
 		LOG_ERROR_STR("failed to read bitmap data");
 		ret = -EIO;
@@ -1548,7 +1546,7 @@
 	}
 	/* We're in the mount path, pretend locked=1 */
 	status = ocfs_lookup_file_allocation(osb, 0ULL, &ret, osb->sb->s_blocksize, NULL,
-					     inode, 1);
+					     inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;
@@ -1612,9 +1610,9 @@
 		LOG_ERROR_STATUS(status = -EINVAL);
 		goto bail;
 	}
-	/* We're in the mount path, pretend locked=1 */
+
 	status = ocfs_lookup_file_allocation(osb, 0ULL, &ret, osb->sb->s_blocksize, NULL,
-					     inode, 1);
+					     inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS(status);
 		goto bail;



More information about the Ocfs2-commits mailing list