cregit-Linux how code gets into the kernel

Release 4.18 drivers/s390/char/tape_class.c

// SPDX-License-Identifier: GPL-2.0
/*
 * 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; rc = cdev_add(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 Morton27085.71%218.18%
Heiko Carstens3611.43%218.18%
Greg Kroah-Hartman41.27%327.27%
Cornelia Huck20.63%19.09%
Eric Sesterhenn / Snakebyte10.32%19.09%
Arjan van de Ven10.32%19.09%
Thomas Meyer10.32%19.09%
Total315100.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 Morton5585.94%240.00%
Michael Holzheu69.38%120.00%
Greg Kroah-Hartman23.12%120.00%
Cornelia 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 Morton2095.24%266.67%
Greg 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 Morton1794.44%266.67%
Greg Kroah-Hartman15.56%133.33%
Total18100.00%3100.00%

postcore_initcall(tape_init); module_exit(tape_exit);

Overall Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton40484.17%211.11%
Heiko Carstens398.12%422.22%
Michael Holzheu173.54%211.11%
Greg Kroah-Hartman112.29%527.78%
Cornelia Huck30.62%15.56%
Tejun Heo30.62%15.56%
Thomas Meyer10.21%15.56%
Eric Sesterhenn / Snakebyte10.21%15.56%
Arjan van de Ven10.21%15.56%
Total480100.00%18100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.