diff options
Diffstat (limited to 'fs/f2fs/inline.c')
-rw-r--r-- | fs/f2fs/inline.c | 43 |
1 files changed, 14 insertions, 29 deletions
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index c3f0b7d4cfca..358214e9f707 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c | |||
@@ -71,7 +71,7 @@ bool truncate_inline_inode(struct page *ipage, u64 from) | |||
71 | 71 | ||
72 | addr = inline_data_addr(ipage); | 72 | addr = inline_data_addr(ipage); |
73 | 73 | ||
74 | f2fs_wait_on_page_writeback(ipage, NODE); | 74 | f2fs_wait_on_page_writeback(ipage, NODE, true); |
75 | memset(addr + from, 0, MAX_INLINE_DATA - from); | 75 | memset(addr + from, 0, MAX_INLINE_DATA - from); |
76 | 76 | ||
77 | return true; | 77 | return true; |
@@ -105,7 +105,6 @@ int f2fs_read_inline_data(struct inode *inode, struct page *page) | |||
105 | 105 | ||
106 | int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) | 106 | int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) |
107 | { | 107 | { |
108 | void *src_addr, *dst_addr; | ||
109 | struct f2fs_io_info fio = { | 108 | struct f2fs_io_info fio = { |
110 | .sbi = F2FS_I_SB(dn->inode), | 109 | .sbi = F2FS_I_SB(dn->inode), |
111 | .type = DATA, | 110 | .type = DATA, |
@@ -115,8 +114,6 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) | |||
115 | }; | 114 | }; |
116 | int dirty, err; | 115 | int dirty, err; |
117 | 116 | ||
118 | f2fs_bug_on(F2FS_I_SB(dn->inode), page->index); | ||
119 | |||
120 | if (!f2fs_exist_data(dn->inode)) | 117 | if (!f2fs_exist_data(dn->inode)) |
121 | goto clear_out; | 118 | goto clear_out; |
122 | 119 | ||
@@ -124,21 +121,9 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) | |||
124 | if (err) | 121 | if (err) |
125 | return err; | 122 | return err; |
126 | 123 | ||
127 | f2fs_wait_on_page_writeback(page, DATA); | 124 | f2fs_bug_on(F2FS_P_SB(page), PageWriteback(page)); |
128 | |||
129 | if (PageUptodate(page)) | ||
130 | goto no_update; | ||
131 | |||
132 | zero_user_segment(page, MAX_INLINE_DATA, PAGE_CACHE_SIZE); | ||
133 | 125 | ||
134 | /* Copy the whole inline data block */ | 126 | read_inline_data(page, dn->inode_page); |
135 | src_addr = inline_data_addr(dn->inode_page); | ||
136 | dst_addr = kmap_atomic(page); | ||
137 | memcpy(dst_addr, src_addr, MAX_INLINE_DATA); | ||
138 | flush_dcache_page(page); | ||
139 | kunmap_atomic(dst_addr); | ||
140 | SetPageUptodate(page); | ||
141 | no_update: | ||
142 | set_page_dirty(page); | 127 | set_page_dirty(page); |
143 | 128 | ||
144 | /* clear dirty state */ | 129 | /* clear dirty state */ |
@@ -146,11 +131,9 @@ no_update: | |||
146 | 131 | ||
147 | /* write data page to try to make data consistent */ | 132 | /* write data page to try to make data consistent */ |
148 | set_page_writeback(page); | 133 | set_page_writeback(page); |
149 | fio.blk_addr = dn->data_blkaddr; | 134 | fio.old_blkaddr = dn->data_blkaddr; |
150 | write_data_page(dn, &fio); | 135 | write_data_page(dn, &fio); |
151 | set_data_blkaddr(dn); | 136 | f2fs_wait_on_page_writeback(page, DATA, true); |
152 | f2fs_update_extent_cache(dn); | ||
153 | f2fs_wait_on_page_writeback(page, DATA); | ||
154 | if (dirty) | 137 | if (dirty) |
155 | inode_dec_dirty_pages(dn->inode); | 138 | inode_dec_dirty_pages(dn->inode); |
156 | 139 | ||
@@ -159,6 +142,7 @@ no_update: | |||
159 | 142 | ||
160 | /* clear inline data and flag after data writeback */ | 143 | /* clear inline data and flag after data writeback */ |
161 | truncate_inline_inode(dn->inode_page, 0); | 144 | truncate_inline_inode(dn->inode_page, 0); |
145 | clear_inline_node(dn->inode_page); | ||
162 | clear_out: | 146 | clear_out: |
163 | stat_dec_inline_inode(dn->inode); | 147 | stat_dec_inline_inode(dn->inode); |
164 | f2fs_clear_inline_inode(dn->inode); | 148 | f2fs_clear_inline_inode(dn->inode); |
@@ -223,7 +207,7 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page) | |||
223 | 207 | ||
224 | f2fs_bug_on(F2FS_I_SB(inode), page->index); | 208 | f2fs_bug_on(F2FS_I_SB(inode), page->index); |
225 | 209 | ||
226 | f2fs_wait_on_page_writeback(dn.inode_page, NODE); | 210 | f2fs_wait_on_page_writeback(dn.inode_page, NODE, true); |
227 | src_addr = kmap_atomic(page); | 211 | src_addr = kmap_atomic(page); |
228 | dst_addr = inline_data_addr(dn.inode_page); | 212 | dst_addr = inline_data_addr(dn.inode_page); |
229 | memcpy(dst_addr, src_addr, MAX_INLINE_DATA); | 213 | memcpy(dst_addr, src_addr, MAX_INLINE_DATA); |
@@ -233,6 +217,7 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page) | |||
233 | set_inode_flag(F2FS_I(inode), FI_DATA_EXIST); | 217 | set_inode_flag(F2FS_I(inode), FI_DATA_EXIST); |
234 | 218 | ||
235 | sync_inode_page(&dn); | 219 | sync_inode_page(&dn); |
220 | clear_inline_node(dn.inode_page); | ||
236 | f2fs_put_dnode(&dn); | 221 | f2fs_put_dnode(&dn); |
237 | return 0; | 222 | return 0; |
238 | } | 223 | } |
@@ -261,7 +246,7 @@ process_inline: | |||
261 | ipage = get_node_page(sbi, inode->i_ino); | 246 | ipage = get_node_page(sbi, inode->i_ino); |
262 | f2fs_bug_on(sbi, IS_ERR(ipage)); | 247 | f2fs_bug_on(sbi, IS_ERR(ipage)); |
263 | 248 | ||
264 | f2fs_wait_on_page_writeback(ipage, NODE); | 249 | f2fs_wait_on_page_writeback(ipage, NODE, true); |
265 | 250 | ||
266 | src_addr = inline_data_addr(npage); | 251 | src_addr = inline_data_addr(npage); |
267 | dst_addr = inline_data_addr(ipage); | 252 | dst_addr = inline_data_addr(ipage); |
@@ -292,7 +277,7 @@ process_inline: | |||
292 | } | 277 | } |
293 | 278 | ||
294 | struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir, | 279 | struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir, |
295 | struct f2fs_filename *fname, struct page **res_page) | 280 | struct fscrypt_name *fname, struct page **res_page) |
296 | { | 281 | { |
297 | struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb); | 282 | struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb); |
298 | struct f2fs_inline_dentry *inline_dentry; | 283 | struct f2fs_inline_dentry *inline_dentry; |
@@ -389,7 +374,7 @@ static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage, | |||
389 | if (err) | 374 | if (err) |
390 | goto out; | 375 | goto out; |
391 | 376 | ||
392 | f2fs_wait_on_page_writeback(page, DATA); | 377 | f2fs_wait_on_page_writeback(page, DATA, true); |
393 | zero_user_segment(page, MAX_INLINE_DATA, PAGE_CACHE_SIZE); | 378 | zero_user_segment(page, MAX_INLINE_DATA, PAGE_CACHE_SIZE); |
394 | 379 | ||
395 | dentry_blk = kmap_atomic(page); | 380 | dentry_blk = kmap_atomic(page); |
@@ -469,7 +454,7 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name, | |||
469 | } | 454 | } |
470 | } | 455 | } |
471 | 456 | ||
472 | f2fs_wait_on_page_writeback(ipage, NODE); | 457 | f2fs_wait_on_page_writeback(ipage, NODE, true); |
473 | 458 | ||
474 | name_hash = f2fs_dentry_hash(name); | 459 | name_hash = f2fs_dentry_hash(name); |
475 | make_dentry_ptr(NULL, &d, (void *)dentry_blk, 2); | 460 | make_dentry_ptr(NULL, &d, (void *)dentry_blk, 2); |
@@ -507,7 +492,7 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page, | |||
507 | int i; | 492 | int i; |
508 | 493 | ||
509 | lock_page(page); | 494 | lock_page(page); |
510 | f2fs_wait_on_page_writeback(page, NODE); | 495 | f2fs_wait_on_page_writeback(page, NODE, true); |
511 | 496 | ||
512 | inline_dentry = inline_data_addr(page); | 497 | inline_dentry = inline_data_addr(page); |
513 | bit_pos = dentry - inline_dentry->dentry; | 498 | bit_pos = dentry - inline_dentry->dentry; |
@@ -550,7 +535,7 @@ bool f2fs_empty_inline_dir(struct inode *dir) | |||
550 | } | 535 | } |
551 | 536 | ||
552 | int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, | 537 | int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, |
553 | struct f2fs_str *fstr) | 538 | struct fscrypt_str *fstr) |
554 | { | 539 | { |
555 | struct inode *inode = file_inode(file); | 540 | struct inode *inode = file_inode(file); |
556 | struct f2fs_inline_dentry *inline_dentry = NULL; | 541 | struct f2fs_inline_dentry *inline_dentry = NULL; |