[SSI] openssi/kernel/cluster/ssi/cfs inode.c,1.68,1.69

Roger Tsang <[email protected]> Wed, 15 Dec 2010 07:34:06 +0000
Newsgroups gmane.linux.cluster.ssic.cvs
Message-ID <[email protected]>
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv19145/kernel/cluster/ssi/cfs

Modified Files:
      Tag: OPENSSI-FC
	inode.c 
Log Message:
cluster/ssi/cfs/inode.c
- cfs_getattr: don't acquire CFSTOK_ATTR token. avoid unnecessary REVOKE on the cluster. Linux VFS intends to grab attributes in real-time.

cluster/ssi/cfs/inode.c (#ifdef CFS_ZAP_CACHES)
- cfs_zap_caches: don't set CFS_INO_INVALID_ATTR flag since CFS piggybacks attributes.
- __cfs_revalidate_inode: test CFS_READTIME after invalidating pages since if there were pending flushes the inode attributes would have been updated after invalidating pages. optimize away getattr().
- __cfs_revalidate_inode: reduce number of getattr() calls per inode to once every 3 seconds for CFS_INO_INVALID_ATTR flag.
- cfs_end_data_update: mark directories and symlinks for page cache invalidation. cfs_refresh_inode() no longer sets CFS_INO_INVALID_DATA flag after unlink(), mkdir(), etc.
- cfs_refresh_inode: no longer set various CFS_INO_INVALID_* flags. avoid unnecessary flushing of page cache since token architecture guarantees cache coherency.
- cfs_refresh_inode: clear CFS_INO_INVALID_ATIME/ATTR flags on successful update of piggybacked attributes. avoid unnecessary getattr() call on revalidate.

cluster/ssi/cfs/inode.c (#ifdef CFSTOK_INTR)
- cfs_setattr: return -ERESTARTSYS instead of -EINTR


Index: inode.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/inode.c,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -d -r1.68 -r1.69
--- inode.c	15 Dec 2010 06:44:25 -0000	1.68
+++ inode.c	15 Dec 2010 07:34:04 -0000	1.69
@@ -136,14 +136,25 @@
 #ifndef CFS_EXPORT_OPS
 	.read_inode	= cfs_read_inode,
 #endif
+	//.dirty_inode	= NULL,
 	.write_inode	= cfs_write_inode,
+	//.put_inode	= NULL,
+	//.drop_inode	= NULL,
 	.delete_inode	= cfs_delete_inode,
 	.put_super	= cfs_put_super,
+	.write_super	= cfs_write_super,
+	//.sync_fs	= NULL,
+	//.write_super_lockfs = NULL,
+	//.unlockfs	= NULL,
 	.statfs		= cfs_statfs,
-	.clear_inode	= cfs_clear_inode,
 	.remount_fs	= cfs_remount_fs,
-	.write_super	= cfs_write_super,
+	.clear_inode	= cfs_clear_inode,
+	//.umount_begin	= NULL,
 	.show_options	= cfs_show_options,
+#ifdef CONFIG_QUOTA
+	//.quota_read	= NULL,
+	//.quota_write	= NULL,
+#endif
 };
 
 #ifdef CFS_EXPORT_OPS
@@ -493,10 +504,11 @@
 	CFS_ATTRTIMEO(inode) = CFS_MINATTRTIMEO(inode);
 	CFS_ATTRTIMEO_UPDATE(inode) = jiffies;
 #endif
+	/* Nothing to do for CFS_INO_INVALID_ATTR. CFS piggybacks attributes */
 	if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))
-		CFS_FLAGS(inode) |= CFS_INO_INVALID_ATTR | CFS_INO_INVALID_DATA | CFS_INO_INVALID_ACCESS;
+		CFS_FLAGS(inode) |= CFS_INO_INVALID_DATA | CFS_INO_INVALID_ACCESS;
 	else
-		CFS_FLAGS(inode) |= CFS_INO_INVALID_ATTR | CFS_INO_INVALID_ACCESS;
+		CFS_FLAGS(inode) |= CFS_INO_INVALID_ACCESS;
 
 	UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
 #else
@@ -907,7 +919,7 @@
 		if (rwlocked)
 			down_write(&inode->i_alloc_sem);
 #endif
-		return -EINTR;
+		return -ERESTARTSYS;
 	}
 #endif /* CFSTOK_INTR */
 	SSI_ASSERT(result == CFSTOK_HELD);
