From 03b5664c5463372336b9a054903e193775a275d9 Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Fri, 7 Jun 2013 22:08:23 +0900 Subject: [PATCH] --- yaml --- r: 377695 b: refs/heads/master c: 699489bbbea4fc3b9b735d69941cf4fca91ce1d5 h: refs/heads/master i: 377693: 86502d6de80ccabf1e786d77645c6af6d57f2ef9 377691: e014a215cffcb8a79a3775782612c14b45d0b19d 377687: a4a9c11f05eb0c53103eba580b47f83e7ff3c6c3 377679: 6c034ecb40ec542252ce9468699a87e3a9135f2d 377663: 8398b23ecb7da41a2017f3aed3fa5f8772d6417c v: v3 --- [refs] | 2 +- trunk/fs/f2fs/data.c | 2 ++ trunk/fs/f2fs/dir.c | 9 ++++----- trunk/fs/f2fs/f2fs.h | 1 + 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 16c4c0ca98a7..600a4bb019ee 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2d4d9fb591fe83d9f0559afaa9736ebc8edad0aa +refs/heads/master: 699489bbbea4fc3b9b735d69941cf4fca91ce1d5 diff --git a/trunk/fs/f2fs/data.c b/trunk/fs/f2fs/data.c index 93917e31dbdf..5b145fcc2864 100644 --- a/trunk/fs/f2fs/data.c +++ b/trunk/fs/f2fs/data.c @@ -339,6 +339,8 @@ struct page *get_new_data_page(struct inode *inode, if (new_i_size && i_size_read(inode) < ((index + 1) << PAGE_CACHE_SHIFT)) { i_size_write(inode, ((index + 1) << PAGE_CACHE_SHIFT)); + /* Only the directory inode sets new_i_size */ + set_inode_flag(F2FS_I(inode), FI_UPDATE_DIR); mark_inode_dirty_sync(inode); } return page; diff --git a/trunk/fs/f2fs/dir.c b/trunk/fs/f2fs/dir.c index eaea5b50d9c1..69ca049b5168 100644 --- a/trunk/fs/f2fs/dir.c +++ b/trunk/fs/f2fs/dir.c @@ -370,22 +370,20 @@ static struct page *init_inode_metadata(struct inode *inode, static void update_parent_metadata(struct inode *dir, struct inode *inode, unsigned int current_depth) { - bool need_dir_update = false; - if (is_inode_flag_set(F2FS_I(inode), FI_NEW_INODE)) { if (S_ISDIR(inode->i_mode)) { inc_nlink(dir); - need_dir_update = true; + set_inode_flag(F2FS_I(dir), FI_UPDATE_DIR); } clear_inode_flag(F2FS_I(inode), FI_NEW_INODE); } dir->i_mtime = dir->i_ctime = CURRENT_TIME; if (F2FS_I(dir)->i_current_depth != current_depth) { F2FS_I(dir)->i_current_depth = current_depth; - need_dir_update = true; + set_inode_flag(F2FS_I(dir), FI_UPDATE_DIR); } - if (need_dir_update) + if (is_inode_flag_set(F2FS_I(dir), FI_UPDATE_DIR)) update_inode_page(dir); else mark_inode_dirty(dir); @@ -502,6 +500,7 @@ int __f2fs_add_link(struct inode *dir, const struct qstr *name, struct inode *in update_parent_metadata(dir, inode, current_depth); fail: + clear_inode_flag(F2FS_I(dir), FI_UPDATE_DIR); kunmap(dentry_page); f2fs_put_page(dentry_page, 1); return err; diff --git a/trunk/fs/f2fs/f2fs.h b/trunk/fs/f2fs/f2fs.h index c344a4d640cb..27edf59ac12c 100644 --- a/trunk/fs/f2fs/f2fs.h +++ b/trunk/fs/f2fs/f2fs.h @@ -859,6 +859,7 @@ enum { FI_INC_LINK, /* need to increment i_nlink */ FI_ACL_MODE, /* indicate acl mode */ FI_NO_ALLOC, /* should not allocate any blocks */ + FI_UPDATE_DIR, /* should update inode block for consistency */ FI_DELAY_IPUT, /* used for the recovery */ };