LCOV - code coverage report
Current view: top level - kernel - ksysfs.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 18 45 40.0 %
Date: 2015-04-12 14:34:49 Functions: 3 13 23.1 %

          Line data    Source code
       1             : /*
       2             :  * kernel/ksysfs.c - sysfs attributes in /sys/kernel, which
       3             :  *                   are not related to any other subsystem
       4             :  *
       5             :  * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
       6             :  * 
       7             :  * This file is release under the GPLv2
       8             :  *
       9             :  */
      10             : 
      11             : #include <linux/kobject.h>
      12             : #include <linux/string.h>
      13             : #include <linux/sysfs.h>
      14             : #include <linux/export.h>
      15             : #include <linux/init.h>
      16             : #include <linux/kexec.h>
      17             : #include <linux/profile.h>
      18             : #include <linux/stat.h>
      19             : #include <linux/sched.h>
      20             : #include <linux/capability.h>
      21             : #include <linux/compiler.h>
      22             : 
      23             : #include <linux/rcupdate.h>       /* rcu_expedited */
      24             : 
      25             : #define KERNEL_ATTR_RO(_name) \
      26             : static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
      27             : 
      28             : #define KERNEL_ATTR_RW(_name) \
      29             : static struct kobj_attribute _name##_attr = \
      30             :         __ATTR(_name, 0644, _name##_show, _name##_store)
      31             : 
      32             : /* current uevent sequence number */
      33           2 : static ssize_t uevent_seqnum_show(struct kobject *kobj,
      34             :                                   struct kobj_attribute *attr, char *buf)
      35             : {
      36           2 :         return sprintf(buf, "%llu\n", (unsigned long long)uevent_seqnum);
      37             : }
      38             : KERNEL_ATTR_RO(uevent_seqnum);
      39             : 
      40             : #ifdef CONFIG_UEVENT_HELPER
      41             : /* uevent helper program, used during early boot */
      42           0 : static ssize_t uevent_helper_show(struct kobject *kobj,
      43             :                                   struct kobj_attribute *attr, char *buf)
      44             : {
      45           0 :         return sprintf(buf, "%s\n", uevent_helper);
      46             : }
      47           1 : static ssize_t uevent_helper_store(struct kobject *kobj,
      48             :                                    struct kobj_attribute *attr,
      49             :                                    const char *buf, size_t count)
      50             : {
      51           1 :         if (count+1 > UEVENT_HELPER_PATH_LEN)
      52             :                 return -ENOENT;
      53           1 :         memcpy(uevent_helper, buf, count);
      54           1 :         uevent_helper[count] = '\0';
      55           1 :         if (count && uevent_helper[count-1] == '\n')
      56           1 :                 uevent_helper[count-1] = '\0';
      57           1 :         return count;
      58             : }
      59             : KERNEL_ATTR_RW(uevent_helper);
      60             : #endif
      61             : 
      62             : #ifdef CONFIG_PROFILING
      63             : static ssize_t profiling_show(struct kobject *kobj,
      64             :                                   struct kobj_attribute *attr, char *buf)
      65             : {
      66             :         return sprintf(buf, "%d\n", prof_on);
      67             : }
      68             : static ssize_t profiling_store(struct kobject *kobj,
      69             :                                    struct kobj_attribute *attr,
      70             :                                    const char *buf, size_t count)
      71             : {
      72             :         int ret;
      73             : 
      74             :         if (prof_on)
      75             :                 return -EEXIST;
      76             :         /*
      77             :          * This eventually calls into get_option() which
      78             :          * has a ton of callers and is not const.  It is
      79             :          * easiest to cast it away here.
      80             :          */
      81             :         profile_setup((char *)buf);
      82             :         ret = profile_init();
      83             :         if (ret)
      84             :                 return ret;
      85             :         ret = create_proc_profile();
      86             :         if (ret)
      87             :                 return ret;
      88             :         return count;
      89             : }
      90             : KERNEL_ATTR_RW(profiling);
      91             : #endif
      92             : 
      93             : #ifdef CONFIG_KEXEC
      94           0 : static ssize_t kexec_loaded_show(struct kobject *kobj,
      95             :                                  struct kobj_attribute *attr, char *buf)
      96             : {
      97           0 :         return sprintf(buf, "%d\n", !!kexec_image);
      98             : }
      99             : KERNEL_ATTR_RO(kexec_loaded);
     100             : 
     101           0 : static ssize_t kexec_crash_loaded_show(struct kobject *kobj,
     102             :                                        struct kobj_attribute *attr, char *buf)
     103             : {
     104           0 :         return sprintf(buf, "%d\n", !!kexec_crash_image);
     105             : }
     106             : KERNEL_ATTR_RO(kexec_crash_loaded);
     107             : 
     108           0 : static ssize_t kexec_crash_size_show(struct kobject *kobj,
     109             :                                        struct kobj_attribute *attr, char *buf)
     110             : {
     111           0 :         return sprintf(buf, "%zu\n", crash_get_memory_size());
     112             : }
     113           0 : static ssize_t kexec_crash_size_store(struct kobject *kobj,
     114             :                                    struct kobj_attribute *attr,
     115             :                                    const char *buf, size_t count)
     116             : {
     117             :         unsigned long cnt;
     118             :         int ret;
     119             : 
     120           0 :         if (kstrtoul(buf, 0, &cnt))
     121             :                 return -EINVAL;
     122             : 
     123           0 :         ret = crash_shrink_memory(cnt);
     124           0 :         return ret < 0 ? ret : count;
     125             : }
     126             : KERNEL_ATTR_RW(kexec_crash_size);
     127             : 
     128           0 : static ssize_t vmcoreinfo_show(struct kobject *kobj,
     129             :                                struct kobj_attribute *attr, char *buf)
     130             : {
     131           0 :         return sprintf(buf, "%lx %x\n",
     132             :                        paddr_vmcoreinfo_note(),
     133             :                        (unsigned int)sizeof(vmcoreinfo_note));
     134             : }
     135             : KERNEL_ATTR_RO(vmcoreinfo);
     136             : 
     137             : #endif /* CONFIG_KEXEC */
     138             : 
     139             : /* whether file capabilities are enabled */
     140           0 : static ssize_t fscaps_show(struct kobject *kobj,
     141             :                                   struct kobj_attribute *attr, char *buf)
     142             : {
     143           0 :         return sprintf(buf, "%d\n", file_caps_enabled);
     144             : }
     145             : KERNEL_ATTR_RO(fscaps);
     146             : 
     147             : int rcu_expedited;
     148           0 : static ssize_t rcu_expedited_show(struct kobject *kobj,
     149             :                                   struct kobj_attribute *attr, char *buf)
     150             : {
     151           0 :         return sprintf(buf, "%d\n", rcu_expedited);
     152             : }
     153           0 : static ssize_t rcu_expedited_store(struct kobject *kobj,
     154             :                                    struct kobj_attribute *attr,
     155             :                                    const char *buf, size_t count)
     156             : {
     157           0 :         if (kstrtoint(buf, 0, &rcu_expedited))
     158             :                 return -EINVAL;
     159             : 
     160           0 :         return count;
     161             : }
     162             : KERNEL_ATTR_RW(rcu_expedited);
     163             : 
     164             : /*
     165             :  * Make /sys/kernel/notes give the raw contents of our kernel .notes section.
     166             :  */
     167             : extern const void __start_notes __weak;
     168             : extern const void __stop_notes __weak;
     169             : #define notes_size (&__stop_notes - &__start_notes)
     170             : 
     171           0 : static ssize_t notes_read(struct file *filp, struct kobject *kobj,
     172             :                           struct bin_attribute *bin_attr,
     173             :                           char *buf, loff_t off, size_t count)
     174             : {
     175           0 :         memcpy(buf, &__start_notes + off, count);
     176           0 :         return count;
     177             : }
     178             : 
     179             : static struct bin_attribute notes_attr = {
     180             :         .attr = {
     181             :                 .name = "notes",
     182             :                 .mode = S_IRUGO,
     183             :         },
     184             :         .read = &notes_read,
     185             : };
     186             : 
     187             : struct kobject *kernel_kobj;
     188             : EXPORT_SYMBOL_GPL(kernel_kobj);
     189             : 
     190             : static struct attribute * kernel_attrs[] = {
     191             :         &fscaps_attr.attr,
     192             :         &uevent_seqnum_attr.attr,
     193             : #ifdef CONFIG_UEVENT_HELPER
     194             :         &uevent_helper_attr.attr,
     195             : #endif
     196             : #ifdef CONFIG_PROFILING
     197             :         &profiling_attr.attr,
     198             : #endif
     199             : #ifdef CONFIG_KEXEC
     200             :         &kexec_loaded_attr.attr,
     201             :         &kexec_crash_loaded_attr.attr,
     202             :         &kexec_crash_size_attr.attr,
     203             :         &vmcoreinfo_attr.attr,
     204             : #endif
     205             :         &rcu_expedited_attr.attr,
     206             :         NULL
     207             : };
     208             : 
     209             : static struct attribute_group kernel_attr_group = {
     210             :         .attrs = kernel_attrs,
     211             : };
     212             : 
     213           1 : static int __init ksysfs_init(void)
     214             : {
     215             :         int error;
     216             : 
     217           1 :         kernel_kobj = kobject_create_and_add("kernel", NULL);
     218           1 :         if (!kernel_kobj) {
     219             :                 error = -ENOMEM;
     220             :                 goto exit;
     221             :         }
     222           1 :         error = sysfs_create_group(kernel_kobj, &kernel_attr_group);
     223           1 :         if (error)
     224             :                 goto kset_exit;
     225             : 
     226           1 :         if (notes_size > 0) {
     227           1 :                 notes_attr.size = notes_size;
     228           1 :                 error = sysfs_create_bin_file(kernel_kobj, &notes_attr);
     229           1 :                 if (error)
     230             :                         goto group_exit;
     231             :         }
     232             : 
     233             :         return 0;
     234             : 
     235             : group_exit:
     236           0 :         sysfs_remove_group(kernel_kobj, &kernel_attr_group);
     237             : kset_exit:
     238           0 :         kobject_put(kernel_kobj);
     239             : exit:
     240           0 :         return error;
     241             : }
     242             : 
     243             : core_initcall(ksysfs_init);

Generated by: LCOV version 1.11