Ejemplo n.º 1
0
int efivars_sysfs_init(void)
{
    struct kobject *parent_kobj = efivars_kobject();
    int error = 0;

    if (!efi_enabled(EFI_RUNTIME_SERVICES))
        return -ENODEV;

    /* No efivars has been registered yet */
    if (!parent_kobj)
        return 0;

    printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION,
           EFIVARS_DATE);

    efivars_kset = kset_create_and_add("vars", NULL, parent_kobj);
    if (!efivars_kset) {
        printk(KERN_ERR "efivars: Subsystem registration failed.\n");
        return -ENOMEM;
    }

    efivar_init(efivars_sysfs_callback, NULL, false,
                true, &efivar_sysfs_list);

    error = create_efivars_bin_attributes();
    if (error) {
        efivars_sysfs_exit();
        return error;
    }

    INIT_WORK(&efivar_work, efivar_update_sysfs_entries);

    return 0;
}
Ejemplo n.º 2
0
static int efivarfs_fill_super(struct super_block *sb, void *data, int silent)
{
	struct inode *inode = NULL;
	struct dentry *root;
	int err;

	efivarfs_sb = sb;

	sb->s_maxbytes          = MAX_LFS_FILESIZE;
	sb->s_blocksize         = PAGE_CACHE_SIZE;
	sb->s_blocksize_bits    = PAGE_CACHE_SHIFT;
	sb->s_magic             = EFIVARFS_MAGIC;
	sb->s_op                = &efivarfs_ops;
	sb->s_d_op		= &efivarfs_d_ops;
	sb->s_time_gran         = 1;

	inode = efivarfs_get_inode(sb, NULL, S_IFDIR | 0755, 0, true);
	if (!inode)
		return -ENOMEM;
	inode->i_op = &efivarfs_dir_inode_operations;

	root = d_make_root(inode);
	sb->s_root = root;
	if (!root)
		return -ENOMEM;

	INIT_LIST_HEAD(&efivarfs_list);

	err = efivar_init(efivarfs_callback, (void *)sb, false,
			  true, &efivarfs_list);
	if (err)
		__efivar_entry_iter(efivarfs_destroy, &efivarfs_list, NULL, NULL);

	return err;
}
Ejemplo n.º 3
0
static void efivar_update_sysfs_entries(struct work_struct *work)
{
    struct efivar_entry *entry;
    int err;

    /* Add new sysfs entries */
    while (1) {
        entry = kzalloc(sizeof(*entry), GFP_KERNEL);
        if (!entry)
            return;

        err = efivar_init(efivar_update_sysfs_entry, entry,
                          true, false, &efivar_sysfs_list);
        if (!err)
            break;

        efivar_create_sysfs_entry(entry);
    }

    kfree(entry);
}