cregit-Linux how code gets into the kernel

Release 4.7 drivers/s390/char/tape_class.c

/*
 * Copyright IBM Corp. 2004
 *
 * Tape class device support
 *
 * Author: Stefan Bader <shbader@de.ibm.com>
 * Based on simple class device code by Greg K-H
 */


#define KMSG_COMPONENT "tape"

#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt

#include <linux/slab.h>

#include "tape_class.h"

MODULE_AUTHOR("Stefan Bader <shbader@de.ibm.com>");
MODULE_DESCRIPTION(
	"Copyright IBM Corp. 2004   All Rights Reserved.\n"
	"tape_class.c"
);
MODULE_LICENSE("GPL");


static struct class *tape_class;

/*
 * Register a tape device and return a pointer to the cdev structure.
 *
 * device
 *      The pointer to the struct device of the physical (base) device.
 * drivername
 *      The pointer to the drivers name for it's character devices.
 * dev
 *      The intended major/minor number. The major number may be 0 to
 *      get a dynamic major number.
 * fops
 *      The pointer to the drivers file operations for the tape device.
 * devname
 *      The pointer to the name of the character device.
 */

struct tape_class_device *register_tape_dev( struct device * device, dev_t dev, const struct file_operations *fops, char * device_name, char * mode_name) { struct tape_class_device * tcd; int rc; char * s; tcd = kzalloc(sizeof(struct tape_class_device), GFP_KERNEL); if (!tcd) return ERR_PTR(-ENOMEM); strncpy(tcd->device_name, device_name, TAPECLASS_NAME_LEN); for (s = strchr(tcd->device_name, '/'); s; s = strchr(s, '/')) *s = '!'; strncpy(tcd->mode_name, mode_name, TAPECLASS_NAME_LEN); for (s = strchr(tcd->mode_name, '/'); s; s = strchr(s, '/')) *s = '!'; tcd->char_device = cdev_alloc(); if (!tcd->char_device) { rc = -ENOMEM; goto fail_with_tcd; } tcd->char_device->owner = fops->owner; tcd->char_device->ops = fops; tcd->char_device->dev = dev; rc = cdev_add(tcd->char_device, tcd->char_device->dev, 1); if (rc) goto fail_with_cdev; tcd->class_device = device_create(tape_class, device, tcd->char_device->dev, NULL, "%s", tcd->device_name); rc = PTR_RET(tcd->class_device); if (rc) goto fail_with_cdev; rc = sysfs_create_link( &device->kobj, &tcd->class_device->kobj, tcd->mode_name ); if (rc) goto fail_with_class_device; return tcd; fail_with_class_device: device_destroy(tape_class, tcd->char_device->dev); fail_with_cdev: cdev_del(tcd->char_device); fail_with_tcd: kfree(tcd); return ERR_PTR(rc); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton28286.24%218.18%
heiko carstensheiko carstens3611.01%218.18%
greg kroah-hartmangreg kroah-hartman41.22%327.27%
cornelia huckcornelia huck20.61%19.09%
arjan van de venarjan van de ven10.31%19.09%
thomas meyerthomas meyer10.31%19.09%
eric sesterhenneric sesterhenn10.31%19.09%
Total327100.00%11100.00%

EXPORT_SYMBOL(register_tape_dev);
void unregister_tape_dev(struct device *device, struct tape_class_device *tcd) { if (tcd != NULL && !IS_ERR(tcd)) { sysfs_remove_link(&device->kobj, tcd->mode_name); device_destroy(tape_class, tcd->char_device->dev); cdev_del(tcd->char_device); kfree(tcd); } }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton5585.94%240.00%
michael holzheumichael holzheu69.38%120.00%
greg kroah-hartmangreg kroah-hartman23.12%120.00%
cornelia huckcornelia huck11.56%120.00%
Total64100.00%5100.00%

EXPORT_SYMBOL(unregister_tape_dev);
static int __init tape_init(void) { tape_class = class_create(THIS_MODULE, "tape390"); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton2095.24%266.67%
greg kroah-hartmangreg kroah-hartman14.76%133.33%
Total21100.00%3100.00%


static void __exit tape_exit(void) { class_destroy(tape_class); tape_class = NULL; }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton1794.44%266.67%
greg kroah-hartmangreg kroah-hartman15.56%133.33%
Total18100.00%3100.00%

postcore_initcall(tape_init); module_exit(tape_exit);

Overall Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton41684.73%211.76%
heiko carstensheiko carstens397.94%423.53%
michael holzheumichael holzheu173.46%211.76%
greg kroah-hartmangreg kroah-hartman102.04%423.53%
cornelia huckcornelia huck30.61%15.88%
tejun heotejun heo30.61%15.88%
eric sesterhenneric sesterhenn10.20%15.88%
arjan van de venarjan van de ven10.20%15.88%
thomas meyerthomas meyer10.20%15.88%
Total491100.00%17100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}