[Ocfs-commits] manish commits r7 - in trunk: . ocfs2 ocfs2/Common ocfs2/Common/inc ocfs2/Linux vendor/unitedlinux

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Fri Jun 18 17:45:59 CDT 2004


Author: manish
Date: 2004-06-18 16:45:58 -0500 (Fri, 18 Jun 2004)
New Revision: 7

Modified:
   trunk/configure.in
   trunk/ocfs2/Common/inc/ocfsgenmisc.h
   trunk/ocfs2/Common/inc/ocfsgenvote.h
   trunk/ocfs2/Common/ocfsgencreate.c
   trunk/ocfs2/Common/ocfsgendirnode.c
   trunk/ocfs2/Common/ocfsgendlm.c
   trunk/ocfs2/Common/ocfsgenmisc.c
   trunk/ocfs2/Common/ocfsgennm.c
   trunk/ocfs2/Common/ocfsgenvote.c
   trunk/ocfs2/Common/ocfsheartbeat.c
   trunk/ocfs2/Linux/ocfsmain.c
   trunk/ocfs2/Makefile
   trunk/vendor/unitedlinux/ocfs-2.4.21.spec-generic.in
Log:
Sync


Modified: trunk/configure.in
===================================================================
--- trunk/configure.in	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/configure.in	2004-06-18 21:45:58 UTC (rev 7)
@@ -60,6 +60,9 @@
   i386|i486|i586|i686|i786|k6|k7)
     OCFS_PROCESSOR="i686"
     ;;
+  s390x)
+    OCFS_PROCESSOR="s390x"
+    ;;
   *)
     AC_MSG_ERROR([not configured for "$host_cpu"])
     ;;

Modified: trunk/ocfs2/Common/inc/ocfsgenmisc.h
===================================================================
--- trunk/ocfs2/Common/inc/ocfsgenmisc.h	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/inc/ocfsgenmisc.h	2004-06-18 21:45:58 UTC (rev 7)
@@ -55,6 +55,7 @@
 
 int ocfs_commit_cache (ocfs_super * osb, bool Flag);
 
+int ocfs_is_dir_empty (ocfs_super * osb, ocfs_dir_node * dirnode, bool * empty);
 
 /* sorry about all the macros, but file and line are important */
 

Modified: trunk/ocfs2/Common/inc/ocfsgenvote.h
===================================================================
--- trunk/ocfs2/Common/inc/ocfsgenvote.h	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/inc/ocfsgenvote.h	2004-06-18 21:45:58 UTC (rev 7)
@@ -28,7 +28,7 @@
 #define _OCFSGENVOTE_H_
 
 int ocfs_send_vote_reply (ocfs_super * osb, ocfs_dlm_msg * dlm_msg,
-			  __u32 vote_status, bool inode_open);
+			  __u32 vote_status, bool inode_open, int reason);
 
 int ocfs_comm_vote_for_del_ren (ocfs_super * osb, ocfs_lock_res ** lockres,
 				ocfs_dlm_msg * dlm_msg);

Modified: trunk/ocfs2/Common/ocfsgencreate.c
===================================================================
--- trunk/ocfs2/Common/ocfsgencreate.c	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/ocfsgencreate.c	2004-06-18 21:45:58 UTC (rev 7)
@@ -264,7 +264,6 @@
 
 	ocfs_down_sem (&(osb->vol_alloc_lock), true);
 
