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

Commit a2964188 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

[PATCH] devfs: Remove devfs from the partition code



This patch removes the devfs code from the fs/partitions/ directory.

Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 5c3927dc
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@

obj-y := check.o

obj-$(CONFIG_DEVFS_FS) += devfs.o
obj-$(CONFIG_ACORN_PARTITION) += acorn.o
obj-$(CONFIG_AMIGA_PARTITION) += amiga.o
obj-$(CONFIG_ATARI_PARTITION) += atari.o
+5 −21
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@
#include <linux/devfs_fs_kernel.h>

#include "check.h"
#include "devfs.h"

#include "acorn.h"
#include "amiga.h"
@@ -161,18 +160,11 @@ check_partition(struct gendisk *hd, struct block_device *bdev)
	if (!state)
		return NULL;

#ifdef CONFIG_DEVFS_FS
	if (hd->devfs_name[0] != '\0') {
		printk(KERN_INFO " /dev/%s:", hd->devfs_name);
		sprintf(state->name, "p");
	}
#endif
	else {
	disk_name(hd, 0, state->name);
	printk(KERN_INFO " %s:", state->name);
	if (isdigit(state->name[strlen(state->name)-1]))
		sprintf(state->name, "p");
	}

	state->limit = hd->minors;
	i = res = 0;
	while (!res && check_part[i]) {
@@ -423,14 +415,8 @@ void register_disk(struct gendisk *disk)
 	disk_sysfs_add_subdirs(disk);

	/* No minors to use for partitions */
	if (disk->minors == 1) {
		if (disk->devfs_name[0] != '\0')
			devfs_add_disk(disk);
	if (disk->minors == 1)
		goto exit;
	}

	/* always add handle for the whole disk */
	devfs_add_partitioned(disk);

	/* No such device (e.g., media were just removed) */
	if (!get_capacity(disk))
@@ -538,8 +524,6 @@ void del_gendisk(struct gendisk *disk)
	disk_stat_set_all(disk, 0);
	disk->stamp = 0;

	devfs_remove_disk(disk);

	kobject_uevent(&disk->kobj, KOBJ_REMOVE);
	if (disk->holder_dir)
		kobject_unregister(disk->holder_dir);

fs/partitions/devfs.c

deleted100644 → 0
+0 −130
Original line number Diff line number Diff line
/*
 * This tries to keep block devices away from devfs as much as possible.
 */
#include <linux/fs.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/vmalloc.h>
#include <linux/genhd.h>
#include <linux/bitops.h>
#include <linux/mutex.h>


struct unique_numspace {
	u32		  num_free;          /*  Num free in bits       */
	u32		  length;            /*  Array length in bytes  */
	unsigned long	  *bits;
	struct semaphore  mutex;
};

static DEFINE_MUTEX(numspace_mutex);

static int expand_numspace(struct unique_numspace *s)
{
	u32 length;
	void *bits;

	if (s->length < 16)
		length = 16;
	else
		length = s->length << 1;

	bits = vmalloc(length);
	if (!bits)
		return -ENOMEM;
	if (s->bits) {
		memcpy(bits, s->bits, s->length);
		vfree(s->bits);
	}
		
	s->num_free = (length - s->length) << 3;
	s->bits = bits;
	memset(bits + s->length, 0, length - s->length);
	s->length = length;

	return 0;
}

static int alloc_unique_number(struct unique_numspace *s)
{
	int rval = 0;

	mutex_lock(&numspace_mutex);
	if (s->num_free < 1)
		rval = expand_numspace(s);
	if (!rval) {
		rval = find_first_zero_bit(s->bits, s->length << 3);
		--s->num_free;
		__set_bit(rval, s->bits);
	}
	mutex_unlock(&numspace_mutex);

	return rval;
}

static void dealloc_unique_number(struct unique_numspace *s, int number)
{
	int old_val;

	if (number >= 0) {
		mutex_lock(&numspace_mutex);
		old_val = __test_and_clear_bit(number, s->bits);
		if (old_val)
			++s->num_free;
		mutex_unlock(&numspace_mutex);
	}
}

static struct unique_numspace disc_numspace;
static struct unique_numspace cdrom_numspace;

void devfs_add_partitioned(struct gendisk *disk)
{
	char dirname[64], symlink[16];

	devfs_mk_dir(disk->devfs_name);
	devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
			S_IFBLK|S_IRUSR|S_IWUSR,
			"%s/disc", disk->devfs_name);

	disk->number = alloc_unique_number(&disc_numspace);

	sprintf(symlink, "discs/disc%d", disk->number);
	sprintf(dirname, "../%s", disk->devfs_name);
	devfs_mk_symlink(symlink, dirname);

}

void devfs_add_disk(struct gendisk *disk)
{
	devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
			(disk->flags & GENHD_FL_CD) ?
				S_IFBLK|S_IRUGO|S_IWUGO :
				S_IFBLK|S_IRUSR|S_IWUSR,
			"%s", disk->devfs_name);

	if (disk->flags & GENHD_FL_CD) {
		char dirname[64], symlink[16];

		disk->number = alloc_unique_number(&cdrom_numspace);

		sprintf(symlink, "cdroms/cdrom%d", disk->number);
		sprintf(dirname, "../%s", disk->devfs_name);
		devfs_mk_symlink(symlink, dirname);
	}
}

void devfs_remove_disk(struct gendisk *disk)
{
	if (disk->minors != 1) {
		devfs_remove("discs/disc%d", disk->number);
		dealloc_unique_number(&disc_numspace, disk->number);
		devfs_remove("%s/disc", disk->devfs_name);
	}
	if (disk->flags & GENHD_FL_CD) {
		devfs_remove("cdroms/cdrom%d", disk->number);
		dealloc_unique_number(&cdrom_numspace, disk->number);
	}
	devfs_remove(disk->devfs_name);
}

fs/partitions/devfs.h

deleted100644 → 0
+0 −10
Original line number Diff line number Diff line

#ifdef CONFIG_DEVFS_FS
void devfs_add_disk(struct gendisk *dev);
void devfs_add_partitioned(struct gendisk *dev);
void devfs_remove_disk(struct gendisk *dev);
#else
# define devfs_add_disk(disk)			do { } while (0)
# define devfs_add_partitioned(disk)		do { } while (0)
# define devfs_remove_disk(disk)		do { } while (0)
#endif