forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
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)
....@@ -147,7 +168,7 @@
147168 if (err)
148169 return err;
149170
150
- err = f2fs_get_node_info(fio.sbi, dn->nid, &ni);
171
+ err = f2fs_get_node_info(fio.sbi, dn->nid, &ni, false);
151172 if (err) {
152173 f2fs_truncate_data_blocks_range(dn, 1);
153174 f2fs_put_dnode(dn);
....@@ -189,7 +210,7 @@
189210
190211 /* clear inline data and flag after data writeback */
191212 f2fs_truncate_inline_inode(dn->inode, dn->inode_page, 0);
192
- clear_inline_node(dn->inode_page);
213
+ clear_page_private_inline(dn->inode_page);
193214 clear_out:
194215 stat_dec_inline_inode(dn->inode);
195216 clear_inode_flag(dn->inode, FI_INLINE_DATA);
....@@ -204,7 +225,8 @@
204225 struct page *ipage, *page;
205226 int err = 0;
206227
207
- if (!f2fs_has_inline_data(inode))
228
+ if (!f2fs_has_inline_data(inode) ||
229
+ f2fs_hw_is_readonly(sbi) || f2fs_readonly(sbi->sb))
208230 return 0;
209231
210232 err = dquot_initialize(inode);
....@@ -265,12 +287,12 @@
265287 kunmap_atomic(src_addr);
266288 set_page_dirty(dn.inode_page);
267289
268
- f2fs_clear_radix_tree_dirty_tag(page);
290
+ f2fs_clear_page_cache_dirty_tag(page);
269291
270292 set_inode_flag(inode, FI_APPEND_WRITE);
271293 set_inode_flag(inode, FI_DATA_EXIST);
272294
273
- clear_inline_node(dn.inode_page);
295
+ clear_page_private_inline(dn.inode_page);
274296 f2fs_put_dnode(&dn);
275297 return 0;
276298 }
....@@ -287,7 +309,7 @@
287309 * [prev.] [next] of inline_data flag
288310 * o o -> recover inline_data
289311 * o x -> remove inline_data, and then recover data blocks
290
- * x o -> remove inline_data, and then recover inline_data
312
+ * x o -> remove data blocks, and then recover inline_data
291313 * x x -> recover data blocks
292314 */
293315 if (IS_INODE(npage))
....@@ -319,6 +341,7 @@
319341 if (IS_ERR(ipage))
320342 return PTR_ERR(ipage);
321343 f2fs_truncate_inline_inode(inode, ipage, 0);
344
+ stat_dec_inline_inode(inode);
322345 clear_inode_flag(inode, FI_INLINE_DATA);
323346 f2fs_put_page(ipage, 1);
324347 } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
....@@ -327,6 +350,7 @@
327350 ret = f2fs_truncate_blocks(inode, 0, false);
328351 if (ret)
329352 return ret;
353
+ stat_inc_inline_inode(inode);
330354 goto process_inline;
331355 }
332356 return 0;
....@@ -353,6 +377,10 @@
353377 make_dentry_ptr_inline(dir, &d, inline_dentry);
354378 de = f2fs_find_target_dentry(&d, fname, NULL);
355379 unlock_page(ipage);
380
+ if (IS_ERR(de)) {
381
+ *res_page = ERR_CAST(de);
382
+ de = NULL;
383
+ }
356384 if (de)
357385 *res_page = ipage;
358386 else
....@@ -545,7 +573,7 @@
545573 !f2fs_has_inline_xattr(dir))
546574 F2FS_I(dir)->i_inline_xattr_size = 0;
547575
548
- kvfree(backup_dentry);
576
+ kfree(backup_dentry);
549577 return 0;
550578 recover:
551579 lock_page(ipage);
....@@ -556,7 +584,7 @@
556584 set_page_dirty(ipage);
557585 f2fs_put_page(ipage, 1);
558586
559
- kvfree(backup_dentry);
587
+ kfree(backup_dentry);
560588 return err;
561589 }
562590
....@@ -638,7 +666,7 @@
638666 }
639667
640668 if (inode) {
641
- down_write(&F2FS_I(inode)->i_sem);
669
+ f2fs_down_write(&F2FS_I(inode)->i_sem);
642670 page = f2fs_init_inode_metadata(inode, dir, fname, ipage);
643671 if (IS_ERR(page)) {
644672 err = PTR_ERR(page);
....@@ -667,7 +695,7 @@
667695 f2fs_update_parent_metadata(dir, inode, 0);
668696 fail:
669697 if (inode)
670
- up_write(&F2FS_I(inode)->i_sem);
698
+ f2fs_up_write(&F2FS_I(inode)->i_sem);
671699 out:
672700 f2fs_put_page(ipage, 1);
673701 return err;
....@@ -795,7 +823,7 @@
795823 ilen = start + len;
796824 ilen -= start;
797825
798
- err = f2fs_get_node_info(F2FS_I_SB(inode), inode->i_ino, &ni);
826
+ err = f2fs_get_node_info(F2FS_I_SB(inode), inode->i_ino, &ni, false);
799827 if (err)
800828 goto out;
801829
....@@ -803,6 +831,7 @@
803831 byteaddr += (char *)inline_data_addr(inode, ipage) -
804832 (char *)F2FS_INODE(ipage);
805833 err = fiemap_fill_next_extent(fieinfo, start, byteaddr, ilen, flags);
834
+ trace_f2fs_fiemap(inode, start, byteaddr, ilen, flags, err);
806835 out:
807836 f2fs_put_page(ipage, 1);
808837 return err;