Skip to content

Commit 205b982

Browse files
author
Jaegeuk Kim
committed
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>
1 parent a196124 commit 205b982

File tree

10 files changed

+92
-46
lines changed

10 files changed

+92
-46
lines changed

fs/f2fs/acl.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,8 @@ int f2fs_init_acl(struct inode *inode, struct inode *dir, struct page *ipage,
384384
if (error)
385385
return error;
386386

387+
mark_inode_dirty_sync(inode);
388+
387389
if (default_acl) {
388390
error = __f2fs_set_acl(inode, ACL_TYPE_DEFAULT, default_acl,
389391
ipage);

fs/f2fs/dir.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,7 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
243243
"Corrupted max_depth of %lu: %u",
244244
dir->i_ino, max_depth);
245245
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);
248247
}
249248

250249
for (level = 0; level < max_depth; level++) {
@@ -303,9 +302,9 @@ void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
303302
set_de_type(de, inode->i_mode);
304303
f2fs_dentry_kunmap(dir, page);
305304
set_page_dirty(page);
306-
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
307-
mark_inode_dirty(dir);
308305

306+
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
307+
mark_inode_dirty_sync(dir);
309308
f2fs_put_page(page, 1);
310309
}
311310

@@ -462,10 +461,10 @@ void update_parent_metadata(struct inode *dir, struct inode *inode,
462461
clear_inode_flag(inode, FI_NEW_INODE);
463462
}
464463
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
465-
mark_inode_dirty(dir);
464+
mark_inode_dirty_sync(dir);
466465

467466
if (F2FS_I(dir)->i_current_depth != current_depth) {
468-
F2FS_I(dir)->i_current_depth = current_depth;
467+
f2fs_i_depth_write(dir, current_depth);
469468
set_inode_flag(dir, FI_UPDATE_DIR);
470469
}
471470

@@ -597,7 +596,7 @@ int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name,
597596

598597
if (inode) {
599598
/* we don't need to mark_inode_dirty now */
600-
F2FS_I(inode)->i_pino = dir->i_ino;
599+
f2fs_i_pino_write(inode, dir->i_ino);
601600
update_inode(inode, page);
602601
f2fs_put_page(page, 1);
603602
}
@@ -730,6 +729,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
730729
set_page_dirty(page);
731730

732731
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
732+
mark_inode_dirty_sync(dir);
733733

734734
if (inode)
735735
f2fs_drop_nlink(dir, inode, NULL);

