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

[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
......@@ -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
......
......@@ -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);
disk_name(hd, 0, state->name);
printk(KERN_INFO " %s:", state->name);
if (isdigit(state->name[strlen(state->name)-1]))
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);
......
/*
* 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);
}
#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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment