[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