@@ -1140,12 +1152,41 @@
 	}
 	CFS_FLAGS(inode) |= CFS_INO_REVALIDATING;
 
+	/* Do the page cache invalidation */
+	if (CFS_FLAGS(inode) & CFS_INO_INVALID_DATA) {
+		UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
+
+		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);
+
+		LOCK_COND_LOCK(&itoc(inode)->c_statelock);
+		CFS_FLAGS(inode) &= ~CFS_INO_INVALID_DATA;
+	}
+
+	status = 0;
 #ifdef CFS_REVALIDATE_GETATTR
-	/* Don't do getattr too often. Use CFS_MAXATTRTIMEO which is 60s */
-	if (!(CFS_FLAGS(inode) & CFS_INO_INVALID_ATIME) ||
-	    !time_after(jiffies, CFS_READTIME(inode) + 60*HZ)) {
-		status = 0;
-		goto skip_getattr;
+	if (!(CFS_FLAGS(inode) & (CFS_INO_INVALID_ATTR|CFS_INO_INVALID_ATIME)))
+		goto out;
+	/* Re-check CFS_READTIME since the above invalidate_inode_pages2()
+	 * might have waited for flush and would have piggybacked attributes.
+	 */
+	/* Don't do getattr too often. Borrow default CFS_MAXATTRTIMEO */
+	if (!time_after(jiffies, CFS_READTIME(inode) + 3*HZ)) {
+		CFS_FLAGS(inode) &= ~(CFS_INO_INVALID_ATTR|CFS_INO_INVALID_ATIME);
+		goto out;
+	}
+	if (!time_after(jiffies, CFS_READTIME(inode) + 60*HZ) &&
+	    !(CFS_FLAGS(inode) & CFS_INO_INVALID_ATTR)) {
+		CFS_FLAGS(inode) &= ~CFS_INO_INVALID_ATIME;
+		goto out;
 	}
 	UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
 
@@ -1161,28 +1202,8 @@
 		goto out;
 	}
 	LOCK_COND_LOCK(&itoc(inode)->c_statelock);
-skip_getattr:
-#else
-	status = 0;
-#endif /* !CFS_REVALIDATE_GETATTR */
-
+#endif /* CFS_REVALIDATE_GETATTR */
 	CFS_FLAGS(inode) &= ~(CFS_INO_INVALID_ATTR|CFS_INO_INVALID_ATIME);
-
-	/* Do the page cache invalidation */
-	if (CFS_FLAGS(inode) & CFS_INO_INVALID_DATA) {
-		UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
-
-		if (S_ISREG(inode->i_mode) && inode->i_mapping->nrpages) {
-			unmap_mapping_range(inode->i_mapping, 0, 0, 0);
-			if (!filemap_write_and_wait(inode->i_mapping))
-				(void)cfs_wb_all(inode);
-		}
-		invalidate_inode_pages2(inode->i_mapping);
-
-		LOCK_COND_LOCK(&itoc(inode)->c_statelock);
-		CFS_FLAGS(inode) &= ~CFS_INO_INVALID_DATA;
-	}
-
 #ifdef CFS_REVALIDATE_GETATTR
 out:
 #endif
@@ -1246,25 +1267,19 @@
 void cfs_end_data_update(struct inode *inode)
 {
 #ifdef CFS_ZAP_CACHES
-	/* cfs_refresh_inode() already marked caches for revalidation */
-#ifdef SSI_CFS_SKIP
 	LOCK_COND_LOCK(&itoc(inode)->c_statelock);
+#ifdef SSI_CFS_SKIP
 	/* Mark the attribute cache for revalidation */
 	CFS_FLAGS(inode) |= CFS_INO_INVALID_ATTR;
-#ifdef SSI_EXNFS
+#endif
 	/* Directories and symlinks: invalidate page cache too */
 	if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
-#else
-	/* Directories, symlinks, pipes, etc. invalidate page cache too */
-	if (!S_ISREG(inode->i_mode))
-#endif
 		CFS_FLAGS(inode) |= CFS_INO_INVALID_DATA;
 	UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
 #ifdef SSI_EXNFS
 	itoc(inode)->cache_change_attribute ++;
 	atomic_dec(&itoc(inode)->data_updates);
 #endif
-#endif /* SSI_CFS_SKIP */
 #else
 	cfs_zap_caches(inode);
 #endif /* !CFS_ZAP_CACHES */
@@ -1287,19 +1302,9 @@
  		goto out_nowait;
 	}
 
