diff options
author | OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> | 2013-05-01 19:21:16 +0900 |
---|---|---|
committer | Daniel Phillips <daniel@tux3.org> | 2013-05-01 19:21:16 +0900 |
commit | 3e58c372947427a5efa8b40fd5ca30c9bb0bad02 (patch) | |
tree | ab811c2f72ea6fe5f4d0ec19f966fcd76d447175 | |
parent | 6d297edba68d8683c153f1ffaa461f6ee7833f07 (diff) | |
download | linux-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.c | 2 | ||||
-rw-r--r-- | fs/tux3/tux3.h | 1 | ||||
-rw-r--r-- | fs/tux3/writeback.c | 21 |
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; |