diff options
Diffstat (limited to 'fs/f2fs/inode.c')
| -rw-r--r-- | fs/f2fs/inode.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 196cc7843aaf..2d002e3738a7 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c | |||
| @@ -67,29 +67,23 @@ static void __set_inode_rdev(struct inode *inode, struct f2fs_inode *ri) | |||
| 67 | } | 67 | } |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | static int __recover_inline_status(struct inode *inode, struct page *ipage) | 70 | static void __recover_inline_status(struct inode *inode, struct page *ipage) |
| 71 | { | 71 | { |
| 72 | void *inline_data = inline_data_addr(ipage); | 72 | void *inline_data = inline_data_addr(ipage); |
| 73 | struct f2fs_inode *ri; | 73 | __le32 *start = inline_data; |
| 74 | void *zbuf; | 74 | __le32 *end = start + MAX_INLINE_DATA / sizeof(__le32); |
| 75 | 75 | ||
| 76 | zbuf = kzalloc(MAX_INLINE_DATA, GFP_NOFS); | 76 | while (start < end) { |
| 77 | if (!zbuf) | 77 | if (*start++) { |
| 78 | return -ENOMEM; | 78 | f2fs_wait_on_page_writeback(ipage, NODE); |
| 79 | 79 | ||
| 80 | if (!memcmp(zbuf, inline_data, MAX_INLINE_DATA)) { | 80 | set_inode_flag(F2FS_I(inode), FI_DATA_EXIST); |
| 81 | kfree(zbuf); | 81 | set_raw_inline(F2FS_I(inode), F2FS_INODE(ipage)); |
| 82 | return 0; | 82 | set_page_dirty(ipage); |
| 83 | return; | ||
| 84 | } | ||
| 83 | } | 85 | } |
| 84 | kfree(zbuf); | 86 | return; |
| 85 | |||
| 86 | f2fs_wait_on_page_writeback(ipage, NODE); | ||
| 87 | set_inode_flag(F2FS_I(inode), FI_DATA_EXIST); | ||
| 88 | |||
| 89 | ri = F2FS_INODE(ipage); | ||
| 90 | set_raw_inline(F2FS_I(inode), ri); | ||
| 91 | set_page_dirty(ipage); | ||
| 92 | return 0; | ||
| 93 | } | 87 | } |
| 94 | 88 | ||
| 95 | static int do_read_inode(struct inode *inode) | 89 | static int do_read_inode(struct inode *inode) |
| @@ -98,7 +92,6 @@ static int do_read_inode(struct inode *inode) | |||
| 98 | struct f2fs_inode_info *fi = F2FS_I(inode); | 92 | struct f2fs_inode_info *fi = F2FS_I(inode); |
| 99 | struct page *node_page; | 93 | struct page *node_page; |
| 100 | struct f2fs_inode *ri; | 94 | struct f2fs_inode *ri; |
| 101 | int err = 0; | ||
| 102 | 95 | ||
| 103 | /* Check if ino is within scope */ | 96 | /* Check if ino is within scope */ |
| 104 | if (check_nid_range(sbi, inode->i_ino)) { | 97 | if (check_nid_range(sbi, inode->i_ino)) { |
| @@ -142,7 +135,7 @@ static int do_read_inode(struct inode *inode) | |||
| 142 | 135 | ||
| 143 | /* check data exist */ | 136 | /* check data exist */ |
| 144 | if (f2fs_has_inline_data(inode) && !f2fs_exist_data(inode)) | 137 | if (f2fs_has_inline_data(inode) && !f2fs_exist_data(inode)) |
| 145 | err = __recover_inline_status(inode, node_page); | 138 | __recover_inline_status(inode, node_page); |
| 146 | 139 | ||
| 147 | /* get rdev by using inline_info */ | 140 | /* get rdev by using inline_info */ |
| 148 | __get_inode_rdev(inode, ri); | 141 | __get_inode_rdev(inode, ri); |
| @@ -152,7 +145,7 @@ static int do_read_inode(struct inode *inode) | |||
| 152 | stat_inc_inline_inode(inode); | 145 | stat_inc_inline_inode(inode); |
| 153 | stat_inc_inline_dir(inode); | 146 | stat_inc_inline_dir(inode); |
| 154 | 147 | ||
| 155 | return err; | 148 | return 0; |
| 156 | } | 149 | } |
| 157 | 150 | ||
| 158 | struct inode *f2fs_iget(struct super_block *sb, unsigned long ino) | 151 | struct inode *f2fs_iget(struct super_block *sb, unsigned long ino) |
| @@ -304,7 +297,7 @@ void f2fs_evict_inode(struct inode *inode) | |||
| 304 | nid_t xnid = F2FS_I(inode)->i_xattr_nid; | 297 | nid_t xnid = F2FS_I(inode)->i_xattr_nid; |
| 305 | 298 | ||
| 306 | /* some remained atomic pages should discarded */ | 299 | /* some remained atomic pages should discarded */ |
| 307 | if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode)) | 300 | if (f2fs_is_atomic_file(inode)) |
| 308 | commit_inmem_pages(inode, true); | 301 | commit_inmem_pages(inode, true); |
| 309 | 302 | ||
| 310 | trace_f2fs_evict_inode(inode); | 303 | trace_f2fs_evict_inode(inode); |