-	/* Get the allocation lock here */
         fe = ocfs_allocate_file_entry();
         if (!fe) {
                 LOG_ERROR_STATUS (status = -ENOMEM);
@@ -832,7 +831,8 @@
 	__u64 parentLockId;
 	__u32 index;
 
-	LOG_ENTRY ();
+	LOG_ENTRY_ARGS ("(osb=%p, poff=%u.%u, off=%u.%u)\n", osb,
+		       	HILO (parent_off), HILO (file_off));
 
 	parentLockId = parent_off;
 	parentLockFlags = (FLAG_FILE_CREATE | FLAG_DIR);
@@ -984,6 +984,7 @@
 	ocfs_log_record *pOcfsLogRec;
 	__u64 lockId = 0;
 	__u32 log_node_num = OCFS_INVALID_NODE_NUM;
+	bool empty = false;
 
 	LOG_ENTRY_ARGS ("(osb=0x%p, poff=%u.%u, fl=%u, foff=%u.%u)\n",
 			osb, HILO(parent_off), flags, HILO(file_off));
@@ -1054,7 +1055,13 @@
 	/* Ask for a lock on the file to ensure there are no open oin's */
 	/* on the file on any node */
 	if (fe->attribs & OCFS_ATTRIB_DIRECTORY) {
-		if ((pLockNode->num_ent_used > 0) && !(flags & FLAG_DEL_NAME)) {
+		status = ocfs_is_dir_empty (osb, pLockNode, &empty);
+		if (status < 0) {
+			LOG_ERROR_STATUS (status);
+			goto leave;
+		}
+
+		if ((!empty) && !(flags & FLAG_DEL_NAME)) {
 			status = -ENOTEMPTY;
 			goto leave;
 		}
@@ -1271,11 +1278,6 @@
 		goto leave;
 	}
 
-	/* Update all open oins */
-
-	/* Our local update is done, if somebody had asked for a bdcast lock  */
-	/* He shd set the state */
-
       leave:
 	if (bAcquiredLock) {
 		if (bFileLockAcquired)
@@ -1629,6 +1631,7 @@
 		goto leave;
 	}
 
+	/* lock was released on disk in last locknode write */
 	bAcquiredLock = false;
 
       leave:
@@ -1719,6 +1722,7 @@
 		goto leave;
 	}
 
+	/* lock was released on disk in last locknode write */
 	bAcquiredLock = false;
 
       leave:
@@ -2051,8 +2055,7 @@
 			DISK_LOCK_READER_NODE (fe) = OCFS_INVALID_NODE_NUM;
 			DISK_LOCK_WRITER_NODE (fe) = OCFS_INVALID_NODE_NUM;
 
-			OcfsQuerySystemTime (&fe->modify_time);
-
+			fe->modify_time = CURRENT_TIME;
 			fe->create_time = fe->modify_time;
 
 			status = ocfs_create_modify_file (osb, parent_off, NULL,
@@ -2113,8 +2116,7 @@
 		DISK_LOCK_READER_NODE (fe) = OCFS_INVALID_NODE_NUM;
 		DISK_LOCK_WRITER_NODE (fe) = OCFS_INVALID_NODE_NUM;
 
-		OcfsQuerySystemTime (&fe->modify_time);
-
+		fe->modify_time = CURRENT_TIME;
 		fe->create_time = fe->modify_time;
 
 		status = ocfs_create_modify_file (osb, parent_off, NULL, NULL,
@@ -2785,6 +2787,7 @@
 		goto leave;
 	}
 
+	/* lock was released on disk in last locknode write */
 	bAcquiredLock = false;
 
       leave:
@@ -2891,7 +2894,7 @@
 	DISK_LOCK_SEQNUM (fe) = changeSeqNum;
 	SET_VALID_BIT (fe->sync_flags);
 	fe->sync_flags &= ~(OCFS_SYNC_FLAG_CHANGE);
-	OcfsQuerySystemTime (&fe->modify_time);
+	fe->modify_time = CURRENT_TIME;
 
 	status = ocfs_write_file_entry (osb, fe, fe->this_sector);
 	if (status < 0) {

Modified: trunk/ocfs2/Common/ocfsgendirnode.c
===================================================================
--- trunk/ocfs2/Common/ocfsgendirnode.c	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/ocfsgendirnode.c	2004-06-18 21:45:58 UTC (rev 7)
@@ -1265,6 +1265,25 @@
 			index = 0;
 		}
 
+#ifdef ENABLE_OOPS_IN_DIRINDEX_CHECK
+		if (DirNode->num_ent_used > 1) {
+			ocfs_file_entry *f1, *f2;
+			int x, y;
+			f1=FILEENT (DirNode, 0);
+			for (x=1; x<DirNode->num_ent_used-1; ++x) {
+				f2=FILEENT (DirNode, x);
+				y=strcmp(f1->filename, f2->filename);
+				if (y < 0) {
+					LOG_ERROR_ARGS ("ocfs: f1=%s, f2=%s, dn=%u.%u, x=%d",
+						       	f1->filename, f2->filename,
+						       	HILO(DirNode->node_disk_off), x);
+					BUG();
+				}
+				f1 = f2;
+			}
+		}
+#endif
+
 		if (index < DirNode->num_ent_used)
 			memmove (&DirNode->index[index + 1],
 				 &DirNode->index[index],
@@ -1450,52 +1469,47 @@
 					PDirNode->head_del_ent_node = PDirNode->node_disk_off;
 			}
 
-			/* clear the lock on disk */
-			if (DISK_LOCK_FILE_LOCK (PDirNode) != OCFS_DLM_ENABLE_CACHE_LOCK) {
-				ocfs_acquire_lockres (dir_lres);
-				dir_lres->lock_type = OCFS_DLM_NO_LOCK;
-				ocfs_release_lockres (dir_lres);
-
-				lock_rls = true;
-
-				if (LockNode->node_disk_off == PDirNode->node_disk_off)
+			/* Release lock in memory and disk under lock */
+			ocfs_acquire_lockres (dir_lres);
+			if (LockNode->node_disk_off == PDirNode->node_disk_off) {
+				if (DISK_LOCK_FILE_LOCK (PDirNode) != OCFS_DLM_ENABLE_CACHE_LOCK) {
+					dir_lres->lock_type = OCFS_DLM_NO_LOCK;
 					DISK_LOCK_FILE_LOCK (PDirNode) = OCFS_DLM_NO_LOCK;
-				else
+					lock_rls = true;
+				}
+			} else {
+				if (DISK_LOCK_FILE_LOCK (LockNode) != OCFS_DLM_ENABLE_CACHE_LOCK) {
+					dir_lres->lock_type = OCFS_DLM_NO_LOCK;
 					DISK_LOCK_FILE_LOCK (LockNode) = OCFS_DLM_NO_LOCK;
+					lock_rls = true;
+				}
 			}
 
 			status = ocfs_write_dir_node (osb, PDirNode, offset);
 			if (status < 0) {
+				ocfs_release_lockres (dir_lres);
 				LOG_ERROR_STATUS (status);
 				goto leave;
 			}
 
 			if (LockNode->node_disk_off != PDirNode->node_disk_off) {
-				if ((DISK_LOCK_CURRENT_MASTER (LockNode) ==
-				     osb->node_num)
-				    && (DISK_LOCK_FILE_LOCK (LockNode) ==
-					OCFS_DLM_ENABLE_CACHE_LOCK))
-					status =
-					    ocfs_write_metadata (osb, LockNode,
-							       osb->sect_size,
-							       LockNode->
-							       node_disk_off);
-				else
-					status =
-					    ocfs_write_disk (osb, LockNode,
-							   osb->sect_size,
-							   LockNode->
-							   node_disk_off);
-
+				status = ocfs_write_metadata (osb, LockNode, osb->sect_size,
+							      LockNode->node_disk_off);
 				if (status < 0) {
+					ocfs_release_lockres (dir_lres);
 					LOG_ERROR_STATUS (status);
 					goto leave;
 				}
 			}
-			if (lock_rls)
+			ocfs_release_lockres (dir_lres);
+			/* lock was released in the last locknode write */
+			if (lock_rls);
 				lock_acq = false;
 			goto leave;
-		}
+		} else
+			LOG_TRACE_ARGS ("dfe: fe=%s, etd=%s, off=%u.%u\n",
+				        fe->filename, EntryToDel->filename,
+				        HILO(fe->this_sector));
 	}
       leave:
 	if (lock_acq) {
@@ -1535,10 +1549,6 @@
 		goto leave;
 	}
 
