linux/include/linux/configfs.h
<<
>>
Prefs
   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 <linux/atomic.h>
  46
  47#define CONFIGFS_ITEM_NAME_LEN  20
  48
  49struct module;
  50
  51struct configfs_item_operations;
  52struct configfs_group_operations;
  53struct configfs_attribute;
  54struct configfs_bin_attribute;
  55struct configfs_subsystem;
  56
  57struct config_item {
  58        char                    *ci_name;
  59        char                    ci_namebuf[CONFIGFS_ITEM_NAME_LEN];
  60        struct kref             ci_kref;
  61        struct list_head        ci_entry;
  62        struct config_item      *ci_parent;
  63        struct config_group     *ci_group;
  64        struct config_item_type *ci_type;
  65        struct dentry           *ci_dentry;
  66};
  67
  68extern __printf(2, 3)
  69int config_item_set_name(struct config_item *, const char *, ...);
  70
  71static inline char *config_item_name(struct config_item * item)
  72{
  73        return item->ci_name;
  74}
  75
  76extern void config_item_init_type_name(struct config_item *item,
  77                                       const char *name,
  78                                       struct config_item_type *type);
  79
  80extern struct config_item * config_item_get(struct config_item *);
  81extern void config_item_put(struct config_item *);
  82
  83struct config_item_type {
  84        struct module                           *ct_owner;
  85        struct configfs_item_operations         *ct_item_ops;
  86        struct configfs_group_operations        *ct_group_ops;
  87        struct configfs_attribute               **ct_attrs;
  88        struct configfs_bin_attribute           **ct_bin_attrs;
  89};
  90
  91/**
  92 *      group - a group of config_items of a specific type, belonging
  93 *      to a specific subsystem.
  94 */
  95struct config_group {
  96        struct config_item              cg_item;
  97        struct list_head                cg_children;
  98        struct configfs_subsystem       *cg_subsys;
  99        struct list_head                default_groups;
 100        struct list_head                group_entry;
 101};
 102
 103extern void config_group_init(struct config_group *group);
 104extern void config_group_init_type_name(struct config_group *group,
 105                                        const char *name,
 106                                        struct config_item_type *type);
 107
 108static inline struct config_group *to_config_group(struct config_item *item)
 109{
 110        return item ? container_of(item,struct config_group,cg_item) : NULL;
 111}
 112
 113static inline struct config_group *config_group_get(struct config_group *group)
 114{
 115        return group ? to_config_group(config_item_get(&group->cg_item)) : NULL;
 116}
 117
 118static inline void config_group_put(struct config_group *group)
 119{
 120        config_item_put(&group->cg_item);
 121}
 122
 123extern struct config_item *config_group_find_item(struct config_group *,
 124                                                  const char *);
 125
 126
 127static inline void configfs_add_default_group(struct config_group *new_group,
 128                struct config_group *group)
 129{
 130        list_add_tail(&new_group->group_entry, &group->default_groups);
 131}
 132
 133struct configfs_attribute {
 134        const char              *ca_name;
 135        struct module           *ca_owner;
 136        umode_t                 ca_mode;
 137        ssize_t (*show)(struct config_item *, char *);
 138        ssize_t (*store)(struct config_item *, const char *, size_t);
 139};
 140
 141#define CONFIGFS_ATTR(_pfx, _name)                      \
 142static struct configfs_attribute _pfx##attr_##_name = { \
 143        .ca_name        = __stringify(_name),           \
 144        .ca_mode        = S_IRUGO | S_IWUSR,            \
 145        .ca_owner       = THIS_MODULE,                  \
 146        .show           = _pfx##_name##_show,           \
 147        .store          = _pfx##_name##_store,          \
 148}
 149
 150#define CONFIGFS_ATTR_RO(_pfx, _name)                   \
 151static struct configfs_attribute _pfx##attr_##_name = { \
 152        .ca_name        = __stringify(_name),           \
 153        .ca_mode        = S_IRUGO,                      \
 154        .ca_owner       = THIS_MODULE,                  \
 155        .show           = _pfx##_name##_show,           \
 156}
 157
 158#define CONFIGFS_ATTR_WO(_pfx, _name)                   \
 159static struct configfs_attribute _pfx##attr_##_name = { \
 160        .ca_name        = __stringify(_name),           \
 161        .ca_mode        = S_IWUSR,                      \
 162        .ca_owner       = THIS_MODULE,                  \
 163        .store          = _pfx##_name##_store,          \
 164}
 165
 166struct file;
 167struct vm_area_struct;
 168
 169struct configfs_bin_attribute {
 170        struct configfs_attribute cb_attr;      /* std. attribute */
 171        void *cb_private;                       /* for user       */
 172        size_t cb_max_size;                     /* max core size  */
 173        ssize_t (*read)(struct config_item *, void *, size_t);
 174        ssize_t (*write)(struct config_item *, const void *, size_t);
 175};
 176
 177#define CONFIGFS_BIN_ATTR(_pfx, _name, _priv, _maxsz)           \
 178static struct configfs_bin_attribute _pfx##attr_##_name = {     \
 179        .cb_attr = {                                            \
 180                .ca_name        = __stringify(_name),           \
 181                .ca_mode        = S_IRUGO | S_IWUSR,            \
 182                .ca_owner       = THIS_MODULE,                  \
 183        },                                                      \
 184        .cb_private     = _priv,                                \
 185        .cb_max_size    = _maxsz,                               \
 186        .read           = _pfx##_name##_read,                   \
 187        .write          = _pfx##_name##_write,                  \
 188}
 189
 190#define CONFIGFS_BIN_ATTR_RO(_pfx, _name, _priv, _maxsz)        \
 191static struct configfs_bin_attribute _pfx##attr_##_name = {     \
 192        .cb_attr = {                                            \
 193                .ca_name        = __stringify(_name),           \
 194                .ca_mode        = S_IRUGO,                      \
 195                .ca_owner       = THIS_MODULE,                  \
 196        },                                                      \
 197        .cb_private     = _priv,                                \
 198        .cb_max_size    = _maxsz,                               \
 199        .read           = _pfx##_name##_read,                   \
 200}
 201
 202#define CONFIGFS_BIN_ATTR_WO(_pfx, _name, _priv, _maxsz)        \
 203static struct configfs_bin_attribute _pfx##attr_##_name = {     \
 204        .cb_attr = {                                            \
 205                .ca_name        = __stringify(_name),           \
 206                .ca_mode        = S_IWUSR,                      \
 207                .ca_owner       = THIS_MODULE,                  \
 208        },                                                      \
 209        .cb_private     = _priv,                                \
 210        .cb_max_size    = _maxsz,                               \
 211        .write          = _pfx##_name##_write,                  \
 212}
 213
 214/*
 215 * If allow_link() exists, the item can symlink(2) out to other
 216 * items.  If the item is a group, it may support mkdir(2).
 217 * Groups supply one of make_group() and make_item().  If the
 218 * group supports make_group(), one can create group children.  If it
 219 * supports make_item(), one can create config_item children.  make_group()
 220 * and make_item() return ERR_PTR() on errors.  If it has
 221 * default_groups on group->default_groups, it has automatically created
 222 * group children.  default_groups may coexist alongsize make_group() or
 223 * make_item(), but if the group wishes to have only default_groups
 224 * children (disallowing mkdir(2)), it need not provide either function.
 225 * If the group has commit(), it supports pending and committed (active)
 226 * items.
 227 */
 228struct configfs_item_operations {
 229        void (*release)(struct config_item *);
 230        int (*allow_link)(struct config_item *src, struct config_item *target);
 231        int (*drop_link)(struct config_item *src, struct config_item *target);
 232};
 233
 234struct configfs_group_operations {
 235        struct config_item *(*make_item)(struct config_group *group, const char *name);
 236        struct config_group *(*make_group)(struct config_group *group, const char *name);
 237        int (*commit_item)(struct config_item *item);
 238        void (*disconnect_notify)(struct config_group *group, struct config_item *item);
 239        void (*drop_item)(struct config_group *group, struct config_item *item);
 240};
 241
 242struct configfs_subsystem {
 243        struct config_group     su_group;
 244        struct mutex            su_mutex;
 245};
 246
 247static inline struct configfs_subsystem *to_configfs_subsystem(struct config_group *group)
 248{
 249        return group ?
 250                container_of(group, struct configfs_subsystem, su_group) :
 251                NULL;
 252}
 253
 254int configfs_register_subsystem(struct configfs_subsystem *subsys);
 255void configfs_unregister_subsystem(struct configfs_subsystem *subsys);
 256
 257int configfs_register_group(struct config_group *parent_group,
 258                            struct config_group *group);
 259void configfs_unregister_group(struct config_group *group);
 260
 261void configfs_remove_default_groups(struct config_group *group);
 262
 263struct config_group *
 264configfs_register_default_group(struct config_group *parent_group,
 265                                const char *name,
 266                                struct config_item_type *item_type);
 267void configfs_unregister_default_group(struct config_group *group);
 268
 269/* These functions can sleep and can alloc with GFP_KERNEL */
 270/* WARNING: These cannot be called underneath configfs callbacks!! */
 271int configfs_depend_item(struct configfs_subsystem *subsys,
 272                         struct config_item *target);
 273void configfs_undepend_item(struct config_item *target);
 274
 275/*
 276 * These functions can sleep and can alloc with GFP_KERNEL
 277 * NOTE: These should be called only underneath configfs callbacks.
 278 * NOTE: First parameter is a caller's subsystem, not target's.
 279 * WARNING: These cannot be called on newly created item
 280 *        (in make_group()/make_item() callback)
 281 */
 282int configfs_depend_item_unlocked(struct configfs_subsystem *caller_subsys,
 283                                  struct config_item *target);
 284
 285
 286static inline void configfs_undepend_item_unlocked(struct config_item *target)
 287{
 288        configfs_undepend_item(target);
 289}
 290
 291#endif /* _CONFIGFS_H_ */
 292