diff options
Diffstat (limited to 'fs/f2fs/inline.c')
| -rw-r--r-- | fs/f2fs/inline.c | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index f2d3c581e776..1484c00133cd 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c | |||
| @@ -50,6 +50,12 @@ void read_inline_data(struct page *page, struct page *ipage) | |||
| 50 | SetPageUptodate(page); | 50 | SetPageUptodate(page); |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | static void truncate_inline_data(struct page *ipage) | ||
| 54 | { | ||
| 55 | f2fs_wait_on_page_writeback(ipage, NODE); | ||
| 56 | memset(inline_data_addr(ipage), 0, MAX_INLINE_DATA); | ||
| 57 | } | ||
| 58 | |||
| 53 | int f2fs_read_inline_data(struct inode *inode, struct page *page) | 59 | int f2fs_read_inline_data(struct inode *inode, struct page *page) |
| 54 | { | 60 | { |
| 55 | struct page *ipage; | 61 | struct page *ipage; |
| @@ -79,7 +85,6 @@ int f2fs_read_inline_data(struct inode *inode, struct page *page) | |||
| 79 | int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) | 85 | int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) |
| 80 | { | 86 | { |
| 81 | void *src_addr, *dst_addr; | 87 | void *src_addr, *dst_addr; |
| 82 | block_t new_blk_addr; | ||
| 83 | struct f2fs_io_info fio = { | 88 | struct f2fs_io_info fio = { |
| 84 | .type = DATA, | 89 | .type = DATA, |
| 85 | .rw = WRITE_SYNC | REQ_PRIO, | 90 | .rw = WRITE_SYNC | REQ_PRIO, |
| @@ -115,9 +120,9 @@ no_update: | |||
| 115 | 120 | ||
| 116 | /* write data page to try to make data consistent */ | 121 | /* write data page to try to make data consistent */ |
| 117 | set_page_writeback(page); | 122 | set_page_writeback(page); |
| 118 | 123 | fio.blk_addr = dn->data_blkaddr; | |
| 119 | write_data_page(page, dn, &new_blk_addr, &fio); | 124 | write_data_page(page, dn, &fio); |
| 120 | update_extent_cache(new_blk_addr, dn); | 125 | update_extent_cache(dn); |
| 121 | f2fs_wait_on_page_writeback(page, DATA); | 126 | f2fs_wait_on_page_writeback(page, DATA); |
| 122 | if (dirty) | 127 | if (dirty) |
| 123 | inode_dec_dirty_pages(dn->inode); | 128 | inode_dec_dirty_pages(dn->inode); |
| @@ -126,7 +131,7 @@ no_update: | |||
| 126 | set_inode_flag(F2FS_I(dn->inode), FI_APPEND_WRITE); | 131 | set_inode_flag(F2FS_I(dn->inode), FI_APPEND_WRITE); |
| 127 | 132 | ||
| 128 | /* clear inline data and flag after data writeback */ | 133 | /* clear inline data and flag after data writeback */ |
| 129 | truncate_inline_data(dn->inode_page, 0); | 134 | truncate_inline_data(dn->inode_page); |
| 130 | clear_out: | 135 | clear_out: |
| 131 | stat_dec_inline_inode(dn->inode); | 136 | stat_dec_inline_inode(dn->inode); |
| 132 | f2fs_clear_inline_inode(dn->inode); | 137 | f2fs_clear_inline_inode(dn->inode); |
| @@ -199,19 +204,6 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page) | |||
| 199 | return 0; | 204 | return 0; |
| 200 | } | 205 | } |
| 201 | 206 | ||
| 202 | void truncate_inline_data(struct page *ipage, u64 from) | ||
| 203 | { | ||
| 204 | void *addr; | ||
| 205 | |||
| 206 | if (from >= MAX_INLINE_DATA) | ||
| 207 | return; | ||
| 208 | |||
| 209 | f2fs_wait_on_page_writeback(ipage, NODE); | ||
| 210 | |||
| 211 | addr = inline_data_addr(ipage); | ||
| 212 | memset(addr + from, 0, MAX_INLINE_DATA - from); | ||
| 213 | } | ||
| 214 | |||
| 215 | bool recover_inline_data(struct inode *inode, struct page *npage) | 207 | bool recover_inline_data(struct inode *inode, struct page *npage) |
| 216 | { | 208 | { |
| 217 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | 209 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
| @@ -253,7 +245,7 @@ process_inline: | |||
| 253 | if (f2fs_has_inline_data(inode)) { | 245 | if (f2fs_has_inline_data(inode)) { |
| 254 | ipage = get_node_page(sbi, inode->i_ino); | 246 | ipage = get_node_page(sbi, inode->i_ino); |
| 255 | f2fs_bug_on(sbi, IS_ERR(ipage)); | 247 | f2fs_bug_on(sbi, IS_ERR(ipage)); |
| 256 | truncate_inline_data(ipage, 0); | 248 | truncate_inline_data(ipage); |
| 257 | f2fs_clear_inline_inode(inode); | 249 | f2fs_clear_inline_inode(inode); |
| 258 | update_inode(inode, ipage); | 250 | update_inode(inode, ipage); |
| 259 | f2fs_put_page(ipage, 1); | 251 | f2fs_put_page(ipage, 1); |
| @@ -371,7 +363,7 @@ static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage, | |||
| 371 | set_page_dirty(page); | 363 | set_page_dirty(page); |
| 372 | 364 | ||
| 373 | /* clear inline dir and flag after data writeback */ | 365 | /* clear inline dir and flag after data writeback */ |
| 374 | truncate_inline_data(ipage, 0); | 366 | truncate_inline_data(ipage); |
| 375 | 367 | ||
| 376 | stat_dec_inline_dir(dir); | 368 | stat_dec_inline_dir(dir); |
| 377 | clear_inode_flag(F2FS_I(dir), FI_INLINE_DENTRY); | 369 | clear_inode_flag(F2FS_I(dir), FI_INLINE_DENTRY); |