-	/* If we have a list of dir nodes go to the last dirnode */
-	/* and insert in that. */
-
-	/* We should not find this entry already inserted */
 	if (!invalid_dirnode && DirNode->num_ent_used < osb->max_dir_node_ent) {
 		status = ocfs_insert_dir_node (osb, DirNode, InsertEntry, LockNode,
 					&indexOffset);
@@ -1579,11 +1589,9 @@
 		}
 
 		if ((DISK_LOCK_CURRENT_MASTER (DirNode) == osb->node_num) &&
-		    (DISK_LOCK_FILE_LOCK (DirNode) ==
-		     OCFS_DLM_ENABLE_CACHE_LOCK)) {
+		    (DISK_LOCK_FILE_LOCK (DirNode) == OCFS_DLM_ENABLE_CACHE_LOCK)) {
 			DISK_LOCK_CURRENT_MASTER (pNewDirNode) = osb->node_num;
-			DISK_LOCK_FILE_LOCK (pNewDirNode) =
-			    OCFS_DLM_ENABLE_CACHE_LOCK;
+			DISK_LOCK_FILE_LOCK (pNewDirNode) = OCFS_DLM_ENABLE_CACHE_LOCK;
 		}
 
 		status = ocfs_insert_dir_node (osb, pNewDirNode, InsertEntry, LockNode,
@@ -1610,48 +1618,41 @@
 		indexOffset = -1;
 	}
 
+	/* Release the lock in memory and disk under lock */
+	ocfs_acquire_lockres (LockResource);
+
 	if (LockNode->node_disk_off == DirNode->node_disk_off) {
 		if (DISK_LOCK_FILE_LOCK (DirNode) != OCFS_DLM_ENABLE_CACHE_LOCK) {
-			ocfs_acquire_lockres (LockResource);
 			LockResource->lock_type = OCFS_DLM_NO_LOCK;
-			ocfs_release_lockres (LockResource);
-			/* Reset the lock on the disk */
 			DISK_LOCK_FILE_LOCK (DirNode) = OCFS_DLM_NO_LOCK;
 		}
 	} else {
 		if (DISK_LOCK_FILE_LOCK (LockNode) != OCFS_DLM_ENABLE_CACHE_LOCK) {
-			ocfs_acquire_lockres (LockResource);
 			LockResource->lock_type = OCFS_DLM_NO_LOCK;
-			ocfs_release_lockres (LockResource);
-			/* Reset the lock on the disk */
 			DISK_LOCK_FILE_LOCK (LockNode) = OCFS_DLM_NO_LOCK;
 		}
 	}
 
 	status = ocfs_write_dir_node (osb, DirNode, indexOffset);
 	if (status < 0) {
+		ocfs_release_lockres (LockResource);
 		LOG_ERROR_STATUS (status);
 		goto leave;
 	}
 
 	if (LockNode->node_disk_off != DirNode->node_disk_off) {
-		if ((DISK_LOCK_CURRENT_MASTER (LockNode) == osb->node_num) &&
-		    (DISK_LOCK_FILE_LOCK (LockNode) ==
-		     OCFS_DLM_ENABLE_CACHE_LOCK))
-			status =
-			    ocfs_write_metadata (osb, LockNode, osb->sect_size,
+		status = ocfs_write_metadata (osb, LockNode, osb->sect_size,
 					       LockNode->node_disk_off);
-		else
-			status =
-			    ocfs_write_disk (osb, LockNode, osb->sect_size,
-					   LockNode->node_disk_off);
-
 		if (status < 0) {
+			ocfs_release_lockres (LockResource);
 			LOG_ERROR_STATUS (status);
 			goto leave;
 		}
 	}
-      leave:
+
+	ocfs_release_lockres (LockResource);
+
+leave:
 	ocfs_release_dirnode (pNewDirNode);
 
 	LOG_EXIT_STATUS (status);
@@ -1720,8 +1721,9 @@
 	int status = 0;
 	__u8 offset;
 	__u8 *ind = NULL;
-	char tmpstr[3];
+	char tmpstr[4];
 	__u64 tmpoff;
+	int reason = 0;
 
 	LOG_ENTRY_ARGS ("(osb=0x%p, dn=0x%p)\n", osb, dirnode);
 
@@ -1739,6 +1741,7 @@
 	for (i = 0; i < dirnode->num_del; ++i) {
 		if (offset > 253) {
 			status = -EBADSLT;
+			reason = 1;
 			break;
 		}
 
@@ -1746,6 +1749,7 @@
 		for (j = 0; j < dirnode->num_ent_used; ++j) {
 			if (dirnode->index[j] == offset) {
 				status = -EBADSLT;
+				reason = 2;
 				break;
 			}
 		}
@@ -1753,6 +1757,7 @@
 		/* check for circular list */
 		if (ind[offset]) {
 			status = -EBADSLT;
+			reason = 3;
 			break;
 		} else
 			ind[offset] = 1;
@@ -1763,6 +1768,7 @@
 		/* file has to be deleted to be in the list */
 		if (fe->sync_flags) {
 			status = -EBADSLT;
+			reason = 4;
 			break;
 		}
 
@@ -1778,8 +1784,8 @@
 			tmpoff = dirnode->node_disk_off;
 		}
 
-		LOG_ERROR_ARGS ("bad offset=%u in %s=%u.%u", offset, tmpstr,
-			       	tmpoff);
+		LOG_TRACE_ARGS ("bad offset=%u in %s=%u.%u, rsn=%d\n", offset,
+			       	tmpstr, HILO(tmpoff), reason);
 	}
 
 bail:

