@@ -183,18 +183,35 @@ static struct file_operations fops_proxy;
183183static ssize_t ksu_rc_pos = 0 ;
184184const size_t ksu_rc_len = sizeof (KERNEL_SU_RC ) - 1 ;
185185
186- // Dynamic rc content from /metadata/watchdog/ksu/modules.rc, populated lazily at
187- // the first read/fstat of /system/etc/init/hw/init .rc.
188- #define MODULE_RC_PATH "/metadata/watchdog /ksu/modules.rc"
189- #define MODULE_RC_MAX (1u << 20) /* 1 MiB safety cap */
186+ // Prefer /metadata/watchdog/ when present, else /metadata.
187+ #define MODULE_RC_PATH_WATCHDOG "/metadata/watchdog/ksu/modules .rc"
188+ #define MODULE_RC_PATH_DEFAULT "/metadata/ksu/modules.rc"
189+ #define MODULE_RC_MAX (1u << 20) /* 1 MiB cap */
190190static char * module_rc_buf ;
191191static size_t module_rc_len ;
192192static ssize_t module_rc_pos ;
193193
194+ static struct file * open_module_rc (const char * * chosen_path )
195+ {
196+ struct file * f = filp_open (MODULE_RC_PATH_WATCHDOG , O_RDONLY , 0 );
197+ if (!IS_ERR (f )) {
198+ * chosen_path = MODULE_RC_PATH_WATCHDOG ;
199+ return f ;
200+ }
201+ f = filp_open (MODULE_RC_PATH_DEFAULT , O_RDONLY , 0 );
202+ if (!IS_ERR (f )) {
203+ * chosen_path = MODULE_RC_PATH_DEFAULT ;
204+ return f ;
205+ }
206+ * chosen_path = MODULE_RC_PATH_DEFAULT ;
207+ return f ;
208+ }
209+
194210static void load_module_rc_once (void )
195211{
196212 static bool loaded = false;
197213 struct file * f ;
214+ const char * path = NULL ;
198215 loff_t pos = 0 ;
199216 ssize_t r ;
200217 size_t fsize ;
@@ -203,14 +220,14 @@ static void load_module_rc_once(void)
203220 return ;
204221 loaded = true;
205222
206- f = filp_open ( MODULE_RC_PATH , O_RDONLY , 0 );
223+ f = open_module_rc ( & path );
207224 if (IS_ERR (f )) {
208- pr_info ("module rc: open %s failed: %ld\n" , MODULE_RC_PATH , PTR_ERR (f ));
225+ pr_info ("module rc: open failed: %ld\n" , PTR_ERR (f ));
209226 return ;
210227 }
211228
212229 if (!S_ISREG (file_inode (f )-> i_mode )) {
213- pr_warn ("module rc: %s is not a regular file\n" , MODULE_RC_PATH );
230+ pr_warn ("module rc: %s is not a regular file\n" , path );
214231 filp_close (f , NULL );
215232 return ;
216233 }
@@ -221,7 +238,7 @@ static void load_module_rc_once(void)
221238 return ;
222239 }
223240 if (fsize > MODULE_RC_MAX ) {
224- pr_warn ("module rc: %s too large (%zu), truncating to %u\n" , MODULE_RC_PATH , fsize , MODULE_RC_MAX );
241+ pr_warn ("module rc: %s too large (%zu), truncating to %u\n" , path , fsize , MODULE_RC_MAX );
225242 fsize = MODULE_RC_MAX ;
226243 }
227244
@@ -243,7 +260,7 @@ static void load_module_rc_once(void)
243260 }
244261
245262 module_rc_len = r ;
246- pr_info ("module rc: loaded %zu bytes from %s\n" , module_rc_len , MODULE_RC_PATH );
263+ pr_info ("module rc: loaded %zu bytes from %s\n" , module_rc_len , path );
247264}
248265
249266// https://cs.android.com/android/platform/superproject/main/+/main:system/core/init/parser.cpp;l=144;drc=61197364367c9e404c7da6900658f1b16c42d0da
0 commit comments