Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

f2fs: call mark_inode_dirty_sync for i_field changes

This patch calls mark_inode_dirty_sync() for the following on-disk inode
changes.

-> largest
-> ctime/mtime/atime
-> i_current_depth
-> i_xattr_nid
-> i_pino
-> i_advise
-> i_flags
-> i_mode

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

+92 -46
+2
fs/f2fs/acl.c
··· 384 384 if (error) 385 385 return error; 386 386 387 + mark_inode_dirty_sync(inode); 388 + 387 389 if (default_acl) { 388 390 error = __f2fs_set_acl(inode, ACL_TYPE_DEFAULT, default_acl, 389 391 ipage);
+7 -7
fs/f2fs/dir.c
··· 243 243 "Corrupted max_depth of %lu: %u", 244 244 dir->i_ino, max_depth); 245 245 max_depth = MAX_DIR_HASH_DEPTH; 246 - F2FS_I(dir)->i_current_depth = max_depth; 247 - mark_inode_dirty(dir); 246 + f2fs_i_depth_write(dir, max_depth); 248 247 } 249 248 250 249 for (level = 0; level < max_depth; level++) { ··· 302 303 set_de_type(de, inode->i_mode); 303 304 f2fs_dentry_kunmap(dir, page); 304 305 set_page_dirty(page); 305 - dir->i_mtime = dir->i_ctime = CURRENT_TIME; 306 - mark_inode_dirty(dir); 307 306 307 + dir->i_mtime = dir->i_ctime = CURRENT_TIME; 308 + mark_inode_dirty_sync(dir); 308 309 f2fs_put_page(page, 1); 309 310 } 310 311 ··· 461 462 clear_inode_flag(inode, FI_NEW_INODE); 462 463 } 463 464 dir->i_mtime = dir->i_ctime = CURRENT_TIME; 464 - mark_inode_dirty(dir); 465 + mark_inode_dirty_sync(dir); 465 466 466 467 if (F2FS_I(dir)->i_current_depth != current_depth) { 467 - F2FS_I(dir)->i_current_depth = current_depth; 468 + f2fs_i_depth_write(dir, current_depth); 468 469 set_inode_flag(dir, FI_UPDATE_DIR); 469 470 } 470 471 ··· 596 597 597 598 if (inode) { 598 599 /* we don't need to mark_inode_dirty now */ 599 - F2FS_I(inode)->i_pino = dir->i_ino; 600 + f2fs_i_pino_write(inode, dir->i_ino); 600 601 update_inode(inode, page); 601 602 f2fs_put_page(page, 1); 602 603 } ··· 729 730 set_page_dirty(page); 730 731 731 732 dir->i_ctime = dir->i_mtime = CURRENT_TIME; 733 + mark_inode_dirty_sync(dir); 732 734 733 735 if (inode) 734 736 f2fs_drop_nlink(dir, inode, NULL);
+14 -10
fs/f2fs/extent_cache.c
··· 170 170 { 171 171 struct extent_info *largest = &F2FS_I(inode)->extent_tree->largest; 172 172 173 - if (fofs < largest->fofs + largest->len && fofs + len > largest->fofs) 173 + if (fofs < largest->fofs + largest->len && fofs + len > largest->fofs) { 174 174 largest->len = 0; 175 + mark_inode_dirty_sync(inode); 176 + } 175 177 } 176 178 177 179 /* return true, if inode page is changed */ ··· 337 335 return en; 338 336 } 339 337 340 - static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi, 338 + static struct extent_node *__try_merge_extent_node(struct inode *inode, 341 339 struct extent_tree *et, struct extent_info *ei, 342 340 struct extent_node *prev_ex, 343 341 struct extent_node *next_ex) 344 342 { 343 + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 345 344 struct extent_node *en = NULL; 346 345 347 346 if (prev_ex && __is_back_mergeable(ei, &prev_ex->ei)) { ··· 363 360 if (!en) 364 361 return NULL; 365 362 366 - __try_update_largest_extent(et, en); 363 + __try_update_largest_extent(inode, et, en); 367 364 368 365 spin_lock(&sbi->extent_lock); 369 366 if (!list_empty(&en->list)) { ··· 374 371 return en; 375 372 } 376 373 377 - static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi, 374 + static struct extent_node *__insert_extent_tree(struct inode *inode, 378 375 struct extent_tree *et, struct extent_info *ei, 379 376 struct rb_node **insert_p, 380 377 struct rb_node *insert_parent) 381 378 { 379 + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 382 380 struct rb_node **p = &et->root.rb_node; 383 381 struct rb_node *parent = NULL; 384 382 struct extent_node *en = NULL; ··· 406 402 if (!en) 407 403 return NULL; 408 404 409 - __try_update_largest_extent(et, en); 405 + __try_update_largest_extent(inode, et, en); 410 406 411 407 /* update in global extent list */ 412 408 spin_lock(&sbi->extent_lock); ··· 477 473 set_extent_info(&ei, end, 478 474 end - dei.fofs + dei.blk, 479 475 org_end - end); 480 - en1 = __insert_extent_tree(sbi, et, &ei, 476 + en1 = __insert_extent_tree(inode, et, &ei, 481 477 NULL, NULL); 482 478 next_en = en1; 483 479 } else { ··· 498 494 } 499 495 500 496 if (parts) 501 - __try_update_largest_extent(et, en); 497 + __try_update_largest_extent(inode, et, en); 502 498 else 503 499 __release_extent_node(sbi, et, en); 504 500 ··· 518 514 if (blkaddr) { 519 515 520 516 set_extent_info(&ei, fofs, blkaddr, len); 521 - if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en)) 522 - __insert_extent_tree(sbi, et, &ei, 517 + if (!__try_merge_extent_node(inode, et, &ei, prev_en, next_en)) 518 + __insert_extent_tree(inode, et, &ei, 523 519 insert_p, insert_parent); 524 520 525 521 /* give up extent_cache, if split and small updates happen */ 526 522 if (dei.len >= 1 && 527 523 prev.len < F2FS_MIN_EXTENT_LEN && 528 524 et->largest.len < F2FS_MIN_EXTENT_LEN) { 529 - et->largest.len = 0; 525 + __drop_largest_extent(inode, 0, UINT_MAX); 530 526 set_inode_flag(inode, FI_NO_EXTENT); 531 527 } 532 528 }
+50 -8
fs/f2fs/f2fs.h
··· 498 498 return __is_extent_mergeable(cur, front); 499 499 } 500 500 501 - static inline void __try_update_largest_extent(struct extent_tree *et, 502 - struct extent_node *en) 501 + static inline void __try_update_largest_extent(struct inode *inode, 502 + struct extent_tree *et, struct extent_node *en) 503 503 { 504 - if (en->ei.len > et->largest.len) 504 + if (en->ei.len > et->largest.len) { 505 505 et->largest = en->ei; 506 + mark_inode_dirty_sync(inode); 507 + } 506 508 } 507 509 508 510 struct f2fs_nm_info { ··· 1536 1534 FI_DIRTY_FILE, /* indicate regular/symlink has dirty pages */ 1537 1535 }; 1538 1536 1537 + static inline void __mark_inode_dirty_flag(struct inode *inode, 1538 + int flag, bool set) 1539 + { 1540 + switch (flag) { 1541 + case FI_INLINE_XATTR: 1542 + case FI_INLINE_DATA: 1543 + case FI_INLINE_DENTRY: 1544 + if (set) 1545 + return; 1546 + case FI_DATA_EXIST: 1547 + case FI_INLINE_DOTS: 1548 + mark_inode_dirty_sync(inode); 1549 + } 1550 + } 1551 + 1539 1552 static inline void set_inode_flag(struct inode *inode, int flag) 1540 1553 { 1541 1554 if (!test_bit(flag, &F2FS_I(inode)->flags)) 1542 1555 set_bit(flag, &F2FS_I(inode)->flags); 1556 + __mark_inode_dirty_flag(inode, flag, true); 1543 1557 } 1544 1558 1545 1559 static inline int is_inode_flag_set(struct inode *inode, int flag) ··· 1567 1549 { 1568 1550 if (test_bit(flag, &F2FS_I(inode)->flags)) 1569 1551 clear_bit(flag, &F2FS_I(inode)->flags); 1552 + __mark_inode_dirty_flag(inode, flag, false); 1570 1553 } 1571 1554 1572 1555 static inline void set_acl_inode(struct inode *inode, umode_t mode) 1573 1556 { 1574 1557 F2FS_I(inode)->i_acl_mode = mode; 1575 1558 set_inode_flag(inode, FI_ACL_MODE); 1559 + mark_inode_dirty_sync(inode); 1576 1560 } 1577 1561 1578 1562 static inline void f2fs_i_links_write(struct inode *inode, bool inc) ··· 1603 1583 mark_inode_dirty_sync(inode); 1604 1584 } 1605 1585 1586 + static inline void f2fs_i_depth_write(struct inode *inode, unsigned int depth) 1587 + { 1588 + F2FS_I(inode)->i_current_depth = depth; 1589 + mark_inode_dirty_sync(inode); 1590 + } 1591 + 1592 + static inline void f2fs_i_xnid_write(struct inode *inode, nid_t xnid) 1593 + { 1594 + F2FS_I(inode)->i_xattr_nid = xnid; 1595 + mark_inode_dirty_sync(inode); 1596 + } 1597 + 1598 + static inline void f2fs_i_pino_write(struct inode *inode, nid_t pino) 1599 + { 1600 + F2FS_I(inode)->i_pino = pino; 1601 + mark_inode_dirty_sync(inode); 1602 + } 1603 + 1606 1604 static inline void get_inline_info(struct inode *inode, struct f2fs_inode *ri) 1607 1605 { 1606 + struct f2fs_inode_info *fi = F2FS_I(inode); 1607 + 1608 1608 if (ri->i_inline & F2FS_INLINE_XATTR) 1609 - set_inode_flag(inode, FI_INLINE_XATTR); 1609 + set_bit(FI_INLINE_XATTR, &fi->flags); 1610 1610 if (ri->i_inline & F2FS_INLINE_DATA) 1611 - set_inode_flag(inode, FI_INLINE_DATA); 1611 + set_bit(FI_INLINE_DATA, &fi->flags); 1612 1612 if (ri->i_inline & F2FS_INLINE_DENTRY) 1613 - set_inode_flag(inode, FI_INLINE_DENTRY); 1613 + set_bit(FI_INLINE_DENTRY, &fi->flags); 1614 1614 if (ri->i_inline & F2FS_DATA_EXIST) 1615 - set_inode_flag(inode, FI_DATA_EXIST); 1615 + set_bit(FI_DATA_EXIST, &fi->flags); 1616 1616 if (ri->i_inline & F2FS_INLINE_DOTS) 1617 - set_inode_flag(inode, FI_INLINE_DOTS); 1617 + set_bit(FI_INLINE_DOTS, &fi->flags); 1618 1618 } 1619 1619 1620 1620 static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri) ··· 1746 1706 static inline void set_file(struct inode *inode, int type) 1747 1707 { 1748 1708 F2FS_I(inode)->i_advise |= type; 1709 + mark_inode_dirty_sync(inode); 1749 1710 } 1750 1711 1751 1712 static inline void clear_file(struct inode *inode, int type) 1752 1713 { 1753 1714 F2FS_I(inode)->i_advise &= ~type; 1715 + mark_inode_dirty_sync(inode); 1754 1716 } 1755 1717 1756 1718 static inline int f2fs_readonly(struct super_block *sb)
+5 -7
fs/f2fs/file.c
··· 171 171 fi->xattr_ver = 0; 172 172 if (file_wrong_pino(inode) && inode->i_nlink == 1 && 173 173 get_parent_ino(inode, &pino)) { 174 - fi->i_pino = pino; 174 + f2fs_i_pino_write(inode, pino); 175 175 file_got_pino(inode); 176 176 up_write(&fi->i_sem); 177 177 178 - mark_inode_dirty_sync(inode); 179 178 f2fs_write_inode(inode, NULL); 180 179 } else { 181 180 up_write(&fi->i_sem); ··· 635 636 return err; 636 637 637 638 inode->i_mtime = inode->i_ctime = CURRENT_TIME; 638 - mark_inode_dirty(inode); 639 + mark_inode_dirty_sync(inode); 639 640 return 0; 640 641 } 641 642 ··· 725 726 } 726 727 } 727 728 728 - mark_inode_dirty(inode); 729 + mark_inode_dirty_sync(inode); 729 730 return err; 730 731 } 731 732 ··· 1278 1279 1279 1280 if (!ret) { 1280 1281 inode->i_mtime = inode->i_ctime = CURRENT_TIME; 1281 - mark_inode_dirty(inode); 1282 + mark_inode_dirty_sync(inode); 1282 1283 f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); 1283 1284 } 1284 1285 ··· 1369 1370 fi->i_flags = flags; 1370 1371 inode_unlock(inode); 1371 1372 1372 - f2fs_set_inode_flags(inode); 1373 1373 inode->i_ctime = CURRENT_TIME; 1374 - mark_inode_dirty(inode); 1374 + f2fs_set_inode_flags(inode); 1375 1375 out: 1376 1376 mnt_drop_write_file(filp); 1377 1377 return ret;
+4 -3
fs/f2fs/inline.c
··· 400 400 stat_dec_inline_dir(dir); 401 401 clear_inode_flag(dir, FI_INLINE_DENTRY); 402 402 403 - F2FS_I(dir)->i_current_depth = 1; 403 + f2fs_i_depth_write(dir, 1); 404 404 if (i_size_read(dir) < PAGE_SIZE) { 405 405 f2fs_i_size_write(dir, PAGE_SIZE); 406 406 set_inode_flag(dir, FI_UPDATE_DIR); ··· 492 492 recover: 493 493 lock_page(ipage); 494 494 memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA); 495 - F2FS_I(dir)->i_current_depth = 0; 495 + f2fs_i_depth_write(dir, 0); 496 496 f2fs_i_size_write(dir, MAX_INLINE_DATA); 497 497 update_inode(dir, ipage); 498 498 f2fs_put_page(ipage, 1); ··· 558 558 559 559 /* we don't need to mark_inode_dirty now */ 560 560 if (inode) { 561 - F2FS_I(inode)->i_pino = dir->i_ino; 561 + f2fs_i_pino_write(inode, dir->i_ino); 562 562 update_inode(inode, page); 563 563 f2fs_put_page(page, 1); 564 564 } ··· 597 597 set_page_dirty(page); 598 598 599 599 dir->i_ctime = dir->i_mtime = CURRENT_TIME; 600 + mark_inode_dirty_sync(dir); 600 601 601 602 if (inode) 602 603 f2fs_drop_nlink(dir, inode, page);
+1
fs/f2fs/inode.c
··· 35 35 new_fl |= S_DIRSYNC; 36 36 inode_set_flags(inode, new_fl, 37 37 S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC); 38 + mark_inode_dirty_sync(inode); 38 39 } 39 40 40 41 static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
+4 -7
fs/f2fs/namei.c
··· 76 76 stat_inc_inline_dir(inode); 77 77 78 78 trace_f2fs_new_inode(inode, 0); 79 - mark_inode_dirty(inode); 80 79 return inode; 81 80 82 81 fail: ··· 246 247 err = __f2fs_add_link(dir, &dotdot, NULL, pino, S_IFDIR); 247 248 } 248 249 out: 249 - if (!err) { 250 + if (!err) 250 251 clear_inode_flag(dir, FI_INLINE_DOTS); 251 - mark_inode_dirty(dir); 252 - } 253 252 254 253 f2fs_unlock_op(sbi); 255 254 return err; ··· 753 756 up_write(&F2FS_I(old_inode)->i_sem); 754 757 755 758 old_inode->i_ctime = CURRENT_TIME; 756 - mark_inode_dirty(old_inode); 759 + mark_inode_dirty_sync(old_inode); 757 760 758 761 f2fs_delete_entry(old_entry, old_page, old_dir, NULL); 759 762 ··· 907 910 f2fs_i_links_write(old_dir, old_nlink > 0); 908 911 up_write(&F2FS_I(old_dir)->i_sem); 909 912 } 910 - mark_inode_dirty(old_dir); 913 + mark_inode_dirty_sync(old_dir); 911 914 update_inode_page(old_dir); 912 915 913 916 /* update directory entry info of new dir inode */ ··· 925 928 f2fs_i_links_write(new_dir, new_nlink > 0); 926 929 up_write(&F2FS_I(new_dir)->i_sem); 927 930 } 928 - mark_inode_dirty(new_dir); 931 + mark_inode_dirty_sync(new_dir); 929 932 update_inode_page(new_dir); 930 933 931 934 f2fs_unlock_op(sbi);
+3 -3
fs/f2fs/node.c
··· 953 953 if (IS_ERR(npage)) 954 954 return PTR_ERR(npage); 955 955 956 - F2FS_I(inode)->i_xattr_nid = 0; 956 + f2fs_i_xnid_write(inode, 0); 957 957 958 958 /* need to do checkpoint during fsync */ 959 959 F2FS_I(inode)->xattr_ver = cur_cp_version(F2FS_CKPT(sbi)); ··· 1047 1047 dn->node_changed = true; 1048 1048 1049 1049 if (f2fs_has_xattr_block(ofs)) 1050 - F2FS_I(dn->inode)->i_xattr_nid = dn->nid; 1050 + f2fs_i_xnid_write(dn->inode, dn->nid); 1051 1051 1052 1052 dn->node_page = page; 1053 1053 if (ipage) ··· 1997 1997 get_node_info(sbi, new_xnid, &ni); 1998 1998 ni.ino = inode->i_ino; 1999 1999 set_node_addr(sbi, &ni, NEW_ADDR, false); 2000 - F2FS_I(inode)->i_xattr_nid = new_xnid; 2000 + f2fs_i_xnid_write(inode, new_xnid); 2001 2001 2002 2002 /* 3: update xattr blkaddr */ 2003 2003 refresh_sit_entry(sbi, NEW_ADDR, blkaddr);
+2 -1
fs/f2fs/xattr.c
··· 106 106 return -EINVAL; 107 107 108 108 F2FS_I(inode)->i_advise |= *(char *)value; 109 - mark_inode_dirty(inode); 109 + mark_inode_dirty_sync(inode); 110 110 return 0; 111 111 } 112 112 ··· 551 551 update_inode(inode, ipage); 552 552 else 553 553 update_inode_page(inode); 554 + mark_inode_dirty_sync(inode); 554 555 exit: 555 556 kzfree(base_addr); 556 557 return error;