[SSI] openssi/kernel/cluster/ssi/cfs inode.c,1.71,1.72

Roger Tsang <[email protected]> Wed, 16 Nov 2011 07:49:39 +0000
Newsgroups gmane.linux.cluster.ssic.cvs
Message-ID <[email protected]>
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs
In directory vz-cvs-3.sog:/tmp/cvs-serv1934/cluster/ssi/cfs

Modified Files:
      Tag: OPENSSI-FC
	inode.c 
Log Message:
cfs_write_super: use generic write_super().
__cfs_revalidate_inode: use cfs_wb_all() to flush dirty pages.

(#ifdef CFS_BDI)
cfs_delete_inode: flush dirty pages before truncate_inode_pages() so they do not get lost.
cfs_delete_inode: call truncate_inode_pages() only for kernel-2.6.14 or higher.
cfs_fill_inode: other types of inodes also get our own backing_dev_info.
__cfs_hpget: fix client@server using PFS backing_dev_info. Replace with backing_dev_info from cfs_server struct.


Index: inode.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/inode.c,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -d -r1.71 -r1.72
--- inode.c	17 Jan 2011 07:04:18 -0000	1.71
+++ inode.c	16 Nov 2011 07:49:37 -0000	1.72
@@ -253,15 +253,14 @@
 {
 	dprintk ("CFS: delete_inode(%x/%ld)\n", inode->i_sb->s_dev, inode->i_ino);
 
-	/* SSI_XXX: Where did this come from? */
-	/* It's needed on 2.6.14 or we get an panic in clear_inode
+	cfs_wb_all(inode);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)
+	/* This is needed on 2.6.14 or we get an panic in clear_inode
 	 * (nr_pages != 0) when renaming - JH
 	 */
-	/* SSI_XXX: i_nlink race? Check generic_drop_inode() code path -RT */
 	if (inode->i_data.nrpages)
 		truncate_inode_pages(&inode->i_data, 0);
-
-	cfs_wb_all(inode);
+#endif
 	/*
 	* The following can never actually happen...
 	*/
@@ -584,15 +583,17 @@
 		 * that's precisely what we have in cfs_file_inode_operations.
 		 */
 		inode->i_op = &cfs_file_inode_operations;
+#ifdef CFS_BDI
+		inode->i_mapping->backing_dev_info =
+				&itocmi(inode)->backing_dev_info;
+#endif
 		if (S_ISREG(inode->i_mode)) {
 			inode->i_fop = &cfs_file_operations;
 			inode->i_data.a_ops = &cfs_file_aops;
 #ifdef CFS_READAHEAD
-#ifdef CFS_BDI
-			inode->i_mapping->backing_dev_info = &itocmi(inode)->backing_dev_info;
-#else
+#ifndef CFS_BDI
 			inode->i_mapping->backing_dev_info->ra_pages =
-					itocmi(inode)->rpages * CFS_MAX_READAHEAD;
+				itocmi(inode)->rpages * CFS_MAX_READAHEAD;
 #endif
 #endif
 		} else if (S_ISDIR(inode->i_mode)) {
@@ -830,6 +831,31 @@
 		 * that's precisely what we have in cfs_file_inode_operations.
 		 */
 		inode->i_op = &cfs_file_inode_operations;
+#ifdef CFS_BDI
+		/* [ ssic-linux-Bugs-686748 ] Filesystem stacking deadlock.
+		 *
+		 * Lock ordering:
+		 * 		(__cfs_file_write)
+		 *		...
+		 *		(generic_file_buffered_write)
+		 *		(cfs_updatepage)
+		 *		...
+		 * ->i_sem	(generic_file_writev)
+		 *		...
+		 *		(generic_file_buffered_write) <- PFS
+		 *		...
+		 *		(balance_dirty_pages)
+		 *		...
+		 *		(cfs_writepages) <- CFS bdi == PFS bdi
+		 *		...
+		 * ->i_sem	(generic_file_writev)
+		 */
+		/* SSI: By default we inherit PFS s_bdev's backing_dev_info.
+		 * This is bad when stacked (client@server). Use our own bdi.
+		 */
+		inode->i_mapping->backing_dev_info =
+				&itocmi(inode)->backing_dev_info;
+#endif
 		if (S_ISREG(inode->i_mode)) {
 			inode->i_fop = &cfs_file_operations;
 			inode->i_data.a_ops = &cfs_file_aops;
@@ -1163,12 +1189,8 @@
 
 		if (S_ISREG(inode->i_mode) && inode->i_mapping->nrpages) {
 			unmap_mapping_range(inode->i_mapping, 0, 0, 0);
-#ifdef SSI_EXNFS
 			if (!filemap_write_and_wait(inode->i_mapping))
 				(void)cfs_wb_all(inode);
-#else
-			filemap_write_and_wait(inode->i_mapping);
-#endif
 		}
 		invalidate_inode_pages2(inode->i_mapping);
 
@@ -2168,15 +2190,9 @@
 static void
 cfs_write_super (struct super_block * sb)
 {
-	struct super_block *psb = sbtocmi(sb)->mi_pfs_sb;
-
-	if (psb) {
-		/* SSI_XXX: Call DQUOT_SYNC(dev)? */
-		lock_super(psb);
-		if (psb->s_dirt && psb->s_op && psb->s_op->write_super)
-			psb->s_op->write_super(psb);
-		unlock_super(psb);
-	}
+	/* SSI_XXX: Call DQUOT_SYNC(dev)? */
+	if (sbtocmi(sb)->mi_pfs_sb)
+		write_super(sbtocmi(sb)->mi_pfs_sb);
 	sb->s_dirt = 0;
 }
 


------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1