[Ocfs2-commits] mfasheh commits r1108 - in trunk/src: . inc

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Tue Jun 15 20:06:10 CDT 2004


Author: mfasheh
Date: 2004-06-15 19:06:08 -0500 (Tue, 15 Jun 2004)
New Revision: 1108

Modified:
   trunk/src/dcache.c
   trunk/src/file.c
   trunk/src/inc/ocfs.h
   trunk/src/inode.c
   trunk/src/namei.c
   trunk/src/nm.c
Log:
* Turn needs_verification into an atomic int,
  ip_needs_verification. This avoids some potential races setting /
  reading that value.

* Fix up ocfs_verify_update_inode() to do locking with priv_sem only
  when it's necessary -- not during the I/O. This should reduce
  contention on that lock and get us within a step or two of just making
  it a spinlock.



Modified: trunk/src/dcache.c
===================================================================
--- trunk/src/dcache.c	2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/dcache.c	2004-06-16 00:06:08 UTC (rev 1108)
@@ -88,7 +88,7 @@
 	ret = 1;
 
 	/* TODO: Is this really necessary? */
-	OCFS_I(inode)->needs_verification = 1;
+	atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
 
 bail:
 

Modified: trunk/src/file.c
===================================================================
--- trunk/src/file.c	2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/file.c	2004-06-16 00:06:08 UTC (rev 1108)
@@ -176,8 +176,18 @@
 		goto leave;
 	}
 
-	/* kch - for an open request we are already given the 
-	* inode, and therefore we are given the oin too */
+	if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
+		down_read (&(OCFS_I(inode)->ip_io_sem));
+		status = ocfs_verify_update_inode (osb, inode, &truncate_pages,
+						   0);
+		up_read (&(OCFS_I(inode)->ip_io_sem));
+		if (status < 0) {
+			up_write(&OCFS_I(inode)->ip_io_sem);
+			LOG_ERROR_STATUS (status);
+			goto leave;
+		}
+	}
+
 	down_write (&(OCFS_I(inode)->ip_io_sem));
 	down (&(OCFS_I(inode)->priv_sem));
 	have_oin_sem = 1;
@@ -214,16 +224,6 @@
 		}
 	}
 
-	if (OCFS_I(inode)->needs_verification) {
-		status = ocfs_verify_update_inode (osb, inode, &truncate_pages,
-						   0);
-		if (status < 0) {
-			up_write(&OCFS_I(inode)->ip_io_sem);
-			LOG_ERROR_STATUS (status);
-			goto leave;
-		}
-	}
-
 	up_write(&OCFS_I(inode)->ip_io_sem);
 	/* yes, hold onto priv_sem. */
 
@@ -756,13 +756,11 @@
 		}
 	}
 
-	if (OCFS_I(inode)->needs_verification) {
+	if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
 		LOG_TRACE_STR ("OIN_NEEDS_VERIFICATION");
 		down_read (&(OCFS_I(inode)->ip_io_sem));
-		down (&(OCFS_I(inode)->priv_sem));
 		status = ocfs_verify_update_inode (osb, inode, &needs_trunc, 
 						   0);
-		up (&(OCFS_I(inode)->priv_sem));
 		up_read (&(OCFS_I(inode)->ip_io_sem));
 		if (needs_trunc)
 			ocfs_truncate_inode_pages(inode, 0);
@@ -887,13 +885,10 @@
 		}
 	}
 
