~registry/kmod/master

« back to all changes in this revision

Viewing changes to libkmod/libkmod-file.c

  • Committer: Lucas De Marchi
  • Date: 2023-06-09 17:45:51 UTC
  • Revision ID: git-v1:7a86f1292051e990507ea48888864ff19626a206
libkmod: Do not inititialize file->memory on open

Add a separate function to load the file contents when it's needed.
When it's not needed on the path of loading modules via finit_module(),
there is no need to mmap the file. This will help support loading
modules with the in-kernel compression support.

This is done differently than the lazy initialization for
kmod_file_get_elf() because on the contents case there is also the
file->size to be updated. It would be a weird API to return the pointer
and have the size changed as a side-effect.

Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>

Show diffs side-by-side

added added

removed removed

Lines of Context:
421
421
        if (file->elf)
422
422
                return file->elf;
423
423
 
 
424
        kmod_file_load_contents(file);
424
425
        file->elf = kmod_elf_new(file->memory, file->size);
425
426
        return file->elf;
426
427
}
431
432
        struct kmod_file *file = calloc(1, sizeof(struct kmod_file));
432
433
        const struct comp_type *itr;
433
434
        size_t magic_size_max = 0;
434
 
        int err;
 
435
        int err = 0;
435
436
 
436
437
        if (file == NULL)
437
438
                return NULL;
477
478
        if (file->ops == NULL)
478
479
                file->ops = &reg_ops;
479
480
 
480
 
        err = file->ops->load(file);
481
481
        file->ctx = ctx;
 
482
 
482
483
error:
483
484
        if (err < 0) {
484
485
                if (file->fd >= 0)
491
492
        return file;
492
493
}
493
494
 
 
495
/*
 
496
 *  Callers should just check file->memory got updated
 
497
 */
 
498
void kmod_file_load_contents(struct kmod_file *file)
 
499
{
 
500
        if (file->memory)
 
501
                return;
 
502
 
 
503
        /*  The load functions already log possible errors. */
 
504
        file->ops->load(file);
 
505
}
 
506
 
494
507
void *kmod_file_get_contents(const struct kmod_file *file)
495
508
{
496
509
        return file->memory;
516
529
        if (file->elf)
517
530
                kmod_elf_unref(file->elf);
518
531
 
519
 
        file->ops->unload(file);
 
532
        if (file->memory)
 
533
                file->ops->unload(file);
 
534
 
520
535
        if (file->fd >= 0)
521
536
                close(file->fd);
522
537
        free(file);