%PDF- %PDF-
| Direktori : /var/lib/dkms/blksnap/6.3.0.73/source/ |
| Current File : //var/lib/dkms/blksnap/6.3.0.73/source/sysfs.c |
// SPDX-License-Identifier: GPL-2.0
#define pr_fmt(fmt) KBUILD_MODNAME "-sysfs: " fmt
#include <linux/blkdev.h>
#include <linux/sysfs.h>
#include <linux/device.h>
#ifdef STANDALONE_BDEVFILTER
#include "blk_snap.h"
#else
#include <linux/blk_snap.h>
#endif
#include "memory_checker.h"
#include "sysfs.h"
#include "ctrl.h"
#ifdef STANDALONE_BDEVFILTER
#include "log.h"
#endif
#if defined(HAVE_DEFINE_CLASS_CREATE_H)
static ssize_t major_show(struct class *class, struct class_attribute *attr,
char *buf)
#else
static ssize_t major_show(const struct class *class, const struct class_attribute *attr,
char *buf)
#endif
{
sprintf(buf, "%d", get_blk_snap_major());
return strlen(buf);
}
/* Declare class_attr_major */
static CLASS_ATTR_RO(major);
static struct class *blk_snap_class;
static struct device *blk_snap_device;
int sysfs_init(void)
{
struct device *dev;
int res;
#if defined(HAVE_DEFINE_CLASS_CREATE_H)
blk_snap_class = class_create(THIS_MODULE, BLK_SNAP_MODULE_NAME);
#else
blk_snap_class = class_create(BLK_SNAP_MODULE_NAME);
#endif
if (IS_ERR(blk_snap_class)) {
res = PTR_ERR(blk_snap_class);
pr_err("Bad class create. errno=%d\n", abs(res));
return res;
}
pr_info("Create 'major' sysfs attribute\n");
res = class_create_file(blk_snap_class, &class_attr_major);
if (res) {
pr_err("Failed to create 'major' sysfs file\n");
class_destroy(blk_snap_class);
blk_snap_class = NULL;
return res;
}
dev = device_create(blk_snap_class, NULL,
MKDEV(get_blk_snap_major(), 0), NULL,
BLK_SNAP_MODULE_NAME);
if (IS_ERR(dev)) {
res = PTR_ERR(dev);
pr_err("Failed to create device, errno=%d\n", abs(res));
class_remove_file(blk_snap_class, &class_attr_major);
class_destroy(blk_snap_class);
blk_snap_class = NULL;
return res;
}
blk_snap_device = dev;
return res;
}
void sysfs_done(void)
{
pr_info("Cleanup sysfs\n");
if (blk_snap_device) {
device_unregister(blk_snap_device);
blk_snap_device = NULL;
}
if (blk_snap_class != NULL) {
class_remove_file(blk_snap_class, &class_attr_major);
class_destroy(blk_snap_class);
blk_snap_class = NULL;
}
}