mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-01-23 00:07:07 +03:00
130 lines
2.8 KiB
C
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_ */
|