提交 54b591df 编写于 作者: J Jaegeuk Kim

f2fs: split grab_cache_page and wait_on_page_writeback for node pages

This patch splits grab_cache_page_write_begin into grab_cache_page and
wait_on_page_writeback for node pages.

This patch intends to enhance the latency to get node pages by alleviating
unnecessary wait_on_page_writeback.
Signed-off-by: NChao Yu <chao2.yu@samsung.com>
Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
上级 8aa6f1c5
...@@ -268,6 +268,8 @@ static void init_dent_inode(const struct qstr *name, struct page *ipage) ...@@ -268,6 +268,8 @@ static void init_dent_inode(const struct qstr *name, struct page *ipage)
{ {
struct f2fs_inode *ri; struct f2fs_inode *ri;
f2fs_wait_on_page_writeback(ipage, NODE);
/* copy name info. to this inode page */ /* copy name info. to this inode page */
ri = F2FS_INODE(ipage); ri = F2FS_INODE(ipage);
ri->i_namelen = cpu_to_le32(name->len); ri->i_namelen = cpu_to_le32(name->len);
......
...@@ -156,6 +156,7 @@ int f2fs_write_inline_data(struct inode *inode, ...@@ -156,6 +156,7 @@ int f2fs_write_inline_data(struct inode *inode,
return err; return err;
ipage = dn.inode_page; ipage = dn.inode_page;
f2fs_wait_on_page_writeback(ipage, NODE);
zero_user_segment(ipage, INLINE_DATA_OFFSET, zero_user_segment(ipage, INLINE_DATA_OFFSET,
INLINE_DATA_OFFSET + MAX_INLINE_DATA); INLINE_DATA_OFFSET + MAX_INLINE_DATA);
src_addr = kmap(page); src_addr = kmap(page);
...@@ -188,6 +189,8 @@ void truncate_inline_data(struct inode *inode, u64 from) ...@@ -188,6 +189,8 @@ void truncate_inline_data(struct inode *inode, u64 from)
if (IS_ERR(ipage)) if (IS_ERR(ipage))
return; return;
f2fs_wait_on_page_writeback(ipage, NODE);
zero_user_segment(ipage, INLINE_DATA_OFFSET + from, zero_user_segment(ipage, INLINE_DATA_OFFSET + from,
INLINE_DATA_OFFSET + MAX_INLINE_DATA); INLINE_DATA_OFFSET + MAX_INLINE_DATA);
set_page_dirty(ipage); set_page_dirty(ipage);
...@@ -218,6 +221,8 @@ int recover_inline_data(struct inode *inode, struct page *npage) ...@@ -218,6 +221,8 @@ int recover_inline_data(struct inode *inode, struct page *npage)
ipage = get_node_page(sbi, inode->i_ino); ipage = get_node_page(sbi, inode->i_ino);
f2fs_bug_on(IS_ERR(ipage)); f2fs_bug_on(IS_ERR(ipage));
f2fs_wait_on_page_writeback(ipage, NODE);
src_addr = inline_data_addr(npage); src_addr = inline_data_addr(npage);
dst_addr = inline_data_addr(ipage); dst_addr = inline_data_addr(ipage);
memcpy(dst_addr, src_addr, MAX_INLINE_DATA); memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
...@@ -229,6 +234,7 @@ int recover_inline_data(struct inode *inode, struct page *npage) ...@@ -229,6 +234,7 @@ int recover_inline_data(struct inode *inode, struct page *npage)
if (f2fs_has_inline_data(inode)) { if (f2fs_has_inline_data(inode)) {
ipage = get_node_page(sbi, inode->i_ino); ipage = get_node_page(sbi, inode->i_ino);
f2fs_bug_on(IS_ERR(ipage)); f2fs_bug_on(IS_ERR(ipage));
f2fs_wait_on_page_writeback(ipage, NODE);
zero_user_segment(ipage, INLINE_DATA_OFFSET, zero_user_segment(ipage, INLINE_DATA_OFFSET,
INLINE_DATA_OFFSET + MAX_INLINE_DATA); INLINE_DATA_OFFSET + MAX_INLINE_DATA);
clear_inode_flag(F2FS_I(inode), FI_INLINE_DATA); clear_inode_flag(F2FS_I(inode), FI_INLINE_DATA);
......
...@@ -853,8 +853,7 @@ struct page *new_node_page(struct dnode_of_data *dn, ...@@ -853,8 +853,7 @@ struct page *new_node_page(struct dnode_of_data *dn,
if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC))) if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)))
return ERR_PTR(-EPERM); return ERR_PTR(-EPERM);
page = grab_cache_page_write_begin(NODE_MAPPING(sbi), page = grab_cache_page(NODE_MAPPING(sbi), dn->nid);
dn->nid, AOP_FLAG_NOFS);
if (!page) if (!page)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -871,6 +870,7 @@ struct page *new_node_page(struct dnode_of_data *dn, ...@@ -871,6 +870,7 @@ struct page *new_node_page(struct dnode_of_data *dn,
new_ni.ino = dn->inode->i_ino; new_ni.ino = dn->inode->i_ino;
set_node_addr(sbi, &new_ni, NEW_ADDR, false); set_node_addr(sbi, &new_ni, NEW_ADDR, false);
f2fs_wait_on_page_writeback(page, NODE);
fill_node_footer(page, dn->nid, dn->inode->i_ino, ofs, true); fill_node_footer(page, dn->nid, dn->inode->i_ino, ofs, true);
set_cold_node(dn->inode, page); set_cold_node(dn->inode, page);
SetPageUptodate(page); SetPageUptodate(page);
...@@ -950,8 +950,7 @@ struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid) ...@@ -950,8 +950,7 @@ struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid)
struct page *page; struct page *page;
int err; int err;
repeat: repeat:
page = grab_cache_page_write_begin(NODE_MAPPING(sbi), page = grab_cache_page(NODE_MAPPING(sbi), nid);
nid, AOP_FLAG_NOFS);
if (!page) if (!page)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -1562,6 +1561,7 @@ static void recover_inline_xattr(struct inode *inode, struct page *page) ...@@ -1562,6 +1561,7 @@ static void recover_inline_xattr(struct inode *inode, struct page *page)
src_addr = inline_xattr_addr(page); src_addr = inline_xattr_addr(page);
inline_size = inline_xattr_size(inode); inline_size = inline_xattr_size(inode);
f2fs_wait_on_page_writeback(ipage, NODE);
memcpy(dst_addr, src_addr, inline_size); memcpy(dst_addr, src_addr, inline_size);
update_inode(inode, ipage); update_inode(inode, ipage);
......
...@@ -272,7 +272,7 @@ static inline void set_nid(struct page *p, int off, nid_t nid, bool i) ...@@ -272,7 +272,7 @@ static inline void set_nid(struct page *p, int off, nid_t nid, bool i)
{ {
struct f2fs_node *rn = F2FS_NODE(p); struct f2fs_node *rn = F2FS_NODE(p);
wait_on_page_writeback(p); f2fs_wait_on_page_writeback(p, NODE);
if (i) if (i)
rn->i.i_nid[off - NODE_DIR1_BLOCK] = cpu_to_le32(nid); rn->i.i_nid[off - NODE_DIR1_BLOCK] = cpu_to_le32(nid);
......
...@@ -349,6 +349,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize, ...@@ -349,6 +349,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
if (ipage) { if (ipage) {
inline_addr = inline_xattr_addr(ipage); inline_addr = inline_xattr_addr(ipage);
f2fs_wait_on_page_writeback(ipage, NODE);
} else { } else {
page = get_node_page(sbi, inode->i_ino); page = get_node_page(sbi, inode->i_ino);
if (IS_ERR(page)) { if (IS_ERR(page)) {
...@@ -356,6 +357,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize, ...@@ -356,6 +357,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
return PTR_ERR(page); return PTR_ERR(page);
} }
inline_addr = inline_xattr_addr(page); inline_addr = inline_xattr_addr(page);
f2fs_wait_on_page_writeback(page, NODE);
} }
memcpy(inline_addr, txattr_addr, inline_size); memcpy(inline_addr, txattr_addr, inline_size);
f2fs_put_page(page, 1); f2fs_put_page(page, 1);
...@@ -376,6 +378,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize, ...@@ -376,6 +378,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
return PTR_ERR(xpage); return PTR_ERR(xpage);
} }
f2fs_bug_on(new_nid); f2fs_bug_on(new_nid);
f2fs_wait_on_page_writeback(xpage, NODE);
} else { } else {
struct dnode_of_data dn; struct dnode_of_data dn;
set_new_dnode(&dn, inode, NULL, NULL, new_nid); set_new_dnode(&dn, inode, NULL, NULL, new_nid);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册