%PDF- %PDF-
Direktori : /usr/src/blksnap-6.3.0.73/ |
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; } }