fs/f2fs/extent_cache.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,10 @@ static void __drop_largest_extent(struct inode *inode,
170170
{
171171
struct extent_info *largest = &F2FS_I(inode)->extent_tree->largest;
172172

173-
if (fofs < largest->fofs + largest->len && fofs + len > largest->fofs)
173+
if (fofs < largest->fofs + largest->len && fofs + len > largest->fofs) {
174174
largest->len = 0;
175+
mark_inode_dirty_sync(inode);
176+
}
175177
}
176178

177179
/* return true, if inode page is changed */
@@ -335,11 +337,12 @@ static struct extent_node *__lookup_extent_tree_ret(struct extent_tree *et,
335337
return en;
336338
}
337339

338-
static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,
340+
static struct extent_node *__try_merge_extent_node(struct inode *inode,
339341
struct extent_tree *et, struct extent_info *ei,
340342
struct extent_node *prev_ex,
341343
struct extent_node *next_ex)
342344
{
345+
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
343346
struct extent_node *en = NULL;
344347

345348
if (prev_ex && __is_back_mergeable(ei, &prev_ex->ei)) {
@@ -360,7 +363,7 @@ static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,
360363
if (!en)
361364
return NULL;
362365

363-
__try_update_largest_extent(et, en);
366+
__try_update_largest_extent(inode, et, en);
364367

365368
spin_lock(&sbi->extent_lock);
366369
if (!list_empty(&en->list)) {
@@ -371,11 +374,12 @@ static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,
371374
return en;
372375
}
373376

374-
static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi,
377+
static struct extent_node *__insert_extent_tree(struct inode *inode,
375378
struct extent_tree *et, struct extent_info *ei,
376379
struct rb_node **insert_p,
377380
struct rb_node *insert_parent)
378381
{
382+
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
379383
struct rb_node **p = &et->root.rb_node;
380384
struct rb_node *parent = NULL;
381385
struct extent_node *en = NULL;
@@ -402,7 +406,7 @@ static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi,
402406
if (!en)
403407
return NULL;
404408

405-
__try_update_largest_extent(et, en);
409+
__try_update_largest_extent(inode, et, en);
406410

407411
/* update in global extent list */
408412
spin_lock(&sbi->extent_lock);
@@ -473,7 +477,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
473477
set_extent_info(&ei, end,
474478
end - dei.fofs + dei.blk,
475479
org_end - end);
476-
en1 = __insert_extent_tree(sbi, et, &ei,
480+
en1 = __insert_extent_tree(inode, et, &ei,
477481
NULL, NULL);
478482
next_en = en1;
479483
} else {
@@ -494,7 +498,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
494498
}
495499

496500
if (parts)
497-
__try_update_largest_extent(et, en);
501+
__try_update_largest_extent(inode, et, en);
498502
else
499503
__release_extent_node(sbi, et, en);
500504

@@ -514,15 +518,15 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode,
514518
if (blkaddr) {
515519

516520
set_extent_info(&ei, fofs, blkaddr, len);
517-
if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
518-
__insert_extent_tree(sbi, et, &ei,
521+
if (!__try_merge_extent_node(inode, et, &ei, prev_en, next_en))
522+
__insert_extent_tree(inode, et, &ei,
519523
insert_p, insert_parent);
520524

521525
/* give up extent_cache, if split and small updates happen */
522526
if (dei.len >= 1 &&
523527
prev.len < F2FS_MIN_EXTENT_LEN &&
524528
et->largest.len < F2FS_MIN_EXTENT_LEN) {
525-
et->largest.len = 0;
529+
__drop_largest_extent(inode, 0, UINT_MAX);
526530
set_inode_flag(inode, FI_NO_EXTENT);
527531
}
528532
}

fs/f2fs/f2fs.h

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -498,11 +498,13 @@ static inline bool __is_front_mergeable(struct extent_info *cur,
498498
return __is_extent_mergeable(cur, front);
499499
}
500500

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)
503503
{
504-
if (en->ei.len > et->largest.len)
504+
if (en->ei.len > et->largest.len) {
505505
et->largest = en->ei;
506+
mark_inode_dirty_sync(inode);
507+
}
506508
}
507509

508510
struct f2fs_nm_info {
@@ -1534,10 +1536,26 @@ enum {
15341536
FI_DIRTY_FILE, /* indicate regular/symlink has dirty pages */
15351537
};
15361538

1539+
static inline void __mark_inode_dirty_flag(struct inode *inode,
1540+
int flag, bool set)
1541+
{
1542+
switch (flag) {
1543+
case FI_INLINE_XATTR:
1544+
case FI_INLINE_DATA:
1545+
case FI_INLINE_DENTRY:
1546+
if (set)
1547+
return;
1548+
case FI_DATA_EXIST:
1549+
case FI_INLINE_DOTS:
1550+
mark_inode_dirty_sync(inode);
1551+
}
1552+
}
1553+
15371554
static inline void set_inode_flag(struct inode *inode, int flag)
15381555
{
15391556
if (!test_bit(flag, &F2FS_I(inode)->flags))
15401557
set_bit(flag, &F2FS_I(inode)->flags);
1558+
__mark_inode_dirty_flag(inode, flag, true);
15411559
}
15421560

15431561
static inline int is_inode_flag_set(struct inode *inode, int flag)
@@ -1549,12 +1567,14 @@ static inline void clear_inode_flag(struct inode *inode, int flag)
15491567
{
15501568
if (test_bit(flag, &F2FS_I(inode)->flags))
15511569
clear_bit(flag, &F2FS_I(inode)->flags);
1570+
__mark_inode_dirty_flag(inode, flag, false);
15521571
}
15531572

15541573
static inline void set_acl_inode(struct inode *inode, umode_t mode)
15551574
{
15561575
F2FS_I(inode)->i_acl_mode = mode;
15571576
set_inode_flag(inode, FI_ACL_MODE);
1577+
mark_inode_dirty_sync(inode);
15581578
}
15591579

15601580
static inline void f2fs_i_links_write(struct inode *inode, bool inc)
@@ -1583,18 +1603,38 @@ static inline void f2fs_i_size_write(struct inode *inode, loff_t i_size)
15831603
mark_inode_dirty_sync(inode);
15841604
}
15851605

1606+
static inline void f2fs_i_depth_write(struct inode *inode, unsigned int depth)
1607+
{
1608+
F2FS_I(inode)->i_current_depth = depth;
1609+
mark_inode_dirty_sync(inode);
1610+
}
1611+
1612+
static inline void f2fs_i_xnid_write(struct inode *inode, nid_t xnid)
1613+
{
1614+
F2FS_I(inode)->i_xattr_nid = xnid;
1615+
mark_inode_dirty_sync(inode);
1616+
}
1617+
1618+
static inline void f2fs_i_pino_write(struct inode *inode, nid_t pino)
1619+
{
1620+
F2FS_I(inode)->i_pino = pino;
1621+
mark_inode_dirty_sync(inode);
1622+
}
1623+
15861624
static inline void get_inline_info(struct inode *inode, struct f2fs_inode *ri)
15871625
{
1626+
struct f2fs_inode_info *fi = F2FS_I(inode);
1627+
15881628
if (ri->i_inline & F2FS_INLINE_XATTR)
1589-
set_inode_flag(inode, FI_INLINE_XATTR);
1629+
set_bit(FI_INLINE_XATTR, &fi->flags);
15901630
if (ri->i_inline & F2FS_INLINE_DATA)
1591-
set_inode_flag(inode, FI_INLINE_DATA);
1631+
set_bit(FI_INLINE_DATA, &fi->flags);
15921632
if (ri->i_inline & F2FS_INLINE_DENTRY)
1593-
set_inode_flag(inode, FI_INLINE_DENTRY);
1633+
set_bit(FI_INLINE_DENTRY, &fi->flags);
15941634
if (ri->i_inline & F2FS_DATA_EXIST)
1595-
set_inode_flag(inode, FI_DATA_EXIST);
1635+
set_bit(FI_DATA_EXIST, &fi->flags);
15961636
if (ri->i_inline & F2FS_INLINE_DOTS)
1597-
set_inode_flag(inode, FI_INLINE_DOTS);
1637+
set_bit(FI_INLINE_DOTS, &fi->flags);
15981638
}
15991639

16001640
static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri)
@@ -1706,11 +1746,13 @@ static inline int is_file(struct inode *inode, int type)
17061746
static inline void set_file(struct inode *inode, int type)
17071747
{
17081748
F2FS_I(inode)->i_advise |= type;
1749+
mark_inode_dirty_sync(inode);
17091750
}
17101751

17111752
static inline void clear_file(struct inode *inode, int type)
17121753
{
17131754
F2FS_I(inode)->i_advise &= ~type;
1755+
mark_inode_dirty_sync(inode);
17141756
}
17151757

17161758
static inline int f2fs_readonly(struct super_block *sb)

fs/f2fs/file.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,10 @@ static void try_to_fix_pino(struct inode *inode)
171171
fi->xattr_ver = 0;
172172
if (file_wrong_pino(inode) && inode->i_nlink == 1 &&
173173
get_parent_ino(inode, &pino)) {
174-
fi->i_pino = pino;
174+
f2fs_i_pino_write(inode, pino);
175175
file_got_pino(inode);
176176
up_write(&fi->i_sem);
177177

178-
mark_inode_dirty_sync(inode);
179178
f2fs_write_inode(inode, NULL);
180179
} else {
181180
up_write(&fi->i_sem);
@@ -636,7 +635,7 @@ int f2fs_truncate(struct inode *inode, bool lock)
636635
return err;
637636

638637
inode->i_mtime = inode->i_ctime = CURRENT_TIME;
639-
mark_inode_dirty(inode);
638+
mark_inode_dirty_sync(inode);
640639
return 0;
641640
}
642641

@@ -726,7 +725,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
726725
}
727726
}
728727

729-
mark_inode_dirty(inode);
728+
mark_inode_dirty_sync(inode);
730729
return err;
731730
}
732731