Modified: trunk/ocfs2/Common/ocfsgendlm.c
===================================================================
--- trunk/ocfs2/Common/ocfsgendlm.c	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/ocfsgendlm.c	2004-06-18 21:45:58 UTC (rev 7)
@@ -708,8 +708,9 @@
 	req->flags = flags;
 	req->lock_seq_num = lockres->last_upd_seq_num;
 
-	LOG_TRACE_ARGS ("ocfs: vote request lockid=%u.%u, seq=%u.%u, map=0x%08x\n",
-	       HILO(req->lock_id), HILO(req->lock_seq_num), LO(vote_map));
+	LOG_TRACE_ARGS ("ocfs: voterqst id=%u.%u, seq=%u.%u, map=0x%x, jif=%u\n",
+		   HILO(req->lock_id), HILO(req->lock_seq_num), LO(vote_map),
+		   jiffies);
 
 	ocfs_send_bcast (osb, vote_map, dlm_msg);
 	status = ocfs_wait (lockres->voted_event,
@@ -720,6 +721,10 @@
 		LOG_TRACE_ARGS ("timedout seq=%u.%u\n", HILO(req->lock_seq_num));
 	}
 
+	LOG_TRACE_ARGS ("ocfs: voted id=%u.%u, seq=%u.%u, map=0x%x, status=%d, "
+		"vote=%d, jif=%u\n", HILO(req->lock_id), HILO(req->lock_seq_num),
+	       	LO(vote_map), status, lockres->vote_status, jiffies);
+
 	ocfs_compute_dlm_stats (status, lockres->vote_status,
 			       	&(OcfsGlobalCtxt.net_reqst_stats));
 
