Lines Matching +full:attribute +full:- +full:set

1 // SPDX-License-Identifier: GPL-2.0-or-later
20 /* Protects all built-in parameters, modules use their own param_lock */
23 /* Use the module's mutex, or if built-in use the built-in mutex */
25 #define KPARAM_MUTEX(mod) ((mod) ? &(mod)->param_lock : &param_lock)
57 list_add(&p->list, &kmalloced_params); in kmalloc_parameter()
60 return p->val; in kmalloc_parameter()
70 if (p->val == param) { in maybe_kfree_parameter()
71 list_del(&p->list); in maybe_kfree_parameter()
81 if (c == '-') in dash2underscore()
104 if (kp->flags & KERNEL_PARAM_FL_HWPARAM && in param_check_unsafe()
108 if (kp->flags & KERNEL_PARAM_FL_UNSAFE) { in param_check_unsafe()
109 pr_notice("Setting dangerous option %s - tainting kernel\n", in param_check_unsafe()
110 kp->name); in param_check_unsafe()
137 !(params[i].ops->flags & KERNEL_PARAM_OPS_FL_NOARG)) in parse_one()
138 return -EINVAL; in parse_one()
140 params[i].ops->set); in parse_one()
143 err = params[i].ops->set(val, &params[i]); in parse_one()
145 err = -EPERM; in parse_one()
157 return -ENOENT; in parse_one()
182 /* Stop at -- */ in parse_args()
183 if (!val && strcmp(param, "--") == 0) in parse_args()
195 case -ENOENT: in parse_args()
198 case -ENOSPC: in parse_args()
218 return strtolfn(val, 0, (type *)kp->arg); \
223 *((type *)kp->arg)); \
226 .set = param_set_##name, \
251 return -EINVAL; in param_set_uint_minmax()
256 return -EINVAL; in param_set_uint_minmax()
257 *((unsigned int *)kp->arg) = num; in param_set_uint_minmax()
268 pr_err("%s: string parameter too long\n", kp->name); in param_set_charp()
269 return -ENOSPC; in param_set_charp()
272 maybe_kfree_parameter(*(char **)kp->arg); in param_set_charp()
279 *(char **)kp->arg = kmalloc_parameter(len + 1); in param_set_charp()
280 if (!*(char **)kp->arg) in param_set_charp()
281 return -ENOMEM; in param_set_charp()
282 strcpy(*(char **)kp->arg, val); in param_set_charp()
284 *(const char **)kp->arg = val; in param_set_charp()
292 return scnprintf(buffer, PAGE_SIZE, "%s\n", *((char **)kp->arg)); in param_get_charp()
303 .set = param_set_charp,
312 /* No equals means "set"... */ in param_set_bool()
316 return kstrtobool(val, kp->arg); in param_set_bool()
322 /* Y and N chosen as being relatively non-coder friendly */ in param_get_bool()
323 return sprintf(buffer, "%c\n", *(bool *)kp->arg ? 'Y' : 'N'); in param_get_bool()
329 .set = param_set_bool,
338 bool orig_value = *(bool *)kp->arg; in param_set_bool_enable_only()
347 /* Don't let them unset it once it's set! */ in param_set_bool_enable_only()
349 return -EROFS; in param_set_bool_enable_only()
360 .set = param_set_bool_enable_only,
375 *(bool *)kp->arg = !boolval; in param_set_invbool()
382 return sprintf(buffer, "%c\n", (*(bool *)kp->arg) ? 'N' : 'Y'); in param_get_invbool()
387 .set = param_set_invbool,
394 /* Match bool exactly, by re-using it. */ in param_set_bint()
403 *(int *)kp->arg = v; in param_set_bint()
410 .set = param_set_bint,
421 int (*set)(const char *, const struct kernel_param *kp), in param_array()
435 /* We expect a comma-separated list of values. */ in param_array()
441 return -EINVAL; in param_array()
445 /* nul-terminate and parse */ in param_array()
449 ret = set(val, &kp); in param_array()
460 return -EINVAL; in param_array()
467 const struct kparam_array *arr = kp->arr; in param_array_set()
470 return param_array(kp->mod, kp->name, val, 1, arr->max, arr->elem, in param_array_set()
471 arr->elemsize, arr->ops->set, kp->level, in param_array_set()
472 arr->num ?: &temp_num); in param_array_set()
478 const struct kparam_array *arr = kp->arr; in param_array_get()
481 for (i = off = 0; i < (arr->num ? *arr->num : arr->max); i++) { in param_array_get()
484 buffer[off - 1] = ','; in param_array_get()
485 p.arg = arr->elem + arr->elemsize * i; in param_array_get()
487 ret = arr->ops->get(buffer + off, &p); in param_array_get()
501 if (arr->ops->free) in param_array_free()
502 for (i = 0; i < (arr->num ? *arr->num : arr->max); i++) in param_array_free()
503 arr->ops->free(arr->elem + arr->elemsize * i); in param_array_free()
507 .set = param_array_set,
515 const struct kparam_string *kps = kp->str; in param_set_copystring()
516 const size_t len = strnlen(val, kps->maxlen); in param_set_copystring()
518 if (len == kps->maxlen) { in param_set_copystring()
520 kp->name, kps->maxlen-1); in param_set_copystring()
521 return -ENOSPC; in param_set_copystring()
523 memcpy(kps->string, val, len + 1); in param_set_copystring()
530 const struct kparam_string *kps = kp->str; in param_get_string()
531 return scnprintf(buffer, PAGE_SIZE, "%s\n", kps->string); in param_get_string()
536 .set = param_set_copystring,
565 const struct param_attribute *attribute = to_param_attr(mattr); in param_attr_show() local
567 if (!attribute->param->ops->get) in param_attr_show()
568 return -EPERM; in param_attr_show()
570 kernel_param_lock(mk->mod); in param_attr_show()
571 count = attribute->param->ops->get(buf, attribute->param); in param_attr_show()
572 kernel_param_unlock(mk->mod); in param_attr_show()
576 /* sysfs always hands a nul-terminated string in buf. We rely on that. */
582 const struct param_attribute *attribute = to_param_attr(mattr); in param_attr_store() local
584 if (!attribute->param->ops->set) in param_attr_store()
585 return -EPERM; in param_attr_store()
587 kernel_param_lock(mk->mod); in param_attr_store()
588 if (param_check_unsafe(attribute->param)) in param_attr_store()
589 err = attribute->param->ops->set(buf, attribute->param); in param_attr_store()
591 err = -EPERM; in param_attr_store()
592 kernel_param_unlock(mk->mod); in param_attr_store()
620 * add_sysfs_param - add a parameter to sysfs
625 * Create a kobject if for a (per-module) parameter if mp NULL, and
634 struct attribute **new_attrs; in add_sysfs_param()
638 BUG_ON(!kp->perm); in add_sysfs_param()
640 if (!mk->mp) { in add_sysfs_param()
642 mk->mp = kzalloc(sizeof(*mk->mp), GFP_KERNEL); in add_sysfs_param()
643 if (!mk->mp) in add_sysfs_param()
644 return -ENOMEM; in add_sysfs_param()
645 mk->mp->grp.name = "parameters"; in add_sysfs_param()
646 /* NULL-terminated attribute array. */ in add_sysfs_param()
647 mk->mp->grp.attrs = kzalloc(sizeof(mk->mp->grp.attrs[0]), in add_sysfs_param()
650 if (!mk->mp->grp.attrs) in add_sysfs_param()
651 return -ENOMEM; in add_sysfs_param()
655 new_mp = krealloc(mk->mp, struct_size(mk->mp, attrs, mk->mp->num + 1), in add_sysfs_param()
658 return -ENOMEM; in add_sysfs_param()
659 mk->mp = new_mp; in add_sysfs_param()
660 mk->mp->num++; in add_sysfs_param()
663 new_attrs = krealloc_array(mk->mp->grp.attrs, mk->mp->num + 1, in add_sysfs_param()
664 sizeof(mk->mp->grp.attrs[0]), GFP_KERNEL); in add_sysfs_param()
666 return -ENOMEM; in add_sysfs_param()
667 mk->mp->grp.attrs = new_attrs; in add_sysfs_param()
670 memset(&mk->mp->attrs[mk->mp->num - 1], 0, sizeof(mk->mp->attrs[0])); in add_sysfs_param()
671 sysfs_attr_init(&mk->mp->attrs[mk->mp->num - 1].mattr.attr); in add_sysfs_param()
672 mk->mp->attrs[mk->mp->num - 1].param = kp; in add_sysfs_param()
673 mk->mp->attrs[mk->mp->num - 1].mattr.show = param_attr_show; in add_sysfs_param()
675 if ((kp->perm & (S_IWUSR | S_IWGRP | S_IWOTH)) != 0) in add_sysfs_param()
676 mk->mp->attrs[mk->mp->num - 1].mattr.store = param_attr_store; in add_sysfs_param()
678 mk->mp->attrs[mk->mp->num - 1].mattr.store = NULL; in add_sysfs_param()
679 mk->mp->attrs[mk->mp->num - 1].mattr.attr.name = (char *)name; in add_sysfs_param()
680 mk->mp->attrs[mk->mp->num - 1].mattr.attr.mode = kp->perm; in add_sysfs_param()
683 for (i = 0; i < mk->mp->num; i++) in add_sysfs_param()
684 mk->mp->grp.attrs[i] = &mk->mp->attrs[i].mattr.attr; in add_sysfs_param()
685 mk->mp->grp.attrs[mk->mp->num] = NULL; in add_sysfs_param()
692 if (mk->mp) in free_module_param_attrs()
693 kfree(mk->mp->grp.attrs); in free_module_param_attrs()
694 kfree(mk->mp); in free_module_param_attrs()
695 mk->mp = NULL; in free_module_param_attrs()
699 * module_param_sysfs_setup - setup sysfs support for one module
705 * /sys/module/[mod->name]/parameters/
717 err = add_sysfs_param(&mod->mkobj, &kparam[i], kparam[i].name); in module_param_sysfs_setup()
719 free_module_param_attrs(&mod->mkobj); in module_param_sysfs_setup()
729 err = sysfs_create_group(&mod->mkobj.kobj, &mod->mkobj.mp->grp); in module_param_sysfs_setup()
731 free_module_param_attrs(&mod->mkobj); in module_param_sysfs_setup()
736 * module_param_sysfs_remove - remove sysfs support for one module
744 if (mod->mkobj.mp) { in module_param_sysfs_remove()
745 sysfs_remove_group(&mod->mkobj.kobj, &mod->mkobj.mp->grp); in module_param_sysfs_remove()
750 free_module_param_attrs(&mod->mkobj); in module_param_sysfs_remove()
760 if (params[i].ops->free) in destroy_params()
761 params[i].ops->free(params[i].arg); in destroy_params()
778 mk->mod = THIS_MODULE; in lookup_or_create_module_kobject()
779 mk->kobj.kset = module_kset; in lookup_or_create_module_kobject()
780 err = kobject_init_and_add(&mk->kobj, &module_ktype, NULL, "%s", name); in lookup_or_create_module_kobject()
782 err = sysfs_create_file(&mk->kobj, &module_uevent.attr); in lookup_or_create_module_kobject()
784 kobject_put(&mk->kobj); in lookup_or_create_module_kobject()
791 kobject_get(&mk->kobj); in lookup_or_create_module_kobject()
808 if (mk->mp) in kernel_add_sysfs_param()
809 sysfs_remove_group(&mk->kobj, &mk->mp->grp); in kernel_add_sysfs_param()
812 err = add_sysfs_param(mk, kparam, kparam->name + name_skip); in kernel_add_sysfs_param()
814 err = sysfs_create_group(&mk->kobj, &mk->mp->grp); in kernel_add_sysfs_param()
816 kobject_uevent(&mk->kobj, KOBJ_ADD); in kernel_add_sysfs_param()
817 kobject_put(&mk->kobj); in kernel_add_sysfs_param()
821 * param_sysfs_builtin - add sysfs parameters for built-in modules
826 * "parameter" name is stored behind a dot in kernel_param->name. So,
827 * extract the "module" name for all built-in kernel_param-eters,
839 if (kp->perm == 0) in param_sysfs_builtin()
842 dot = strchr(kp->name, '.'); in param_sysfs_builtin()
848 name_len = dot - kp->name + 1; in param_sysfs_builtin()
849 strscpy(modname, kp->name, name_len); in param_sysfs_builtin()
861 return scnprintf(buf, PAGE_SIZE, "%s\n", vattr->version); in __modver_version_show()
874 mk = lookup_or_create_module_kobject(vattr->module_name); in version_sysfs_builtin()
876 err = sysfs_create_file(&mk->kobj, &vattr->mattr.attr); in version_sysfs_builtin()
878 kobject_uevent(&mk->kobj, KOBJ_ADD); in version_sysfs_builtin()
879 kobject_put(&mk->kobj); in version_sysfs_builtin()
884 /* module-related sysfs stuff */
887 struct attribute *attr, in module_attr_show()
890 const struct module_attribute *attribute; in module_attr_show() local
894 attribute = to_module_attr(attr); in module_attr_show()
897 if (!attribute->show) in module_attr_show()
898 return -EIO; in module_attr_show()
900 ret = attribute->show(attribute, mk, buf); in module_attr_show()
906 struct attribute *attr, in module_attr_store()
909 const struct module_attribute *attribute; in module_attr_store() local
913 attribute = to_module_attr(attr); in module_attr_store()
916 if (!attribute->store) in module_attr_store()
917 return -EIO; in module_attr_store()
919 ret = attribute->store(attribute, mk, buf, len); in module_attr_store()
948 if (mk->kobj_completion) in module_kobj_release()
949 complete(mk->kobj_completion); in module_kobj_release()
958 * param_sysfs_init - create "module" kset
970 return -ENOMEM; in param_sysfs_init()
978 * param_sysfs_builtin_init - add sysfs version and parameter
979 * attributes for built-in modules
984 return -ENOMEM; in param_sysfs_builtin_init()