hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/f2fs/inline.c
....@@ -8,26 +8,47 @@
88
99 #include <linux/fs.h>
1010 #include <linux/f2fs_fs.h>
11
+#include <linux/fiemap.h>
1112
1213 #include "f2fs.h"
1314 #include "node.h"
15
+#include <trace/events/f2fs.h>
1416 #include <trace/events/android_fs.h>
1517
16
-bool f2fs_may_inline_data(struct inode *inode)
18
+static bool support_inline_data(struct inode *inode)
1719 {
1820 if (f2fs_is_atomic_file(inode))
1921 return false;
20
-
2122 if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))
2223 return false;
23
-
2424 if (i_size_read(inode) > MAX_INLINE_DATA(inode))
2525 return false;
26
+ return true;
27
+}
2628
27
- if (f2fs_post_read_required(inode))
29
+bool f2fs_may_inline_data(struct inode *inode)
30
+{
31
+ if (!support_inline_data(inode))
2832 return false;
2933
30
- return true;
34
+ return !f2fs_post_read_required(inode);
35
+}
36
+
37
+bool f2fs_sanity_check_inline_data(struct inode *inode)
38
+{
39
+ if (!f2fs_has_inline_data(inode))
40
+ return false;
41
+
42
+ if (!support_inline_data(inode))
43
+ return true;
44
+
45
+ /*
46
+ * used by sanity_check_inode(), when disk layout fields has not
47
+ * been synchronized to inmem fields.
48
+ */
49
+ return (S_ISREG(inode->i_mode) &&
50
+ (file_is_encrypt(inode) || file_is_verity(inode) ||
51
+ (F2FS_I(inode)->i_flags & F2FS_COMPR_FL)));
3152 }
3253
3354 bool f2fs_may_inline_dentry(struct inode *inode)
....@@ -44,7 +65,6 @@
4465 void f2fs_do_read_inline_data(struct page *page, struct page *ipage)
4566 {
4667 struct inode *inode = page->mapping->host;
47
- void *src_addr, *dst_addr;
4868
4969 if (PageUptodate(page))
5070 return;
....@@ -54,11 +74,8 @@
5474 zero_user_segment(page, MAX_INLINE_DATA(inode), PAGE_SIZE);
5575
5676 /* Copy the whole inline data block */
57
- src_addr = inline_data_addr(inode, ipage);
58
- dst_addr = kmap_atomic(page);
59
- memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
60
- flush_dcache_page(page);
61
- kunmap_atomic(dst_addr);
77
+ memcpy_to_page(page, 0, inline_data_addr(inode, ipage),
78
+ MAX_INLINE_DATA(inode));
6279 if (!PageUptodate(page))
6380 SetPageUptodate(page);
6481 }
....@@ -147,7 +164,7 @@
147164 if (err)
148165 return err;
149166
150
- err = f2fs_get_node_info(fio.sbi, dn->nid, &ni);
167
+ err = f2fs_get_node_info(fio.sbi, dn->nid, &ni, false);
151168 if (err) {
152169 f2fs_truncate_data_blocks_range(dn, 1);
153170 f2fs_put_dnode(dn);
....@@ -189,7 +206,7 @@
189206
190207 /* clear inline data and flag after data writeback */
191208 f2fs_truncate_inline_inode(dn->inode, dn->inode_page, 0);
192
- clear_inline_node(dn->inode_page);
209
+ clear_page_private_inline(dn->inode_page);
193210 clear_out:
194211 stat_dec_inline_inode(dn->inode);
195212 clear_inode_flag(dn->inode, FI_INLINE_DATA);
....@@ -204,7 +221,8 @@
204221 struct page *ipage, *page;
205222 int err = 0;
206223
207
- if (!f2fs_has_inline_data(inode))
224
+ if (!f2fs_has_inline_data(inode) ||
225
+ f2fs_hw_is_readonly(sbi) || f2fs_readonly(sbi->sb))
208226 return 0;
209227
210228 err = dquot_initialize(inode);
....@@ -242,7 +260,6 @@
242260
243261 int f2fs_write_inline_data(struct inode *inode, struct page *page)
244262 {
245
- void *src_addr, *dst_addr;
246263 struct dnode_of_data dn;
247264 int err;
248265
....@@ -259,18 +276,16 @@
259276 f2fs_bug_on(F2FS_I_SB(inode), page->index);
260277
261278 f2fs_wait_on_page_writeback(dn.inode_page, NODE, true, true);
262
- src_addr = kmap_atomic(page);
263
- dst_addr = inline_data_addr(inode, dn.inode_page);
264
- memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
265
- kunmap_atomic(src_addr);
279
+ memcpy_from_page(inline_data_addr(inode, dn.inode_page),
280
+ page, 0, MAX_INLINE_DATA(inode));
266281 set_page_dirty(dn.inode_page);
267282
268
- f2fs_clear_radix_tree_dirty_tag(page);
283
+ f2fs_clear_page_cache_dirty_tag(page);
269284
270285 set_inode_flag(inode, FI_APPEND_WRITE);
271286 set_inode_flag(inode, FI_DATA_EXIST);
272287
273
- clear_inline_node(dn.inode_page);
288
+ clear_page_private_inline(dn.inode_page);
274289 f2fs_put_dnode(&dn);
275290 return 0;
276291 }
....@@ -287,7 +302,7 @@
287302 * [prev.] [next] of inline_data flag
288303 * o o -> recover inline_data
289304 * o x -> remove inline_data, and then recover data blocks
290
- * x o -> remove inline_data, and then recover inline_data
305
+ * x o -> remove data blocks, and then recover inline_data
291306 * x x -> recover data blocks
292307 */
293308 if (IS_INODE(npage))
....@@ -319,6 +334,7 @@
319334 if (IS_ERR(ipage))
320335 return PTR_ERR(ipage);
321336 f2fs_truncate_inline_inode(inode, ipage, 0);
337
+ stat_dec_inline_inode(inode);
322338 clear_inode_flag(inode, FI_INLINE_DATA);
323339 f2fs_put_page(ipage, 1);
324340 } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
....@@ -327,6 +343,7 @@
327343 ret = f2fs_truncate_blocks(inode, 0, false);
328344 if (ret)
329345 return ret;
346
+ stat_inc_inline_inode(inode);
330347 goto process_inline;
331348 }
332349 return 0;
....@@ -353,6 +370,10 @@
353370 make_dentry_ptr_inline(dir, &d, inline_dentry);
354371 de = f2fs_find_target_dentry(&d, fname, NULL);
355372 unlock_page(ipage);
373
+ if (IS_ERR(de)) {
374
+ *res_page = ERR_CAST(de);
375
+ de = NULL;
376
+ }
356377 if (de)
357378 *res_page = ipage;
358379 else
....@@ -417,18 +438,17 @@
417438
418439 dentry_blk = page_address(page);
419440
441
+ /*
442
+ * Start by zeroing the full block, to ensure that all unused space is
443
+ * zeroed and no uninitialized memory is leaked to disk.
444
+ */
445
+ memset(dentry_blk, 0, F2FS_BLKSIZE);
446
+
420447 make_dentry_ptr_inline(dir, &src, inline_dentry);
421448 make_dentry_ptr_block(dir, &dst, dentry_blk);
422449
423450 /* copy data from inline dentry block to new dentry block */
424451 memcpy(dst.bitmap, src.bitmap, src.nr_bitmap);
425
- memset(dst.bitmap + src.nr_bitmap, 0, dst.nr_bitmap - src.nr_bitmap);
426
- /*
427
- * we do not need to zero out remainder part of dentry and filename
428
- * field, since we have used bitmap for marking the usage status of
429
- * them, besides, we can also ignore copying/zeroing reserved space
430
- * of dentry block, because them haven't been used so far.
431
- */
432452 memcpy(dst.dentry, src.dentry, SIZE_OF_DIR_ENTRY * src.max);
433453 memcpy(dst.filename, src.filename, src.max * F2FS_SLOT_LEN);
434454
....@@ -545,7 +565,7 @@
545565 !f2fs_has_inline_xattr(dir))
546566 F2FS_I(dir)->i_inline_xattr_size = 0;
547567
548
- kvfree(backup_dentry);
568
+ kfree(backup_dentry);
549569 return 0;
550570 recover:
551571 lock_page(ipage);
....@@ -556,7 +576,7 @@
556576 set_page_dirty(ipage);
557577 f2fs_put_page(ipage, 1);
558578
559
- kvfree(backup_dentry);
579
+ kfree(backup_dentry);
560580 return err;
561581 }
562582
....@@ -638,7 +658,7 @@
638658 }
639659
640660 if (inode) {
641
- down_write(&F2FS_I(inode)->i_sem);
661
+ f2fs_down_write(&F2FS_I(inode)->i_sem);
642662 page = f2fs_init_inode_metadata(inode, dir, fname, ipage);
643663 if (IS_ERR(page)) {
644664 err = PTR_ERR(page);
....@@ -667,7 +687,7 @@
667687 f2fs_update_parent_metadata(dir, inode, 0);
668688 fail:
669689 if (inode)
670
- up_write(&F2FS_I(inode)->i_sem);
690
+ f2fs_up_write(&F2FS_I(inode)->i_sem);
671691 out:
672692 f2fs_put_page(ipage, 1);
673693 return err;
....@@ -795,7 +815,7 @@
795815 ilen = start + len;
796816 ilen -= start;
797817
798
- err = f2fs_get_node_info(F2FS_I_SB(inode), inode->i_ino, &ni);
818
+ err = f2fs_get_node_info(F2FS_I_SB(inode), inode->i_ino, &ni, false);
799819 if (err)
800820 goto out;
801821
....@@ -803,6 +823,7 @@
803823 byteaddr += (char *)inline_data_addr(inode, ipage) -
804824 (char *)F2FS_INODE(ipage);
805825 err = fiemap_fill_next_extent(fieinfo, start, byteaddr, ilen, flags);
826
+ trace_f2fs_fiemap(inode, start, byteaddr, ilen, flags, err);
806827 out:
807828 f2fs_put_page(ipage, 1);
808829 return err;