From e4d293dc33b5fa97b7965447fe6c3f6796af01c9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 21 Feb 2022 19:08:47 +0100 Subject: [PATCH 1/4] Revert "ANDROID: vendor_hooks: Add hooks for binder proc transaction" This reverts commit cb7e10d31bca4f247c34d6791d6db048edf7e7a8. The hook android_vh_binder_proc_transaction_finish is not used by any vendor, so remove it to help with merge issues with future LTS releases. If this is needed by any real user, it can easily be reverted to add it back and then the symbol should be added to the abi list at the same time to prevent it from being removed again later. Bug: 203756332 Bug: 208910215 Cc: Liujie Xie Signed-off-by: Greg Kroah-Hartman Change-Id: I19c6660c138dc88e554e62d309484d75ec24dc6c --- drivers/android/binder.c | 3 +-- drivers/android/vendor_hooks.c | 1 - include/trace/hooks/binder.h | 5 ----- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index b4941e5ca357..c51478a185cc 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -2535,8 +2535,7 @@ static int binder_proc_transaction(struct binder_transaction *t, trace_android_vh_binder_proc_transaction_end(current, proc->tsk, thread ? thread->task : NULL, t->code, pending_async, !oneway); - trace_android_vh_binder_proc_transaction_finish(proc, t, - thread ? thread->task : NULL, pending_async, !oneway); + if (!pending_async) binder_wakeup_thread_ilocked(proc, thread, !oneway /* sync */); diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 5dba08ab132e..ef6b8e851608 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -279,7 +279,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_binder_transaction); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_preset); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_proc_transaction); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_proc_transaction_end); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_proc_transaction_finish); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_new_ref); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_del_ref); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_post_init_entity_util_avg); diff --git a/include/trace/hooks/binder.h b/include/trace/hooks/binder.h index 63a9b19d7e7d..42d974f76573 100644 --- a/include/trace/hooks/binder.h +++ b/include/trace/hooks/binder.h @@ -69,10 +69,6 @@ DECLARE_HOOK(android_vh_binder_proc_transaction_end, struct task_struct *binder_th_task, unsigned int code, bool pending_async, bool sync), TP_ARGS(caller_task, binder_proc_task, binder_th_task, code, pending_async, sync)); -DECLARE_HOOK(android_vh_binder_proc_transaction_finish, - TP_PROTO(struct binder_proc *proc, struct binder_transaction *t, - struct task_struct *binder_th_task, bool pending_async, bool sync), - TP_ARGS(proc, t, binder_th_task, pending_async, sync)); DECLARE_HOOK(android_vh_binder_new_ref, TP_PROTO(struct task_struct *proc, uint32_t ref_desc, int node_debug_id), TP_ARGS(proc, ref_desc, node_debug_id)); @@ -102,7 +98,6 @@ DECLARE_HOOK(android_vh_binder_read_done, DECLARE_HOOK(android_vh_binder_has_work_ilocked, TP_PROTO(struct binder_thread *thread, bool do_proc_work, int *ret), TP_ARGS(thread, do_proc_work, ret)); - /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_BINDER_H */ From 07630c80731a93d066b6365b53a033841baebd54 Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Fri, 4 Feb 2022 15:20:46 +0000 Subject: [PATCH 2/4] Revert "ANDROID: incremental-fs: fix mount_fs issue" This reverts commit 93717b608dd30f9d41b15a72e809238807c68026. Test: Can now install the same apk twice, and repeated installs are stable Bug: 217661925 Signed-off-by: Paul Lawrence Change-Id: I86871c364c17a0d1107b3891a574b72edcf04ea2 (cherry picked from commit d107cd06f26b4d45b1079c7eb857815905198076) Signed-off-by: Steve Muckle --- fs/incfs/vfs.c | 58 +++++++++++++------------------------------------- fs/incfs/vfs.h | 1 + 2 files changed, 16 insertions(+), 43 deletions(-) diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c index 84f9932233c4..8d21f6decaee 100644 --- a/fs/incfs/vfs.c +++ b/fs/incfs/vfs.c @@ -393,7 +393,7 @@ static int iterate_incfs_dir(struct file *file, struct dir_context *ctx) struct mount_info *mi = get_mount_info(file_superblock(file)); bool root; - if (!dir || !mi) { + if (!dir) { error = -EBADF; goto out; } @@ -1336,9 +1336,6 @@ static int dir_rename(struct inode *old_dir, struct dentry *old_dentry, struct dentry *trap; int error = 0; - if (!mi) - return -EBADF; - error = mutex_lock_interruptible(&mi->mi_dir_struct_mutex); if (error) return error; @@ -1667,9 +1664,6 @@ static ssize_t incfs_getxattr(struct dentry *d, const char *name, size_t stored_size; int i; - if (!mi) - return -EBADF; - if (di && di->backing_path.dentry) return vfs_getxattr(di->backing_path.dentry, name, value, size); @@ -1704,9 +1698,6 @@ static ssize_t incfs_setxattr(struct dentry *d, const char *name, size_t *stored_size; int i; - if (!mi) - return -EBADF; - if (di && di->backing_path.dentry) return vfs_setxattr(di->backing_path.dentry, name, value, size, flags); @@ -1745,11 +1736,6 @@ static ssize_t incfs_listxattr(struct dentry *d, char *list, size_t size) return vfs_listxattr(di->backing_path.dentry, list, size); } -static int incfs_test_super(struct super_block *s, void *p) -{ - return s->s_fs_info != NULL; -} - struct dentry *incfs_mount_fs(struct file_system_type *type, int flags, const char *dev_name, void *data) { @@ -1760,8 +1746,7 @@ struct dentry *incfs_mount_fs(struct file_system_type *type, int flags, struct dentry *incomplete_dir = NULL; struct super_block *src_fs_sb = NULL; struct inode *root_inode = NULL; - struct super_block *sb = sget(type, incfs_test_super, set_anon_super, - flags, NULL); + struct super_block *sb = sget(type, NULL, set_anon_super, flags, NULL); int error = 0; if (IS_ERR(sb)) @@ -1802,18 +1787,13 @@ struct dentry *incfs_mount_fs(struct file_system_type *type, int flags, src_fs_sb = backing_dir_path.dentry->d_sb; sb->s_maxbytes = src_fs_sb->s_maxbytes; - if (!sb->s_fs_info) { - mi = incfs_alloc_mount_info(sb, &options, &backing_dir_path); + mi = incfs_alloc_mount_info(sb, &options, &backing_dir_path); - if (IS_ERR_OR_NULL(mi)) { - error = PTR_ERR(mi); - pr_err("incfs: Error allocating mount info. %d\n", error); - mi = NULL; - goto err; - } - sb->s_fs_info = mi; - } else { - mi = sb->s_fs_info; + if (IS_ERR_OR_NULL(mi)) { + error = PTR_ERR(mi); + pr_err("incfs: Error allocating mount info. %d\n", error); + mi = NULL; + goto err; } index_dir = open_or_create_special_dir(backing_dir_path.dentry, @@ -1838,22 +1818,21 @@ struct dentry *incfs_mount_fs(struct file_system_type *type, int flags, } mi->mi_incomplete_dir = incomplete_dir; + sb->s_fs_info = mi; root_inode = fetch_regular_inode(sb, backing_dir_path.dentry); if (IS_ERR(root_inode)) { error = PTR_ERR(root_inode); goto err; } + sb->s_root = d_make_root(root_inode); if (!sb->s_root) { - sb->s_root = d_make_root(root_inode); - if (!sb->s_root) { - error = -ENOMEM; - goto err; - } - error = incfs_init_dentry(sb->s_root, &backing_dir_path); - if (error) - goto err; + error = -ENOMEM; + goto err; } + error = incfs_init_dentry(sb->s_root, &backing_dir_path); + if (error) + goto err; mi->mi_backing_dir_path = backing_dir_path; sb->s_flags |= SB_ACTIVE; @@ -1876,9 +1855,6 @@ static int incfs_remount_fs(struct super_block *sb, int *flags, char *data) struct mount_info *mi = get_mount_info(sb); int err = 0; - if (!mi) - return err; - sync_filesystem(sb); err = parse_options(&options, (char *)data); if (err) @@ -1912,16 +1888,12 @@ void incfs_kill_sb(struct super_block *sb) kill_anon_super(sb); incfs_free_mount_info(mi); - sb->s_fs_info = NULL; } static int show_options(struct seq_file *m, struct dentry *root) { struct mount_info *mi = get_mount_info(root->d_sb); - if (!mi) - return -EBADF; - seq_printf(m, ",read_timeout_ms=%u", mi->mi_options.read_timeout_ms); seq_printf(m, ",readahead=%u", mi->mi_options.readahead_pages); if (mi->mi_options.read_log_pages != 0) { diff --git a/fs/incfs/vfs.h b/fs/incfs/vfs.h index 8876e63a8b0f..79fdf243733d 100644 --- a/fs/incfs/vfs.h +++ b/fs/incfs/vfs.h @@ -19,6 +19,7 @@ static inline struct mount_info *get_mount_info(struct super_block *sb) { struct mount_info *result = sb->s_fs_info; + WARN_ON(!result); return result; } From 5db3e72c57d3b87cb0ac0fc204156ce0c56e8411 Mon Sep 17 00:00:00 2001 From: Tadeusz Struk Date: Wed, 23 Feb 2022 10:47:36 -0800 Subject: [PATCH 3/4] Revert "ANDROID: incremental-fs: remove index and incomplete dir on umount" This reverts commit 6f915dd2af92ade13d280d83fcce327161b9573c. This is follow up cleanup after revert of: "Revert "ANDROID: incremental-fs: fix mount_fs issue" Bug: 220805927 Signed-off-by: Tadeusz Struk Change-Id: I2ff42145dd586ae6ae4c76c3136e1fad14c08952 --- fs/incfs/data_mgmt.c | 1 + fs/incfs/vfs.c | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/fs/incfs/data_mgmt.c b/fs/incfs/data_mgmt.c index fbab68a280d5..a383c5b5ad7f 100644 --- a/fs/incfs/data_mgmt.c +++ b/fs/incfs/data_mgmt.c @@ -175,6 +175,7 @@ void incfs_free_mount_info(struct mount_info *mi) kfree(mi->pseudo_file_xattr[i].data); kfree(mi->mi_per_uid_read_timeouts); incfs_free_sysfs_node(mi->mi_sysfs_node); + kfree(mi->mi_options.sysfs_name); kfree(mi); } diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c index 8d21f6decaee..ea7866fbfd6e 100644 --- a/fs/incfs/vfs.c +++ b/fs/incfs/vfs.c @@ -1834,11 +1834,10 @@ struct dentry *incfs_mount_fs(struct file_system_type *type, int flags, if (error) goto err; - mi->mi_backing_dir_path = backing_dir_path; + path_put(&backing_dir_path); sb->s_flags |= SB_ACTIVE; pr_debug("incfs: mount\n"); - free_options(&options); return dget(sb->s_root); err: sb->s_fs_info = NULL; @@ -1880,13 +1879,9 @@ out: void incfs_kill_sb(struct super_block *sb) { struct mount_info *mi = sb->s_fs_info; - struct inode *dinode = d_inode(mi->mi_backing_dir_path.dentry); pr_debug("incfs: unmount\n"); - vfs_rmdir(dinode, mi->mi_index_dir); - vfs_rmdir(dinode, mi->mi_incomplete_dir); - - kill_anon_super(sb); + generic_shutdown_super(sb); incfs_free_mount_info(mi); } From b9b8fd203dba3f17f85a0f7ea3b6bf490e6e53f5 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 21 Feb 2022 11:03:13 +0100 Subject: [PATCH 4/4] UPSTREAM: lib/iov_iter: initialize "flags" in new pipe_buffer commit 9d2231c5d74e13b2a0546fee6737ee4446017903 upstream. The functions copy_page_to_iter_pipe() and push_pipe() can both allocate a new pipe_buffer, but the "flags" member initializer is missing. Fixes: 241699cd72a8 ("new iov_iter flavour: pipe-backed") To: Alexander Viro To: linux-fsdevel@vger.kernel.org To: linux-kernel@vger.kernel.org Cc: stable@vger.kernel.org Signed-off-by: Max Kellermann Signed-off-by: Al Viro Signed-off-by: Greg Kroah-Hartman (cherry picked from commit b19ec7afa9297d862ed86443e0164643b97250ab) Bug: 220741611 Signed-off-by: Greg Kroah-Hartman Change-Id: I91076a0b6327ee8dd87e75fc875062b6adf2de4c --- lib/iov_iter.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index b364231b5fc8..1b0a349fbcd9 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -407,6 +407,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by return 0; buf->ops = &page_cache_pipe_buf_ops; + buf->flags = 0; get_page(page); buf->page = page; buf->offset = offset; @@ -543,6 +544,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size, break; buf->ops = &default_pipe_buf_ops; + buf->flags = 0; buf->page = page; buf->offset = 0; buf->len = min_t(ssize_t, left, PAGE_SIZE);