mirror of https://github.com/OpenIPC/firmware.git
154 lines
5.0 KiB
Diff
154 lines
5.0 KiB
Diff
diff -drupN a/fs/ext4/inode.c b/fs/ext4/inode.c
|
|
--- a/fs/ext4/inode.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/fs/ext4/inode.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -44,6 +44,7 @@
|
|
#include "truncate.h"
|
|
|
|
#include <trace/events/ext4.h>
|
|
+#include <trace/events/android_fs.h>
|
|
|
|
#define MPAGE_DA_EXTENT_TAIL 0x01
|
|
|
|
@@ -1165,7 +1166,8 @@ static int ext4_block_write_begin(struct
|
|
if (unlikely(err))
|
|
page_zero_new_buffers(page, from, to);
|
|
else if (decrypt)
|
|
- err = fscrypt_decrypt_page(page);
|
|
+ err = fscrypt_decrypt_page(page->mapping->host, page,
|
|
+ PAGE_SIZE, 0, page->index);
|
|
return err;
|
|
}
|
|
#endif
|
|
@@ -1182,6 +1184,16 @@ static int ext4_write_begin(struct file
|
|
pgoff_t index;
|
|
unsigned from, to;
|
|
|
|
+ if (trace_android_fs_datawrite_start_enabled()) {
|
|
+ char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
|
|
+
|
|
+ path = android_fstrace_get_pathname(pathbuf,
|
|
+ MAX_TRACE_PATHBUF_LEN,
|
|
+ inode);
|
|
+ trace_android_fs_datawrite_start(inode, pos, len,
|
|
+ current->pid, path,
|
|
+ current->comm);
|
|
+ }
|
|
trace_ext4_write_begin(inode, pos, len, flags);
|
|
/*
|
|
* Reserve one block more for addition to orphan list in case
|
|
@@ -1320,6 +1332,7 @@ static int ext4_write_end(struct file *f
|
|
int i_size_changed = 0;
|
|
int inline_data = ext4_has_inline_data(inode);
|
|
|
|
+ trace_android_fs_datawrite_end(inode, pos, len);
|
|
trace_ext4_write_end(inode, pos, len, copied);
|
|
if (inline_data) {
|
|
ret = ext4_write_inline_data_end(inode, pos, len,
|
|
@@ -1425,6 +1438,7 @@ static int ext4_journalled_write_end(str
|
|
int size_changed = 0;
|
|
int inline_data = ext4_has_inline_data(inode);
|
|
|
|
+ trace_android_fs_datawrite_end(inode, pos, len);
|
|
trace_ext4_journalled_write_end(inode, pos, len, copied);
|
|
from = pos & (PAGE_SIZE - 1);
|
|
to = from + len;
|
|
@@ -2921,6 +2935,16 @@ static int ext4_da_write_begin(struct fi
|
|
len, flags, pagep, fsdata);
|
|
}
|
|
*fsdata = (void *)0;
|
|
+ if (trace_android_fs_datawrite_start_enabled()) {
|
|
+ char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
|
|
+
|
|
+ path = android_fstrace_get_pathname(pathbuf,
|
|
+ MAX_TRACE_PATHBUF_LEN,
|
|
+ inode);
|
|
+ trace_android_fs_datawrite_start(inode, pos, len,
|
|
+ current->pid,
|
|
+ path, current->comm);
|
|
+ }
|
|
trace_ext4_da_write_begin(inode, pos, len, flags);
|
|
|
|
if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {
|
|
@@ -3039,6 +3063,7 @@ static int ext4_da_write_end(struct file
|
|
return ext4_write_end(file, mapping, pos,
|
|
len, copied, page, fsdata);
|
|
|
|
+ trace_android_fs_datawrite_end(inode, pos, len);
|
|
trace_ext4_da_write_end(inode, pos, len, copied);
|
|
start = pos & (PAGE_SIZE - 1);
|
|
end = start + copied - 1;
|
|
@@ -3602,6 +3627,7 @@ static ssize_t ext4_direct_IO(struct kio
|
|
size_t count = iov_iter_count(iter);
|
|
loff_t offset = iocb->ki_pos;
|
|
ssize_t ret;
|
|
+ int rw = iov_iter_rw(iter);
|
|
|
|
#ifdef CONFIG_EXT4_FS_ENCRYPTION
|
|
if (ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode))
|
|
@@ -3618,12 +3644,42 @@ static ssize_t ext4_direct_IO(struct kio
|
|
if (ext4_has_inline_data(inode))
|
|
return 0;
|
|
|
|
+ if (trace_android_fs_dataread_start_enabled() &&
|
|
+ (rw == READ)) {
|
|
+ char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
|
|
+
|
|
+ path = android_fstrace_get_pathname(pathbuf,
|
|
+ MAX_TRACE_PATHBUF_LEN,
|
|
+ inode);
|
|
+ trace_android_fs_dataread_start(inode, offset, count,
|
|
+ current->pid, path,
|
|
+ current->comm);
|
|
+ }
|
|
+ if (trace_android_fs_datawrite_start_enabled() &&
|
|
+ (rw == WRITE)) {
|
|
+ char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
|
|
+
|
|
+ path = android_fstrace_get_pathname(pathbuf,
|
|
+ MAX_TRACE_PATHBUF_LEN,
|
|
+ inode);
|
|
+ trace_android_fs_datawrite_start(inode, offset, count,
|
|
+ current->pid, path,
|
|
+ current->comm);
|
|
+ }
|
|
trace_ext4_direct_IO_enter(inode, offset, count, iov_iter_rw(iter));
|
|
if (iov_iter_rw(iter) == READ)
|
|
ret = ext4_direct_IO_read(iocb, iter);
|
|
else
|
|
ret = ext4_direct_IO_write(iocb, iter);
|
|
trace_ext4_direct_IO_exit(inode, offset, count, iov_iter_rw(iter), ret);
|
|
+
|
|
+ if (trace_android_fs_dataread_start_enabled() &&
|
|
+ (rw == READ))
|
|
+ trace_android_fs_dataread_end(inode, offset, count);
|
|
+ if (trace_android_fs_datawrite_start_enabled() &&
|
|
+ (rw == WRITE))
|
|
+ trace_android_fs_datawrite_end(inode, offset, count);
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
@@ -3774,7 +3830,8 @@ static int __ext4_block_zero_page_range(
|
|
/* We expect the key to be set. */
|
|
BUG_ON(!fscrypt_has_encryption_key(inode));
|
|
BUG_ON(blocksize != PAGE_SIZE);
|
|
- WARN_ON_ONCE(fscrypt_decrypt_page(page));
|
|
+ WARN_ON_ONCE(fscrypt_decrypt_page(page->mapping->host,
|
|
+ page, PAGE_SIZE, 0, page->index));
|
|
}
|
|
}
|
|
if (ext4_should_journal_data(inode)) {
|
|
@@ -4392,8 +4449,11 @@ void ext4_set_inode_flags(struct inode *
|
|
new_fl |= S_DIRSYNC;
|
|
if (test_opt(inode->i_sb, DAX) && S_ISREG(inode->i_mode))
|
|
new_fl |= S_DAX;
|
|
+ if (flags & EXT4_ENCRYPT_FL)
|
|
+ new_fl |= S_ENCRYPTED;
|
|
inode_set_flags(inode, new_fl,
|
|
- S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|S_DAX);
|
|
+ S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|S_DAX|
|
|
+ S_ENCRYPTED);
|
|
}
|
|
|
|
/* Propagate flags from i_flags to EXT4_I(inode)->i_flags */
|