aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs/inline.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/f2fs/inline.c')
-rw-r--r--fs/f2fs/inline.c43
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
106int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) 106int 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);
141no_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);
162clear_out: 146clear_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
294struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir, 279struct 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
552int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, 537int 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;