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; }
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; }
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); }