-	if (OCFS_I(inode)->needs_verification) {
-		/* yay, locking hell! */
+	if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
 		down_read(&OCFS_I(inode)->ip_io_sem);
-		down (&(OCFS_I(inode)->priv_sem));
 		status = ocfs_verify_update_inode (osb, inode, &needs_trunc, 
 						   0);
-		up (&(OCFS_I(inode)->priv_sem));
 		up_read(&OCFS_I(inode)->ip_io_sem);
 		if (needs_trunc)
 			ocfs_truncate_inode_pages(inode, 0);
@@ -1385,20 +1380,17 @@
 	fileOff = GET_INODE_FEOFF(inode);
 
 	if (attr->ia_valid & ATTR_SIZE) {
-		down (&(OCFS_I(inode)->priv_sem));
-		if (OCFS_I(inode)->needs_verification) {
+		if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
 			LOG_TRACE_STR ("OIN_NEEDS_VERIFICATION");
 			status = ocfs_verify_update_inode (osb, inode, 
 							   &needs_trunc, 0);
 			if (status < 0) {
 				LOG_ERROR_STATUS (status);
 				LOG_TRACE_STR ("TODO: disable volume");
-				up (&(OCFS_I(inode)->priv_sem));
 				error = -EIO;
 				goto bail;
 			}
 		}
-		up (&(OCFS_I(inode)->priv_sem));
 		if (needs_trunc)
 			ocfs_truncate_inode_pages(inode, 0);
 

Modified: trunk/src/inc/ocfs.h
===================================================================
--- trunk/src/inc/ocfs.h	2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/inc/ocfs.h	2004-06-16 00:06:08 UTC (rev 1108)
@@ -1107,12 +1107,13 @@
 	/* These fields are protected by priv_sem */
 	struct semaphore  priv_sem;
 	__u32             open_hndl_cnt;
-	int               needs_verification;
 	__u64             chng_seq_num;
 	ocfs_extent_map   map;
 	__s64             alloc_size;
 	__u32             oin_flags;
 
+	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. */

Modified: trunk/src/inode.c
===================================================================
--- trunk/src/inode.c	2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/inode.c	2004-06-16 00:06:08 UTC (rev 1108)
@@ -323,6 +323,8 @@
 
 	init_rwsem(&i->ip_io_sem);
 
+	atomic_set(&i->ip_needs_verification, 0);
+
 	/* These should be set in read_inode2. */
 	i->alloc_size = 0ULL;
 	i->feoff = 0ULL;
@@ -1374,7 +1376,7 @@
 	osb = inode->i_sb->s_fs_info;
 	blocksize_bits = inode->i_sb->s_blocksize_bits;
 	/* make sure we're up to date... */
-	if (OCFS_I(inode)->needs_verification) {
+	if (atomic_read(&OCFS_I(inode)->ip_needs_verification)) {
 		LOG_TRACE_STR ("ocfs_direct_IO_get_blocks: verify oin.");
 		status = ocfs_verify_update_inode (osb, inode, &needs_trunc,
 						   0);
@@ -1894,12 +1896,13 @@
 
 	down_read (&(OCFS_I(inode)->ip_io_sem));
 	down (&(OCFS_I(inode)->priv_sem));
-
 	if (INODE_DELETED(inode)) {
+		up (&(OCFS_I(inode)->priv_sem));
 		LOG_TRACE_STR("inode deleted!\n");
 		status = -ENOENT;
 		goto bail;
 	}
+	up (&(OCFS_I(inode)->priv_sem));
 
 	if (osb->publ_map == (1 << osb->node_num)) {
 		LOG_TRACE_STR ("Only node alive.");
@@ -1907,12 +1910,15 @@
 	}
 
 	/* if I hold cache lock, no revalidate needed */
+	ocfs_acquire_lockres(GET_INODE_LOCKRES(inode), 0);
 	if (ocfs_is_local_cache_lock(osb, inode)) {
+		ocfs_release_lockres(GET_INODE_LOCKRES(inode));
 		LOG_TRACE_STR("local cache lock\n");
 		goto bail;
 	}
+	ocfs_release_lockres(GET_INODE_LOCKRES(inode));
 
-	OCFS_I(inode)->needs_verification = 1;
+	atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
 	status = ocfs_verify_update_inode(osb, inode, &needs_trunc, 0);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
@@ -1920,7 +1926,6 @@
 	}
 
 bail:
-	up (&(OCFS_I(inode)->priv_sem));
 	up_read (&(OCFS_I(inode)->ip_io_sem));
 
 	if (needs_trunc)
@@ -1930,7 +1935,7 @@
 
 	LOG_EXIT_STATUS(status);
 	return(status);
-}
+}				/* ocfs_inode_revalidate */
 
 /*
  * ocfs_verify_update_inode()
@@ -1941,6 +1946,7 @@
 	struct buffer_head *fe_bh = NULL;
 	ocfs_file_entry *fe = NULL;
 	__u64 offset;
+	int drop_priv_sem = 0;
 
 	/* We are setting the oin Updated flag in the end. */
 	LOG_ENTRY ();
@@ -1959,18 +1965,25 @@
 		goto leave;
 	}
 
