[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