[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