[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® 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