LCOV - code coverage report
Current view: top level - lkbce/include/linux - configfs.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 17 17 100.0 %
Date: 2017-01-25 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /* -*- mode: c; c-basic-offset: 8; -*-
       2             :  * vim: noexpandtab sw=8 ts=8 sts=0:
       3             :  *
       4             :  * configfs.h - definitions for the device driver filesystem
       5             :  *
       6             :  * This program is free software; you can redistribute it and/or
       7             :  * modify it under the terms of the GNU General Public
       8             :  * License as published by the Free Software Foundation; either
       9             :  * version 2 of the License, or (at your option) any later version.
      10             :  *
      11             :  * This program is distributed in the hope that it will be useful,
      12             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14             :  * General Public License for more details.
      15             :  *
      16             :  * You should have received a copy of the GNU General Public
      17             :  * License along with this program; if not, write to the
      18             :  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      19             :  * Boston, MA 021110-1307, USA.
      20             :  *
      21             :  * Based on sysfs:
      22             :  *      sysfs is Copyright (C) 2001, 2002, 2003 Patrick Mochel
      23             :  *
      24             :  * Based on kobject.h:
      25             :  *      Copyright (c) 2002-2003 Patrick Mochel
      26             :  *      Copyright (c) 2002-2003 Open Source Development Labs
      27             :  *
      28             :  * configfs Copyright (C) 2005 Oracle.  All rights reserved.
      29             :  *
      30             :  * Please read Documentation/filesystems/configfs/configfs.txt before using
      31             :  * the configfs interface, ESPECIALLY the parts about reference counts and
      32             :  * item destructors.
      33             :  */
      34             : 
      35             : #ifndef _CONFIGFS_H_
      36             : #define _CONFIGFS_H_
      37             : 
      38             : #include <linux/kernel.h>
      39             : #include <linux/types.h>
      40             : #include <linux/list.h>
      41             : #include <linux/kref.h>
      42             : #include <linux/mutex.h>
      43             : #include <linux/err.h>
      44             : 
      45             : #include <asm/atomic.h>
      46             : 
      47             : #define CONFIGFS_ITEM_NAME_LEN  20
      48             : 
      49             : struct module;
      50             : 
      51             : struct configfs_item_operations;
      52             : struct configfs_group_operations;
      53             : struct configfs_attribute;
      54             : struct configfs_subsystem;
      55             : 
      56             : struct config_item {
      57             :         char                    *ci_name;
      58             :         char                    ci_namebuf[CONFIGFS_ITEM_NAME_LEN];
      59             :         struct kref             ci_kref;
      60             :         struct list_head        ci_entry;
      61             :         struct config_item      *ci_parent;
      62             :         struct config_group     *ci_group;
      63             :         struct config_item_type *ci_type;
      64             :         struct dentry           *ci_dentry;
      65             : };
      66             : 
      67             : extern int config_item_set_name(struct config_item *, const char *, ...);
      68             : 
      69             : static inline char *config_item_name(struct config_item * item)
      70             : {
      71           3 :         return item->ci_name;
      72             : }
      73             : 
      74             : extern void config_item_init(struct config_item *);
      75             : extern void config_item_init_type_name(struct config_item *item,
      76             :                                        const char *name,
      77             :                                        struct config_item_type *type);
      78             : 
      79             : extern struct config_item * config_item_get(struct config_item *);
      80             : extern void config_item_put(struct config_item *);
      81           1 : 
      82             : struct config_item_type {
      83             :         struct module                           *ct_owner;
      84             :         struct configfs_item_operations         *ct_item_ops;
      85             :         struct configfs_group_operations        *ct_group_ops;
      86             :         struct configfs_attribute               **ct_attrs;
      87             : };
      88           1 : 
      89             : /**
      90             :  *      group - a group of config_items of a specific type, belonging
      91             :  *      to a specific subsystem.
      92             :  */
      93             : struct config_group {
      94             :         struct config_item              cg_item;
      95             :         struct list_head                cg_children;
      96             :         struct configfs_subsystem       *cg_subsys;
      97             :         struct config_group             **default_groups;
      98             : };
      99             : 
     100             : extern void config_group_init(struct config_group *group);
     101             : extern void config_group_init_type_name(struct config_group *group,
     102             :                                         const char *name,
     103             :                                         struct config_item_type *type);
     104             : 
     105             : static inline struct config_group *to_config_group(struct config_item *item)
     106             : {
     107         175 :         return item ? container_of(item,struct config_group,cg_item) : NULL;
     108          25 : }
     109             : 
     110             : static inline struct config_group *config_group_get(struct config_group *group)
     111             : {
     112          22 :         return group ? to_config_group(config_item_get(&group->cg_item)) : NULL;
     113           2 : }
     114           2 : 
     115             : static inline void config_group_put(struct config_group *group)
     116             : {
     117          12 :         config_item_put(&group->cg_item);
     118           6 : }
     119             : 
     120             : extern struct config_item *config_group_find_item(struct config_group *,
     121           1 :                                                   const char *);
     122             : 
     123             : 
     124             : struct configfs_attribute {
     125             :         const char              *ca_name;
     126             :         struct module           *ca_owner;
     127             :         mode_t                  ca_mode;
     128             : };
     129           1 : 
     130             : /*
     131             :  * Users often need to create attribute structures for their configurable
     132             :  * attributes, containing a configfs_attribute member and function pointers
     133             :  * for the show() and store() operations on that attribute. If they don't
     134             :  * need anything else on the extended attribute structure, they can use
     135             :  * this macro to define it  The argument _item is the name of the
     136             :  * config_item structure.
     137             :  */
     138             : #define CONFIGFS_ATTR_STRUCT(_item)                                     \
     139             : struct _item##_attribute {                                              \
     140             :         struct configfs_attribute attr;                                 \
     141             :         ssize_t (*show)(struct _item *, char *);                        \
     142             :         ssize_t (*store)(struct _item *, const char *, size_t);         \
     143             : }
     144             : 
     145             : /*
     146             :  * With the extended attribute structure, users can use this macro
     147             :  * (similar to sysfs' __ATTR) to make defining attributes easier.
     148             :  * An example:
     149             :  * #define MYITEM_ATTR(_name, _mode, _show, _store)     \
     150             :  * struct myitem_attribute childless_attr_##_name =     \
     151             :  *         __CONFIGFS_ATTR(_name, _mode, _show, _store)
     152             :  */
     153             : #define __CONFIGFS_ATTR(_name, _mode, _show, _store)                    \
     154             : {                                                                       \
     155             :         .attr   = {                                                     \
     156             :                         .ca_name = __stringify(_name),                  \
     157             :                         .ca_mode = _mode,                               \
     158             :                         .ca_owner = THIS_MODULE,                        \
     159             :         },                                                              \
     160             :         .show   = _show,                                                \
     161             :         .store  = _store,                                               \
     162             : }
     163             : /* Here is a readonly version, only requiring a show() operation */
     164             : #define __CONFIGFS_ATTR_RO(_name, _show)                                \
     165             : {                                                                       \
     166             :         .attr   = {                                                     \
     167             :                         .ca_name = __stringify(_name),                  \
     168             :                         .ca_mode = 0444,                                \
     169             :                         .ca_owner = THIS_MODULE,                        \
     170             :         },                                                              \
     171             :         .show   = _show,                                                \
     172             : }
     173             : 
     174             : /*
     175             :  * With these extended attributes, the simple show_attribute() and
     176             :  * store_attribute() operations need to call the show() and store() of the
     177             :  * attributes.  This is a common pattern, so we provide a macro to define
     178             :  * them.  The argument _item is the name of the config_item structure.
     179             :  * This macro expects the attributes to be named "struct <name>_attribute"
     180             :  * and the function to_<name>() to exist;
     181             :  */
     182             : #define CONFIGFS_ATTR_OPS(_item)                                        \
     183             : static ssize_t _item##_attr_show(struct config_item *item,              \
     184             :                                  struct configfs_attribute *attr,       \
     185             :                                  char *page)                            \
     186             : {                                                                       \
     187             :         struct _item *_item = to_##_item(item);                         \
     188             :         struct _item##_attribute *_item##_attr =                        \
     189             :                 container_of(attr, struct _item##_attribute, attr);     \
     190             :         ssize_t ret = 0;                                                \
     191             :                                                                         \
     192             :         if (_item##_attr->show)                                              \
     193             :                 ret = _item##_attr->show(_item, page);                       \
     194             :         return ret;                                                     \
     195             : }                                                                       \
     196             : static ssize_t _item##_attr_store(struct config_item *item,             \
     197             :                                   struct configfs_attribute *attr,      \
     198             :                                   const char *page, size_t count)       \
     199             : {                                                                       \
     200             :         struct _item *_item = to_##_item(item);                         \
     201             :         struct _item##_attribute *_item##_attr =                        \
     202             :                 container_of(attr, struct _item##_attribute, attr);     \
     203             :         ssize_t ret = -EINVAL;                                          \
     204             :                                                                         \
     205             :         if (_item##_attr->store)                                     \
     206             :                 ret = _item##_attr->store(_item, page, count);               \
     207             :         return ret;                                                     \
     208             : }
     209             : 
     210             : /*
     211             :  * If allow_link() exists, the item can symlink(2) out to other
     212             :  * items.  If the item is a group, it may support mkdir(2).
     213             :  * Groups supply one of make_group() and make_item().  If the
     214             :  * group supports make_group(), one can create group children.  If it
     215             :  * supports make_item(), one can create config_item children.  make_group()
     216             :  * and make_item() return ERR_PTR() on errors.  If it has
     217             :  * default_groups on group->default_groups, it has automatically created
     218             :  * group children.  default_groups may coexist alongsize make_group() or
     219             :  * make_item(), but if the group wishes to have only default_groups
     220             :  * children (disallowing mkdir(2)), it need not provide either function.
     221             :  * If the group has commit(), it supports pending and commited (active)
     222             :  * items.
     223             :  */
     224             : struct configfs_item_operations {
     225             :         void (*release)(struct config_item *);
     226             :         ssize_t (*show_attribute)(struct config_item *, struct configfs_attribute *,char *);
     227             :         ssize_t (*store_attribute)(struct config_item *,struct configfs_attribute *,const char *, size_t);
     228             :         int (*allow_link)(struct config_item *src, struct config_item *target);
     229             :         int (*drop_link)(struct config_item *src, struct config_item *target);
     230             : };
     231           1 : 
     232             : struct configfs_group_operations {
     233             :         struct config_item *(*make_item)(struct config_group *group, const char *name);
     234             :         struct config_group *(*make_group)(struct config_group *group, const char *name);
     235             :         int (*commit_item)(struct config_item *item);
     236             :         void (*disconnect_notify)(struct config_group *group, struct config_item *item);
     237             :         void (*drop_item)(struct config_group *group, struct config_item *item);
     238             : };
     239           1 : 
     240             : struct configfs_subsystem {
     241             :         struct config_group     su_group;
     242             :         struct mutex            su_mutex;
     243             : };
     244             : 
     245             : static inline struct configfs_subsystem *to_configfs_subsystem(struct config_group *group)
     246             : {
     247           2 :         return group ?
     248           6 :                 container_of(group, struct configfs_subsystem, su_group) :
     249             :                 NULL;
     250             : }
     251             : 
     252             : int configfs_register_subsystem(struct configfs_subsystem *subsys);
     253             : void configfs_unregister_subsystem(struct configfs_subsystem *subsys);
     254             : 
     255             : /* These functions can sleep and can alloc with GFP_KERNEL */
     256             : /* WARNING: These cannot be called underneath configfs callbacks!! */
     257             : int configfs_depend_item(struct configfs_subsystem *subsys, struct config_item *target);
     258             : void configfs_undepend_item(struct configfs_subsystem *subsys, struct config_item *target);
     259           1 : 
     260             : #endif /* _CONFIGFS_H_ */

Generated by: LCOV version 1.10