[Ocfs2-commits] mfasheh commits r1614 - branches/dlm-glue/src
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Mon Nov 1 19:58:24 CST 2004
Author: mfasheh
Date: 2004-11-01 19:58:22 -0600 (Mon, 01 Nov 2004)
New Revision: 1614
Modified:
branches/dlm-glue/src/dlmglue.c
Log:
* populate the lvb, even when we drop locks completely from clear_inode.
Modified: branches/dlm-glue/src/dlmglue.c
===================================================================
--- branches/dlm-glue/src/dlmglue.c 2004-11-02 01:01:01 UTC (rev 1613)
+++ branches/dlm-glue/src/dlmglue.c 2004-11-02 01:58:22 UTC (rev 1614)
@@ -149,9 +149,9 @@
static void ocfs2_vote_thread_do_work(ocfs_super *osb);
static void ocfs2_process_vote(ocfs_super *osb,
ocfs2_vote_msg *msg);
-static int ocfs2_drop_lock(ocfs_super *osb,
- ocfs2_lock_res *lockres,
- ocfs2_lock *lock);
+static int __ocfs2_drop_lock(ocfs_super *osb,
+ ocfs2_lock_res *lockres,
+ ocfs2_lock *lock);
static inline int ocfs2_highest_compat_lock_level(int level);
static int __ocfs2_downconvert_lock(ocfs2_lock_res *lockres,
ocfs2_lock *lock,
@@ -1138,15 +1138,14 @@
wake_up_all(&lockres->lr_busy);
}
-static int ocfs2_drop_lock(ocfs_super *osb,
- ocfs2_lock_res *lockres,
- ocfs2_lock *lock)
+/* BEWARE: called with lockres lock, and always drops it. */
+static int __ocfs2_drop_lock(ocfs_super *osb,
+ ocfs2_lock_res *lockres,
+ ocfs2_lock *lock)
{
int ret = 0;
dlm_status status;
- spin_lock(&lockres->lr_lock);
-
if (lock->l_flags & OCFS2_LOCK_BUSY)
printk("ocfs2: destroying busy lock!\n");
if (lock->l_flags & OCFS2_LOCK_BLOCKED)
@@ -1188,15 +1187,28 @@
{
int status, err;
ocfs2_lock_res *lockres = &OCFS_I(inode)->ip_lockres;
+ ocfs2_lock *meta_lock;
- err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb), lockres,
- &lockres->lr_data);
+ spin_lock(&lockres->lr_lock);
+ err = __ocfs2_drop_lock(OCFS2_SB(inode->i_sb), lockres,
+ &lockres->lr_data);
if (err < 0)
LOG_ERROR_STATUS(err);
status = err;
- err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb), lockres,
- &lockres->lr_meta);
+
+ /* the metadata lock requires a bit more work as we have an
+ * LVB to worry about. */
+ meta_lock = &lockres->lr_meta;
+ spin_lock(&lockres->lr_lock);
+ if (meta_lock->l_flags & OCFS2_LOCK_ATTACHED) {
+ if (meta_lock->l_level == LKM_EXMODE)
+ __ocfs2_stuff_meta_lvb(inode);
+ /* fake an NLMODE downconvert for the lvb code. */
+ __ocfs2_lvb_on_downconvert(meta_lock, LKM_NLMODE);
+ }
+ err = __ocfs2_drop_lock(OCFS2_SB(inode->i_sb), lockres,
+ meta_lock);
if (err < 0)
LOG_ERROR_STATUS(err);
if (err < 0 && !status)
More information about the Ocfs2-commits
mailing list