diff --git a/kernel/apk_sign.c b/kernel/apk_sign.c index 3d3d0c5a..dd522172 100644 --- a/kernel/apk_sign.c +++ b/kernel/apk_sign.c @@ -259,7 +259,7 @@ static bool has_v1_signature_file(struct file *fp) * possibly optional * */ -static bool is_lock_held(const char *path) +bool is_lock_held(const char *path) { struct path kpath; diff --git a/kernel/throne_tracker.c b/kernel/throne_tracker.c index 1c45df4b..673234b0 100644 --- a/kernel/throne_tracker.c +++ b/kernel/throne_tracker.c @@ -439,13 +439,6 @@ static int throne_tracker_thread(void *data) void track_throne(void) { - static bool throne_tracker_first_run __read_mostly = true; - if (unlikely(throne_tracker_first_run)) { - track_throne_function(); - throne_tracker_first_run = false; - return; - } - smp_mb(); if (throne_thread != NULL) // single instance lock return; diff --git a/kernel/user_data_scanner.c b/kernel/user_data_scanner.c index c33842a7..a56a0ea0 100644 --- a/kernel/user_data_scanner.c +++ b/kernel/user_data_scanner.c @@ -24,6 +24,8 @@ #define KERN_PATH_TIMEOUT_MS 100 #define MAX_FUSE_CHECK_RETRIES 3 +extern bool is_lock_held(const char *path); + static struct workqueue_struct *scan_workqueue; struct work_buffers *get_work_buffer(void) @@ -216,6 +218,16 @@ static int process_deferred_paths(struct list_head *deferred_paths, struct list_ continue; } + int tries = 0; + do { + if (!is_lock_held(path_info->path)) + break; + + tries++; + pr_info("%s: waiting for lock on %s (try %d)\n", __func__, path_info->path, tries); + msleep(100); + } while (tries < 10); + struct kstat stat; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0) || defined(KSU_HAS_NEW_VFS_GETATTR) err = vfs_getattr(&path, &stat, STATX_UID, AT_STATX_SYNC_AS_STAT);