@@ -920,8 +925,8 @@
 
 	spin_lock (&lockres->lock_mutex);
 	if (lockres->in_use == 0) {
-		LOG_TRACE_ARGS("Releasing lockres with inuse 0: 0x%p\n",
-			       lockres);
+		LOG_TRACE_ARGS ("Releasing lockres with inuse=0, lastpid=%u, "
+			       	"lres=0x%p", lockres->thread_id, lockres);
 		lockres->thread_id = 0;
 		lockres->in_use = 0;
 	} else {
@@ -1015,12 +1020,25 @@
 	int status = -EAGAIN;
 	bool disk_vote = false;
 	bool lock_acq = false;
+	bool first_loop = true;
 
 	LOG_ENTRY ();
 
 	ocfs_get_lockres(lockres);
 
 	while (status == -EAGAIN) {
+		ACQUIRE_WITH_FLAG(lockres, lock_acq);
+
+		if (!first_loop) {
+			status = ocfs_disk_update_resource (osb, lockres, NULL, 0);
+			if (status < 0) {
+				LOG_ERROR_STATUS (status);
+				goto bail;
+			}
+		}
+
+		first_loop = false;
+
 		if (!IS_NODE_ALIVE (osb->publ_map, lockres->master_node_num,
 				    OCFS_MAXIMUM_NODES)) {
 			LOG_TRACE_ARGS ("Master (%u) dead, lockid %u.%u\n",
@@ -1029,8 +1047,6 @@
 			goto bail;
 		}
 
-		ACQUIRE_WITH_FLAG(lockres, lock_acq);
-
 		if (lockres->master_node_num == osb->node_num) {
 			LOG_TRACE_ARGS ("Added node to map 0x%08x, lockid %u.%u\n",
 			     LO (lockres->oin_openmap), HILO (lockres->sector_num));
@@ -1328,7 +1344,7 @@
 		lockres->oin_openmap = DISK_LOCK_OIN_MAP (fe);
 		updated = true;
 	}
-            
+
         if (lockres->master_node_num == osb->node_num) {
             if ((flags & FLAG_FILE_DELETE) || (flags & FLAG_FILE_RENAME)) {
                 status = ocfs_get_x_for_del (osb, lock_id, lock_type, flags,
@@ -1351,7 +1367,7 @@
             }
 #endif
             DISK_LOCK_CURRENT_MASTER (fe) = osb->node_num;
-                
+
             if (DISK_LOCK_FILE_LOCK (fe) < OCFS_DLM_EXCLUSIVE_LOCK) {
                 DISK_LOCK_FILE_LOCK (fe) = lock_type;
                     
@@ -1363,7 +1379,7 @@
                     }
                 }
             }
-                                            
+
             status = ocfs_write_file_entry (osb, fe, lock_id);
             if (status < 0) {
                 LOG_ERROR_STATUS (status);
@@ -1653,7 +1669,7 @@
 
 /*
  * ocfs_disk_release_lock()
- *
+ *	lockres needs to be held in calling function
  */
 int ocfs_disk_release_lock (ocfs_super * osb, __u64 lock_id, __u32 lock_type,
 			    __u32 flags, ocfs_lock_res * lockres, ocfs_file_entry *fe)
@@ -1673,8 +1689,6 @@
 	LOG_ENTRY_ARGS ("(0x%p, %u.%u, %u, %u, 0x%p)\n", osb, HI (lock_id),
 			LO (lock_id), lock_type, flags, lockres);
 
-//	ocfs_acquire_lockres (lockres);
-
 	if (fe == NULL) {
 		status = ocfs_get_file_entry (osb, &fe, lock_id);
 		if (status < 0) {
@@ -1827,7 +1841,6 @@
       finito:
 	if (fe_alloc)
 		ocfs_release_file_entry (fe);
-//	ocfs_release_lockres (lockres);
 	LOG_EXIT_STATUS (status);
 	return status;
 }				/* ocfs_disk_release_lock */
@@ -1840,13 +1853,11 @@
 		       ocfs_lock_res * lockres, ocfs_file_entry *fe)
 {
 	int status = 0;
-	bool lock_acq = false;
 
-	LOG_ENTRY_ARGS ("(0x%p, %u.%u, %u, %u, 0x%p)\n", osb, HI (lock_id),
-			LO (lock_id), lock_type, flags, lockres);
+	LOG_ENTRY_ARGS ("(osb=0x%p, id=%u.%u, typ=0x%x, flg=0x%x, lres=0x%p)\n",
+		       	osb, HILO (lock_id), lock_type, flags, lockres);
 
 	ocfs_acquire_lockres (lockres);
-	lock_acq = true;
 
 	switch (lock_type) {
 	    case OCFS_DLM_SHARED_LOCK:
@@ -1860,35 +1871,18 @@
 	    case OCFS_DLM_EXCLUSIVE_LOCK:
 		    break;
 	}
-	/*
-	 * Change flags based on which kind of lock we are releasing
-	 * For directory we need special handling of oin updates when the release
-	 * is for XBcast
-	 * For file we need to update oin's
-	 * For Shared we need to update the lock state locally only
-	 */
 
-	/* OcfsRelease */
-
-	/* CommReleaseLock */
 	if (flags & FLAG_FILE_DELETE) {
 		lockres->lock_type = OCFS_DLM_NO_LOCK;
 		lockres->master_node_num = OCFS_INVALID_NODE_NUM;
 		status = 0;
 		goto do_release_lock;
 	}
-//    if(lock_id != OCFS_BITMAP_LOCK_OFFSET)
-	{
-		if ((lockres->lock_type == OCFS_DLM_ENABLE_CACHE_LOCK) &&
-		    (lockres->master_node_num == osb->node_num)) {
-			status = 0;
-			goto finally;
-		}
-	}
 
-	if (lock_id == OCFS_BITMAP_LOCK_OFFSET) {
-		LOG_TRACE_ARGS ("Bitmap lock state is (%d)\n",
-				lockres->lock_type);
+	if ((lockres->lock_type == OCFS_DLM_ENABLE_CACHE_LOCK) &&
+	    (lockres->master_node_num == osb->node_num)) {
+		status = 0;
+		goto finally;
 	}
 
 	lockres->lock_type = OCFS_DLM_NO_LOCK;
@@ -1896,11 +1890,6 @@
 		lockres->master_node_num = OCFS_INVALID_NODE_NUM;
 
 do_release_lock:
-//	if (lock_acq) {
-//		ocfs_release_lockres (lockres);
-//		lock_acq = false;
-//	}
-
 	status = ocfs_disk_release_lock (osb, lock_id, lock_type, flags,
 					 lockres, fe);
 	if (status < 0) {
@@ -1909,8 +1898,7 @@
 	}
 
 finally:
-	if (lock_acq)
-		ocfs_release_lockres (lockres);
+	ocfs_release_lockres (lockres);
 
 	LOG_EXIT_STATUS (status);
 	return (status);

Modified: trunk/ocfs2/Common/ocfsgenmisc.c
===================================================================
--- trunk/ocfs2/Common/ocfsgenmisc.c	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/ocfsgenmisc.c	2004-06-18 21:45:58 UTC (rev 7)
@@ -588,16 +588,6 @@
 	snprintf(osb->dev_str, sizeof(osb->dev_str), "%u,%u",
 		 MAJOR(osb->sb->s_dev), MINOR(osb->sb->s_dev));
 
-#ifdef __LP64__
-#define HASHBITS	11
-#else
-#define HASHBITS	12
-#endif
-	if (!ocfs_hash_create (&(osb->root_sect_node), HASHBITS)) {
-		LOG_ERROR_STATUS (status = -ENOMEM);
-		goto bail;
-	}
-
 	ocfs_init_sem (&(osb->osb_res));
 	ocfs_init_sem (&(osb->map_lock));
 	ocfs_init_sem (&(osb->log_lock));
@@ -612,14 +602,22 @@
 	init_MUTEX (&(osb->comm_lock));
 	init_MUTEX (&(osb->trans_lock));
 
+#ifdef __LP64__
+#define HASHBITS	11
+#else
+#define HASHBITS	12
+#endif
+	if (!ocfs_hash_create (&(osb->root_sect_node), HASHBITS)) {
+		LOG_ERROR_STATUS (status = -ENOMEM);
+		goto bail;
+	}
+
 	osb->node_recovering = OCFS_INVALID_NODE_NUM;
-
 	osb->needs_flush = false;
 	osb->commit_cache_exec = false;
 	osb->log_disk_off = 0;
 	osb->log_meta_disk_off = 0;
 	osb->trans_in_progress = false;
-
 	osb->last_disk_seq = ULONGLONG_MAX;
 
 	init_MUTEX (&(osb->publish_lock));
@@ -1018,3 +1016,58 @@
 	LOG_EXIT_STATUS (status);
 	return status;
 }				/* ocfs_commit_cache */
+
+/*
+ * ocfs_is_dir_empty()
+ * 
+ */
+int ocfs_is_dir_empty (ocfs_super * osb, ocfs_dir_node * dirnode, bool * empty)
+{
+	ocfs_dir_node *dn = NULL;
+	__u64 offset;
+	int status = 0;
+
+	LOG_ENTRY ();
+
+	*empty = true;
+
+	if (dirnode->num_ent_used != 0) {
+		*empty = false;
+		goto bail;
+	}
+
+	offset = dirnode->next_node_ptr;
+	if (offset == INVALID_NODE_POINTER)
+		goto bail;
+
+	dn = ocfs_malloc (OCFS_SECTOR_SIZE);
+	if (dn == NULL) {
+		LOG_ERROR_STATUS (status = -ENOMEM);
+		goto bail;
+	}
+
+	while (1) {
+		status = ocfs_read_sector (osb, dn, offset);
+		if (status < 0) {
+			LOG_ERROR_STATUS (status);
+			goto bail;
+		}
+
+		if (dn->num_ent_used != 0) {
+			*empty = false;
+			goto bail;
+		}
+
+		offset = dn->next_node_ptr;
+		if (offset == INVALID_NODE_POINTER)
+			goto bail;
+	}
+
+bail:
+	LOG_TRACE_ARGS("status=%d, dir=%u.%u is %s\n", status,
+		       HILO(dirnode->node_disk_off),
+		       (*empty ? "empty" : "not empty"));
+	ocfs_safefree (dn);
+	LOG_EXIT_STATUS (status);
+	return status;
+}				/* ocfs _is_dir_empty */

Modified: trunk/ocfs2/Common/ocfsgennm.c
===================================================================
--- trunk/ocfs2/Common/ocfsgennm.c	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/ocfsgennm.c	2004-06-18 21:45:58 UTC (rev 7)
@@ -217,13 +217,7 @@
 			goto finally;
 		}
 
-		if (lock_id != (*lockres)->sector_num) {
-			LOG_ERROR_ARGS ("lockid=%u.%u != secnum=%u.%u\n",
-					HILO(lock_id),
-					HILO((*lockres)->sector_num));
-			status = -EFAIL;
-			goto finally;
-		}
+		OCFS_ASSERT (lock_id == (*lockres)->sector_num);
 
 		status = ocfs_check_for_stale_lock(osb, *lockres, fe, lock_id);
 		if (status < 0) {
@@ -248,13 +242,7 @@
 		}
 	}
 
-	if (lock_id != (*lockres)->sector_num) {
-		LOG_ERROR_ARGS ("lockid=%u.%u != secnum=%u.%u",
-				HILO(lock_id),
-				HILO((*lockres)->sector_num));
-		status = -EFAIL;
-		goto finally;
-	}
+	OCFS_ASSERT (lock_id == (*lockres)->sector_num);
 
 	if ((*lockres)->master_node_num != osb->node_num) {
 		status = ocfs_disk_update_resource (osb, *lockres, fe, timeout);
@@ -466,6 +454,13 @@
 	} else
 		lockres_acq = true;
 
+	/* refresh the lockres while under lock */
+	status = ocfs_disk_update_resource (osb, lockres, NULL, 0);
+	if (status < 0) {
+		LOG_ERROR_STATUS (status);
+		goto finally;
+	}
+
 	/* Zero out the vote for everybody, if any already set and hung */
 	for (i = 0; i < num_nodes; i++)
 		vote->vote[i] = 0;
@@ -664,7 +659,7 @@
 		}
 	}
 
-      finito:
+finito:
 	vote->dir_ent = publish->dir_ent;
 	vote->vote_seq_num = publish->publ_seq_num;
 
@@ -763,7 +758,7 @@
 			}
 		}
 