-	status = cfstok_req(inode, CFSTOK_ATTR, CFSTOK_READ,
-		CFSTOK_HOLD|CFSTOK_BLOCK, NON_RANGE, NULL);
-#ifdef CFSTOK_INTR
-	if (status == CFSTOK_INTERRUPTED) {
-#ifdef DEBUG
-		printk(KERN_DEBUG "%s: Interrupted\n", __FUNCTION__);
-#endif
-		status = -EINTR;
- 		goto out_nowait;
-	}
-#endif
-	SSI_ASSERT(status == CFSTOK_HELD);
-
+	/* SSI: no longer acquire CFSTOK_ATTR token in SR mode.
+	 * Linux VFS intends to grab attributes in real-time.
+	 */
 #ifdef CFS_ZAP_CACHES
 	need_atime = 1;
 	if (IS_NOATIME(inode))
@@ -1319,8 +1324,6 @@
 #endif /* CFS_ZAP_CACHES */
 	generic_fillattr(inode, stat);
 
-	cfstok_relse(inode, CFSTOK_ATTR, CFSTOK_READ, NON_RANGE);
-
 out_nowait:
 	dfprintk(PAGECACHE, "CFS: (%x/%ld) revalidation complete\n",
 		inode->i_sb->s_dev, inode->i_ino);
@@ -1395,15 +1398,19 @@
 		if (S_ISREG(inode->i_mode) && cfs_have_writebacks(inode)) {
 			if (new_isize > cur_isize) {
 				i_size_write(inode, new_isize);
+#ifdef SSI_CFS_NOTNEEDED
 				LOCK_COND_LOCK(&itoc(inode)->c_statelock);
 				CFS_FLAGS(inode) |= CFS_INO_INVALID_ATTR|CFS_INO_INVALID_DATA;
 				UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
+#endif /* SSI_CFS_NOTNEEDED */
 			}
 		} else {
 			i_size_write(inode, new_isize);
+#ifdef SSI_CFS_NOTNEEDED
 			LOCK_COND_LOCK(&itoc(inode)->c_statelock);
 			CFS_FLAGS(inode) |= CFS_INO_INVALID_ATTR|CFS_INO_INVALID_DATA;
 			UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
+#endif /* SSI_CFS_NOTNEEDED */
 		}
 	}
 #else
@@ -1434,11 +1441,13 @@
 #ifdef CFS_DEBUG_VERBOSE
 		printk(KERN_DEBUG "CFS: mtime change on %s/%ld\n", inode->i_sb->s_id, inode->i_ino);
 #endif
+#ifdef SSI_CFS_NOTNEEDED
 		if (!cfs_have_writebacks(inode)) {
 			LOCK_COND_LOCK(&itoc(inode)->c_statelock);
 			CFS_FLAGS(inode) |= CFS_INO_INVALID_ATTR|CFS_INO_INVALID_DATA;
 			UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
 		}
+#endif /* SSI_CFS_NOTNEEDED */
 	}
 #endif /* CFS_ZAP_CACHES */
 
@@ -1458,13 +1467,15 @@
 #else
 	if (itoc(inode)->c_vn != fattr->cna_vn) {
 		itoc(inode)->c_vn = fattr->cna_vn;
+#ifdef SSI_CFS_NOTNEEDED
 		if (!cfs_have_writebacks(inode)) {
 			LOCK_COND_LOCK(&itoc(inode)->c_statelock);
 			CFS_FLAGS(inode) |= CFS_INO_INVALID_ATTR|CFS_INO_INVALID_DATA|CFS_INO_INVALID_ACCESS;
 			UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
 		}
+#endif /* SSI_CFS_NOTNEEDED */
 	}
-#endif
+#endif /* CFS_ZAP_CACHES */
 	inode->i_generation = fattr->cna_generation;
 
 	cfstok_putiflags(inode, fattr->cna_flags);
@@ -1492,6 +1503,14 @@
 	}
 #endif
 
+#ifdef CFS_ZAP_CACHES
+	/* i_atime is updated (above) */
+	LOCK_COND_LOCK(&itoc(inode)->c_statelock);
+	if (CFS_FLAGS(inode) & (CFS_INO_INVALID_ATTR|CFS_INO_INVALID_ATIME))
+		CFS_FLAGS(inode) &= ~(CFS_INO_INVALID_ATTR|CFS_INO_INVALID_ATIME);
+	UNLOCK_COND_LOCK(&itoc(inode)->c_statelock);
+#endif /* CFS_ZAP_CACHES */
+
 	return 0;
 
  out_changed:


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d