Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 389e0cb9 authored by Kay Sievers's avatar Kay Sievers Committed by Greg Kroah-Hartman
Browse files

mem_class: use minor as index instead of searching the array



Declare the device list with the minor numbers as the index, which saves us from
searching for a matching list entry. Remove old devfs permissions declaration.

Signed-off-by: default avatarKay Sievers <kay.sievers@vrfy.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent a4dbd674
Loading
Loading
Loading
Loading
+40 −42
Original line number Diff line number Diff line
@@ -864,71 +864,67 @@ static const struct file_operations kmsg_fops = {
	.write =	kmsg_write,
};

static const struct {
	unsigned int		minor;
	char			*name;
	umode_t			mode;
static const struct memdev {
	const char *name;
	const struct file_operations *fops;
	struct backing_dev_info *dev_info;
} devlist[] = { /* list of minor devices */
	{1, "mem",     S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops,
		&directly_mappable_cdev_bdi},
} devlist[] = {
	[ 1] = { "mem", &mem_fops, &directly_mappable_cdev_bdi },
#ifdef CONFIG_DEVKMEM
	{2, "kmem",    S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops,
		&directly_mappable_cdev_bdi},
	[ 2] = { "kmem", &kmem_fops, &directly_mappable_cdev_bdi },
#endif
	{3, "null",    S_IRUGO | S_IWUGO,           &null_fops, NULL},
	[ 3] = {"null", &null_fops, NULL },
#ifdef CONFIG_DEVPORT
	{4, "port",    S_IRUSR | S_IWUSR | S_IRGRP, &port_fops, NULL},
	[ 4] = { "port", &port_fops, NULL },
#endif
	{5, "zero",    S_IRUGO | S_IWUGO,           &zero_fops, &zero_bdi},
	{7, "full",    S_IRUGO | S_IWUGO,           &full_fops, NULL},
	{8, "random",  S_IRUGO | S_IWUSR,           &random_fops, NULL},
	{9, "urandom", S_IRUGO | S_IWUSR,           &urandom_fops, NULL},
	{11,"kmsg",    S_IRUGO | S_IWUSR,           &kmsg_fops, NULL},
	[ 5] = { "zero", &zero_fops, &zero_bdi },
	[ 6] = { "full", &full_fops, NULL },
	[ 7] = { "random", &random_fops, NULL },
	[ 9] = { "urandom", &urandom_fops, NULL },
	[11] = { "kmsg", &kmsg_fops, NULL },
#ifdef CONFIG_CRASH_DUMP
	{12,"oldmem",    S_IRUSR | S_IWUSR | S_IRGRP, &oldmem_fops, NULL},
	[12] = { "oldmem", &oldmem_fops, NULL },
#endif
};

static int memory_open(struct inode *inode, struct file *filp)
{
	int ret = 0;
	int i;
	int minor;
	const struct memdev *dev;
	int ret = -ENXIO;

	lock_kernel();

	for (i = 0; i < ARRAY_SIZE(devlist); i++) {
		if (devlist[i].minor == iminor(inode)) {
			filp->f_op = devlist[i].fops;
			if (devlist[i].dev_info) {
				filp->f_mapping->backing_dev_info =
					devlist[i].dev_info;
			}
	minor = iminor(inode);
	if (minor >= ARRAY_SIZE(devlist))
		goto out;

			break;
		}
	}
	dev = &devlist[minor];
	if (!dev->fops)
		goto out;

	if (i == ARRAY_SIZE(devlist))
		ret = -ENXIO;
	else
		if (filp->f_op && filp->f_op->open)
			ret = filp->f_op->open(inode, filp);
	filp->f_op = dev->fops;
	if (dev->dev_info)
		filp->f_mapping->backing_dev_info = dev->dev_info;

	if (dev->fops->open)
		ret = dev->fops->open(inode, filp);
	else
		ret = 0;
out:
	unlock_kernel();
	return ret;
}

static const struct file_operations memory_fops = {
	.open		= memory_open,	/* just a selector for the real open */
	.open		= memory_open,
};

static struct class *mem_class;

static int __init chr_dev_init(void)
{
	int i;
	int minor;
	int err;

	err = bdi_init(&zero_bdi);
@@ -939,10 +935,12 @@ static int __init chr_dev_init(void)
		printk("unable to get major %d for memory devs\n", MEM_MAJOR);

	mem_class = class_create(THIS_MODULE, "mem");
	for (i = 0; i < ARRAY_SIZE(devlist); i++)
		device_create(mem_class, NULL,
			      MKDEV(MEM_MAJOR, devlist[i].minor), NULL,
			      devlist[i].name);
	for (minor = 1; minor < ARRAY_SIZE(devlist); minor++) {
		if (!devlist[minor].name)
			continue;
		device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor),
			      NULL, devlist[minor].name);
	}

	return 0;
}