aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>2013-05-01 19:21:16 +0900
committerDaniel Phillips <daniel@tux3.org>2013-05-01 19:21:16 +0900
commit3e58c372947427a5efa8b40fd5ca30c9bb0bad02 (patch)
treeab811c2f72ea6fe5f4d0ec19f966fcd76d447175
parent6d297edba68d8683c153f1ffaa461f6ee7833f07 (diff)
downloadlinux-tux3-3e58c372947427a5efa8b40fd5ca30c9bb0bad02.tar.gz
tux3: Sort inodes by inum for flushing
To make fs traverse by efficient order, this sorts inodes by inum. With it, inodes are flushed by inum order. So, even if current linear block allocation, blocks are allocated more fs traverse friendly order. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
-rw-r--r--fs/tux3/buffer_writeback.c2
-rw-r--r--fs/tux3/tux3.h1
-rw-r--r--fs/tux3/writeback.c21
3 files changed, 22 insertions, 2 deletions
diff --git a/fs/tux3/buffer_writeback.c b/fs/tux3/buffer_writeback.c
index af0f64af8a76e0..8994f2a4ee2790 100644
--- a/fs/tux3/buffer_writeback.c
+++ b/fs/tux3/buffer_writeback.c
@@ -2,8 +2,6 @@
* Write back buffers
*/
-#include <linux/list_sort.h>
-
#include "buffer_writebacklib.c"
/*
diff --git a/fs/tux3/tux3.h b/fs/tux3/tux3.h
index 8eb370f4eae5d5..228a9b91ccdf13 100644
--- a/fs/tux3/tux3.h
+++ b/fs/tux3/tux3.h
@@ -14,6 +14,7 @@
#include <linux/magic.h>
#include <linux/slab.h>
#include <linux/xattr.h>
+#include <linux/list_sort.h>
#include "trace.h"
#include "buffer.h"
diff --git a/fs/tux3/writeback.c b/fs/tux3/writeback.c
index 1cdb88a6047867..e9cc48399849a0 100644
--- a/fs/tux3/writeback.c
+++ b/fs/tux3/writeback.c
@@ -482,6 +482,24 @@ int tux3_flush_inode_internal(struct inode *inode, unsigned delta)
return err;
}
+static int inode_inum_cmp(void *priv, struct list_head *a, struct list_head *b)
+{
+ struct tux3_inode *ta, *tb;
+ struct inode_delta_dirty *i_ddc;
+ unsigned delta = *(unsigned *)priv;
+
+ i_ddc = list_entry(a, struct inode_delta_dirty, dirty_list);
+ ta = i_ddc_to_inode(i_ddc, delta);
+ i_ddc = list_entry(b, struct inode_delta_dirty, dirty_list);
+ tb = i_ddc_to_inode(i_ddc, delta);
+
+ if (ta->inum < tb->inum)
+ return -1;
+ else if (ta->inum > tb->inum)
+ return 1;
+ return 0;
+}
+
int tux3_flush_inodes(struct sb *sb, unsigned delta)
{
struct sb_delta_dirty *s_ddc = tux3_sb_ddc(sb, delta);
@@ -491,6 +509,9 @@ int tux3_flush_inodes(struct sb *sb, unsigned delta)
/* ->dirty_inodes owned by backend. No need to lock here */
+ /* Sort by tuxnode->inum. FIXME: do we want to sort? */
+ list_sort(&delta, dirty_inodes, inode_inum_cmp);
+
list_for_each_entry_safe(i_ddc, safe, dirty_inodes, dirty_list) {
struct tux3_inode *tuxnode = i_ddc_to_inode(i_ddc, delta);
struct inode *inode = &tuxnode->vfs_inode;