diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-18 11:17:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-18 11:17:20 -0400 |
commit | 06a60deca87dba8e2c186ea7f12ea87d6785188e (patch) | |
tree | 2a6c8de6a7b110d13a1c1e3fc07cdc9065dfd749 /fs/f2fs/inode.c | |
parent | d6a24d0640d609138a4e40a4ce9fd9fe7859e24c (diff) | |
parent | 10027551ccf5459cc771c31ac8bc8e5cc8db45f8 (diff) |
Merge tag 'for-f2fs-4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs
Pull f2fs updates from Jaegeuk Kim:
"New features:
- in-memory extent_cache
- fs_shutdown to test power-off-recovery
- use inline_data to store symlink path
- show f2fs as a non-misc filesystem
Major fixes:
- avoid CPU stalls on sync_dirty_dir_inodes
- fix some power-off-recovery procedure
- fix handling of broken symlink correctly
- fix missing dot and dotdot made by sudden power cuts
- handle wrong data index during roll-forward recovery
- preallocate data blocks for direct_io
... and a bunch of minor bug fixes and cleanups"
* tag 'for-f2fs-4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (71 commits)
f2fs: pass checkpoint reason on roll-forward recovery
f2fs: avoid abnormal behavior on broken symlink
f2fs: flush symlink path to avoid broken symlink after POR
f2fs: change 0 to false for bool type
f2fs: do not recover wrong data index
f2fs: do not increase link count during recovery
f2fs: assign parent's i_mode for empty dir
f2fs: add F2FS_INLINE_DOTS to recover missing dot dentries
f2fs: fix mismatching lock and unlock pages for roll-forward recovery
f2fs: fix sparse warnings
f2fs: limit b_size of mapped bh in f2fs_map_bh
f2fs: persist system.advise into on-disk inode
f2fs: avoid NULL pointer dereference in f2fs_xattr_advise_get
f2fs: preallocate fallocated blocks for direct IO
f2fs: enable inline data by default
f2fs: preserve extent info for extent cache
f2fs: initialize extent tree with on-disk extent info of inode
f2fs: introduce __{find,grab}_extent_tree
f2fs: split set_data_blkaddr from f2fs_update_extent_cache
f2fs: enable fast symlink by utilizing inline data
...
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); |