@@ -1279,7 +1278,7 @@ static long f2fs_fallocate(struct file *file, int mode,
12791278

12801279
if (!ret) {
12811280
inode->i_mtime = inode->i_ctime = CURRENT_TIME;
1282-
mark_inode_dirty(inode);
1281+
mark_inode_dirty_sync(inode);
12831282
f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
12841283
}
12851284

@@ -1370,9 +1369,8 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
13701369
fi->i_flags = flags;
13711370
inode_unlock(inode);
13721371

1373-
f2fs_set_inode_flags(inode);
13741372
inode->i_ctime = CURRENT_TIME;
1375-
mark_inode_dirty(inode);
1373+
f2fs_set_inode_flags(inode);
13761374
out:
13771375
mnt_drop_write_file(filp);
13781376
return ret;

fs/f2fs/inline.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
400400
stat_dec_inline_dir(dir);
401401
clear_inode_flag(dir, FI_INLINE_DENTRY);
402402

403-
F2FS_I(dir)->i_current_depth = 1;
403+
f2fs_i_depth_write(dir, 1);
404404
if (i_size_read(dir) < PAGE_SIZE) {
405405
f2fs_i_size_write(dir, PAGE_SIZE);
406406
set_inode_flag(dir, FI_UPDATE_DIR);
@@ -492,7 +492,7 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
492492
recover:
493493
lock_page(ipage);
494494
memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA);
495-
F2FS_I(dir)->i_current_depth = 0;
495+
f2fs_i_depth_write(dir, 0);
496496
f2fs_i_size_write(dir, MAX_INLINE_DATA);
497497
update_inode(dir, ipage);
498498
f2fs_put_page(ipage, 1);
@@ -558,7 +558,7 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
558558

559559
/* we don't need to mark_inode_dirty now */
560560
if (inode) {
561-
F2FS_I(inode)->i_pino = dir->i_ino;
561+
f2fs_i_pino_write(inode, dir->i_ino);
562562
update_inode(inode, page);
563563
f2fs_put_page(page, 1);
564564
}
@@ -597,6 +597,7 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
597597
set_page_dirty(page);
598598

599599
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
600+
mark_inode_dirty_sync(dir);
600601

601602
if (inode)
602603
f2fs_drop_nlink(dir, inode, page);

fs/f2fs/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ void f2fs_set_inode_flags(struct inode *inode)
3535
new_fl |= S_DIRSYNC;
3636
inode_set_flags(inode, new_fl,
3737
S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
38+
mark_inode_dirty_sync(inode);
3839
}
3940

4041
static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)

0 commit comments

Comments
 (0)