[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