+	down(&OCFS_I(inode)->priv_sem);
 	if (INODE_DELETED(inode)) {
+		up(&OCFS_I(inode)->priv_sem);
 		LOG_TRACE_ARGS("Inode %llu was marked as deleted!", 
 			       GET_INODE_FEOFF(inode));
 		status = -ENOENT;
 		goto leave;
 	}
+	up(&OCFS_I(inode)->priv_sem);
 
 	status = ocfs_read_bh(osb, offset, &fe_bh, OCFS_BH_COND_CACHED, inode);
 	if (status < 0) {
 		LOG_ERROR_STATUS (status);
 		goto leave;
 	}
+
+	down(&OCFS_I(inode)->priv_sem);
+	drop_priv_sem = 1;
+
 	fe = OCFS_BH_GET_DATA_READ(fe_bh);
 
 	/* Make sure that what we found is not a directory. */
@@ -2081,14 +2094,20 @@
 	OCFS_BH_PUT_DATA(fe_bh);
 	fe = NULL;
 
+	up(&OCFS_I(inode)->priv_sem);
+	drop_priv_sem = 0;
+
 	status = ocfs_update_lockres (osb, GET_INODE_FEOFF(inode), &fe_bh, 
 				      NULL, 0, inode, 0, lockres_locked);
 
 	status = 0;
 leave:
 	if (status == 0)
-		OCFS_I(inode)->needs_verification = 0;
+		atomic_set(&OCFS_I(inode)->ip_needs_verification, 0);
 
+	if (drop_priv_sem)
+		up(&OCFS_I(inode)->priv_sem);
+
 	if (fe_bh) {
 		if (fe)
 			OCFS_BH_PUT_DATA(fe_bh);

Modified: trunk/src/namei.c
===================================================================
--- trunk/src/namei.c	2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/namei.c	2004-06-16 00:06:08 UTC (rev 1108)
@@ -1044,10 +1044,8 @@
 		/* if our caching is working right, then after the
 		 * verify_update_inode, newfe->i_nlink ==
 		 * new_inode->i_nlink */
-		down (&(OCFS_I(new_inode)->priv_sem));
 		status = ocfs_verify_update_inode (osb, new_inode, 
 						   &needs_trunc, 0);
-		up (&(OCFS_I(new_inode)->priv_sem));
 		if (needs_trunc)
 			ocfs_truncate_inode_pages(new_inode, 0);
 

Modified: trunk/src/nm.c
===================================================================
--- trunk/src/nm.c	2004-06-15 23:56:11 UTC (rev 1107)
+++ trunk/src/nm.c	2004-06-16 00:06:08 UTC (rev 1108)
@@ -874,13 +874,11 @@
 	switch (vote_type) {
 		case UPDATE_OIN_INODE:
 			LOG_TRACE_STR("UPDATE_OIN_INODE");
-			down (&(OCFS_I(inode)->priv_sem));
-			OCFS_I(inode)->needs_verification = 1;
+			atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
 			tmpstat = ocfs_verify_update_inode(osb, inode, 
 							   &needs_trunc, 1);
 			if (tmpstat < 0)
 				LOG_ERROR_STATUS (tmpstat);
-			up (&(OCFS_I(inode)->priv_sem));
 			if (needs_trunc) {
 				if (inode)
 					ocfs_truncate_inode_pages(inode, 0);
@@ -925,8 +923,7 @@
 		case DELETE_ACQUIRE:
 			LOG_TRACE_STR("DELETE_ACQUIRE");
 
-			down (&(OCFS_I(inode)->priv_sem));
-			OCFS_I(inode)->needs_verification = 1;
+			atomic_set(&OCFS_I(inode)->ip_needs_verification, 1);
 			tmpstat = ocfs_verify_update_inode(osb, inode, 
 							   &needs_trunc,
 							   1);
@@ -948,6 +945,7 @@
 				inode->i_nlink = 0;
 			}
 
+			down (&(OCFS_I(inode)->priv_sem));
 			/* vote no if the file is still open. */
 			if (OCFS_I(inode)->open_hndl_cnt > 0) {
 				vote_response = FLAG_VOTE_OIN_ALREADY_INUSE;



More information about the Ocfs2-commits mailing list