[SSI] openssi/kernel/cluster/ssi/cfs cfstok.c,1.27,1.28
Roger Tsang <[email protected]> Wed, 15 Dec 2010 07:31:38 +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-serv18821/kernel/cluster/ssi/cfs
Modified Files:
Tag: OPENSSI-FC
cfstok.c
Log Message:
cluster/ssi/cfs/cfstok.c
- cfstok_req: pass TOK_REQUEST flag to tok_hold() if CFSTOK_BLOCK flag is seen in cfstok_req() scope. reduce redundant code.
- cfstok_req: for non-blocking requests look for -EAGAIN returned from tok_hold().
- cfstok_send: fix lost non-HAVE token messages on hard mounts that are being rebuilt. clients may livelock in tok_wait() since tokens messages with cta_op value 0 are ignored.
- cfstok_objrevoke: skip unmap_mapping_range() if object is not a file.
- cfstok_objrevoke: skip unmap_mapping_range() if there are no shared writeable memory mappings.
- cfstok_objrevoke: push dirty pages to server when there is a CFSTOK_EXCL to CFSTOK_SR mode change at client. fix data inconsistency when other clients receive GRANT message ahead of Linux page writeback.
- cfstok_objrevoke: skip filemap_write_and_wait() if old mode is CFSTOK_SR. there are no dirty pages.
- decrease cfs_default_delay by one factor to reduce cross node starvation. this should be tunable.
- rename and convert cfs_default_delay static variable to CFS_DEFAULT_DELAY preprocessor macro. reduce kernel bss.
cluster/ssi/cfs/cfstok.c (#ifdef CFS_ZAP_CACHES)
- cfstok_objrevoke: now that pages are invalidated we no longer need to set CFS_INO_INVALID_DATA flag.
- cfstok_objrevoke: no need to set CFS_INO_INVALID_ATTR flag since attributes are piggybacked with GRANT message.
cluster/ssi/cfs/cfstok.c (#ifdef CFSTOK_INTR)
- cfstok_req_m: return -ERESTARTSYS instead of -EINTR
cluster/ssi/cfs/cfstok.c (#ifdef CFSTOK_KMEM_CACHE)
- tok_delrel_add: revert original behavior. don't wait for memory, just panic.
cluster/ssi/cfs/cfstok.c (#ifdef CFSTOKHOLD_LINUX_LIST)
- delholdlist: use list_del() instead of list_del_init().
cluster/ssi/cfs/cfstok.c (#ifdef KERNEL2616_53)
- cfstok_objrevoke: remove new unused range token support since REVOKE message does not include a range.
Index: cfstok.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfstok.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- cfstok.c 15 Dec 2010 07:08:42 -0000 1.27
+++ cfstok.c 15 Dec 2010 07:31:36 -0000 1.28
@@ -450,25 +450,8 @@
}
}
- if (flags == CFSTOK_HOLD) { /* HOLD && !BLOCK */
-#ifdef SSI_RANGE_TOKENS
- if (BITVAL(which_tok) & CFSTOK_RANGE)
- ret = tok_hold_range(&obj, ITORTCB(ip, which_tok),
- mode, TOK_HOLD, agent,
- (waitcookie_t *)NULL, start, len);
- else
-#endif
- ret = tok_hold(&obj, ITOTCB(ip, which_tok), mode,
- TOK_HOLD, agent, (waitcookie_t *)NULL);
- if (ret)
- goto held;
-
- ret = CFSTOK_WOULDBLOCK;
- goto unlock;
- }
-
/*
- * make a blocking request on cfstok layer.
+ * If CFSTOK_BLOCK flag is set make a blocking request on cfstok layer.
* The request is send by Token layer and gives back
* wait-cookie. unlock cip and wait on wait-cookie.
* This is done this way instead of making a blocking
@@ -479,15 +462,21 @@
if (BITVAL(which_tok) & CFSTOK_RANGE)
ret = tok_hold_range(&obj,
ITORTCB(ip, which_tok), mode,
- TOK_HOLD|TOK_REQUEST,
+ TOK_HOLD | (flags & CFSTOK_BLOCK) ? TOK_REQUEST : 0,
agent, &waitcookie, start, len );
else
#endif
- ret = tok_hold(&obj, ITOTCB(ip, which_tok),
- mode, TOK_HOLD|TOK_REQUEST,
+ ret = tok_hold(&obj, ITOTCB(ip, which_tok), mode,
+ TOK_HOLD | (flags & CFSTOK_BLOCK) ? TOK_REQUEST : 0,
agent, &waitcookie);
- if (ret)
+ if (ret) {
+ if (ret == -EAGAIN) {
+ SSI_ASSERT(!(flags & CFSTOK_BLOCK));
+ ret = CFSTOK_WOULDBLOCK;
+ goto unlock;
+ }
goto held;
+ }
/* Before release TCB exclusive lock
* indicate that this process has the
@@ -643,7 +632,7 @@
#ifdef DEBUG
printk(KERN_DEBUG "%s: Interrupted\n", __FUNCTION__);
#endif
- return -EINTR;
+ return -ERESTARTSYS;
}
#else
#ifdef SSI_XXX_CFS_NEED_ERROR_HANDLING
@@ -1072,7 +1061,7 @@
#endif
{
#ifdef CFSTOKHOLD_LINUX_LIST
- list_del_init(&entry->ctok_list);
+ list_del(&entry->ctok_list);
#else
if ( entry->prev != NULL)
entry->prev->next = entry->next;
@@ -1562,20 +1551,15 @@
* a down soft mount.
*/
if (!CFS_SB_UP_MIP(mip)) {
- if (!CFS_SB_HARD_MIP(mip) ||
- mip->mi_sb_state == MI_SB_STATE_REBUILD_HAVES) {
- SSI_ASSERT(op == HAVE);
- if (op != HAVE) {
- if (op == GIVEBACK)
- goto out;
- op = 0;
- }
- }
/* Optimize away RPC */
- if (server != this_node) {
+ if (!CFS_SB_HARD_MIP(mip))
+ goto out;
+ if (op != HAVE &&
+ mip->mi_sb_state < MI_SB_STATE_REBUILD_HAVES_DONE) {
+ /* Swallow GIVEBACK since server went down */
if (op == GIVEBACK)
goto out;
- return -EREMOTE;
+ return -EBUSY;
}
}
@@ -1641,7 +1625,6 @@
if (error && (error != -EREMOTE || !clms_isnodedown(server)))
printk(KERN_WARNING "cfstok_send: nsc_rcall error %d\n", error);
#endif
-
if (error == -EREMOTE) {
/* Server went down */
if (!CFS_SB_HARD_MIP(mip) ||
@@ -1650,7 +1633,6 @@
} else
return error;
}
-
out:
iput(ip); /* undo HOLDOBJ() */
return error;
@@ -1717,53 +1699,24 @@
* mappings to read-only until he does a write fault.
* This is not possible in Linux without further modifications.
*/
-#ifdef SSI_RANGE_TOKENS
- unmap_mapping_range(ip->i_mapping,
- start, (len == MAXLEN) ? 0 : len, 0);
-#else
- unmap_mapping_range(ip->i_mapping, 0, 0, 0);
-#endif /* !SSI_RANGE_TOKENS */
- break;
case TOK_NOMODE:
case CFSTOK_NULL:
-#ifdef SSI_RANGE_TOKENS
- if (!len || (!start && len == MAXLEN))
- goto nonrange;
-
- unmap_mapping_range(ip->i_mapping,
- start, (len == MAXLEN) ? 0 : len, 0);
-#ifdef KERNEL2616_53
- filemap_write_and_wait_range(ip->i_mapping, start,
- (len == MAXLEN) ? i_size_read(ip)
- : start + len);
- {
- pgoff_t end = (len == MAXLEN) ? -1
- : (start + len) >> PAGE_CACHE_SHIFT;
-
- /* SSI_XXX: end is inclusive while range tokens is not */
- invalidate_inode_pages2_range(ip->i_mapping,
- start >> PAGE_CACHE_SHIFT,
- end);
+ if (S_ISREG(ip->i_mode) &&
+ mapping_writably_mapped(ip->i_mapping))
+ unmap_mapping_range(ip->i_mapping, 0, 0, 0);
+ if (oldmode != CFSTOK_SR &&
+ ip->i_mapping->nrpages) {
+ error = filemap_flush(ip->i_mapping);
+ if (error != -EIO) {
+ int err2 = filemap_fdatawait(
+ ip->i_mapping);
+ if (!error)
+ error = err2;
+ }
}
- break;
-#else
-#error Linux does not fully support range tokens
-#endif
-nonrange:
-#endif /* SSI_RANGE_TOKENS */
-#ifdef CFS_ZAP_CACHES
- LOCK_COND_LOCK(&itoc(ip)->c_statelock);
- CFS_FLAGS(ip) |= CFS_INO_INVALID_ATTR | CFS_INO_INVALID_DATA;
- UNLOCK_COND_LOCK(&itoc(ip)->c_statelock);
-#else
- unmap_mapping_range(ip->i_mapping, 0, 0, 0);
- filemap_write_and_wait(ip->i_mapping);
+ if (newmode == CFSTOK_SR)
+ break;
invalidate_inode_pages2(ip->i_mapping);
-#ifdef SSI_XXX_DO_THIS_INSTEAD
- /* NFS code uses the invalidate_inode_pages2() */
- truncate_inode_pages(&ip->i_data, 0);
-#endif
-#endif /* !CFS_ZAP_CACHES */
break;
default:
panic("cfstok_objrevoke: bad revoke mode %s",
@@ -1778,7 +1731,15 @@
if (relock)
CFSTOK_XLOCK_NF(itoc(ip));
- return error;
+ /* SSI_XXX: Eat the errors for now.
+ * cfs_clear_inode() does not handle errors.
+ */
+ if (unlikely(error)) {
+ printk(KERN_ERR "%s: swallowed error %d\n",
+ __FUNCTION__, error);
+ dump_stack();
+ }
+ return 0;
}
char *
@@ -2193,7 +2154,8 @@
cfs_wakeup_daemon();
}
-int cfs_default_delay = 1 * HZ;
+/* Delay token release by CFS_DEFAULT_DELAY ticks */
+#define CFS_DEFAULT_DELAY (HZ/10) // old default: HZ
/* SSI_XXX: If the delay is 0, maybe this routine should use
* a heuristic algorithm to determine a reasonable delay value.
@@ -2239,7 +2201,9 @@
struct delrel *drp;
#ifdef CFSTOK_KMEM_CACHE
- drp = kmem_cache_alloc(delrel_cachep, GFP_KERNEL|__GFP_NOFAIL);
+ drp = kmem_cache_alloc(delrel_cachep, GFP_KERNEL);
+ if (unlikely(drp == NULL))
+ panic("%s: Out of memory", __FUNCTION__);
memset(drp, 0, sizeof(struct delrel));
#else
/* Get struct from free list if possible */
@@ -2268,7 +2232,7 @@
drp->dr_relse = relse_func;
if (delay == 0)
- delay = cfs_default_delay;
+ delay = CFS_DEFAULT_DELAY;
init_timer(&(drp->dr_tl));
drp->dr_tl.expires = jiffies + delay;
------------------------------------------------------------------------------
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