-		if (((*lockres)->oin->open_hndl_cnt == 0) &&
+		if ((oin->open_hndl_cnt == 0) &&
 		    (!(oin->oin_flags & OCFS_OIN_IN_USE))) {
 			if (!(oin->oin_flags & OCFS_OIN_IN_TEARDOWN) &&
 			    IS_RELEASE_LOCK(flags)) {

Modified: trunk/ocfs2/Common/ocfsgenvote.c
===================================================================
--- trunk/ocfs2/Common/ocfsgenvote.c	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/ocfsgenvote.c	2004-06-18 21:45:58 UTC (rev 7)
@@ -39,7 +39,7 @@
  *
  */
 int ocfs_send_vote_reply (ocfs_super * osb, ocfs_dlm_msg * dlm_msg,
-			  __u32 vote_status, bool inode_open)
+			  __u32 vote_status, bool inode_open, int reason)
 {
 	ocfs_dlm_req_master *req_master;
 	ocfs_dlm_reply_master *reply_master;
@@ -74,10 +74,10 @@
 
 	vote_map = (1 << dlm_msg->src_node);
 
-	LOG_TRACE_ARGS ("vote_reply node=%d, id=%u.%u, status=%d, "
-			"seq=%u.%u, oh=%d\n", dlm_msg->src_node,
-		       	HILO(req_master->lock_id), vote_status,
-		       	HILO(req_master->lock_seq_num), inode_open);
+	LOG_TRACE_ARGS ("reply node=%d, seq=%u.%u, id=%u.%u, status=%d, "
+			"oh=%d, rsn=%d, jif=%u\n", dlm_msg->src_node,
+		       	HILO(req_master->lock_seq_num), HILO(req_master->lock_id),
+		       	vote_status, inode_open, reason, jiffies);
 
 	ocfs_send_bcast (osb, vote_map, send_dlm_msg);
 
@@ -116,7 +116,7 @@
 		goto bail;
 	}
 
-	ocfs_send_vote_reply (osb, dlm_msg, voted, false);
+	ocfs_send_vote_reply (osb, dlm_msg, voted, false, 99);
 
 bail:
 	LOG_EXIT_STATUS (status);
@@ -273,7 +273,7 @@
 		if (status == -ETIMEDOUT) {
 			LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_RETRY\n",
 				       	HILO (req_master->lock_seq_num));
-			ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_UPDATE_RETRY, false);
+			ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_UPDATE_RETRY, false, 1);
 			goto finally;
 		}
 		if (req_master->flags & FLAG_FILE_UPDATE_OIN) {
@@ -286,7 +286,7 @@
 			}
 			LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=OIN_UPDATED\n",
 			       	HILO (req_master->lock_seq_num));
