[PATCH] do not use global lock in lmLogSync (2 of 2)

[email protected] Wed, 24 Mar 2004 14:22:43 -0600
Newsgroups gmane.comp.file-systems.jfs.patches
Message-ID <[email protected]>
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/03/24 14:17:44-06:00 [email protected] 
#   JFS: don't use global lock in lmLogSync when local lock is sufficient
#   
#   I stupidly used the global jfs_log_sem to protect log->sb_list when
#   implementing the shared journal stuff.  Since we already hold
#   LOG_LOCK, it makes more sense to use that to protect log->sb_list.
#   This caused horrible serialization when running on lots of jfs
#   volumes.
# 
diff -Nru a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
--- a/fs/jfs/jfs_logmgr.c	Wed Mar 24 14:19:50 2004
+++ b/fs/jfs/jfs_logmgr.c	Wed Mar 24 14:19:50 2004
@@ -979,7 +979,6 @@
 		 * We need to make sure all of the "written" metapages
 		 * actually make it to disk
 		 */
-		down(&jfs_log_sem);
 		list_for_each_entry(sbi, &log->sb_list, log_list) {
 			filemap_fdatawrite(sbi->ipbmap->i_mapping);
 			filemap_fdatawrite(sbi->ipimap->i_mapping);
@@ -990,7 +989,6 @@
 			filemap_fdatawait(sbi->ipimap->i_mapping);
 			filemap_fdatawait(sbi->sb->s_bdev->bd_inode->i_mapping);
 		}
-		up(&jfs_log_sem);
 
 		lrd.logtid = 0;
 		lrd.backchain = 0;
@@ -1151,8 +1149,10 @@
 		goto shutdown;
 
 journal_found:
+	LOG_LOCK(log);
 	list_add(&sbi->log_list, &log->sb_list);
 	sbi->log = log;
+	LOG_UNLOCK(log);
 
 	up(&jfs_log_sem);
 	return 0;
@@ -1237,8 +1237,10 @@
 		}
 	}
 
+	LOG_LOCK(dummy_log);
 	list_add(&JFS_SBI(sb)->log_list, &dummy_log->sb_list);
 	JFS_SBI(sb)->log = dummy_log;
+	LOG_UNLOCK(dummy_log);
 	up(&jfs_log_sem);
 
 	return 0;
@@ -1469,7 +1471,9 @@
 	jfs_info("lmLogClose: log:0x%p", log);
 
 	down(&jfs_log_sem);
+	LOG_LOCK(log);
 	list_del(&sbi->log_list);
+	LOG_UNLOCK(log);
 	sbi->log = NULL;
 
 	/*