Linux 6.10-rc7
[linux-block.git] / fs / f2fs / inline.c
CommitLineData
7c1a000d 1// SPDX-License-Identifier: GPL-2.0
e18c65b2
HL
2/*
3 * fs/f2fs/inline.c
4 * Copyright (c) 2013, Intel Corporation
5 * Authors: Huajun Li <huajun.li@intel.com>
6 * Haicheng Li <haicheng.li@intel.com>
e18c65b2
HL
7 */
8
9#include <linux/fs.h>
10#include <linux/f2fs_fs.h>
10c5db28 11#include <linux/fiemap.h>
e18c65b2
HL
12
13#include "f2fs.h"
67f8cf3c 14#include "node.h"
dd5a09bd 15#include <trace/events/f2fs.h>
e18c65b2 16
677a82b4 17static bool support_inline_data(struct inode *inode)
e18c65b2 18{
88b88a66
JK
19 if (f2fs_is_atomic_file(inode))
20 return false;
368a0e40 21 if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))
e18c65b2 22 return false;
f2470371 23 if (i_size_read(inode) > MAX_INLINE_DATA(inode))
92dffd01 24 return false;
677a82b4
CY
25 return true;
26}
27
28bool f2fs_may_inline_data(struct inode *inode)
29{
30 if (!support_inline_data(inode))
31 return false;
32
33 return !f2fs_post_read_required(inode);
34}
92dffd01 35
677a82b4
CY
36bool f2fs_sanity_check_inline_data(struct inode *inode)
37{
38 if (!f2fs_has_inline_data(inode))
fcc85a4d
JK
39 return false;
40
677a82b4
CY
41 if (!support_inline_data(inode))
42 return true;
43
44 /*
45 * used by sanity_check_inode(), when disk layout fields has not
46 * been synchronized to inmem fields.
47 */
48 return (S_ISREG(inode->i_mode) &&
49 (file_is_encrypt(inode) || file_is_verity(inode) ||
50 (F2FS_I(inode)->i_flags & F2FS_COMPR_FL)));
e18c65b2
HL
51}
52
01b960e9
JK
53bool f2fs_may_inline_dentry(struct inode *inode)
54{
55 if (!test_opt(F2FS_I_SB(inode), INLINE_DENTRY))
56 return false;
57
58 if (!S_ISDIR(inode->i_mode))
59 return false;
60
61 return true;
62}
63
96ea46f3 64void f2fs_do_read_inline_data(struct folio *folio, struct page *ipage)
e18c65b2 65{
96ea46f3 66 struct inode *inode = folio_file_mapping(folio)->host;
e18c65b2 67
96ea46f3 68 if (folio_test_uptodate(folio))
b3d208f9 69 return;
04a17fb1 70
96ea46f3 71 f2fs_bug_on(F2FS_I_SB(inode), folio_index(folio));
e18c65b2 72
96ea46f3 73 folio_zero_segment(folio, MAX_INLINE_DATA(inode), folio_size(folio));
e18c65b2
HL
74
75 /* Copy the whole inline data block */
96ea46f3 76 memcpy_to_folio(folio, 0, inline_data_addr(inode, ipage),
b87846bd 77 MAX_INLINE_DATA(inode));
96ea46f3
CY
78 if (!folio_test_uptodate(folio))
79 folio_mark_uptodate(folio);
b3d208f9
JK
80}
81
4d57b86d
CY
82void f2fs_truncate_inline_inode(struct inode *inode,
83 struct page *ipage, u64 from)
feeb0deb 84{
0bfcfcca
CY
85 void *addr;
86
f2470371 87 if (from >= MAX_INLINE_DATA(inode))
bd4667cb 88 return;
0bfcfcca 89
f2470371 90 addr = inline_data_addr(inode, ipage);
0bfcfcca 91
bae0ee7a 92 f2fs_wait_on_page_writeback(ipage, NODE, true, true);
f2470371 93 memset(addr + from, 0, MAX_INLINE_DATA(inode) - from);
ee6d182f 94 set_page_dirty(ipage);
bd4667cb
KM
95
96 if (from == 0)
97 clear_inode_flag(inode, FI_DATA_EXIST);
feeb0deb
CY
98}
99
96ea46f3 100int f2fs_read_inline_data(struct inode *inode, struct folio *folio)
b3d208f9
JK
101{
102 struct page *ipage;
103
4d57b86d 104 ipage = f2fs_get_node_page(F2FS_I_SB(inode), inode->i_ino);
b3d208f9 105 if (IS_ERR(ipage)) {
96ea46f3 106 folio_unlock(folio);
b3d208f9
JK
107 return PTR_ERR(ipage);
108 }
e18c65b2 109
b3d208f9
JK
110 if (!f2fs_has_inline_data(inode)) {
111 f2fs_put_page(ipage, 1);
112 return -EAGAIN;
113 }
114
96ea46f3
CY
115 if (folio_index(folio))
116 folio_zero_segment(folio, 0, folio_size(folio));
b3d208f9 117 else
96ea46f3 118 f2fs_do_read_inline_data(folio, ipage);
b3d208f9 119
96ea46f3
CY
120 if (!folio_test_uptodate(folio))
121 folio_mark_uptodate(folio);
b3d208f9 122 f2fs_put_page(ipage, 1);
96ea46f3 123 folio_unlock(folio);
e18c65b2
HL
124 return 0;
125}
126
b3d208f9 127int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
e18c65b2 128{
e18c65b2 129 struct f2fs_io_info fio = {
05ca3632 130 .sbi = F2FS_I_SB(dn->inode),
39d787be 131 .ino = dn->inode->i_ino,
e18c65b2 132 .type = DATA,
04d328de 133 .op = REQ_OP_WRITE,
70fd7614 134 .op_flags = REQ_SYNC | REQ_PRIO,
05ca3632 135 .page = page,
4375a336 136 .encrypted_page = NULL,
b0af6d49 137 .io_type = FS_DATA_IO,
e18c65b2 138 };
7735730d 139 struct node_info ni;
158c194c 140 int dirty, err;
e18c65b2 141
b3d208f9
JK
142 if (!f2fs_exist_data(dn->inode))
143 goto clear_out;
ec4e7af4 144
b3d208f9 145 err = f2fs_reserve_block(dn, 0);
15c6e3aa 146 if (err)
b3d208f9 147 return err;
e18c65b2 148
a9419b63 149 err = f2fs_get_node_info(fio.sbi, dn->nid, &ni, false);
7735730d 150 if (err) {
e8c82c11 151 f2fs_truncate_data_blocks_range(dn, 1);
7735730d
CY
152 f2fs_put_dnode(dn);
153 return err;
154 }
155
156 fio.version = ni.version;
157
4dbe38dc
CY
158 if (unlikely(dn->data_blkaddr != NEW_ADDR)) {
159 f2fs_put_dnode(dn);
160 set_sbi_flag(fio.sbi, SBI_NEED_FSCK);
dcbb4c10
JP
161 f2fs_warn(fio.sbi, "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, run fsck to fix.",
162 __func__, dn->inode->i_ino, dn->data_blkaddr);
95fa90c9 163 f2fs_handle_error(fio.sbi, ERROR_INVALID_BLKADDR);
10f966bb 164 return -EFSCORRUPTED;
4dbe38dc
CY
165 }
166
16778aea 167 f2fs_bug_on(F2FS_P_SB(page), folio_test_writeback(page_folio(page)));
b3d208f9 168
96ea46f3 169 f2fs_do_read_inline_data(page_folio(page), dn->inode_page);
6282adbf
JK
170 set_page_dirty(page);
171
158c194c
JK
172 /* clear dirty state */
173 dirty = clear_page_dirty_for_io(page);
174
e18c65b2
HL
175 /* write data page to try to make data consistent */
176 set_page_writeback(page);
7a9d7548 177 fio.old_blkaddr = dn->data_blkaddr;
ef095d19 178 set_inode_flag(dn->inode, FI_HOT_DATA);
4d57b86d 179 f2fs_outplace_write_data(dn, &fio);
bae0ee7a 180 f2fs_wait_on_page_writeback(page, DATA, true, true);
933439c8 181 if (dirty) {
158c194c 182 inode_dec_dirty_pages(dn->inode);
4d57b86d 183 f2fs_remove_dirty_inode(dn->inode);
933439c8 184 }
e18c65b2 185
95f5b0fc 186 /* this converted inline_data should be recovered. */
91942321 187 set_inode_flag(dn->inode, FI_APPEND_WRITE);
95f5b0fc 188
e18c65b2 189 /* clear inline data and flag after data writeback */
4d57b86d 190 f2fs_truncate_inline_inode(dn->inode, dn->inode_page, 0);
b763f3be 191 clear_page_private_inline(dn->inode_page);
b3d208f9 192clear_out:
b3d208f9 193 stat_dec_inline_inode(dn->inode);
bd4667cb 194 clear_inode_flag(dn->inode, FI_INLINE_DATA);
b3d208f9
JK
195 f2fs_put_dnode(dn);
196 return 0;
e18c65b2
HL
197}
198
b3d208f9 199int f2fs_convert_inline_inode(struct inode *inode)
e18c65b2 200{
b3d208f9
JK
201 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
202 struct dnode_of_data dn;
203 struct page *ipage, *page;
204 int err = 0;
e18c65b2 205
ec2ddf49
JK
206 if (!f2fs_has_inline_data(inode) ||
207 f2fs_hw_is_readonly(sbi) || f2fs_readonly(sbi->sb))
b9d777b8
JK
208 return 0;
209
10a26878 210 err = f2fs_dquot_initialize(inode);
25fb04db
YC
211 if (err)
212 return err;
213
300e129c 214 page = f2fs_grab_cache_page(inode->i_mapping, 0, false);
b3d208f9
JK
215 if (!page)
216 return -ENOMEM;
e18c65b2 217
b3d208f9
JK
218 f2fs_lock_op(sbi);
219
4d57b86d 220 ipage = f2fs_get_node_page(sbi, inode->i_ino);
b3d208f9 221 if (IS_ERR(ipage)) {
6d20aff8
JK
222 err = PTR_ERR(ipage);
223 goto out;
b067ba1f 224 }
e18c65b2 225
b3d208f9
JK
226 set_new_dnode(&dn, inode, ipage, ipage, 0);
227
228 if (f2fs_has_inline_data(inode))
229 err = f2fs_convert_inline_page(&dn, page);
230
231 f2fs_put_dnode(&dn);
6d20aff8 232out:
b3d208f9
JK
233 f2fs_unlock_op(sbi);
234
235 f2fs_put_page(page, 1);
2a340760 236
28e18ee6
CIK
237 if (!err)
238 f2fs_balance_fs(sbi, dn.node_changed);
2a340760 239
e18c65b2
HL
240 return err;
241}
242
b3d208f9 243int f2fs_write_inline_data(struct inode *inode, struct page *page)
e18c65b2 244{
e18c65b2
HL
245 struct dnode_of_data dn;
246 int err;
247
248 set_new_dnode(&dn, inode, NULL, NULL, 0);
4d57b86d 249 err = f2fs_get_dnode_of_data(&dn, 0, LOOKUP_NODE);
e18c65b2
HL
250 if (err)
251 return err;
e18c65b2 252
c08a690b 253 if (!f2fs_has_inline_data(inode)) {
b3d208f9
JK
254 f2fs_put_dnode(&dn);
255 return -EAGAIN;
c08a690b
JK
256 }
257
b3d208f9
JK
258 f2fs_bug_on(F2FS_I_SB(inode), page->index);
259
bae0ee7a 260 f2fs_wait_on_page_writeback(dn.inode_page, NODE, true, true);
b87846bd
EB
261 memcpy_from_page(inline_data_addr(inode, dn.inode_page),
262 page, 0, MAX_INLINE_DATA(inode));
ee6d182f 263 set_page_dirty(dn.inode_page);
e18c65b2 264
5ec2d99d 265 f2fs_clear_page_cache_dirty_tag(page);
0abd8e70 266
91942321
JK
267 set_inode_flag(inode, FI_APPEND_WRITE);
268 set_inode_flag(inode, FI_DATA_EXIST);
b3d208f9 269
b763f3be 270 clear_page_private_inline(dn.inode_page);
e18c65b2 271 f2fs_put_dnode(&dn);
e18c65b2
HL
272 return 0;
273}
1e1bb4ba 274
9627a7b3 275int f2fs_recover_inline_data(struct inode *inode, struct page *npage)
1e1bb4ba 276{
4081363f 277 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1e1bb4ba
JK
278 struct f2fs_inode *ri = NULL;
279 void *src_addr, *dst_addr;
280 struct page *ipage;
281
282 /*
283 * The inline_data recovery policy is as follows.
284 * [prev.] [next] of inline_data flag
285 * o o -> recover inline_data
286 * o x -> remove inline_data, and then recover data blocks
6e5ca4fc 287 * x o -> remove data blocks, and then recover inline_data
1e1bb4ba
JK
288 * x x -> recover data blocks
289 */
290 if (IS_INODE(npage))
291 ri = F2FS_INODE(npage);
292
293 if (f2fs_has_inline_data(inode) &&
0342fd30 294 ri && (ri->i_inline & F2FS_INLINE_DATA)) {
1e1bb4ba 295process_inline:
4d57b86d 296 ipage = f2fs_get_node_page(sbi, inode->i_ino);
9627a7b3
CY
297 if (IS_ERR(ipage))
298 return PTR_ERR(ipage);
1e1bb4ba 299
bae0ee7a 300 f2fs_wait_on_page_writeback(ipage, NODE, true, true);
54b591df 301
f2470371
CY
302 src_addr = inline_data_addr(inode, npage);
303 dst_addr = inline_data_addr(inode, ipage);
304 memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
b3d208f9 305
91942321
JK
306 set_inode_flag(inode, FI_INLINE_DATA);
307 set_inode_flag(inode, FI_DATA_EXIST);
b3d208f9 308
ee6d182f 309 set_page_dirty(ipage);
1e1bb4ba 310 f2fs_put_page(ipage, 1);
9627a7b3 311 return 1;
1e1bb4ba
JK
312 }
313
314 if (f2fs_has_inline_data(inode)) {
4d57b86d 315 ipage = f2fs_get_node_page(sbi, inode->i_ino);
9627a7b3
CY
316 if (IS_ERR(ipage))
317 return PTR_ERR(ipage);
4d57b86d 318 f2fs_truncate_inline_inode(inode, ipage, 0);
84921561 319 stat_dec_inline_inode(inode);
bd4667cb 320 clear_inode_flag(inode, FI_INLINE_DATA);
1e1bb4ba 321 f2fs_put_page(ipage, 1);
0342fd30 322 } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
9627a7b3
CY
323 int ret;
324
325 ret = f2fs_truncate_blocks(inode, 0, false);
326 if (ret)
327 return ret;
84921561 328 stat_inc_inline_inode(inode);
1e1bb4ba
JK
329 goto process_inline;
330 }
9627a7b3 331 return 0;
1e1bb4ba 332}
201a05be 333
4d57b86d 334struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,
43c780ba
EB
335 const struct f2fs_filename *fname,
336 struct page **res_page)
201a05be
CY
337{
338 struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
201a05be 339 struct f2fs_dir_entry *de;
7b3cd7d6 340 struct f2fs_dentry_ptr d;
4e6ebf6d 341 struct page *ipage;
f2470371 342 void *inline_dentry;
201a05be 343
4d57b86d 344 ipage = f2fs_get_node_page(sbi, dir->i_ino);
42d96401
JK
345 if (IS_ERR(ipage)) {
346 *res_page = ipage;
201a05be 347 return NULL;
42d96401 348 }
201a05be 349
f2470371 350 inline_dentry = inline_data_addr(dir, ipage);
201a05be 351
f2470371 352 make_dentry_ptr_inline(dir, &d, inline_dentry);
43c780ba 353 de = f2fs_find_target_dentry(&d, fname, NULL);
201a05be 354 unlock_page(ipage);
7ad08a58
DR
355 if (IS_ERR(de)) {
356 *res_page = ERR_CAST(de);
357 de = NULL;
358 }
4e6ebf6d
JK
359 if (de)
360 *res_page = ipage;
361 else
362 f2fs_put_page(ipage, 0);
363
201a05be
CY
364 return de;
365}
366
4d57b86d 367int f2fs_make_empty_inline_dir(struct inode *inode, struct inode *parent,
201a05be
CY
368 struct page *ipage)
369{
062a3e7b 370 struct f2fs_dentry_ptr d;
f2470371 371 void *inline_dentry;
201a05be 372
f2470371 373 inline_dentry = inline_data_addr(inode, ipage);
201a05be 374
f2470371 375 make_dentry_ptr_inline(inode, &d, inline_dentry);
4d57b86d 376 f2fs_do_make_empty_dir(inode, parent, &d);
201a05be
CY
377
378 set_page_dirty(ipage);
379
380 /* update i_size to MAX_INLINE_DATA */
f2470371
CY
381 if (i_size_read(inode) < MAX_INLINE_DATA(inode))
382 f2fs_i_size_write(inode, MAX_INLINE_DATA(inode));
201a05be
CY
383 return 0;
384}
385
470f00e9
CY
386/*
387 * NOTE: ipage is grabbed by caller, but if any error occurs, we should
388 * release ipage in this function.
389 */
675f10bd 390static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
f2470371 391 void *inline_dentry)
201a05be
CY
392{
393 struct page *page;
394 struct dnode_of_data dn;
395 struct f2fs_dentry_block *dentry_blk;
76a9dd85 396 struct f2fs_dentry_ptr src, dst;
201a05be
CY
397 int err;
398
dd973007 399 page = f2fs_grab_cache_page(dir->i_mapping, 0, true);
470f00e9
CY
400 if (!page) {
401 f2fs_put_page(ipage, 1);
201a05be 402 return -ENOMEM;
470f00e9 403 }
201a05be
CY
404
405 set_new_dnode(&dn, dir, ipage, NULL, 0);
406 err = f2fs_reserve_block(&dn, 0);
407 if (err)
408 goto out;
409
4dbe38dc
CY
410 if (unlikely(dn.data_blkaddr != NEW_ADDR)) {
411 f2fs_put_dnode(&dn);
412 set_sbi_flag(F2FS_P_SB(page), SBI_NEED_FSCK);
dcbb4c10
JP
413 f2fs_warn(F2FS_P_SB(page), "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, run fsck to fix.",
414 __func__, dir->i_ino, dn.data_blkaddr);
95fa90c9 415 f2fs_handle_error(F2FS_P_SB(page), ERROR_INVALID_BLKADDR);
10f966bb 416 err = -EFSCORRUPTED;
4dbe38dc
CY
417 goto out;
418 }
419
bae0ee7a 420 f2fs_wait_on_page_writeback(page, DATA, true, true);
201a05be 421
bdbc90fa 422 dentry_blk = page_address(page);
201a05be 423
9a5571cf
EB
424 /*
425 * Start by zeroing the full block, to ensure that all unused space is
426 * zeroed and no uninitialized memory is leaked to disk.
427 */
428 memset(dentry_blk, 0, F2FS_BLKSIZE);
429
f2470371
CY
430 make_dentry_ptr_inline(dir, &src, inline_dentry);
431 make_dentry_ptr_block(dir, &dst, dentry_blk);
76a9dd85 432
201a05be 433 /* copy data from inline dentry block to new dentry block */
76a9dd85 434 memcpy(dst.bitmap, src.bitmap, src.nr_bitmap);
76a9dd85
CY
435 memcpy(dst.dentry, src.dentry, SIZE_OF_DIR_ENTRY * src.max);
436 memcpy(dst.filename, src.filename, src.max * F2FS_SLOT_LEN);
201a05be 437
237c0790
JK
438 if (!PageUptodate(page))
439 SetPageUptodate(page);
201a05be
CY
440 set_page_dirty(page);
441
442 /* clear inline dir and flag after data writeback */
4d57b86d 443 f2fs_truncate_inline_inode(dir, ipage, 0);
b3d208f9 444
3289c061 445 stat_dec_inline_dir(dir);
91942321 446 clear_inode_flag(dir, FI_INLINE_DENTRY);
201a05be 447
45a74688
CY
448 /*
449 * should retrieve reserved space which was used to keep
450 * inline_dentry's structure for backward compatibility.
451 */
452 if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
453 !f2fs_has_inline_xattr(dir))
454 F2FS_I(dir)->i_inline_xattr_size = 0;
455
205b9822 456 f2fs_i_depth_write(dir, 1);
ee6d182f 457 if (i_size_read(dir) < PAGE_SIZE)
fc9581c8 458 f2fs_i_size_write(dir, PAGE_SIZE);
201a05be
CY
459out:
460 f2fs_put_page(page, 1);
461 return err;
462}
463
f2470371 464static int f2fs_add_inline_entries(struct inode *dir, void *inline_dentry)
675f10bd
CY
465{
466 struct f2fs_dentry_ptr d;
467 unsigned long bit_pos = 0;
468 int err = 0;
469
f2470371 470 make_dentry_ptr_inline(dir, &d, inline_dentry);
675f10bd
CY
471
472 while (bit_pos < d.max) {
473 struct f2fs_dir_entry *de;
43c780ba 474 struct f2fs_filename fname;
675f10bd
CY
475 nid_t ino;
476 umode_t fake_mode;
477
478 if (!test_bit_le(bit_pos, d.bitmap)) {
479 bit_pos++;
480 continue;
481 }
482
483 de = &d.dentry[bit_pos];
a4a13f58
CY
484
485 if (unlikely(!de->name_len)) {
486 bit_pos++;
487 continue;
488 }
489
43c780ba
EB
490 /*
491 * We only need the disk_name and hash to move the dentry.
492 * We don't need the original or casefolded filenames.
493 */
494 memset(&fname, 0, sizeof(fname));
495 fname.disk_name.name = d.filename[bit_pos];
496 fname.disk_name.len = le16_to_cpu(de->name_len);
497 fname.hash = de->hash_code;
675f10bd
CY
498
499 ino = le32_to_cpu(de->ino);
0c9f4521 500 fake_mode = fs_ftype_to_dtype(de->file_type) << S_DT_SHIFT;
675f10bd 501
43c780ba 502 err = f2fs_add_regular_entry(dir, &fname, NULL, ino, fake_mode);
675f10bd
CY
503 if (err)
504 goto punch_dentry_pages;
505
675f10bd
CY
506 bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
507 }
508 return 0;
509punch_dentry_pages:
510 truncate_inode_pages(&dir->i_data, 0);
c42d28ce 511 f2fs_truncate_blocks(dir, 0, false);
4d57b86d 512 f2fs_remove_dirty_inode(dir);
675f10bd
CY
513 return err;
514}
515
516static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
f2470371 517 void *inline_dentry)
675f10bd 518{
f2470371 519 void *backup_dentry;
675f10bd
CY
520 int err;
521
1ecc0c5c 522 backup_dentry = f2fs_kmalloc(F2FS_I_SB(dir),
f2470371 523 MAX_INLINE_DATA(dir), GFP_F2FS_ZERO);
8975bdf4
CY
524 if (!backup_dentry) {
525 f2fs_put_page(ipage, 1);
675f10bd 526 return -ENOMEM;
8975bdf4 527 }
675f10bd 528
f2470371 529 memcpy(backup_dentry, inline_dentry, MAX_INLINE_DATA(dir));
4d57b86d 530 f2fs_truncate_inline_inode(dir, ipage, 0);
675f10bd
CY
531
532 unlock_page(ipage);
533
534 err = f2fs_add_inline_entries(dir, backup_dentry);
535 if (err)
536 goto recover;
537
538 lock_page(ipage);
539
540 stat_dec_inline_dir(dir);
91942321 541 clear_inode_flag(dir, FI_INLINE_DENTRY);
45a74688
CY
542
543 /*
544 * should retrieve reserved space which was used to keep
545 * inline_dentry's structure for backward compatibility.
546 */
547 if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
548 !f2fs_has_inline_xattr(dir))
549 F2FS_I(dir)->i_inline_xattr_size = 0;
550
c8eb7024 551 kfree(backup_dentry);
675f10bd
CY
552 return 0;
553recover:
554 lock_page(ipage);
bae0ee7a 555 f2fs_wait_on_page_writeback(ipage, NODE, true, true);
f2470371 556 memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA(dir));
205b9822 557 f2fs_i_depth_write(dir, 0);
f2470371 558 f2fs_i_size_write(dir, MAX_INLINE_DATA(dir));
ee6d182f 559 set_page_dirty(ipage);
675f10bd
CY
560 f2fs_put_page(ipage, 1);
561
c8eb7024 562 kfree(backup_dentry);
675f10bd
CY
563 return err;
564}
565
b06af2af 566static int do_convert_inline_dir(struct inode *dir, struct page *ipage,
f2470371 567 void *inline_dentry)
675f10bd
CY
568{
569 if (!F2FS_I(dir)->i_dir_level)
570 return f2fs_move_inline_dirents(dir, ipage, inline_dentry);
571 else
572 return f2fs_move_rehashed_dirents(dir, ipage, inline_dentry);
573}
574
b06af2af
JK
575int f2fs_try_convert_inline_dir(struct inode *dir, struct dentry *dentry)
576{
577 struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
578 struct page *ipage;
43c780ba 579 struct f2fs_filename fname;
b06af2af
JK
580 void *inline_dentry = NULL;
581 int err = 0;
582
583 if (!f2fs_has_inline_dentry(dir))
584 return 0;
585
586 f2fs_lock_op(sbi);
587
43c780ba 588 err = f2fs_setup_filename(dir, &dentry->d_name, 0, &fname);
b06af2af
JK
589 if (err)
590 goto out;
591
592 ipage = f2fs_get_node_page(sbi, dir->i_ino);
593 if (IS_ERR(ipage)) {
594 err = PTR_ERR(ipage);
ff5f85c8 595 goto out_fname;
b06af2af
JK
596 }
597
598 if (f2fs_has_enough_room(dir, ipage, &fname)) {
599 f2fs_put_page(ipage, 1);
ff5f85c8 600 goto out_fname;
b06af2af
JK
601 }
602
603 inline_dentry = inline_data_addr(dir, ipage);
604
605 err = do_convert_inline_dir(dir, ipage, inline_dentry);
606 if (!err)
607 f2fs_put_page(ipage, 1);
ff5f85c8 608out_fname:
43c780ba 609 f2fs_free_filename(&fname);
b06af2af
JK
610out:
611 f2fs_unlock_op(sbi);
612 return err;
613}
614
43c780ba
EB
615int f2fs_add_inline_entry(struct inode *dir, const struct f2fs_filename *fname,
616 struct inode *inode, nid_t ino, umode_t mode)
201a05be
CY
617{
618 struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
619 struct page *ipage;
620 unsigned int bit_pos;
f2470371 621 void *inline_dentry = NULL;
3b4d732a 622 struct f2fs_dentry_ptr d;
43c780ba 623 int slots = GET_DENTRY_SLOTS(fname->disk_name.len);
510022a8 624 struct page *page = NULL;
201a05be 625 int err = 0;
201a05be 626
4d57b86d 627 ipage = f2fs_get_node_page(sbi, dir->i_ino);
201a05be
CY
628 if (IS_ERR(ipage))
629 return PTR_ERR(ipage);
630
f2470371
CY
631 inline_dentry = inline_data_addr(dir, ipage);
632 make_dentry_ptr_inline(dir, &d, inline_dentry);
76a9dd85 633
4d57b86d 634 bit_pos = f2fs_room_for_filename(d.bitmap, slots, d.max);
76a9dd85 635 if (bit_pos >= d.max) {
b06af2af 636 err = do_convert_inline_dir(dir, ipage, inline_dentry);
470f00e9
CY
637 if (err)
638 return err;
639 err = -EAGAIN;
201a05be
CY
640 goto out;
641 }
642
510022a8 643 if (inode) {
5c13e238
JK
644 f2fs_down_write_nested(&F2FS_I(inode)->i_sem,
645 SINGLE_DEPTH_NESTING);
43c780ba 646 page = f2fs_init_inode_metadata(inode, dir, fname, ipage);
510022a8
JK
647 if (IS_ERR(page)) {
648 err = PTR_ERR(page);
649 goto fail;
650 }
201a05be 651 }
bce8d112 652
bae0ee7a 653 f2fs_wait_on_page_writeback(ipage, NODE, true, true);
3b4d732a 654
43c780ba
EB
655 f2fs_update_dentry(ino, mode, &d, &fname->disk_name, fname->hash,
656 bit_pos);
3b4d732a 657
201a05be
CY
658 set_page_dirty(ipage);
659
660 /* we don't need to mark_inode_dirty now */
510022a8 661 if (inode) {
205b9822 662 f2fs_i_pino_write(inode, dir->i_ino);
98194030
CY
663
664 /* synchronize inode page's data from inode cache */
665 if (is_inode_flag_set(inode, FI_NEW_INODE))
666 f2fs_update_inode(inode, page);
667
510022a8
JK
668 f2fs_put_page(page, 1);
669 }
201a05be 670
4d57b86d 671 f2fs_update_parent_metadata(dir, inode, 0);
201a05be 672fail:
510022a8 673 if (inode)
e4544b63 674 f2fs_up_write(&F2FS_I(inode)->i_sem);
201a05be
CY
675out:
676 f2fs_put_page(ipage, 1);
677 return err;
678}
679
680void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
681 struct inode *dir, struct inode *inode)
682{
76a9dd85 683 struct f2fs_dentry_ptr d;
f2470371 684 void *inline_dentry;
201a05be
CY
685 int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len));
686 unsigned int bit_pos;
687 int i;
688
689 lock_page(page);
bae0ee7a 690 f2fs_wait_on_page_writeback(page, NODE, true, true);
201a05be 691
f2470371
CY
692 inline_dentry = inline_data_addr(dir, page);
693 make_dentry_ptr_inline(dir, &d, inline_dentry);
76a9dd85
CY
694
695 bit_pos = dentry - d.dentry;
201a05be 696 for (i = 0; i < slots; i++)
76a9dd85 697 __clear_bit_le(bit_pos + i, d.bitmap);
201a05be
CY
698
699 set_page_dirty(page);
9f7c45cc 700 f2fs_put_page(page, 1);
201a05be 701
11cc6426 702 inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
7c45729a 703 f2fs_mark_inode_dirty_sync(dir, false);
201a05be
CY
704
705 if (inode)
9f7c45cc 706 f2fs_drop_nlink(dir, inode);
201a05be
CY
707}
708
709bool f2fs_empty_inline_dir(struct inode *dir)
710{
711 struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
712 struct page *ipage;
713 unsigned int bit_pos = 2;
f2470371 714 void *inline_dentry;
76a9dd85 715 struct f2fs_dentry_ptr d;
201a05be 716
4d57b86d 717 ipage = f2fs_get_node_page(sbi, dir->i_ino);
201a05be
CY
718 if (IS_ERR(ipage))
719 return false;
720
f2470371
CY
721 inline_dentry = inline_data_addr(dir, ipage);
722 make_dentry_ptr_inline(dir, &d, inline_dentry);
76a9dd85
CY
723
724 bit_pos = find_next_bit_le(d.bitmap, d.max, bit_pos);
201a05be
CY
725
726 f2fs_put_page(ipage, 1);
727
76a9dd85 728 if (bit_pos < d.max)
201a05be
CY
729 return false;
730
731 return true;
732}
733
d8c6822a 734int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx,
0b81d077 735 struct fscrypt_str *fstr)
201a05be
CY
736{
737 struct inode *inode = file_inode(file);
201a05be 738 struct page *ipage = NULL;
7b3cd7d6 739 struct f2fs_dentry_ptr d;
f2470371 740 void *inline_dentry = NULL;
ed6bd4b1 741 int err;
201a05be 742
76a9dd85
CY
743 make_dentry_ptr_inline(inode, &d, inline_dentry);
744
745 if (ctx->pos == d.max)
201a05be
CY
746 return 0;
747
4d57b86d 748 ipage = f2fs_get_node_page(F2FS_I_SB(inode), inode->i_ino);
201a05be
CY
749 if (IS_ERR(ipage))
750 return PTR_ERR(ipage);
751
aadcef64
CY
752 /*
753 * f2fs_readdir was protected by inode.i_rwsem, it is safe to access
754 * ipage without page's lock held.
755 */
756 unlock_page(ipage);
757
f2470371 758 inline_dentry = inline_data_addr(inode, ipage);
201a05be 759
64c24ecb 760 make_dentry_ptr_inline(inode, &d, inline_dentry);
7b3cd7d6 761
ed6bd4b1
CY
762 err = f2fs_fill_dentries(ctx, &d, 0, fstr);
763 if (!err)
76a9dd85 764 ctx->pos = d.max;
201a05be 765
aadcef64 766 f2fs_put_page(ipage, 0);
ed6bd4b1 767 return err < 0 ? err : 0;
201a05be 768}
67f8cf3c
JK
769
770int f2fs_inline_data_fiemap(struct inode *inode,
771 struct fiemap_extent_info *fieinfo, __u64 start, __u64 len)
772{
773 __u64 byteaddr, ilen;
774 __u32 flags = FIEMAP_EXTENT_DATA_INLINE | FIEMAP_EXTENT_NOT_ALIGNED |
775 FIEMAP_EXTENT_LAST;
776 struct node_info ni;
777 struct page *ipage;
778 int err = 0;
779
4d57b86d 780 ipage = f2fs_get_node_page(F2FS_I_SB(inode), inode->i_ino);
67f8cf3c
JK
781 if (IS_ERR(ipage))
782 return PTR_ERR(ipage);
783
7975f349
CY
784 if ((S_ISREG(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
785 !f2fs_has_inline_data(inode)) {
786 err = -EAGAIN;
787 goto out;
788 }
789
790 if (S_ISDIR(inode->i_mode) && !f2fs_has_inline_dentry(inode)) {
67f8cf3c
JK
791 err = -EAGAIN;
792 goto out;
793 }
794
f2470371 795 ilen = min_t(size_t, MAX_INLINE_DATA(inode), i_size_read(inode));
67f8cf3c
JK
796 if (start >= ilen)
797 goto out;
798 if (start + len < ilen)
799 ilen = start + len;
800 ilen -= start;
801
a9419b63 802 err = f2fs_get_node_info(F2FS_I_SB(inode), inode->i_ino, &ni, false);
7735730d
CY
803 if (err)
804 goto out;
805
67f8cf3c 806 byteaddr = (__u64)ni.blk_addr << inode->i_sb->s_blocksize_bits;
f2470371
CY
807 byteaddr += (char *)inline_data_addr(inode, ipage) -
808 (char *)F2FS_INODE(ipage);
67f8cf3c 809 err = fiemap_fill_next_extent(fieinfo, start, byteaddr, ilen, flags);
dd5a09bd 810 trace_f2fs_fiemap(inode, start, byteaddr, ilen, flags, err);
67f8cf3c
JK
811out:
812 f2fs_put_page(ipage, 1);
813 return err;
814}