summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChao Yu <chao2.yu@samsung.com>2015-02-05 18:03:40 +0800
committerJaegeuk Kim <jaegeuk@kernel.org>2015-03-03 09:58:48 -0800
commitcb3bc9ee06f708f3b615b6ce119b907d6a4c8a5d (patch)
tree74cff964a35c787ca4c6d3386f8cccd068ffd67a
parent91c5d9bce7fef638add2cd36676e157354784d0f (diff)
downloadlinux-cb3bc9ee06f708f3b615b6ce119b907d6a4c8a5d.tar.gz
linux-cb3bc9ee06f708f3b615b6ce119b907d6a4c8a5d.tar.bz2
linux-cb3bc9ee06f708f3b615b6ce119b907d6a4c8a5d.zip
f2fs: use extent cache for dir
We update extent cache for all user inode of f2fs including dir inode, so this patch gives another chance to try to get physical address of page from extent cache for dir inode. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fs/f2fs/data.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index ad99b7a295b4..ae5c41444e8f 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -806,6 +806,7 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync)
struct address_space *mapping = inode->i_mapping;
struct dnode_of_data dn;
struct page *page;
+ struct extent_info ei;
int err;
struct f2fs_io_info fio = {
.type = DATA,
@@ -817,6 +818,11 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync)
return page;
f2fs_put_page(page, 0);
+ if (f2fs_lookup_extent_cache(inode, index, &ei)) {
+ dn.data_blkaddr = ei.blk + index - ei.fofs;
+ goto got_it;
+ }
+
set_new_dnode(&dn, inode, NULL, NULL, 0);
err = get_dnode_of_data(&dn, index, LOOKUP_NODE);
if (err)
@@ -830,6 +836,7 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync)
if (unlikely(dn.data_blkaddr == NEW_ADDR))
return ERR_PTR(-EINVAL);
+got_it:
page = grab_cache_page(mapping, index);
if (!page)
return ERR_PTR(-ENOMEM);
@@ -864,6 +871,7 @@ struct page *get_lock_data_page(struct inode *inode, pgoff_t index)
struct address_space *mapping = inode->i_mapping;
struct dnode_of_data dn;
struct page *page;
+ struct extent_info ei;
int err;
struct f2fs_io_info fio = {
.type = DATA,
@@ -874,6 +882,11 @@ repeat:
if (!page)
return ERR_PTR(-ENOMEM);
+ if (f2fs_lookup_extent_cache(inode, index, &ei)) {
+ dn.data_blkaddr = ei.blk + index - ei.fofs;
+ goto got_it;
+ }
+
set_new_dnode(&dn, inode, NULL, NULL, 0);
err = get_dnode_of_data(&dn, index, LOOKUP_NODE);
if (err) {
@@ -887,6 +900,7 @@ repeat:
return ERR_PTR(-ENOENT);
}
+got_it:
if (PageUptodate(page))
return page;