aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs/namei.c
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-03-21 02:21:57 -0400
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-03-26 20:16:25 -0400
commit953a3e27e10fc6acb480801ea47197d0270d735e (patch)
tree8ff66198318ee79464b9ac47e8ee091acf140c20 /fs/f2fs/namei.c
parentfa37241743ac26ba0ac6f54579158c2fae310a5c (diff)
f2fs: fix to give correct parent inode number for roll forward
When we recover fsync'ed data after power-off-recovery, we should guarantee that any parent inode number should be correct for each direct inode blocks. So, let's make the following rules. - The fsync should do checkpoint to all the inodes that were experienced hard links. - So, the only normal files can be recovered by roll-forward. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/namei.c')
-rw-r--r--fs/f2fs/namei.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index d4a171b1a68b..7c6e219a479c 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -15,6 +15,7 @@
15#include <linux/ctype.h> 15#include <linux/ctype.h>
16 16
17#include "f2fs.h" 17#include "f2fs.h"
18#include "node.h"
18#include "xattr.h" 19#include "xattr.h"
19#include "acl.h" 20#include "acl.h"
20 21
@@ -99,7 +100,7 @@ static int is_multimedia_file(const unsigned char *s, const char *sub)
99/* 100/*
100 * Set multimedia files as cold files for hot/cold data separation 101 * Set multimedia files as cold files for hot/cold data separation
101 */ 102 */
102static inline void set_cold_file(struct f2fs_sb_info *sbi, struct inode *inode, 103static inline void set_cold_files(struct f2fs_sb_info *sbi, struct inode *inode,
103 const unsigned char *name) 104 const unsigned char *name)
104{ 105{
105 int i; 106 int i;
@@ -108,7 +109,7 @@ static inline void set_cold_file(struct f2fs_sb_info *sbi, struct inode *inode,
108 int count = le32_to_cpu(sbi->raw_super->extension_count); 109 int count = le32_to_cpu(sbi->raw_super->extension_count);
109 for (i = 0; i < count; i++) { 110 for (i = 0; i < count; i++) {
110 if (!is_multimedia_file(name, extlist[i])) { 111 if (!is_multimedia_file(name, extlist[i])) {
111 F2FS_I(inode)->i_advise |= FADVISE_COLD_BIT; 112 set_cold_file(inode);
112 break; 113 break;
113 } 114 }
114 } 115 }
@@ -130,7 +131,7 @@ static int f2fs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
130 return PTR_ERR(inode); 131 return PTR_ERR(inode);
131 132
132 if (!test_opt(sbi, DISABLE_EXT_IDENTIFY)) 133 if (!test_opt(sbi, DISABLE_EXT_IDENTIFY))
133 set_cold_file(sbi, inode, dentry->d_name.name); 134 set_cold_files(sbi, inode, dentry->d_name.name);
134 135
135 inode->i_op = &f2fs_file_inode_operations; 136 inode->i_op = &f2fs_file_inode_operations;
136 inode->i_fop = &f2fs_file_operations; 137 inode->i_fop = &f2fs_file_operations;
@@ -173,6 +174,12 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
173 if (err) 174 if (err)
174 goto out; 175 goto out;
175 176
177 /*
178 * This file should be checkpointed during fsync.
179 * We lost i_pino from now on.
180 */
181 set_cp_file(inode);
182
176 d_instantiate(dentry, inode); 183 d_instantiate(dentry, inode);
177 return 0; 184 return 0;
178out: 185out:
@@ -425,7 +432,6 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
425 } 432 }
426 433
427 old_inode->i_ctime = CURRENT_TIME; 434 old_inode->i_ctime = CURRENT_TIME;
428 set_inode_flag(F2FS_I(old_inode), FI_NEED_CP);
429 mark_inode_dirty(old_inode); 435 mark_inode_dirty(old_inode);
430 436
431 f2fs_delete_entry(old_entry, old_page, NULL); 437 f2fs_delete_entry(old_entry, old_page, NULL);