mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-14 04:41:26 +00:00
f2fs: check PageWriteback flag for ordered case
For all ordered cases in f2fs_wait_on_page_writeback(), we need to check PageWriteback status, so let's clean up to relocate the check into f2fs_wait_on_page_writeback(). Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
88960068f2
commit
bae0ee7a76
@ -44,7 +44,7 @@ repeat:
|
|||||||
cond_resched();
|
cond_resched();
|
||||||
goto repeat;
|
goto repeat;
|
||||||
}
|
}
|
||||||
f2fs_wait_on_page_writeback(page, META, true);
|
f2fs_wait_on_page_writeback(page, META, true, true);
|
||||||
if (!PageUptodate(page))
|
if (!PageUptodate(page))
|
||||||
SetPageUptodate(page);
|
SetPageUptodate(page);
|
||||||
return page;
|
return page;
|
||||||
@ -370,9 +370,8 @@ continue_unlock:
|
|||||||
goto continue_unlock;
|
goto continue_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, META, true);
|
f2fs_wait_on_page_writeback(page, META, true, true);
|
||||||
|
|
||||||
BUG_ON(PageWriteback(page));
|
|
||||||
if (!clear_page_dirty_for_io(page))
|
if (!clear_page_dirty_for_io(page))
|
||||||
goto continue_unlock;
|
goto continue_unlock;
|
||||||
|
|
||||||
@ -1290,8 +1289,7 @@ static void commit_checkpoint(struct f2fs_sb_info *sbi,
|
|||||||
struct page *page = f2fs_grab_meta_page(sbi, blk_addr);
|
struct page *page = f2fs_grab_meta_page(sbi, blk_addr);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, META, true);
|
f2fs_wait_on_page_writeback(page, META, true, true);
|
||||||
f2fs_bug_on(sbi, PageWriteback(page));
|
|
||||||
|
|
||||||
memcpy(page_address(page), src, PAGE_SIZE);
|
memcpy(page_address(page), src, PAGE_SIZE);
|
||||||
|
|
||||||
|
@ -626,7 +626,7 @@ static void __set_data_blkaddr(struct dnode_of_data *dn)
|
|||||||
*/
|
*/
|
||||||
void f2fs_set_data_blkaddr(struct dnode_of_data *dn)
|
void f2fs_set_data_blkaddr(struct dnode_of_data *dn)
|
||||||
{
|
{
|
||||||
f2fs_wait_on_page_writeback(dn->node_page, NODE, true);
|
f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
|
||||||
__set_data_blkaddr(dn);
|
__set_data_blkaddr(dn);
|
||||||
if (set_page_dirty(dn->node_page))
|
if (set_page_dirty(dn->node_page))
|
||||||
dn->node_changed = true;
|
dn->node_changed = true;
|
||||||
@ -656,7 +656,7 @@ int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)
|
|||||||
trace_f2fs_reserve_new_blocks(dn->inode, dn->nid,
|
trace_f2fs_reserve_new_blocks(dn->inode, dn->nid,
|
||||||
dn->ofs_in_node, count);
|
dn->ofs_in_node, count);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(dn->node_page, NODE, true);
|
f2fs_wait_on_page_writeback(dn->node_page, NODE, true, true);
|
||||||
|
|
||||||
for (; count > 0; dn->ofs_in_node++) {
|
for (; count > 0; dn->ofs_in_node++) {
|
||||||
block_t blkaddr = datablock_addr(dn->inode,
|
block_t blkaddr = datablock_addr(dn->inode,
|
||||||
@ -2149,12 +2149,11 @@ continue_unlock:
|
|||||||
if (PageWriteback(page)) {
|
if (PageWriteback(page)) {
|
||||||
if (wbc->sync_mode != WB_SYNC_NONE)
|
if (wbc->sync_mode != WB_SYNC_NONE)
|
||||||
f2fs_wait_on_page_writeback(page,
|
f2fs_wait_on_page_writeback(page,
|
||||||
DATA, true);
|
DATA, true, true);
|
||||||
else
|
else
|
||||||
goto continue_unlock;
|
goto continue_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
BUG_ON(PageWriteback(page));
|
|
||||||
if (!clear_page_dirty_for_io(page))
|
if (!clear_page_dirty_for_io(page))
|
||||||
goto continue_unlock;
|
goto continue_unlock;
|
||||||
|
|
||||||
@ -2472,7 +2471,7 @@ repeat:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, DATA, false);
|
f2fs_wait_on_page_writeback(page, DATA, false, true);
|
||||||
|
|
||||||
if (len == PAGE_SIZE || PageUptodate(page))
|
if (len == PAGE_SIZE || PageUptodate(page))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -293,7 +293,7 @@ void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
|
|||||||
{
|
{
|
||||||
enum page_type type = f2fs_has_inline_dentry(dir) ? NODE : DATA;
|
enum page_type type = f2fs_has_inline_dentry(dir) ? NODE : DATA;
|
||||||
lock_page(page);
|
lock_page(page);
|
||||||
f2fs_wait_on_page_writeback(page, type, true);
|
f2fs_wait_on_page_writeback(page, type, true, true);
|
||||||
de->ino = cpu_to_le32(inode->i_ino);
|
de->ino = cpu_to_le32(inode->i_ino);
|
||||||
set_de_type(de, inode->i_mode);
|
set_de_type(de, inode->i_mode);
|
||||||
set_page_dirty(page);
|
set_page_dirty(page);
|
||||||
@ -307,7 +307,7 @@ 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, true);
|
f2fs_wait_on_page_writeback(ipage, NODE, true, true);
|
||||||
|
|
||||||
/* copy name info. to this inode page */
|
/* copy name info. to this inode page */
|
||||||
ri = F2FS_INODE(ipage);
|
ri = F2FS_INODE(ipage);
|
||||||
@ -550,7 +550,7 @@ start:
|
|||||||
++level;
|
++level;
|
||||||
goto start;
|
goto start;
|
||||||
add_dentry:
|
add_dentry:
|
||||||
f2fs_wait_on_page_writeback(dentry_page, DATA, true);
|
f2fs_wait_on_page_writeback(dentry_page, DATA, true, true);
|
||||||
|
|
||||||
if (inode) {
|
if (inode) {
|
||||||
down_write(&F2FS_I(inode)->i_sem);
|
down_write(&F2FS_I(inode)->i_sem);
|
||||||
@ -705,7 +705,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
|
|||||||
return f2fs_delete_inline_entry(dentry, page, dir, inode);
|
return f2fs_delete_inline_entry(dentry, page, dir, inode);
|
||||||
|
|
||||||
lock_page(page);
|
lock_page(page);
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
|
|
||||||
dentry_blk = page_address(page);
|
dentry_blk = page_address(page);
|
||||||
bit_pos = dentry - dentry_blk->dentry;
|
bit_pos = dentry - dentry_blk->dentry;
|
||||||
|
@ -3038,7 +3038,7 @@ void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
|
|||||||
struct f2fs_summary *sum, int type,
|
struct f2fs_summary *sum, int type,
|
||||||
struct f2fs_io_info *fio, bool add_list);
|
struct f2fs_io_info *fio, bool add_list);
|
||||||
void f2fs_wait_on_page_writeback(struct page *page,
|
void f2fs_wait_on_page_writeback(struct page *page,
|
||||||
enum page_type type, bool ordered);
|
enum page_type type, bool ordered, bool locked);
|
||||||
void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr);
|
void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr);
|
||||||
void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr,
|
void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr,
|
||||||
block_t len);
|
block_t len);
|
||||||
|
@ -82,7 +82,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* fill the page */
|
/* fill the page */
|
||||||
f2fs_wait_on_page_writeback(page, DATA, false);
|
f2fs_wait_on_page_writeback(page, DATA, false, true);
|
||||||
|
|
||||||
/* wait for GCed page writeback via META_MAPPING */
|
/* wait for GCed page writeback via META_MAPPING */
|
||||||
f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
|
f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
|
||||||
@ -578,7 +578,7 @@ static int truncate_partial_data_page(struct inode *inode, u64 from,
|
|||||||
if (IS_ERR(page))
|
if (IS_ERR(page))
|
||||||
return PTR_ERR(page) == -ENOENT ? 0 : PTR_ERR(page);
|
return PTR_ERR(page) == -ENOENT ? 0 : PTR_ERR(page);
|
||||||
truncate_out:
|
truncate_out:
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
zero_user(page, offset, PAGE_SIZE - offset);
|
zero_user(page, offset, PAGE_SIZE - offset);
|
||||||
|
|
||||||
/* An encrypted inode should have a key and truncate the last page. */
|
/* An encrypted inode should have a key and truncate the last page. */
|
||||||
@ -895,7 +895,7 @@ static int fill_zero(struct inode *inode, pgoff_t index,
|
|||||||
if (IS_ERR(page))
|
if (IS_ERR(page))
|
||||||
return PTR_ERR(page);
|
return PTR_ERR(page);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
zero_user(page, start, len);
|
zero_user(page, start, len);
|
||||||
set_page_dirty(page);
|
set_page_dirty(page);
|
||||||
f2fs_put_page(page, 1);
|
f2fs_put_page(page, 1);
|
||||||
|
10
fs/f2fs/gc.c
10
fs/f2fs/gc.c
@ -679,7 +679,7 @@ got_it:
|
|||||||
* don't cache encrypted data into meta inode until previous dirty
|
* don't cache encrypted data into meta inode until previous dirty
|
||||||
* data were writebacked to avoid racing between GC and flush.
|
* data were writebacked to avoid racing between GC and flush.
|
||||||
*/
|
*/
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
|
|
||||||
f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
|
f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
|
||||||
|
|
||||||
@ -768,7 +768,7 @@ static int move_data_block(struct inode *inode, block_t bidx,
|
|||||||
* don't cache encrypted data into meta inode until previous dirty
|
* don't cache encrypted data into meta inode until previous dirty
|
||||||
* data were writebacked to avoid racing between GC and flush.
|
* data were writebacked to avoid racing between GC and flush.
|
||||||
*/
|
*/
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
|
|
||||||
f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
|
f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
|
||||||
|
|
||||||
@ -829,7 +829,7 @@ static int move_data_block(struct inode *inode, block_t bidx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
write_page:
|
write_page:
|
||||||
f2fs_wait_on_page_writeback(fio.encrypted_page, DATA, true);
|
f2fs_wait_on_page_writeback(fio.encrypted_page, DATA, true, true);
|
||||||
set_page_dirty(fio.encrypted_page);
|
set_page_dirty(fio.encrypted_page);
|
||||||
if (clear_page_dirty_for_io(fio.encrypted_page))
|
if (clear_page_dirty_for_io(fio.encrypted_page))
|
||||||
dec_page_count(fio.sbi, F2FS_DIRTY_META);
|
dec_page_count(fio.sbi, F2FS_DIRTY_META);
|
||||||
@ -838,7 +838,7 @@ write_page:
|
|||||||
ClearPageError(page);
|
ClearPageError(page);
|
||||||
|
|
||||||
/* allocate block address */
|
/* allocate block address */
|
||||||
f2fs_wait_on_page_writeback(dn.node_page, NODE, true);
|
f2fs_wait_on_page_writeback(dn.node_page, NODE, true, true);
|
||||||
|
|
||||||
fio.op = REQ_OP_WRITE;
|
fio.op = REQ_OP_WRITE;
|
||||||
fio.op_flags = REQ_SYNC;
|
fio.op_flags = REQ_SYNC;
|
||||||
@ -924,7 +924,7 @@ static int move_data_page(struct inode *inode, block_t bidx, int gc_type,
|
|||||||
bool is_dirty = PageDirty(page);
|
bool is_dirty = PageDirty(page);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
|
|
||||||
set_page_dirty(page);
|
set_page_dirty(page);
|
||||||
if (clear_page_dirty_for_io(page)) {
|
if (clear_page_dirty_for_io(page)) {
|
||||||
|
@ -72,7 +72,7 @@ void f2fs_truncate_inline_inode(struct inode *inode,
|
|||||||
|
|
||||||
addr = inline_data_addr(inode, ipage);
|
addr = inline_data_addr(inode, ipage);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(ipage, NODE, true);
|
f2fs_wait_on_page_writeback(ipage, NODE, true, true);
|
||||||
memset(addr + from, 0, MAX_INLINE_DATA(inode) - from);
|
memset(addr + from, 0, MAX_INLINE_DATA(inode) - from);
|
||||||
set_page_dirty(ipage);
|
set_page_dirty(ipage);
|
||||||
|
|
||||||
@ -161,7 +161,7 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
|
|||||||
fio.old_blkaddr = dn->data_blkaddr;
|
fio.old_blkaddr = dn->data_blkaddr;
|
||||||
set_inode_flag(dn->inode, FI_HOT_DATA);
|
set_inode_flag(dn->inode, FI_HOT_DATA);
|
||||||
f2fs_outplace_write_data(dn, &fio);
|
f2fs_outplace_write_data(dn, &fio);
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
if (dirty) {
|
if (dirty) {
|
||||||
inode_dec_dirty_pages(dn->inode);
|
inode_dec_dirty_pages(dn->inode);
|
||||||
f2fs_remove_dirty_inode(dn->inode);
|
f2fs_remove_dirty_inode(dn->inode);
|
||||||
@ -236,7 +236,7 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page)
|
|||||||
|
|
||||||
f2fs_bug_on(F2FS_I_SB(inode), page->index);
|
f2fs_bug_on(F2FS_I_SB(inode), page->index);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(dn.inode_page, NODE, true);
|
f2fs_wait_on_page_writeback(dn.inode_page, NODE, true, true);
|
||||||
src_addr = kmap_atomic(page);
|
src_addr = kmap_atomic(page);
|
||||||
dst_addr = inline_data_addr(inode, dn.inode_page);
|
dst_addr = inline_data_addr(inode, dn.inode_page);
|
||||||
memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
|
memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
|
||||||
@ -277,7 +277,7 @@ process_inline:
|
|||||||
ipage = f2fs_get_node_page(sbi, inode->i_ino);
|
ipage = f2fs_get_node_page(sbi, inode->i_ino);
|
||||||
f2fs_bug_on(sbi, IS_ERR(ipage));
|
f2fs_bug_on(sbi, IS_ERR(ipage));
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(ipage, NODE, true);
|
f2fs_wait_on_page_writeback(ipage, NODE, true, true);
|
||||||
|
|
||||||
src_addr = inline_data_addr(inode, npage);
|
src_addr = inline_data_addr(inode, npage);
|
||||||
dst_addr = inline_data_addr(inode, ipage);
|
dst_addr = inline_data_addr(inode, ipage);
|
||||||
@ -391,7 +391,7 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
|
|
||||||
dentry_blk = page_address(page);
|
dentry_blk = page_address(page);
|
||||||
|
|
||||||
@ -505,7 +505,7 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
|
|||||||
return 0;
|
return 0;
|
||||||
recover:
|
recover:
|
||||||
lock_page(ipage);
|
lock_page(ipage);
|
||||||
f2fs_wait_on_page_writeback(ipage, NODE, true);
|
f2fs_wait_on_page_writeback(ipage, NODE, true, true);
|
||||||
memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA(dir));
|
memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA(dir));
|
||||||
f2fs_i_depth_write(dir, 0);
|
f2fs_i_depth_write(dir, 0);
|
||||||
f2fs_i_size_write(dir, MAX_INLINE_DATA(dir));
|
f2fs_i_size_write(dir, MAX_INLINE_DATA(dir));
|
||||||
@ -565,7 +565,7 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(ipage, NODE, true);
|
f2fs_wait_on_page_writeback(ipage, NODE, true, true);
|
||||||
|
|
||||||
name_hash = f2fs_dentry_hash(new_name, NULL);
|
name_hash = f2fs_dentry_hash(new_name, NULL);
|
||||||
f2fs_update_dentry(ino, mode, &d, new_name, name_hash, bit_pos);
|
f2fs_update_dentry(ino, mode, &d, new_name, name_hash, bit_pos);
|
||||||
@ -597,7 +597,7 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
lock_page(page);
|
lock_page(page);
|
||||||
f2fs_wait_on_page_writeback(page, NODE, true);
|
f2fs_wait_on_page_writeback(page, NODE, true, true);
|
||||||
|
|
||||||
inline_dentry = inline_data_addr(dir, page);
|
inline_dentry = inline_data_addr(dir, page);
|
||||||
make_dentry_ptr_inline(dir, &d, inline_dentry);
|
make_dentry_ptr_inline(dir, &d, inline_dentry);
|
||||||
|
@ -103,7 +103,7 @@ static void __recover_inline_status(struct inode *inode, struct page *ipage)
|
|||||||
|
|
||||||
while (start < end) {
|
while (start < end) {
|
||||||
if (*start++) {
|
if (*start++) {
|
||||||
f2fs_wait_on_page_writeback(ipage, NODE, true);
|
f2fs_wait_on_page_writeback(ipage, NODE, true, true);
|
||||||
|
|
||||||
set_inode_flag(inode, FI_DATA_EXIST);
|
set_inode_flag(inode, FI_DATA_EXIST);
|
||||||
set_raw_inline(inode, F2FS_INODE(ipage));
|
set_raw_inline(inode, F2FS_INODE(ipage));
|
||||||
@ -497,7 +497,7 @@ void f2fs_update_inode(struct inode *inode, struct page *node_page)
|
|||||||
struct f2fs_inode *ri;
|
struct f2fs_inode *ri;
|
||||||
struct extent_tree *et = F2FS_I(inode)->extent_tree;
|
struct extent_tree *et = F2FS_I(inode)->extent_tree;
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(node_page, NODE, true);
|
f2fs_wait_on_page_writeback(node_page, NODE, true, true);
|
||||||
set_page_dirty(node_page);
|
set_page_dirty(node_page);
|
||||||
|
|
||||||
f2fs_inode_synced(inode);
|
f2fs_inode_synced(inode);
|
||||||
|
@ -1106,7 +1106,7 @@ skip_partial:
|
|||||||
ri->i_nid[offset[0] - NODE_DIR1_BLOCK]) {
|
ri->i_nid[offset[0] - NODE_DIR1_BLOCK]) {
|
||||||
lock_page(page);
|
lock_page(page);
|
||||||
BUG_ON(page->mapping != NODE_MAPPING(sbi));
|
BUG_ON(page->mapping != NODE_MAPPING(sbi));
|
||||||
f2fs_wait_on_page_writeback(page, NODE, true);
|
f2fs_wait_on_page_writeback(page, NODE, true, true);
|
||||||
ri->i_nid[offset[0] - NODE_DIR1_BLOCK] = 0;
|
ri->i_nid[offset[0] - NODE_DIR1_BLOCK] = 0;
|
||||||
set_page_dirty(page);
|
set_page_dirty(page);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
@ -1234,7 +1234,7 @@ struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs)
|
|||||||
new_ni.version = 0;
|
new_ni.version = 0;
|
||||||
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, true);
|
f2fs_wait_on_page_writeback(page, NODE, true, true);
|
||||||
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(page, S_ISDIR(dn->inode->i_mode));
|
set_cold_node(page, S_ISDIR(dn->inode->i_mode));
|
||||||
if (!PageUptodate(page))
|
if (!PageUptodate(page))
|
||||||
@ -1598,8 +1598,7 @@ int f2fs_move_node_page(struct page *node_page, int gc_type)
|
|||||||
.for_reclaim = 0,
|
.for_reclaim = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(node_page, NODE, true);
|
f2fs_wait_on_page_writeback(node_page, NODE, true, true);
|
||||||
f2fs_bug_on(F2FS_P_SB(node_page), PageWriteback(node_page));
|
|
||||||
|
|
||||||
set_page_dirty(node_page);
|
set_page_dirty(node_page);
|
||||||
|
|
||||||
@ -1690,8 +1689,7 @@ continue_unlock:
|
|||||||
goto continue_unlock;
|
goto continue_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, NODE, true);
|
f2fs_wait_on_page_writeback(page, NODE, true, true);
|
||||||
BUG_ON(PageWriteback(page));
|
|
||||||
|
|
||||||
set_fsync_mark(page, 0);
|
set_fsync_mark(page, 0);
|
||||||
set_dentry_mark(page, 0);
|
set_dentry_mark(page, 0);
|
||||||
@ -1742,7 +1740,7 @@ continue_unlock:
|
|||||||
"Retry to write fsync mark: ino=%u, idx=%lx",
|
"Retry to write fsync mark: ino=%u, idx=%lx",
|
||||||
ino, last_page->index);
|
ino, last_page->index);
|
||||||
lock_page(last_page);
|
lock_page(last_page);
|
||||||
f2fs_wait_on_page_writeback(last_page, NODE, true);
|
f2fs_wait_on_page_writeback(last_page, NODE, true, true);
|
||||||
set_page_dirty(last_page);
|
set_page_dirty(last_page);
|
||||||
unlock_page(last_page);
|
unlock_page(last_page);
|
||||||
goto retry;
|
goto retry;
|
||||||
@ -1823,9 +1821,8 @@ continue_unlock:
|
|||||||
goto lock_node;
|
goto lock_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, NODE, true);
|
f2fs_wait_on_page_writeback(page, NODE, true, true);
|
||||||
|
|
||||||
BUG_ON(PageWriteback(page));
|
|
||||||
if (!clear_page_dirty_for_io(page))
|
if (!clear_page_dirty_for_io(page))
|
||||||
goto continue_unlock;
|
goto continue_unlock;
|
||||||
|
|
||||||
@ -1892,7 +1889,7 @@ int f2fs_wait_on_node_pages_writeback(struct f2fs_sb_info *sbi,
|
|||||||
get_page(page);
|
get_page(page);
|
||||||
spin_unlock_irqrestore(&sbi->fsync_node_lock, flags);
|
spin_unlock_irqrestore(&sbi->fsync_node_lock, flags);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, NODE, true);
|
f2fs_wait_on_page_writeback(page, NODE, true, false);
|
||||||
if (TestClearPageError(page))
|
if (TestClearPageError(page))
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
|
||||||
@ -2470,7 +2467,7 @@ void f2fs_recover_inline_xattr(struct inode *inode, struct page *page)
|
|||||||
src_addr = inline_xattr_addr(inode, page);
|
src_addr = inline_xattr_addr(inode, page);
|
||||||
inline_size = inline_xattr_size(inode);
|
inline_size = inline_xattr_size(inode);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(ipage, NODE, true);
|
f2fs_wait_on_page_writeback(ipage, NODE, true, true);
|
||||||
memcpy(dst_addr, src_addr, inline_size);
|
memcpy(dst_addr, src_addr, inline_size);
|
||||||
update_inode:
|
update_inode:
|
||||||
f2fs_update_inode(inode, ipage);
|
f2fs_update_inode(inode, ipage);
|
||||||
|
@ -361,7 +361,7 @@ static inline int 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);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(p, NODE, true);
|
f2fs_wait_on_page_writeback(p, NODE, true, true);
|
||||||
|
|
||||||
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);
|
||||||
|
@ -539,7 +539,7 @@ retry_dn:
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(dn.node_page, NODE, true);
|
f2fs_wait_on_page_writeback(dn.node_page, NODE, true, true);
|
||||||
|
|
||||||
err = f2fs_get_node_info(sbi, dn.nid, &ni);
|
err = f2fs_get_node_info(sbi, dn.nid, &ni);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -229,7 +229,7 @@ static int __revoke_inmem_pages(struct inode *inode,
|
|||||||
|
|
||||||
lock_page(page);
|
lock_page(page);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
|
|
||||||
if (recover) {
|
if (recover) {
|
||||||
struct dnode_of_data dn;
|
struct dnode_of_data dn;
|
||||||
@ -387,7 +387,7 @@ static int __f2fs_commit_inmem_pages(struct inode *inode)
|
|||||||
if (page->mapping == inode->i_mapping) {
|
if (page->mapping == inode->i_mapping) {
|
||||||
trace_f2fs_commit_inmem_page(page, INMEM);
|
trace_f2fs_commit_inmem_page(page, INMEM);
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(page, DATA, true);
|
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||||
|
|
||||||
set_page_dirty(page);
|
set_page_dirty(page);
|
||||||
if (clear_page_dirty_for_io(page)) {
|
if (clear_page_dirty_for_io(page)) {
|
||||||
@ -3279,16 +3279,18 @@ void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void f2fs_wait_on_page_writeback(struct page *page,
|
void f2fs_wait_on_page_writeback(struct page *page,
|
||||||
enum page_type type, bool ordered)
|
enum page_type type, bool ordered, bool locked)
|
||||||
{
|
{
|
||||||
if (PageWriteback(page)) {
|
if (PageWriteback(page)) {
|
||||||
struct f2fs_sb_info *sbi = F2FS_P_SB(page);
|
struct f2fs_sb_info *sbi = F2FS_P_SB(page);
|
||||||
|
|
||||||
f2fs_submit_merged_write_cond(sbi, NULL, page, 0, type);
|
f2fs_submit_merged_write_cond(sbi, NULL, page, 0, type);
|
||||||
if (ordered)
|
if (ordered) {
|
||||||
wait_on_page_writeback(page);
|
wait_on_page_writeback(page);
|
||||||
else
|
f2fs_bug_on(sbi, locked && PageWriteback(page));
|
||||||
|
} else {
|
||||||
wait_for_stable_page(page);
|
wait_for_stable_page(page);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3305,7 +3307,7 @@ void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr)
|
|||||||
|
|
||||||
cpage = find_lock_page(META_MAPPING(sbi), blkaddr);
|
cpage = find_lock_page(META_MAPPING(sbi), blkaddr);
|
||||||
if (cpage) {
|
if (cpage) {
|
||||||
f2fs_wait_on_page_writeback(cpage, DATA, true);
|
f2fs_wait_on_page_writeback(cpage, DATA, true, true);
|
||||||
f2fs_put_page(cpage, 1);
|
f2fs_put_page(cpage, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -415,7 +415,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
|
|||||||
}
|
}
|
||||||
|
|
||||||
f2fs_wait_on_page_writeback(ipage ? ipage : in_page,
|
f2fs_wait_on_page_writeback(ipage ? ipage : in_page,
|
||||||
NODE, true);
|
NODE, true, true);
|
||||||
/* no need to use xattr node block */
|
/* no need to use xattr node block */
|
||||||
if (hsize <= inline_size) {
|
if (hsize <= inline_size) {
|
||||||
err = f2fs_truncate_xattr_node(inode);
|
err = f2fs_truncate_xattr_node(inode);
|
||||||
@ -439,7 +439,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
|
|||||||
goto in_page_out;
|
goto in_page_out;
|
||||||
}
|
}
|
||||||
f2fs_bug_on(sbi, new_nid);
|
f2fs_bug_on(sbi, new_nid);
|
||||||
f2fs_wait_on_page_writeback(xpage, NODE, true);
|
f2fs_wait_on_page_writeback(xpage, NODE, true, true);
|
||||||
} 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);
|
||||||
|
Loading…
Reference in New Issue
Block a user