[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