%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /usr/src/blksnap-6.3.0.73/
Upload File :
Create Path :
Current File : //usr/src/blksnap-6.3.0.73/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;
	}
}

Zerion Mini Shell 1.0