bcachefs-tools/include/linux/kobject.h

130 lines
2.8 KiB
C

/*
* kobject.h - generic kernel object infrastructure.
*
* Copyright (c) 2002-2003 Patrick Mochel
* Copyright (c) 2002-2003 Open Source Development Labs
* Copyright (c) 2006-2008 Greg Kroah-Hartman <greg@kroah.com>
* Copyright (c) 2006-2008 Novell Inc.
*
* This file is released under the GPLv2.
*
* Please read Documentation/kobject.txt before using the kobject
* interface, ESPECIALLY the parts about reference counts and object
* destructors.
*/
#ifndef _KOBJECT_H_
#define _KOBJECT_H_
#include <linux/atomic.h>
#include <linux/bug.h>
#include <linux/compiler.h>
#include <linux/kernel.h>
#include <linux/sysfs.h>
#include <linux/types.h>
#include <linux/workqueue.h>
struct kset;
struct kobj_type {
void (*release)(struct kobject *kobj);
const struct sysfs_ops *sysfs_ops;
const struct attribute_group **default_groups;
const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
const void *(*namespace)(struct kobject *kobj);
};
struct kobj_uevent_env {
};
struct kobj_attribute {
struct attribute attr;
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
char *buf);
ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t count);
};
struct kobject {
struct kobject *parent;
struct kset *kset;
const struct kobj_type *ktype;
struct kernfs_node *sd; /* sysfs directory entry */
atomic_t ref;
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
};
struct kset {
struct kobject kobj;
};
#define kobject_add(...) 0
static inline void kobject_init(struct kobject *kobj, const struct kobj_type *ktype)
{
memset(kobj, 0, sizeof(*kobj));
atomic_set(&kobj->ref, 1);
kobj->ktype = ktype;
kobj->state_initialized = 1;
}
static inline void kobject_del(struct kobject *kobj);
static inline void kobject_cleanup(struct kobject *kobj)
{
const struct kobj_type *t = kobj->ktype;
/* remove from sysfs if the caller did not do it */
if (kobj->state_in_sysfs)
kobject_del(kobj);
if (t && t->release)
t->release(kobj);
}
static inline void kobject_put(struct kobject *kobj)
{
BUG_ON(!kobj);
BUG_ON(!kobj->state_initialized);
if (atomic_dec_and_test(&kobj->ref))
kobject_cleanup(kobj);
}
static inline void kobject_del(struct kobject *kobj)
{
if (!kobj)
return;
kobj->state_in_sysfs = 0;
#if 0
kobj_kset_leave(kobj);
#endif
kobject_put(kobj->parent);
kobj->parent = NULL;
}
static inline struct kobject *kobject_get(struct kobject *kobj)
{
BUG_ON(!kobj);
BUG_ON(!kobj->state_initialized);
atomic_inc(&kobj->ref);
return kobj;
}
static inline void kset_unregister(struct kset *kset)
{
kfree(kset);
}
#define kset_create_and_add(_name, _u, _parent) \
((struct kset *) kzalloc(sizeof(struct kset), GFP_KERNEL))
#endif /* _KOBJECT_H_ */