#include <linux/module.h>
#include <linux/init.h>
#include <linux/file.h>
#include <linux/blkdev.h>
#include <linux/cdev.h>
#include <linux/jiffies.h>
#include <linux/percpu.h>
#include <linux/idr.h>
#include <linux/bsg.h>
#include <linux/slab.h>
#include <scsi/scsi.h>
#include <scsi/scsi_ioctl.h>
#include <scsi/sg.h>
#define BSG_DESCRIPTION …
#define BSG_VERSION …
struct bsg_device { … };
static inline struct bsg_device *to_bsg_device(struct inode *inode)
{ … }
#define BSG_DEFAULT_CMDS …
#define BSG_MAX_DEVS …
static DEFINE_IDA(bsg_minor_ida);
static const struct class bsg_class;
static int bsg_major;
static unsigned int bsg_timeout(struct bsg_device *bd, struct sg_io_v4 *hdr)
{ … }
static int bsg_sg_io(struct bsg_device *bd, bool open_for_write,
void __user *uarg)
{ … }
static int bsg_open(struct inode *inode, struct file *file)
{ … }
static int bsg_release(struct inode *inode, struct file *file)
{ … }
static int bsg_get_command_q(struct bsg_device *bd, int __user *uarg)
{ … }
static int bsg_set_command_q(struct bsg_device *bd, int __user *uarg)
{ … }
static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{ … }
static const struct file_operations bsg_fops = …;
static void bsg_device_release(struct device *dev)
{ … }
void bsg_unregister_queue(struct bsg_device *bd)
{ … }
EXPORT_SYMBOL_GPL(…);
struct bsg_device *bsg_register_queue(struct request_queue *q,
struct device *parent, const char *name, bsg_sg_io_fn *sg_io_fn)
{ … }
EXPORT_SYMBOL_GPL(…);
static char *bsg_devnode(const struct device *dev, umode_t *mode)
{ … }
static const struct class bsg_class = …;
static int __init bsg_init(void)
{ … }
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…);
MODULE_LICENSE(…) …;
device_initcall(bsg_init);