diff options
Diffstat (limited to 'fs/f2fs/inode.c')
-rw-r--r-- | fs/f2fs/inode.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 2d002e3738a7..e622ec95409e 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c | |||
@@ -51,6 +51,15 @@ static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri) | |||
51 | } | 51 | } |
52 | } | 52 | } |
53 | 53 | ||
54 | static bool __written_first_block(struct f2fs_inode *ri) | ||
55 | { | ||
56 | block_t addr = le32_to_cpu(ri->i_addr[0]); | ||
57 | |||
58 | if (addr != NEW_ADDR && addr != NULL_ADDR) | ||
59 | return true; | ||
60 | return false; | ||
61 | } | ||
62 | |||
54 | static void __set_inode_rdev(struct inode *inode, struct f2fs_inode *ri) | 63 | static void __set_inode_rdev(struct inode *inode, struct f2fs_inode *ri) |
55 | { | 64 | { |
56 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { | 65 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { |
@@ -130,7 +139,8 @@ static int do_read_inode(struct inode *inode) | |||
130 | fi->i_pino = le32_to_cpu(ri->i_pino); | 139 | fi->i_pino = le32_to_cpu(ri->i_pino); |
131 | fi->i_dir_level = ri->i_dir_level; | 140 | fi->i_dir_level = ri->i_dir_level; |
132 | 141 | ||
133 | get_extent_info(&fi->ext, ri->i_ext); | 142 | f2fs_init_extent_cache(inode, &ri->i_ext); |
143 | |||
134 | get_inline_info(fi, ri); | 144 | get_inline_info(fi, ri); |
135 | 145 | ||
136 | /* check data exist */ | 146 | /* check data exist */ |
@@ -140,6 +150,9 @@ static int do_read_inode(struct inode *inode) | |||
140 | /* get rdev by using inline_info */ | 150 | /* get rdev by using inline_info */ |
141 | __get_inode_rdev(inode, ri); | 151 | __get_inode_rdev(inode, ri); |
142 | 152 | ||
153 | if (__written_first_block(ri)) | ||
154 | set_inode_flag(F2FS_I(inode), FI_FIRST_BLOCK_WRITTEN); | ||
155 | |||
143 | f2fs_put_page(node_page, 1); | 156 | f2fs_put_page(node_page, 1); |
144 | 157 | ||
145 | stat_inc_inline_inode(inode); | 158 | stat_inc_inline_inode(inode); |
@@ -220,7 +233,11 @@ void update_inode(struct inode *inode, struct page *node_page) | |||
220 | ri->i_links = cpu_to_le32(inode->i_nlink); | 233 | ri->i_links = cpu_to_le32(inode->i_nlink); |
221 | ri->i_size = cpu_to_le64(i_size_read(inode)); | 234 | ri->i_size = cpu_to_le64(i_size_read(inode)); |
222 | ri->i_blocks = cpu_to_le64(inode->i_blocks); | 235 | ri->i_blocks = cpu_to_le64(inode->i_blocks); |
236 | |||
237 | read_lock(&F2FS_I(inode)->ext_lock); | ||
223 | set_raw_extent(&F2FS_I(inode)->ext, &ri->i_ext); | 238 | set_raw_extent(&F2FS_I(inode)->ext, &ri->i_ext); |
239 | read_unlock(&F2FS_I(inode)->ext_lock); | ||
240 | |||
224 | set_raw_inline(F2FS_I(inode), ri); | 241 | set_raw_inline(F2FS_I(inode), ri); |
225 | 242 | ||
226 | ri->i_atime = cpu_to_le64(inode->i_atime.tv_sec); | 243 | ri->i_atime = cpu_to_le64(inode->i_atime.tv_sec); |
@@ -328,6 +345,12 @@ void f2fs_evict_inode(struct inode *inode) | |||
328 | no_delete: | 345 | no_delete: |
329 | stat_dec_inline_dir(inode); | 346 | stat_dec_inline_dir(inode); |
330 | stat_dec_inline_inode(inode); | 347 | stat_dec_inline_inode(inode); |
348 | |||
349 | /* update extent info in inode */ | ||
350 | if (inode->i_nlink) | ||
351 | f2fs_preserve_extent_tree(inode); | ||
352 | f2fs_destroy_extent_tree(inode); | ||
353 | |||
331 | invalidate_mapping_pages(NODE_MAPPING(sbi), inode->i_ino, inode->i_ino); | 354 | invalidate_mapping_pages(NODE_MAPPING(sbi), inode->i_ino, inode->i_ino); |
332 | if (xnid) | 355 | if (xnid) |
333 | invalidate_mapping_pages(NODE_MAPPING(sbi), xnid, xnid); | 356 | invalidate_mapping_pages(NODE_MAPPING(sbi), xnid, xnid); |