[Ocfs2-commits] mfasheh commits r1597 - branches/dlm-glue/src
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Thu Oct 28 15:06:51 CDT 2004
Author: mfasheh
Date: 2004-10-28 15:06:50 -0500 (Thu, 28 Oct 2004)
New Revision: 1597
Modified:
branches/dlm-glue/src/dlmglue.c
branches/dlm-glue/src/heartbeat.c
branches/dlm-glue/src/heartbeat.h
branches/dlm-glue/src/ocfs.h
branches/dlm-glue/src/proc.c
branches/dlm-glue/src/super.c
Log:
* more cleanup and compile fixes
Modified: branches/dlm-glue/src/dlmglue.c
===================================================================
--- branches/dlm-glue/src/dlmglue.c 2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/dlmglue.c 2004-10-28 20:06:50 UTC (rev 1597)
@@ -42,6 +42,7 @@
#include "alloc.h"
#include "dlmglue.h"
#include "extent_map.h"
+#include "heartbeat.h"
#include "inode.h"
#include "util.h"
@@ -94,7 +95,8 @@
static void ocfs2_schedule_blocked_inode(struct inode *inode);
static inline void ocfs2_recover_from_dlm_error(ocfs2_lock_res *lockres,
ocfs2_lock *lock);
-static void ocfs2_data_vote_on_unlock(struct inode *inode);
+static void ocfs2_vote_on_unlock(ocfs_super *osb,
+ ocfs2_lock *lock);
/* Called after we refresh our inode, only has any effect if we have
* an EX lock. This populates the LVB with the initial values for our
* change set. */
@@ -695,17 +697,14 @@
return status;
}
-static void ocfs2_data_vote_on_unlock(struct inode *inode)
+static void ocfs2_vote_on_unlock(ocfs_super *osb,
+ ocfs2_lock *lock)
{
- ocfs2_lock_res *lockres = &OCFS_I(inode)->ip_lockres;
- ocfs2_lock *lock = &lockres->lr_data;
int kick = 0;
- /* Data locking needs to be fast. If we know that another node
- * is waiting on our lock, don't just wait for the vote thread
- * to timeout before it processes this -- kick it
- * pre-emptively when we reach a release condition. */
- spin_lock(&lockres->lr_lock);
+ /* If we know that another node is waiting on our lock, kick
+ * the vote thread * pre-emptively when we reach a release
+ * condition. */
if (lock->l_flags & OCFS2_LOCK_BLOCKED) {
switch(lock->l_blocking) {
case LKM_EXMODE:
@@ -720,33 +719,31 @@
BUG();
}
}
- spin_unlock(&lockres->lr_lock);
if (kick)
- ocfs2_kick_vote_thread(OCFS2_SB(inode->i_sb));
+ ocfs2_kick_vote_thread(osb);
}
void ocfs2_data_unlock(struct inode *inode,
int write)
{
int level;
- ocfs2_lock *lock;
+ ocfs2_lock_res *lockres = &OCFS_I(inode)->ip_lockres;
+ ocfs2_lock *lock = &lockres->lr_data;
- OCFS_ASSERT(inode);
+ level = write ? LKM_EXMODE : LKM_PRMODE;
- lock = &(OCFS_I(inode)->ip_lockres.lr_data);
- level = write ? LKM_EXMODE : LKM_PRMODE;
+ spin_lock(&lockres->lr_lock);
ocfs2_dec_holders(lock, level);
-
- ocfs2_data_vote_on_unlock(inode);
+ ocfs2_vote_on_unlock(OCFS2_SB(inode->i_sb), lock);
+ spin_unlock(&lockres->lr_lock);
}
static inline int ocfs2_wait_on_recovery(ocfs_super *osb)
{
- /* recovery_count is incremented once for every dead node and
- * decremented once when it gets recovered. */
wait_event_interruptible(osb->recovery_event,
- !atomic_read(&osb->num_recovery_threads));
+ !ocfs_node_map_is_empty(osb,
+ &osb->recovery_map));
if (signal_pending(current))
return -EINTR;
@@ -996,13 +993,15 @@
int ex)
{
int level;
- ocfs2_lock *lock;
+ ocfs2_lock_res *lockres = &OCFS_I(inode)->ip_lockres;
+ ocfs2_lock *lock = &lockres->lr_meta;
- OCFS_ASSERT(inode);
+ level = ex ? LKM_EXMODE : LKM_PRMODE;
- lock = &(OCFS_I(inode)->ip_lockres.lr_meta);
- level = ex ? LKM_EXMODE : LKM_PRMODE;
+ spin_lock(&lockres->lr_lock);
ocfs2_dec_holders(lock, level);
+ ocfs2_vote_on_unlock(OCFS2_SB(inode->i_sb), lock);
+ spin_unlock(&lockres->lr_lock);
}
int ocfs2_dlm_init(ocfs_super *osb)
@@ -1496,11 +1495,13 @@
while (1) {
spin_unlock(&osb->vote_task_lock);
-#define OCFS2_VOTE_THREAD_TIMEOUT (HZ >> 1)
- wait_event_interruptible_timeout(osb->vote_event,
- atomic_read(
- &osb->wake_vote_task),
- OCFS2_VOTE_THREAD_TIMEOUT);
+//#define OCFS2_VOTE_THREAD_TIMEOUT (HZ >> 1)
+// wait_event_interruptible_timeout(osb->vote_event,
+// atomic_read(
+// &osb->wake_vote_task),
+// OCFS2_VOTE_THREAD_TIMEOUT);
+ wait_event_interruptible(osb->vote_event,
+ atomic_read(&osb->wake_vote_task));
atomic_set(&osb->wake_vote_task, 0);
@@ -1580,6 +1581,7 @@
enum ocfs2_vote_request type)
{
int status;
+ ocfs_super *osb = OCFS2_SB(inode->i_sb);
if (ocfs_inode_is_new(inode))
return 0;
@@ -1589,8 +1591,10 @@
if (signal_pending(current))
return -EINTR;
- status = ocfs2_do_request_vote(OCFS2_SB(inode->i_sb),
- inode, type);
+ if (ocfs_node_map_is_only(osb, &osb->node_map, osb->node_num))
+ return 0;
+
+ status = ocfs2_do_request_vote(osb, inode, type);
}
return status;
}
Modified: branches/dlm-glue/src/heartbeat.c
===================================================================
--- branches/dlm-glue/src/heartbeat.c 2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/heartbeat.c 2004-10-28 20:06:50 UTC (rev 1597)
@@ -46,6 +46,18 @@
#define OCFS_DEBUG_CONTEXT OCFS_DEBUG_CONTEXT_HEARTBEAT
static void ocfs_node_map_init(ocfs_super *osb, ocfs_node_map *map);
+static void __ocfs_node_map_dup(ocfs_super *osb,
+ ocfs_node_map *target,
+ ocfs_node_map *from);
+static inline void __ocfs_node_map_set_bit(ocfs_node_map *map,
+ int bit);
+static inline void __ocfs_node_map_clear_bit(ocfs_node_map *map,
+ int bit);
+static inline int __ocfs_node_map_is_empty(ocfs_node_map *map);
+static void __ocfs_node_map_dup(ocfs_super *osb,
+ ocfs_node_map *target,
+ ocfs_node_map *from);
+static void __ocfs_node_map_set(ocfs_node_map *target, ocfs_node_map *from);
void ocfs2_init_node_maps(ocfs_super *osb)
{
@@ -57,81 +69,154 @@
/* Most functions here are just stubs for now... */
int ocfs2_register_hb_callbacks(ocfs_super *osb)
{
- ocfs_node_map_set_bit(&osb->node_map, osb->node_num);
+ ocfs_node_map_set_bit(osb, &osb->node_map, osb->node_num);
return 0;
}
void ocfs2_clear_hb_callbacks(ocfs_super *osb)
{
-
+ ocfs_node_map_clear_bit(osb, &osb->node_map, osb->node_num);
}
-#warning these node map functions need to be spin locked
/* special case -1 for now
* TODO: should *really* make sure the calling func never passes -1!! */
-static void ocfs_node_map_init(ocfs_super *osb, ocfs_node_map *map)
+static void ocfs_node_map_init(ocfs_super *osb,
+ ocfs_node_map *map)
{
- spin_lock(&osb->node_map_lock);
map->num_nodes = osb->max_nodes;
memset(map->map, 0, BITS_TO_LONGS(OCFS_NODE_MAP_MAX_NODES) *
sizeof(unsigned long));
- spin_unlock(&osb->node_map_lock);
}
-void ocfs_node_map_set_bit(ocfs_node_map *map, int bit)
+static inline void __ocfs_node_map_set_bit(ocfs_node_map *map,
+ int bit)
{
- if (bit==-1)
- return;
- OCFS_ASSERT(bit < map->num_nodes);
set_bit(bit, map->map);
}
-void ocfs_node_map_clear_bit(ocfs_node_map *map, int bit)
+void ocfs_node_map_set_bit(ocfs_super *osb,
+ ocfs_node_map *map,
+ int bit)
{
if (bit==-1)
return;
OCFS_ASSERT(bit < map->num_nodes);
- clear_bit(bit, map->map);
+ spin_lock(&osb->node_map_lock);
+ __ocfs_node_map_set_bit(map, bit);
+ spin_unlock(&osb->node_map_lock);
}
-#if 0
-// clear all the bits in "target" which are set in "mask"
-static void __ocfs_node_map_clear_bits(ocfs_node_map *target,
- ocfs_node_map *mask)
+static inline void __ocfs_node_map_clear_bit(ocfs_node_map *map,
+ int bit)
{
- int bit, prev=0;
- while (1) {
- bit = find_next_bit (mask->map, mask->num_nodes, prev);
- if (bit >= mask->num_nodes)
- break;
- ocfs_node_map_clear_bit(target, bit);
- prev = bit+1;
- }
+ clear_bit(bit, map->map);
}
-// set all the bits in "target" which are set in "mask"
-void __ocfs_node_map_set_bits(ocfs_node_map *target,
- ocfs_node_map *mask)
+void ocfs_node_map_clear_bit(ocfs_super *osb,
+ ocfs_node_map *map,
+ int bit)
{
- int bit, prev=0;
- while (1) {
- bit = find_next_bit (mask->map, mask->num_nodes, prev);
- if (bit >= mask->num_nodes)
- break;
- ocfs_node_map_set_bit(target, bit);
- prev = bit+1;
- }
+ if (bit==-1)
+ return;
+ OCFS_ASSERT(bit < map->num_nodes);
+ spin_lock(&osb->node_map_lock);
+ __ocfs_node_map_clear_bit(map, bit);
+ spin_unlock(&osb->node_map_lock);
}
-#endif
-int ocfs_node_map_test_bit(ocfs_node_map *map, int bit)
+
+int ocfs_node_map_test_bit(ocfs_super *osb,
+ ocfs_node_map *map,
+ int bit)
{
+ int ret;
if (bit >= map->num_nodes) {
LOG_ERROR_ARGS("bit=%d map->num_nodes=%d\n", bit, map->num_nodes);
BUG();
}
- return test_bit(bit, map->map);
+ spin_lock(&osb->node_map_lock);
+ ret = test_bit(bit, map->map);
+ spin_unlock(&osb->node_map_lock);
+ return ret;
}
+static inline int __ocfs_node_map_is_empty(ocfs_node_map *map)
+{
+ int bit;
+ bit = find_next_bit(map->map, map->num_nodes, 0);
+ if (bit < map->num_nodes)
+ return 0;
+ return 1;
+}
+
+int ocfs_node_map_is_empty(ocfs_super *osb,
+ ocfs_node_map *map)
+{
+ int ret;
+ OCFS_ASSERT(map->num_nodes > 0);
+ spin_lock(&osb->node_map_lock);
+ ret = __ocfs_node_map_is_empty(map);
+ spin_unlock(&osb->node_map_lock);
+ return ret;
+}
+
+static void __ocfs_node_map_dup(ocfs_super *osb,
+ ocfs_node_map *target,
+ ocfs_node_map *from)
+{
+ OCFS_ASSERT(from->num_nodes > 0);
+ ocfs_node_map_init(osb, target);
+ __ocfs_node_map_set(target, from);
+}
+
+/* returns 1 if bit is the only bit set in target, 0 otherwise */
+int ocfs_node_map_is_only(ocfs_super *osb,
+ ocfs_node_map *target,
+ int bit)
+{
+ ocfs_node_map temp;
+ int ret;
+
+ spin_lock(&osb->node_map_lock);
+ __ocfs_node_map_dup(osb, &temp, target);
+ __ocfs_node_map_clear_bit(&temp, bit);
+ ret = __ocfs_node_map_is_empty(&temp);
+ spin_unlock(&osb->node_map_lock);
+
+ return ret;
+}
+
+static void __ocfs_node_map_set(ocfs_node_map *target,
+ ocfs_node_map *from)
+{
+ int num_longs, i;
+
+ OCFS_ASSERT(target->num_nodes == from->num_nodes);
+ OCFS_ASSERT(target->num_nodes > 0);
+
+ num_longs = BITS_TO_LONGS(target->num_nodes);
+ for (i=0; i<num_longs; i++)
+ target->map[i] = from->map[i];
+}
+
+void ocfs_recovery_map_set(ocfs_super *osb,
+ int num)
+{
+ spin_lock(&osb->node_map_lock);
+ __ocfs_node_map_clear_bit(&osb->node_map, num);
+ __ocfs_node_map_set_bit(&osb->recovery_map, num);
+ spin_unlock(&osb->node_map_lock);
+}
+
+void ocfs_recovery_map_clear(ocfs_super *osb,
+ int num)
+{
+ ocfs_node_map_clear_bit(osb, &osb->recovery_map, num);
+}
+
+
+#if 0
+/* unused (for now) node map functions. */
+
static int ocfs_node_map_stringify(ocfs_node_map *map, char **str)
{
int i, n;
@@ -159,14 +244,16 @@
return 0;
}
-int ocfs_node_map_is_empty(ocfs_node_map *map)
+void ocfs_node_map_and(ocfs_node_map *target, ocfs_node_map *mask)
{
- int bit;
- OCFS_ASSERT(map->num_nodes > 0);
- bit = find_next_bit(map->map, map->num_nodes, 0);
- if (bit < map->num_nodes)
- return 0;
- return 1;
+ int num_longs, i;
+
+ OCFS_ASSERT(target->num_nodes == mask->num_nodes);
+ OCFS_ASSERT(target->num_nodes > 0);
+
+ num_longs = BITS_TO_LONGS(target->num_nodes);
+ for (i=0; i<num_longs; i++)
+ target->map[i] &= mask->map[i];
}
int ocfs_node_map_is_equal(ocfs_node_map *map1, ocfs_node_map *map2)
@@ -184,64 +271,36 @@
return 1;
}
-void ocfs_node_map_and(ocfs_node_map *target, ocfs_node_map *mask)
-{
- int num_longs, i;
- OCFS_ASSERT(target->num_nodes == mask->num_nodes);
- OCFS_ASSERT(target->num_nodes > 0);
-
- num_longs = BITS_TO_LONGS(target->num_nodes);
- for (i=0; i<num_longs; i++)
- target->map[i] &= mask->map[i];
-}
-
-void ocfs_node_map_set(ocfs_node_map *target, ocfs_node_map *from)
+// clear all the bits in "target" which are set in "mask"
+static void __ocfs_node_map_clear_bits(ocfs_node_map *target,
+ ocfs_node_map *mask)
{
- int num_longs, i;
-
- OCFS_ASSERT(target->num_nodes == from->num_nodes);
- OCFS_ASSERT(target->num_nodes > 0);
-
- num_longs = BITS_TO_LONGS(target->num_nodes);
- for (i=0; i<num_longs; i++)
- target->map[i] = from->map[i];
+ int bit, prev=0;
+ while (1) {
+ bit = find_next_bit (mask->map, mask->num_nodes, prev);
+ if (bit >= mask->num_nodes)
+ break;
+ ocfs_node_map_clear_bit(target, bit);
+ prev = bit+1;
+ }
}
-void ocfs_node_map_dup(ocfs_super *osb, ocfs_node_map *target, ocfs_node_map *from)
+// set all the bits in "target" which are set in "mask"
+void __ocfs_node_map_set_bits(ocfs_node_map *target,
+ ocfs_node_map *mask)
{
- OCFS_ASSERT(from->num_nodes > 0);
- ocfs_node_map_init(osb, target);
- ocfs_node_map_set(target, from);
+ int bit, prev=0;
+ while (1) {
+ bit = find_next_bit (mask->map, mask->num_nodes, prev);
+ if (bit >= mask->num_nodes)
+ break;
+ ocfs_node_map_set_bit(target, bit);
+ prev = bit+1;
+ }
}
+#endif
-/* returns 1 if bit is the only bit set in target, 0 otherwise */
-int ocfs_node_map_is_only(ocfs_super *osb, ocfs_node_map *target, int bit)
-{
- ocfs_node_map temp;
- int ret;
-
- ocfs_node_map_dup(osb, &temp, target);
- ocfs_node_map_clear_bit(&temp, bit);
- ret = ocfs_node_map_is_empty(&temp);
- return ret;
-}
-
-/* update the recovery map here */
-void ocfs_recovery_map_set(ocfs_super *osb, int num)
-{
- spin_lock(&osb->node_map_lock);
- ocfs_node_map_set_bit(&osb->recovery_map, num);
- spin_unlock(&osb->node_map_lock);
-}
-
-void ocfs_recovery_map_clear(ocfs_super *osb, int num)
-{
- spin_lock(&osb->node_map_lock);
- ocfs_node_map_clear_bit(&osb->recovery_map, num);
- spin_unlock(&osb->node_map_lock);
-}
-
#if 0
if (node_map[i].miss_cnt >= MISS_COUNT_NODE_DEAD) {
ocfs_recovery_map_set(osb, i);
Modified: branches/dlm-glue/src/heartbeat.h
===================================================================
--- branches/dlm-glue/src/heartbeat.h 2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/heartbeat.h 2004-10-28 20:06:50 UTC (rev 1597)
@@ -31,17 +31,26 @@
int ocfs2_register_hb_callbacks(ocfs_super *osb);
void ocfs2_clear_hb_callbacks(ocfs_super *osb);
-void ocfs_node_map_set_bit(ocfs_node_map *map, int bit);
-void ocfs_node_map_clear_bit(ocfs_node_map *map, int bit);
-int ocfs_node_map_test_bit(ocfs_node_map *map, int bit);
-int ocfs_node_map_is_empty(ocfs_node_map *map);
-int ocfs_node_map_is_equal(ocfs_node_map *map1, ocfs_node_map *map2);
-void ocfs_node_map_and(ocfs_node_map *target, ocfs_node_map *mask);
-void ocfs_node_map_set(ocfs_node_map *target, ocfs_node_map *from);
-void ocfs_node_map_dup(ocfs_super *osb, ocfs_node_map *target, ocfs_node_map *from);
+/* node map functions - used to keep track of mounted and in-recovery
+ * nodes. */
+int ocfs_node_map_is_empty(ocfs_super *osb,
+ ocfs_node_map *map);
+void ocfs_node_map_set_bit(ocfs_super *osb,
+ ocfs_node_map *map,
+ int bit);
+void ocfs_node_map_clear_bit(ocfs_super *osb,
+ ocfs_node_map *map,
+ int bit);
+int ocfs_node_map_test_bit(ocfs_super *osb,
+ ocfs_node_map *map,
+ int bit);
+void ocfs_recovery_map_set(ocfs_super *osb,
+ int num);
+void ocfs_recovery_map_clear(ocfs_super *osb,
+ int num);
/* returns 1 if bit is the only bit set in target, 0 otherwise */
-int ocfs_node_map_is_only(ocfs_super *osb, ocfs_node_map *target, int bit);
-void ocfs_recovery_map_set(ocfs_super *osb, int num);
-void ocfs_recovery_map_clear(ocfs_super *osb, int num);
+int ocfs_node_map_is_only(ocfs_super *osb,
+ ocfs_node_map *target,
+ int bit);
#endif /* OCFS2_HEARTBEAT_H */
Modified: branches/dlm-glue/src/ocfs.h
===================================================================
--- branches/dlm-glue/src/ocfs.h 2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/ocfs.h 2004-10-28 20:06:50 UTC (rev 1597)
@@ -514,7 +514,6 @@
dlm_ctxt *dlm;
- atomic_t recovery_count;
wait_queue_head_t recovery_event;
spinlock_t vote_task_lock;
Modified: branches/dlm-glue/src/proc.c
===================================================================
--- branches/dlm-glue/src/proc.c 2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/proc.c 2004-10-28 20:06:50 UTC (rev 1597)
@@ -446,7 +446,7 @@
ptr = pubmap;
for (i = 0; i < osb->max_nodes; i++) {
- if (ocfs_node_map_test_bit(&osb->node_map, i))
+ if (ocfs_node_map_test_bit(osb, &osb->node_map, i))
ptr += sprintf (ptr, "%d ", i);
}
if (pubmap != ptr)
@@ -527,7 +527,7 @@
node = osb->node_cfg_info[i];
if (!node)
continue;
- mount = ocfs_node_map_test_bit(&osb->node_map, i) ? 'M' : ' ';
+ mount = ocfs_node_map_test_bit(osb, &osb->node_map, i) ? 'M' : ' ';
len += sprintf (page + len,
"%2d %c %-32s 0x%08u %-6u ",
i, mount, node->node_name,
Modified: branches/dlm-glue/src/super.c
===================================================================
--- branches/dlm-glue/src/super.c 2004-10-28 02:14:29 UTC (rev 1596)
+++ branches/dlm-glue/src/super.c 2004-10-28 20:06:50 UTC (rev 1597)
@@ -1123,7 +1123,6 @@
goto finally;
}
- atomic_set(&osb->recovery_count, 0);
init_waitqueue_head(&osb->recovery_event);
atomic_set(&osb->wake_vote_task, 0);
spin_lock_init(&osb->vote_task_lock);
More information about the Ocfs2-commits
mailing list