[SSI] openssi/kernel/cluster/ssi/cfs write.c,1.41,1.42

Roger Tsang <[email protected]> Fri, 05 Mar 2010 05:27:36 +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-serv26381/cluster/ssi/cfs

Modified Files:
      Tag: OPENSSI-FC
	write.c 
Log Message:
CFS (#ifdef CFS_CHARD_SYNC_FIX):
- Regression:
  - CFS: desynchronized value of cfs_i.ndirty messages after failover.

 cluster/ssi/cfs/write.c          |   44 ++++++++++---------------------
 include/cluster/ssi/cfs/cfs_fs.h |    3 --
 2 files changed, 15 insertions(+), 32 deletions(-)


Index: write.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/write.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- write.c	5 Mar 2010 05:23:57 -0000	1.41
+++ write.c	5 Mar 2010 05:27:34 -0000	1.42
@@ -120,6 +120,10 @@
 					    unsigned int, unsigned int);
 static int cfs_wait_on_write_congestion(struct address_space *, int);
 static int cfs_wait_on_requests(struct inode *, unsigned long, unsigned int);
+#ifdef CFS_CHARD_SYNC_FIX
+static void cfs_prepare_reflush(struct inode *, unsigned long, unsigned int,
+				struct writeback_control *);
+#endif
 
 static kmem_cache_t *cfs_wdata_cachep;
 static mempool_t *cfs_wdata_mempool;
@@ -513,6 +517,7 @@
 	}
 
 #ifdef CFS_CHARD_SYNC_FIX
+flush_again:
 	node = itocmi(inode)->mi_server;
 #endif
 	err = cfs_flush_inode(inode, index, npages, wb_priority(wbc));
@@ -522,9 +527,6 @@
 	if (err < 0)
 		goto out;
 	wbc->nr_to_write -= err;
-#ifdef CFS_CHARD_SYNC_FIX
-wait_on_requests:
-#endif
 	if (!wbc->nonblocking && wbc->sync_mode == WB_SYNC_ALL) {
 #ifdef CFS_COMMIT_FILE_RANGE
 		err = cfs_wait_on_requests(inode, index, npages);
@@ -539,11 +541,8 @@
 #ifdef CFS_CHARD_SYNC_FIX
 	/* If server failed over, flush unstable data to new server. */
 	if (node != itocmi(inode)->mi_server) {
-		node = itocmi(inode)->mi_server;
-		err = cfs_reflush_inode(inode, index, npages, wb_priority(wbc));
-		if (err < 0)
-			goto out;
-		goto wait_on_requests;
+		cfs_prepare_reflush(inode, index, npages, wbc);
+		goto flush_again;
 	}
 #endif
 	err = cfs_commit_inode(inode, index, npages, wb_priority(wbc));
@@ -2145,45 +2144,32 @@
 
 #ifdef CFS_CHARD_SYNC_FIX
 /*
- * Flush requests marked for commit.
+ * Move requests marked for commit to dirty queue.
  */
-int
-cfs_reflush_inode(
+static void
+cfs_prepare_reflush(
 	struct inode *inode,
 	unsigned long idx_start,
 	unsigned int npages,
-	int how)
+	struct writeback_control *wbc)
 {
-	struct cfs_server *server = CFS_SERVER(inode);
 	struct cfs_page *req;
 	cnode_t *cp = itoc(inode);
 	LIST_HEAD(head);
 	unsigned int res;
-	int error = 0;
 
 	spin_lock(&cp->req_lock);
 	res = cfs_scan_commit(inode, &head, idx_start, npages);
 	spin_unlock(&cp->req_lock);
-	if (!res)
-		return 0;
+
+	if (wbc)
+		wbc->nr_to_write += res;
 
 	while (!list_empty(&head)) {
 		req = cfs_list_entry((&head)->next);
 		cfs_list_remove_request(req);
 		cfs_mark_request_dirty(req);
 	}
-
-	/* Taken from cfs_flush_inode() */
-	/* For single writes, FLUSH_STABLE is more efficient */
-	if (res == cp->npages && cp->npages <= server->wpages) {
-	       if (res > 1 || cfs_list_entry(head.next)->wb_bytes <= server->wsize)
-		       how |= FLUSH_STABLE;
-	}
-	error = cfs_flush_list(&head, server->wpages, how);
-	if (error < 0)
-		return error;
-
-	return res;
 }
 #endif /* CFS_CHARD_SYNC_FIX */
 
@@ -2243,7 +2229,7 @@
 		/* If server failed over, flush unstable data to new server. */
 		if (node != itocmi(inode)->mi_server) {
 			node = itocmi(inode)->mi_server;
-			error = cfs_reflush_inode(inode, idx_start, npages, how);
+			cfs_prepare_reflush(inode, idx_start, npages, NULL);
 		}
 #endif
 		if (error == 0)


------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev