f2fs: add common iget in add_fsync_inode
Subsystems (2)
Jaegeuk Kim
maintainerPATCH 1/2 f2fs: add common iget in add_fsync_inode
There is no functional change.
Signed-off-by Jaegeuk Kim <[email protected]>
--- fs/f2fs/recovery.c | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-)
fs/f2fs/recovery.c +17 -26
@@ -68,14 +68,20 @@ static struct fsync_inode_entry *get_fsync_inode(struct list_head *head,return NULL ; } -static struct fsync_inode_entry *add_fsync_inode (struct list_head *head, -struct inode *inode) +static struct fsync_inode_entry *add_fsync_inode (struct f2fs_sb_info *sbi, +struct list_head *head,nid_t ino) { +struct inode *inode =f2fs_iget (sbi->sb, ino);struct fsync_inode_entry *entry; +if (IS_ERR (inode)) +return ERR_CAST (inode); + entry =kmem_cache_alloc (fsync_entry_slab,GFP_F2FS_ZERO ); -if (!entry) -return NULL ; +if (!entry) { +iput (inode); +return ERR_PTR (-ENOMEM ); + } entry->inode = inode;list_add_tail (&entry->list, head);
@@ -105,16 +111,10 @@ static int recover_dentry(struct inode *inode, struct page *ipage, entry =get_fsync_inode (dir_list, pino);if (!entry) { - dir =f2fs_iget (inode->i_sb, pino); -if (IS_ERR (dir)) { - err =PTR_ERR (dir); - goto out; - } - - entry =add_fsync_inode (dir_list, dir); -if (!entry) { - err = -ENOMEM ; -iput (dir); + entry =add_fsync_inode (F2FS_I_SB (inode), dir_list, pino); +if (IS_ERR (entry)) { + dir =ERR_CAST (entry); + err =PTR_ERR (entry); goto out; } }
@@ -228,7 +228,6 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head) {unsigned long long cp_ver =cur_cp_version (F2FS_CKPT (sbi));struct curseg_info *curseg; -struct inode *inode;struct page *page =NULL ;block_t blkaddr;int err =0 ;
@@ -266,23 +265,15 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head)* CP | dnode(F) | inode(DF) * For this case, we should not give up now. */ - inode =f2fs_iget (sbi->sb,ino_of_node (page)); -if (IS_ERR (inode)) { - err =PTR_ERR (inode); + entry =add_fsync_inode (sbi, head,ino_of_node (page)); +if (IS_ERR (entry)) { + err =PTR_ERR (entry);if (err == -ENOENT ) { err =0 ; goto next; }break ; } - -/* add this fsync inode to the list */ - entry =add_fsync_inode (head, inode); -if (!entry) { - err = -ENOMEM ; -iput (inode); -break ; - } } entry->blkaddr = blkaddr;
Signature · 1 line
2.8.3
Jaegeuk Kim
maintainerPATCH 2/2 f2fs: avoid ENOMEM during roll-forward recovery
This patch gives another chances during roll-forward recovery regarding to -ENOMEM.
Signed-off-by Jaegeuk Kim <[email protected]>
--- fs/f2fs/f2fs.h | 1 + fs/f2fs/inode.c | 15 +++++++++++++++ fs/f2fs/node.c | 8 +++++--- fs/f2fs/recovery.c | 35 +++++++++++++++++++++-------------- 4 files changed, 42 insertions(+), 17 deletions(-)
fs/f2fs/f2fs.h +1 -0
@@ -1930,6 +1930,7 @@ long f2fs_compat_ioctl(struct file *, unsigned int, unsigned long);*/ void f2fs_set_inode_flags (struct inode *);struct inode *f2fs_iget (struct super_block *,unsigned long ); +struct inode *f2fs_iget_retry (struct super_block *,unsigned long );int try_to_free_nats (struct f2fs_sb_info *,int );int update_inode (struct inode *,struct page *);int update_inode_page (struct inode *);
fs/f2fs/inode.c +15 -0
@@ -11,6 +11,7 @@#include <linux/fs.h> #include <linux/f2fs_fs.h> #include <linux/buffer_head.h> +#include <linux/backing-dev.h> #include <linux/writeback.h> #include "f2fs.h"
@@ -234,6 +235,20 @@ bad_inode:return ERR_PTR (ret); } +struct inode *f2fs_iget_retry (struct super_block *sb,unsigned long ino) +{ +struct inode *inode; +retry: + inode =f2fs_iget (sb, ino); +if (IS_ERR (inode)) { +if (PTR_ERR (inode) == -ENOMEM ) { +congestion_wait (BLK_RW_ASYNC ,HZ /50 ); + goto retry; + } + } +return inode; +} +int update_inode (struct inode *inode,struct page *node_page) {struct f2fs_inode *ri;
fs/f2fs/node.c +5 -3
@@ -2013,10 +2013,12 @@ int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)if (unlikely (old_ni.blk_addr !=NULL_ADDR ))return -EINVAL ; - +retry: ipage =f2fs_grab_cache_page (NODE_MAPPING (sbi), ino, false); -if (!ipage) -return -ENOMEM ; +if (!ipage) { +congestion_wait (BLK_RW_ASYNC ,HZ /50 ); + goto retry; + }/* Should not use this inode from free nid list */ remove_free_nid (NM_I (sbi), ino);
fs/f2fs/recovery.c +21 -14
@@ -71,18 +71,14 @@ static struct fsync_inode_entry *get_fsync_inode(struct list_head *head,static struct fsync_inode_entry *add_fsync_inode (struct f2fs_sb_info *sbi,struct list_head *head,nid_t ino) { -struct inode *inode =f2fs_iget (sbi->sb, ino); +struct inode *inode;struct fsync_inode_entry *entry; + inode =f2fs_iget_retry (sbi->sb, ino);if (IS_ERR (inode))return ERR_CAST (inode); - entry =kmem_cache_alloc (fsync_entry_slab,GFP_F2FS_ZERO ); -if (!entry) { -iput (inode); -return ERR_PTR (-ENOMEM ); - } - + entry =f2fs_kmem_cache_alloc (fsync_entry_slab,GFP_F2FS_ZERO ); entry->inode = inode;list_add_tail (&entry->list, head);
@@ -136,7 +132,7 @@ retry: goto out_unmap_put;if (de) { - einode =f2fs_iget (inode->i_sb,le32_to_cpu (de->ino)); + einode =f2fs_iget_retry (inode->i_sb,le32_to_cpu (de->ino));if (IS_ERR (einode)) {WARN_ON (1 ); err =PTR_ERR (einode);
@@ -158,6 +154,8 @@ retry: err =__f2fs_do_add_link (dir, &fname, inode, inode->i_ino, inode->i_mode); } +if (err == -ENOMEM ) + goto retry; goto out; out_unmap_put:
@@ -272,7 +270,6 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head) err =0 ; goto next; } -break ; } } entry->blkaddr = blkaddr;
@@ -357,7 +354,7 @@ got_it:if (ino != dn->inode->i_ino) {/* Deallocate previous index in the node page */ - inode =f2fs_iget (sbi->sb, ino); + inode =f2fs_iget_retry (sbi->sb, ino);if (IS_ERR (inode))return PTR_ERR (inode); }else {
@@ -425,10 +422,15 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, end = start +ADDRS_PER_PAGE (page, inode);set_new_dnode (&dn, inode,NULL ,NULL ,0 ); - +retry_dn: err =get_dnode_of_data (&dn, start,ALLOC_NODE ); -if (err) +if (err) { +if (err == -ENOMEM ) { +congestion_wait (BLK_RW_ASYNC ,HZ /50 ); + goto retry_dn; + } goto out; + }f2fs_wait_on_page_writeback (dn.node_page,NODE , true);
@@ -479,11 +481,16 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,if (err) goto err; } - +retry_prev:/* Check the previous node page having this index */ err =check_index_in_prev_nodes (sbi, dest, &dn); -if (err) +if (err) { +if (err == -ENOMEM ) { +congestion_wait (BLK_RW_ASYNC ,HZ /50 ); + goto retry_prev; + } goto err; + }/* write dummy data page */ f2fs_replace_block(sbi, &dn, src, dest,
Signature · 1 line
2.8.3