Skip to content

Commit 712f10e

Browse files
committed
Fix VTOY_LINUX_REMOUNT feature in RHEL 9.4+ (ventoy#2827)
1 parent 2be340d commit 712f10e

File tree

3 files changed

+67
-30
lines changed

3 files changed

+67
-30
lines changed

DMPATCH/dmpatch.c

+67-30
Original file line numberDiff line numberDiff line change
@@ -451,39 +451,24 @@ static u64 notrace dmpatch_ibt_save(void) { return 0; }
451451
static void notrace dmpatch_ibt_restore(u64 save) { (void)save; }
452452
#endif
453453

454-
static int notrace dmpatch_init(void)
454+
static int notrace dmpatch_process(unsigned long a, unsigned long b, unsigned long c)
455455
{
456456
int r = 0;
457457
int rc = 0;
458-
u64 msr = 0;
459-
460-
if (g_ko_param.ibt == 0x8888)
461-
{
462-
msr = dmpatch_ibt_save();
463-
}
464-
465-
kprintf = (printk_pf)(g_ko_param.printk_addr);
458+
unsigned long kv_major = 0;
459+
unsigned long kv_minor = 0;
460+
unsigned long kv_subminor = 0;
466461

467-
vdebug("dmpatch_init start pagesize=%lu kernel=%lu.%lu.%lu ...\n",
468-
g_ko_param.pgsize, g_ko_param.kv_major, g_ko_param.kv_minor, g_ko_param.kv_subminor);
469-
470-
if (g_ko_param.struct_size != sizeof(ko_param))
471-
{
472-
vdebug("Invalid struct size %d %d\n", (int)g_ko_param.struct_size, (int)sizeof(ko_param));
473-
return -EINVAL;
474-
}
475-
476-
if (g_ko_param.sym_get_addr == 0 || g_ko_param.sym_put_addr == 0 ||
477-
g_ko_param.ro_addr == 0 || g_ko_param.rw_addr == 0)
478-
{
479-
return -EINVAL;
480-
}
462+
vdebug("dmpatch_process as KV %d.%d.%d ...\n", (int)a, (int)b, (int)c);
481463

482-
set_mem_ro = (set_memory_attr_pf)(g_ko_param.ro_addr);
483-
set_mem_rw = (set_memory_attr_pf)(g_ko_param.rw_addr);
484-
reg_kprobe = (kprobe_reg_pf)g_ko_param.reg_kprobe_addr;
485-
unreg_kprobe = (kprobe_unreg_pf)g_ko_param.unreg_kprobe_addr;
464+
kv_major = g_ko_param.kv_major;
465+
kv_minor = g_ko_param.kv_minor;
466+
kv_subminor = g_ko_param.kv_subminor;
486467

468+
g_ko_param.kv_major = a;
469+
g_ko_param.kv_minor = b;
470+
g_ko_param.kv_subminor = c;
471+
487472
if (dmpatch_kv_above(6, 5, 0)) /* >= kernel 6.5 */
488473
{
489474
vdebug("new interface patch dm_get_table_device...\n");
@@ -531,14 +516,66 @@ static int notrace dmpatch_init(void)
531516
vdebug("######## dm patch success ###########\n");
532517
vdebug("#####################################\n");
533518

519+
out:
520+
521+
g_ko_param.kv_major = kv_major;
522+
g_ko_param.kv_minor = kv_minor;
523+
g_ko_param.kv_subminor = kv_subminor;
524+
525+
return rc;
526+
}
527+
528+
static int notrace dmpatch_init(void)
529+
{
530+
int rc = 0;
531+
u64 msr = 0;
532+
533+
if (g_ko_param.ibt == 0x8888)
534+
{
535+
msr = dmpatch_ibt_save();
536+
}
537+
538+
kprintf = (printk_pf)(g_ko_param.printk_addr);
539+
540+
vdebug("dmpatch_init start pagesize=%lu kernel=%lu.%lu.%lu ...\n",
541+
g_ko_param.pgsize, g_ko_param.kv_major, g_ko_param.kv_minor, g_ko_param.kv_subminor);
542+
543+
if (g_ko_param.struct_size != sizeof(ko_param))
544+
{
545+
vdebug("Invalid struct size %d %d\n", (int)g_ko_param.struct_size, (int)sizeof(ko_param));
546+
return -EINVAL;
547+
}
548+
549+
if (g_ko_param.sym_get_addr == 0 || g_ko_param.sym_put_addr == 0 ||
550+
g_ko_param.ro_addr == 0 || g_ko_param.rw_addr == 0)
551+
{
552+
return -EINVAL;
553+
}
554+
555+
set_mem_ro = (set_memory_attr_pf)(g_ko_param.ro_addr);
556+
set_mem_rw = (set_memory_attr_pf)(g_ko_param.rw_addr);
557+
reg_kprobe = (kprobe_reg_pf)g_ko_param.reg_kprobe_addr;
558+
unreg_kprobe = (kprobe_unreg_pf)g_ko_param.unreg_kprobe_addr;
559+
560+
rc = dmpatch_process(g_ko_param.kv_major, g_ko_param.kv_minor, g_ko_param.kv_subminor);
561+
if (rc)
562+
{
563+
if (g_ko_param.kv_major >= 5)
564+
{
565+
rc = dmpatch_process(6, 5, 0);
566+
if (rc)
567+
{
568+
rc = dmpatch_process(6, 7, 0);
569+
}
570+
}
571+
}
572+
534573
if (g_ko_param.ibt == 0x8888)
535574
{
536575
dmpatch_ibt_restore(msr);
537576
}
538577

539-
out:
540-
541-
return rc;
578+
return rc;
542579
}
543580

544581
static void notrace dmpatch_exit(void)
704 Bytes
Binary file not shown.
704 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)