[Ocfs2-devel] [Patch] Patch to fix OCFS bug 73 and 74.
Zhang, Sonic
sonic.zhang at intel.com
Tue May 25 09:20:13 CDT 2004
Hi,
After investigate in the JBD code in kernel 2.6.6 and OCFS2 svn
929 on IPF, I think I find the cause of dead lock bug 73 and 74.
In kernel 2.6.6, the bit 12 to 19 of variable b_state in
structure buffer_head is occupied by the linux journaling code as
follows.
enum jbd_state_bits {
BH_JBD /* Has an attached ext3 journal_head */
= BH_PrivateStart,
BH_JWrite, /* Being written to log (@@@ DEBUGGING)
*/
BH_Freed, /* Has been freed (truncated) */
BH_Revoked, /* Has been revoked from the log */
BH_RevokeValid, /* Revoked flag is valid */
BH_JBDDirty, /* Is dirty but journaled */
BH_State, /* Pins most journal_head state */
BH_JournalHead, /* Pins bh->b_private and jh->b_bh */
};
But, in ocfs2 head io.h, variable BH_Modified and the inode
clean sequence number also occupy some bits in this frame as follows.
#define BH_Modified 18
#define STATE_BIT_MASK ((~0UL)<<19)
The bit 18 and bit 19 conflict with Linux journaling code in
kernel 2.6.6. When copy a file to the OCFS2 volume, the journaling code
will try to lock bit BH_JournalHead and BH_State of variable b_state in
buffer_head, which have already been set to 1 in OCFS2 routine
ocfs_read_dirnode() and ocfs_insert_dir_node(). So, the dead locks occur
at journaling routine jbd_lock_bh_journal_head() and
jbd_lock_bh_state().
My patch fixes these 2 bugs by using the empty bits 20 ~ 31. It
is against svn 932. Please refer to the attachment.
Any comment?
------------------------------------------------------------------------
-----------
--- ocfs2.old/src/inc/io.h 2004-05-24 19:16:00.000000000 -0700
+++ ocfs2/src/inc/io.h 2004-05-24 23:11:57.877670837 -0700
@@ -75,7 +75,7 @@
#define OCFS_NONCACHED(osb,off) ((off) <
(osb)->vol_layout.data_start_off)
-#define BH_Modified 18
+#define BH_Modified 20
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
/*
@@ -214,10 +214,10 @@
ocfs_bh_sem_unlock(bh);
}
-
+#define JBD_STATE_BIT_MAX 21
#define STATE_BIT_MAX (1 << 12)
#define STATE_BIT_MAX_MASK ((1 << 12)-1)
-#define STATE_BIT_MASK ((~0UL)<<19)
+#define STATE_BIT_MASK ((~0UL)<<JBD_STATE_BIT_MAX)
static inline void CLEAR_BH_SEQNUM(struct buffer_head *bh)
@@ -229,7 +229,7 @@
static inline void SET_BH_SEQNUM(struct inode *inode, struct
buffer_head *bh)
{
unsigned int seq = (atomic_read(GET_INODE_CLEAN_SEQ(inode)) &
- STATE_BIT_MAX_MASK) << 19;
+ STATE_BIT_MAX_MASK) << JBD_STATE_BIT_MAX;
CLEAR_BH_SEQNUM(bh);
bh->b_state |= seq;
@@ -238,7 +238,7 @@
static inline int TEST_BH_SEQNUM(struct inode *inode, struct
buffer_head *bh)
{
int ret;
- unsigned int seq = (bh->b_state & STATE_BIT_MASK) >> 19;
+ unsigned int seq = (bh->b_state & STATE_BIT_MASK) >>
JBD_STATE_BIT_MAX;
ret = (seq == atomic_read(GET_INODE_CLEAN_SEQ(inode)));
return ret;
*********************************************
Sonic Zhang
Software Engineer
Intel China Software Lab
Tel: (086)021-52574545-1667
iNet: 752-1667
*********************************************
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ocfs2-jbd-statebit.patch
Type: application/octet-stream
Size: 1274 bytes
Desc: ocfs2-jbd-statebit.patch
Url : http://oss.oracle.com/pipermail/ocfs2-devel/attachments/20040525/895dece7/ocfs2-jbd-statebit.obj
More information about the Ocfs2-devel
mailing list