|
@@ -212,24 +212,29 @@ void update_inode(struct inode *inode, struct page *node_page)
|
|
|
clear_inode_flag(F2FS_I(inode), FI_DIRTY_INODE);
|
|
|
}
|
|
|
|
|
|
-int update_inode_page(struct inode *inode)
|
|
|
+void update_inode_page(struct inode *inode)
|
|
|
{
|
|
|
struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
|
|
|
struct page *node_page;
|
|
|
-
|
|
|
+retry:
|
|
|
node_page = get_node_page(sbi, inode->i_ino);
|
|
|
- if (IS_ERR(node_page))
|
|
|
- return PTR_ERR(node_page);
|
|
|
-
|
|
|
+ if (IS_ERR(node_page)) {
|
|
|
+ int err = PTR_ERR(node_page);
|
|
|
+ if (err == -ENOMEM) {
|
|
|
+ cond_resched();
|
|
|
+ goto retry;
|
|
|
+ } else if (err != -ENOENT) {
|
|
|
+ f2fs_stop_checkpoint(sbi);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
update_inode(inode, node_page);
|
|
|
f2fs_put_page(node_page, 1);
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|
|
{
|
|
|
struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
|
|
|
- int ret;
|
|
|
|
|
|
if (inode->i_ino == F2FS_NODE_INO(sbi) ||
|
|
|
inode->i_ino == F2FS_META_INO(sbi))
|
|
@@ -243,13 +248,13 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|
|
* during the urgent cleaning time when runing out of free sections.
|
|
|
*/
|
|
|
f2fs_lock_op(sbi);
|
|
|
- ret = update_inode_page(inode);
|
|
|
+ update_inode_page(inode);
|
|
|
f2fs_unlock_op(sbi);
|
|
|
|
|
|
if (wbc)
|
|
|
f2fs_balance_fs(sbi);
|
|
|
|
|
|
- return ret;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/*
|