[Ocfs2-commits] khackel commits r1313 - trunk/src

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Thu Jul 29 20:32:42 CDT 2004


Author: khackel
Date: 2004-07-29 19:32:40 -0500 (Thu, 29 Jul 2004)
New Revision: 1313

Modified:
   trunk/src/nm.c
Log:
change down_read on iosem in processvote to a trylock... this means that verifyupdateinode MAY NOT HAPPEN... at least the ip_needs_verification flag will be set tho

Modified: trunk/src/nm.c
===================================================================
--- trunk/src/nm.c	2004-07-28 22:09:17 UTC (rev 1312)
+++ trunk/src/nm.c	2004-07-30 00:32:40 UTC (rev 1313)
@@ -694,6 +694,42 @@
 	LOG_EXIT_STATUS (status);
 	return status;
 }
+static int ocfs_io_sem_read_trylock(struct inode *inode, u32 timeout)
+{
+	unsigned long jif;
+	int status;
+
+	OCFS_ASSERT(inode);
+
+	LOG_ENTRY_ARGS ("(%llu, %u)\n", OCFS_I(inode)->ip_blkno, timeout);
+
+	if (!timeout) {
+		down_read(&OCFS_I(inode)->ip_io_sem);
+		status = 0;
+		goto bail;
+	}
+
+	jif = jiffies + (timeout * HZ / 1000);
+
+	while(1) {
+		if (down_read_trylock(&OCFS_I(inode)->ip_io_sem)) {
+			status = 0;
+			break;
+		}
+
+		if (jif < jiffies) {
+			status = -ETIMEDOUT;
+			break;
+		}
+
+		ocfs_sleep (OCFS_NM_HEARTBEAT_TIME / 10);
+	}
+
+bail:
+	LOG_EXIT_STATUS (status);
+	return status;
+}
+
 #endif
 
 /*
@@ -1325,24 +1361,40 @@
 		ocfs_release_lockres (lockres); // ocfs_process_vote
 
 leave:
-	if (inode  && have_io_sem)
+	if (!inode)
+		goto no_inode_leave;
+
+	if (have_io_sem) {
 		up_write(&OCFS_I(inode)->ip_io_sem);
+		have_io_sem = 0;
+	}
 
 	if (atomic_read(&OCFS_I(inode)->ip_needs_verification) 
 	    && vote_type == UPDATE_OIN_INODE) {
+		have_io_sem = 1;
+#ifdef PROCESS_VOTE_TRYLOCK
+		if (ocfs_io_sem_read_trylock(inode, (OCFS_NM_HEARTBEAT_TIME/2))) {
+			LOG_ERROR_ARGS("Could not verify_update on %llu\n",
+				       OCFS_I(inode)->ip_blkno);
+			have_io_sem = 0;
+		}
+#else
 		down_read(&OCFS_I(inode)->ip_io_sem);
-		tmpstat = ocfs_verify_update_inode(osb, inode, 0);
-		if (tmpstat < 0)
-			LOG_ERROR_STATUS(tmpstat);
-		up_read(&OCFS_I(inode)->ip_io_sem);
+#endif
+		if (have_io_sem) {
+			tmpstat = ocfs_verify_update_inode(osb, inode, 0);
+			if (tmpstat < 0)
+				LOG_ERROR_STATUS(tmpstat);
+			up_read(&OCFS_I(inode)->ip_io_sem);
+			have_io_sem = 0;
+		}
 	}
 
-	if (inode) {
-		if (inc_inode_seq)
-			ocfs_inc_inode_seq(osb, inode, 1);
-		iput(inode);
-	}
+	if (inc_inode_seq)
+		ocfs_inc_inode_seq(osb, inode, 1);
+	iput(inode);
 
+no_inode_leave:
 	osb->voting_ino = 0;
 
 	up(&osb->vote_sem);



More information about the Ocfs2-commits mailing list