diff options
Diffstat (limited to 'fs/f2fs/inode.c')
-rw-r--r-- | fs/f2fs/inode.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 5528801a5baf..2adeff26be11 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c | |||
@@ -138,7 +138,8 @@ static int do_read_inode(struct inode *inode) | |||
138 | fi->i_pino = le32_to_cpu(ri->i_pino); | 138 | fi->i_pino = le32_to_cpu(ri->i_pino); |
139 | fi->i_dir_level = ri->i_dir_level; | 139 | fi->i_dir_level = ri->i_dir_level; |
140 | 140 | ||
141 | f2fs_init_extent_tree(inode, &ri->i_ext); | 141 | if (f2fs_init_extent_tree(inode, &ri->i_ext)) |
142 | set_page_dirty(node_page); | ||
142 | 143 | ||
143 | get_inline_info(fi, ri); | 144 | get_inline_info(fi, ri); |
144 | 145 | ||
@@ -222,7 +223,7 @@ bad_inode: | |||
222 | return ERR_PTR(ret); | 223 | return ERR_PTR(ret); |
223 | } | 224 | } |
224 | 225 | ||
225 | void update_inode(struct inode *inode, struct page *node_page) | 226 | int update_inode(struct inode *inode, struct page *node_page) |
226 | { | 227 | { |
227 | struct f2fs_inode *ri; | 228 | struct f2fs_inode *ri; |
228 | 229 | ||
@@ -260,15 +261,16 @@ void update_inode(struct inode *inode, struct page *node_page) | |||
260 | 261 | ||
261 | __set_inode_rdev(inode, ri); | 262 | __set_inode_rdev(inode, ri); |
262 | set_cold_node(inode, node_page); | 263 | set_cold_node(inode, node_page); |
263 | set_page_dirty(node_page); | ||
264 | |||
265 | clear_inode_flag(F2FS_I(inode), FI_DIRTY_INODE); | 264 | clear_inode_flag(F2FS_I(inode), FI_DIRTY_INODE); |
265 | |||
266 | return set_page_dirty(node_page); | ||
266 | } | 267 | } |
267 | 268 | ||
268 | void update_inode_page(struct inode *inode) | 269 | int update_inode_page(struct inode *inode) |
269 | { | 270 | { |
270 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | 271 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
271 | struct page *node_page; | 272 | struct page *node_page; |
273 | int ret = 0; | ||
272 | retry: | 274 | retry: |
273 | node_page = get_node_page(sbi, inode->i_ino); | 275 | node_page = get_node_page(sbi, inode->i_ino); |
274 | if (IS_ERR(node_page)) { | 276 | if (IS_ERR(node_page)) { |
@@ -279,10 +281,11 @@ retry: | |||
279 | } else if (err != -ENOENT) { | 281 | } else if (err != -ENOENT) { |
280 | f2fs_stop_checkpoint(sbi); | 282 | f2fs_stop_checkpoint(sbi); |
281 | } | 283 | } |
282 | return; | 284 | return 0; |
283 | } | 285 | } |
284 | update_inode(inode, node_page); | 286 | ret = update_inode(inode, node_page); |
285 | f2fs_put_page(node_page, 1); | 287 | f2fs_put_page(node_page, 1); |
288 | return ret; | ||
286 | } | 289 | } |
287 | 290 | ||
288 | int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) | 291 | int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) |
@@ -300,9 +303,8 @@ int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
300 | * We need to balance fs here to prevent from producing dirty node pages | 303 | * We need to balance fs here to prevent from producing dirty node pages |
301 | * during the urgent cleaning time when runing out of free sections. | 304 | * during the urgent cleaning time when runing out of free sections. |
302 | */ | 305 | */ |
303 | update_inode_page(inode); | 306 | if (update_inode_page(inode)) |
304 | 307 | f2fs_balance_fs(sbi, true); | |
305 | f2fs_balance_fs(sbi); | ||
306 | return 0; | 308 | return 0; |
307 | } | 309 | } |
308 | 310 | ||
@@ -328,7 +330,7 @@ void f2fs_evict_inode(struct inode *inode) | |||
328 | goto out_clear; | 330 | goto out_clear; |
329 | 331 | ||
330 | f2fs_bug_on(sbi, get_dirty_pages(inode)); | 332 | f2fs_bug_on(sbi, get_dirty_pages(inode)); |
331 | remove_dirty_dir_inode(inode); | 333 | remove_dirty_inode(inode); |
332 | 334 | ||
333 | f2fs_destroy_extent_tree(inode); | 335 | f2fs_destroy_extent_tree(inode); |
334 | 336 | ||
@@ -358,9 +360,9 @@ no_delete: | |||
358 | if (xnid) | 360 | if (xnid) |
359 | invalidate_mapping_pages(NODE_MAPPING(sbi), xnid, xnid); | 361 | invalidate_mapping_pages(NODE_MAPPING(sbi), xnid, xnid); |
360 | if (is_inode_flag_set(fi, FI_APPEND_WRITE)) | 362 | if (is_inode_flag_set(fi, FI_APPEND_WRITE)) |
361 | add_dirty_inode(sbi, inode->i_ino, APPEND_INO); | 363 | add_ino_entry(sbi, inode->i_ino, APPEND_INO); |
362 | if (is_inode_flag_set(fi, FI_UPDATE_WRITE)) | 364 | if (is_inode_flag_set(fi, FI_UPDATE_WRITE)) |
363 | add_dirty_inode(sbi, inode->i_ino, UPDATE_INO); | 365 | add_ino_entry(sbi, inode->i_ino, UPDATE_INO); |
364 | if (is_inode_flag_set(fi, FI_FREE_NID)) { | 366 | if (is_inode_flag_set(fi, FI_FREE_NID)) { |
365 | if (err && err != -ENOENT) | 367 | if (err && err != -ENOENT) |
366 | alloc_nid_done(sbi, inode->i_ino); | 368 | alloc_nid_done(sbi, inode->i_ino); |