]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - include/linux/configfs.h
Merge tag 'armsoc-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[karo-tx-linux.git] / include / linux / configfs.h
index 758a029011b11a3d1d2c1acfe9fa171e82a55343..f8165c129ccb260498b44e7451153a9281a0a79a 100644 (file)
@@ -51,6 +51,7 @@ struct module;
 struct configfs_item_operations;
 struct configfs_group_operations;
 struct configfs_attribute;
+struct configfs_bin_attribute;
 struct configfs_subsystem;
 
 struct config_item {
@@ -84,6 +85,7 @@ struct config_item_type {
        struct configfs_item_operations         *ct_item_ops;
        struct configfs_group_operations        *ct_group_ops;
        struct configfs_attribute               **ct_attrs;
+       struct configfs_bin_attribute           **ct_bin_attrs;
 };
 
 /**
@@ -154,6 +156,54 @@ static struct configfs_attribute _pfx##attr_##_name = {    \
        .store          = _pfx##_name##_store,          \
 }
 
+struct file;
+struct vm_area_struct;
+
+struct configfs_bin_attribute {
+       struct configfs_attribute cb_attr;      /* std. attribute */
+       void *cb_private;                       /* for user       */
+       size_t cb_max_size;                     /* max core size  */
+       ssize_t (*read)(struct config_item *, void *, size_t);
+       ssize_t (*write)(struct config_item *, const void *, size_t);
+};
+
+#define CONFIGFS_BIN_ATTR(_pfx, _name, _priv, _maxsz)          \
+static struct configfs_bin_attribute _pfx##attr_##_name = {    \
+       .cb_attr = {                                            \
+               .ca_name        = __stringify(_name),           \
+               .ca_mode        = S_IRUGO | S_IWUSR,            \
+               .ca_owner       = THIS_MODULE,                  \
+       },                                                      \
+       .cb_private     = _priv,                                \
+       .cb_max_size    = _maxsz,                               \
+       .read           = _pfx##_name##_read,                   \
+       .write          = _pfx##_name##_write,                  \
+}
+
+#define CONFIGFS_BIN_ATTR_RO(_pfx, _name, _priv, _maxsz)       \
+static struct configfs_attribute _pfx##attr_##_name = {                \
+       .cb_attr = {                                            \
+               .ca_name        = __stringify(_name),           \
+               .ca_mode        = S_IRUGO,                      \
+               .ca_owner       = THIS_MODULE,                  \
+       },                                                      \
+       .cb_private     = _priv,                                \
+       .cb_max_size    = _maxsz,                               \
+       .read           = _pfx##_name##_read,                   \
+}
+
+#define CONFIGFS_BIN_ATTR_WO(_pfx, _name, _priv, _maxsz)       \
+static struct configfs_attribute _pfx##attr_##_name = {                \
+       .cb_attr = {                                            \
+               .ca_name        = __stringify(_name),           \
+               .ca_mode        = S_IWUSR,                      \
+               .ca_owner       = THIS_MODULE,                  \
+       },                                                      \
+       .cb_private     = _priv,                                \
+       .cb_max_size    = _maxsz,                               \
+       .write          = _pfx##_name##_write,                  \
+}
+
 /*
  * If allow_link() exists, the item can symlink(2) out to other
  * items.  If the item is a group, it may support mkdir(2).
@@ -209,7 +259,24 @@ void configfs_unregister_default_group(struct config_group *group);
 
 /* These functions can sleep and can alloc with GFP_KERNEL */
 /* WARNING: These cannot be called underneath configfs callbacks!! */
-int configfs_depend_item(struct configfs_subsystem *subsys, struct config_item *target);
-void configfs_undepend_item(struct configfs_subsystem *subsys, struct config_item *target);
+int configfs_depend_item(struct configfs_subsystem *subsys,
+                        struct config_item *target);
+void configfs_undepend_item(struct config_item *target);
+
+/*
+ * These functions can sleep and can alloc with GFP_KERNEL
+ * NOTE: These should be called only underneath configfs callbacks.
+ * NOTE: First parameter is a caller's subsystem, not target's.
+ * WARNING: These cannot be called on newly created item
+ *        (in make_group()/make_item() callback)
+ */
+int configfs_depend_item_unlocked(struct configfs_subsystem *caller_subsys,
+                                 struct config_item *target);
+
+
+static inline void configfs_undepend_item_unlocked(struct config_item *target)
+{
+       configfs_undepend_item(target);
+}
 
 #endif /* _CONFIGFS_H_ */