[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