-			ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_OIN_UPDATED, false);
+			ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_OIN_UPDATED, false, 2);
 			status = 0;
 		} else
 			LOG_ERROR_STATUS (status);
@@ -297,11 +297,18 @@
 	if (status < 0) {
 		LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_RETRY\n",
 			       	HILO (req_master->lock_seq_num));
-		ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_UPDATE_RETRY, false);
+		ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_UPDATE_RETRY, false, 3);
 		goto finally;
 	} else
 		lockres_acq = true;
 
+	/* refresh the lockres while under lock */
+	status = ocfs_disk_update_resource (osb, lockres, NULL, 0);
+	if (status < 0) {
+		LOG_ERROR_STATUS (status);
+		goto finally;
+	}
+
 	flags = req_master->flags;
 	node_num = dlm_msg->src_node;
 
@@ -317,7 +324,7 @@
 			if (osb->trans_in_progress == true) {
 				LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_RETRY\n",
 					       	HILO (req_master->lock_seq_num));
-				ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_UPDATE_RETRY, false);
+				ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_UPDATE_RETRY, false, 4);
 				goto finally;
 			}
 
@@ -356,7 +363,7 @@
 
 			LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_NODE\n",
 			       	HILO (req_master->lock_seq_num));
-			ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_NODE, false);
+			ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_NODE, false, 5);
 			status = 0;
 			goto finally;
 		}
@@ -383,7 +390,7 @@
 		}
 		LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=OIN_UPDATE\n",
 		       	HILO (req_master->lock_seq_num));
-		ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_OIN_UPDATED, false);
+		ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_OIN_UPDATED, false, 6);
 		status = 0;
 		goto finally;
 	}
@@ -397,7 +404,7 @@
 				if (lockres->lock_type != OCFS_DLM_NO_LOCK) {
 					LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_RETRY\n",
 						       	HILO (req_master->lock_seq_num));
-					ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_UPDATE_RETRY, false);
+					ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_UPDATE_RETRY, false, 7);
 					goto finally;
 				}
 
@@ -426,7 +433,7 @@
 				lockres->master_node_num = node_num;
 				LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_NODE\n",
 				       	HILO (req_master->lock_seq_num));
-				ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_NODE, false);
+				ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_NODE, false, 8);
 				goto finally;
 			} else if (flags & FLAG_ADD_OIN_MAP) {
 				__u64 tmp = req_master->lock_id;
@@ -439,14 +446,14 @@
 
 				if (fe->attribs & OCFS_ATTRIB_DIRECTORY) {
 					LOG_TRACE_STR("stale lock probe on directory!, respond but do nothing");
-					ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_NODE, false);
+					ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_NODE, false, 9);
 					goto finally;
 				} else if (IS_FE_DELETED(fe->sync_flags) ||
 					   (!(fe->sync_flags & OCFS_SYNC_FLAG_VALID))) {
 					LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=FILE_DEL\n",
 				       		HILO (req_master->lock_seq_num));
 					ocfs_send_vote_reply (osb, dlm_msg,
-						FLAG_VOTE_FILE_DEL, false);
+						FLAG_VOTE_FILE_DEL, false, 10);
 					goto finally;
 				} else {
 					DISK_LOCK_OIN_MAP (fe) |= (1 << node_num);
@@ -463,7 +470,7 @@
 					LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_NODE\n",
 				       		HILO (req_master->lock_seq_num));
 					ocfs_send_vote_reply (osb, dlm_msg,
-							FLAG_VOTE_NODE, false);
+							FLAG_VOTE_NODE, false, 11);
 					goto finally;
 				}
 			}
