Skip to content

Commit

Permalink
f2fs: fix to commit bio cache after flushing node pages
Browse files Browse the repository at this point in the history
In sync_node_pages, we won't check and commit last merged pages in private
bio cache of f2fs, as these pages were taged as writeback, someone who is
waiting for writebacking of the page will be blocked until the cache was
committed by someone else.

We need to commit node type bio cache to avoid potential deadlock or long
delay of waiting writeback.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
  • Loading branch information
Chao Yu authored and Jaegeuk Kim committed Oct 1, 2016
1 parent fc0065a commit 3f5f495
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions fs/f2fs/node.c
Original file line number Diff line number Diff line change
Expand Up @@ -1312,6 +1312,7 @@ int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
struct page *last_page = NULL;
bool marked = false;
nid_t ino = inode->i_ino;
int nwritten = 0;

if (atomic) {
last_page = last_fsync_dnode(sbi, ino);
Expand Down Expand Up @@ -1385,7 +1386,10 @@ int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
unlock_page(page);
f2fs_put_page(last_page, 0);
break;
} else {
nwritten++;
}

if (page == last_page) {
f2fs_put_page(page, 0);
marked = true;
Expand All @@ -1407,6 +1411,9 @@ int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
unlock_page(last_page);
goto retry;
}

if (nwritten)
f2fs_submit_merged_bio_cond(sbi, NULL, NULL, ino, NODE, WRITE);
return ret ? -EIO: 0;
}

Expand All @@ -1416,6 +1423,7 @@ int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc)
struct pagevec pvec;
int step = 0;
int nwritten = 0;
int ret = 0;

pagevec_init(&pvec, 0);

Expand All @@ -1436,7 +1444,8 @@ int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc)

if (unlikely(f2fs_cp_error(sbi))) {
pagevec_release(&pvec);
return -EIO;
ret = -EIO;
goto out;
}

/*
Expand Down Expand Up @@ -1487,6 +1496,8 @@ int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc)

if (NODE_MAPPING(sbi)->a_ops->writepage(page, wbc))
unlock_page(page);
else
nwritten++;

if (--wbc->nr_to_write == 0)
break;
Expand All @@ -1504,7 +1515,10 @@ int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc)
step++;
goto next_step;
}
return nwritten;
out:
if (nwritten)
f2fs_submit_merged_bio(sbi, NODE, WRITE);
return ret;
}

int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino)
Expand Down

0 comments on commit 3f5f495

Please sign in to comment.