@@ -474,7 +481,7 @@
 				LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=RETRY\n",
 			       		HILO (req_master->lock_seq_num));
 				ocfs_send_vote_reply (osb, dlm_msg,
-					FLAG_VOTE_UPDATE_RETRY, false);
+					FLAG_VOTE_UPDATE_RETRY, false, 12);
 			} else {
 				oin_exists = false;
 
@@ -488,7 +495,7 @@
 					LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=RETRY\n",
 			       			HILO (req_master->lock_seq_num));
 					ocfs_send_vote_reply (osb, dlm_msg,
-						FLAG_VOTE_UPDATE_RETRY, oin_exists);
+						FLAG_VOTE_UPDATE_RETRY, oin_exists, 13);
 					goto finally;
 				} else {
 					if ((!(flags & FLAG_DIR)) &&
@@ -501,7 +508,7 @@
 					LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_NODE\n",
 			       			HILO (req_master->lock_seq_num));
 					ocfs_send_vote_reply (osb, dlm_msg,
-						FLAG_VOTE_NODE, oin_exists);
+						FLAG_VOTE_NODE, oin_exists, 14);
 				}
 			}
 		}
@@ -515,7 +522,7 @@
 			LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=RETRY\n",
 		      		HILO (req_master->lock_seq_num));
 			ocfs_send_vote_reply (osb, dlm_msg,
-					FLAG_VOTE_UPDATE_RETRY, oin_exists);
+					FLAG_VOTE_UPDATE_RETRY, oin_exists, 15);
 			goto finally;
 		} else {
 			/* Vote for the node */
@@ -528,7 +535,7 @@
 
 			LOG_TRACE_ARGS ("ocfs: rqrep seq=%u.%u, vote=VOTE_NODE\n",
 		      		HILO (req_master->lock_seq_num));
-			ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_NODE, oin_exists);
+			ocfs_send_vote_reply (osb, dlm_msg, FLAG_VOTE_NODE, oin_exists, 16);
 			goto finally;
 		}
 	}

Modified: trunk/ocfs2/Common/ocfsheartbeat.c
===================================================================
--- trunk/ocfs2/Common/ocfsheartbeat.c	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Common/ocfsheartbeat.c	2004-06-18 21:45:58 UTC (rev 7)
@@ -428,10 +428,10 @@
 		if (!IS_VALID_OSB (sv->osb) || !publish)
 			goto bail;
 		ocfs_process_vote (sv->osb, publish, sv->node_num);
-		ocfs_safefree (sv);
 	}
 
 bail:
+	ocfs_safefree (sv);
 	LOG_EXIT ();
 	return ;
 }				/* ocfs_process_vote_worker */

Modified: trunk/ocfs2/Linux/ocfsmain.c
===================================================================
--- trunk/ocfs2/Linux/ocfsmain.c	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Linux/ocfsmain.c	2004-06-18 21:45:58 UTC (rev 7)
@@ -970,13 +970,13 @@
 
         osb = ((ocfs_super *)(sb->u.generic_sbp));
 	OCFS_ASSERT(IS_VALID_OSB(osb));
-
-        numbits = osb->cluster_bitmap.size;
         
         status = ocfs_read_force_disk (osb, lockbuf, OCFS_SECTOR_SIZE, (__u64)OCFS_BITMAP_LOCK_OFFSET);
 
+        freebits = numbits = osb->cluster_bitmap.size;
+
         if (numbits >= bm_lock->used_bits)
-            freebits = numbits - bm_lock->used_bits;
+            freebits -= bm_lock->used_bits;
 
 	/* take out the space reserved for system files */
 	freebits -= (8 * ONE_MEGA_BYTE / osb->vol_layout.cluster_size);

Modified: trunk/ocfs2/Makefile
===================================================================
--- trunk/ocfs2/Makefile	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/ocfs2/Makefile	2004-06-18 21:45:58 UTC (rev 7)
@@ -101,6 +101,9 @@
 ifeq ($(OCFS_PROCESSOR),i586)
   DEFINES += -D__ILP32__
 endif
+ifeq ($(OCFS_PROCESSOR),s390x)
+  DEFINES += -D__LP64__
+endif
 
 CFLAGS += $(OPTIMIZE)
 

Modified: trunk/vendor/unitedlinux/ocfs-2.4.21.spec-generic.in
===================================================================
--- trunk/vendor/unitedlinux/ocfs-2.4.21.spec-generic.in	2004-05-14 00:01:35 UTC (rev 6)
+++ trunk/vendor/unitedlinux/ocfs-2.4.21.spec-generic.in	2004-06-18 21:45:58 UTC (rev 7)
@@ -30,8 +30,13 @@
 %define buildnuma		1
 %endif
 
+%ifarch s390x
+%define buildsmp		0
+%define buildpsmp		0
+%endif
 
 
+
 # This must be changed to the minimum ABI compat kernel version expected
 %define base		2.4.21
 %define sver		%{generic}



More information about the Ocfs-commits mailing list