summaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-07-27 23:20:03 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-07-27 23:20:03 +0000
commit89eba5eb77bbf92ffed6686c951cc35f4027e71f (patch)
treeb56887b1753ca2573002bc7f60e5f3e47c33b116 /drivers/block
parentf7ff3f5a67747c7714c3db772d05965a0c033705 (diff)
Merge with Linux 2.4.0-test5-pre5.
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/Config.in2
-rw-r--r--drivers/block/Makefile8
-rw-r--r--drivers/block/ll_rw_blk.c1
-rw-r--r--drivers/block/md.c64
-rw-r--r--drivers/block/raid0.c2
-rw-r--r--drivers/block/raid1.c14
-rw-r--r--drivers/block/raid5.c8
-rw-r--r--drivers/block/xor.c13
8 files changed, 86 insertions, 26 deletions
diff --git a/drivers/block/Config.in b/drivers/block/Config.in
index b04bd828e..4a92d53c2 100644
--- a/drivers/block/Config.in
+++ b/drivers/block/Config.in
@@ -44,7 +44,7 @@ if [ "$CONFIG_BLK_DEV_LVM" != "n" ]; then
bool ' LVM information in proc filesystem' CONFIG_LVM_PROC_FS Y
fi
-bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD
+tristate 'Multiple devices driver support' CONFIG_BLK_DEV_MD
dep_tristate ' Linear (append) mode' CONFIG_MD_LINEAR $CONFIG_BLK_DEV_MD
dep_tristate ' RAID-0 (striping) mode' CONFIG_MD_RAID0 $CONFIG_BLK_DEV_MD
dep_tristate ' RAID-1 (mirroring) mode' CONFIG_MD_RAID1 $CONFIG_BLK_DEV_MD
diff --git a/drivers/block/Makefile b/drivers/block/Makefile
index 30ebf11c2..af03cdf7b 100644
--- a/drivers/block/Makefile
+++ b/drivers/block/Makefile
@@ -42,13 +42,7 @@ obj-$(CONFIG_BLK_DEV_MD) += md.o
obj-$(CONFIG_MD_LINEAR) += linear.o
obj-$(CONFIG_MD_RAID0) += raid0.o
obj-$(CONFIG_MD_RAID1) += raid1.o
-
-ifeq ($(CONFIG_MD_RAID5),m)
- obj-y += xor.o
-else
- obj-$(CONFIG_MD_RAID5) += xor.o
-endif
-obj-$(CONFIG_MD_RAID5) += raid5.o
+obj-$(CONFIG_MD_RAID5) += raid5.o xor.o
obj-$(CONFIG_BLK_DEV_NBD) += nbd.o
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
index ee9de09ec..3672e8976 100644
--- a/drivers/block/ll_rw_blk.c
+++ b/drivers/block/ll_rw_blk.c
@@ -1052,4 +1052,5 @@ EXPORT_SYMBOL(blk_queue_headactive);
EXPORT_SYMBOL(blk_queue_pluggable);
EXPORT_SYMBOL(blk_queue_make_request);
EXPORT_SYMBOL(generic_make_request);
+EXPORT_SYMBOL(generic_unplug_device);
EXPORT_SYMBOL(blkdev_release_request);
diff --git a/drivers/block/md.c b/drivers/block/md.c
index 2eb6cea4b..afde399d4 100644
--- a/drivers/block/md.c
+++ b/drivers/block/md.c
@@ -28,6 +28,7 @@
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <linux/module.h>
#include <linux/config.h>
#include <linux/raid/md.h>
#include <linux/raid/xor.h>
@@ -265,6 +266,8 @@ static mddev_t * alloc_mddev (kdev_t dev)
add_mddev_mapping(mddev, dev, 0);
md_list_add(&mddev->all_mddevs, &all_mddevs);
+ MOD_INC_USE_COUNT;
+
return mddev;
}
@@ -807,6 +810,7 @@ static void free_mddev (mddev_t *mddev)
MD_INIT_LIST_HEAD(&mddev->all_mddevs);
blk_cleanup_queue(&mddev->queue);
kfree(mddev);
+ MOD_DEC_USE_COUNT;
}
#undef BAD_CSUM
@@ -2895,7 +2899,7 @@ int md_thread(void * arg)
/*
* Detach thread
*/
- sys_setsid();
+ daemonize();
sprintf(current->comm, thread->name);
md_init_signals();
md_flush_signals();
@@ -3582,7 +3586,7 @@ struct notifier_block md_notifier = {
NULL,
0
};
-
+#ifndef MODULE
static int md__init raid_setup(char *str)
{
int len, pos;
@@ -3605,7 +3609,7 @@ static int md__init raid_setup(char *str)
return 1;
}
__setup("raid=", raid_setup);
-
+#endif
static void md_geninit (void)
{
int i;
@@ -3679,12 +3683,6 @@ int md__init md_init (void)
#ifdef CONFIG_MD_RAID5
raid5_init ();
#endif
-#if defined(CONFIG_MD_RAID5) || defined(CONFIG_MD_RAID5_MODULE)
- /*
- * pick a XOR routine, runtime.
- */
- calibrate_xor_block();
-#endif
md_geninit();
return (0);
}
@@ -3855,6 +3853,54 @@ void md__init md_setup_drive(void)
__setup("md=", md_setup);
#endif
+#ifdef MODULE
+int init_module (void)
+{
+ return md_init();
+}
+
+static void free_device_names(void)
+{
+ while (device_names.next != &device_names) {
+ struct list_head *tmp = device_names.next;
+ list_del(tmp);
+ kfree(tmp);
+ }
+}
+
+
+void cleanup_module (void)
+{
+ struct gendisk **gendisk_ptr;
+
+ md_unregister_thread(md_recovery_thread);
+ devfs_unregister(devfs_handle);
+
+ devfs_unregister_blkdev(MAJOR_NR,"md");
+ unregister_reboot_notifier(&md_notifier);
+ unregister_sysctl_table(raid_table_header);
+#ifdef CONFIG_PROC_FS
+ remove_proc_entry("mdstat", NULL);
+#endif
+
+ gendisk_ptr = &gendisk_head;
+ while (*gendisk_ptr) {
+ if (*gendisk_ptr == &md_gendisk) {
+ *gendisk_ptr = md_gendisk.next;
+ break;
+ }
+ gendisk_ptr = & (*gendisk_ptr)->next;
+ }
+ blk_dev[MAJOR_NR].queue = NULL;
+ blksize_size[MAJOR_NR] = NULL;
+ blk_size[MAJOR_NR] = NULL;
+ max_readahead[MAJOR_NR] = NULL;
+ hardsect_size[MAJOR_NR] = NULL;
+
+ free_device_names();
+
+}
+#endif
MD_EXPORT_SYMBOL(md_size);
MD_EXPORT_SYMBOL(register_md_personality);
diff --git a/drivers/block/raid0.c b/drivers/block/raid0.c
index f37d8e5fb..48055ecea 100644
--- a/drivers/block/raid0.c
+++ b/drivers/block/raid0.c
@@ -258,7 +258,7 @@ static int raid0_make_request (request_queue_t *q, mddev_t *mddev,
sect_in_chunk = bh->b_rsector & ((chunk_size<<1) -1);
chunk = (block - zone->zone_offset) / (zone->nb_dev << chunksize_bits);
tmp_dev = zone->dev[(block >> chunksize_bits) % zone->nb_dev];
- rsect = ((chunk << chunksize_bits) + zone->dev_offset)<<1
+ rsect = (((chunk << chunksize_bits) + zone->dev_offset)<<1)
+ sect_in_chunk;
/*
diff --git a/drivers/block/raid1.c b/drivers/block/raid1.c
index 608bc4c43..c8b2ce456 100644
--- a/drivers/block/raid1.c
+++ b/drivers/block/raid1.c
@@ -379,7 +379,7 @@ static void raid1_end_bh_io (struct raid1_bh *r1_bh, int uptodate)
}
void raid1_end_request (struct buffer_head *bh, int uptodate)
{
- struct raid1_bh * r1_bh = (struct raid1_bh *)(bh->b_dev_id);
+ struct raid1_bh * r1_bh = (struct raid1_bh *)(bh->b_private);
/*
* this branch is our 'one mirror IO has finished' event handler:
@@ -626,7 +626,7 @@ static int raid1_make_request (request_queue_t *q, mddev_t *mddev, int rw,
bh_req->b_rdev = mirror->dev;
/* bh_req->b_rsector = bh->n_rsector; */
bh_req->b_end_io = raid1_end_request;
- bh_req->b_dev_id = r1_bh;
+ bh_req->b_private = r1_bh;
q = blk_get_queue(bh_req->b_rdev);
generic_make_request (q, rw, bh_req);
return 0;
@@ -679,7 +679,7 @@ static int raid1_make_request (request_queue_t *q, mddev_t *mddev, int rw,
mbh->b_data = bh->b_data;
mbh->b_list = BUF_LOCKED;
mbh->b_end_io = raid1_end_request;
- mbh->b_dev_id = r1_bh;
+ mbh->b_private = r1_bh;
mbh->b_next = r1_bh->mirror_bh_list;
r1_bh->mirror_bh_list = mbh;
@@ -1192,7 +1192,7 @@ static void raid1d (void *data)
mbh->b_data = bh->b_data;
mbh->b_list = BUF_LOCKED;
mbh->b_end_io = end_sync_write;
- mbh->b_dev_id = r1_bh;
+ mbh->b_private = r1_bh;
mbh->b_next = r1_bh->mirror_bh_list;
r1_bh->mirror_bh_list = mbh;
@@ -1430,7 +1430,7 @@ static int raid1_sync_request (mddev_t *mddev, unsigned long block_nr)
if (bh->b_data != (char *) page_address(bh->b_page))
BUG();
bh->b_end_io = end_sync_read;
- bh->b_dev_id = (void *) r1_bh;
+ bh->b_private = r1_bh;
bh->b_rsector = block_nr<<1;
init_waitqueue_head(&bh->b_wait);
@@ -1448,7 +1448,7 @@ nomem:
static void end_sync_read(struct buffer_head *bh, int uptodate)
{
- struct raid1_bh * r1_bh = (struct raid1_bh *)(bh->b_dev_id);
+ struct raid1_bh * r1_bh = (struct raid1_bh *)(bh->b_private);
/* we have read a block, now it needs to be re-written,
* or re-read if the read failed.
@@ -1463,7 +1463,7 @@ static void end_sync_read(struct buffer_head *bh, int uptodate)
static void end_sync_write(struct buffer_head *bh, int uptodate)
{
- struct raid1_bh * r1_bh = (struct raid1_bh *)(bh->b_dev_id);
+ struct raid1_bh * r1_bh = (struct raid1_bh *)(bh->b_private);
if (!uptodate)
md_error (mddev_to_kdev(r1_bh->mddev), bh->b_dev);
diff --git a/drivers/block/raid5.c b/drivers/block/raid5.c
index e7e73c689..4dc2d7d40 100644
--- a/drivers/block/raid5.c
+++ b/drivers/block/raid5.c
@@ -597,7 +597,7 @@ static inline void raid5_mark_buffer_uptodate (struct buffer_head *bh, int uptod
static void raid5_end_request (struct buffer_head * bh, int uptodate)
{
- struct stripe_head *sh = bh->b_dev_id;
+ struct stripe_head *sh = bh->b_private;
raid5_conf_t *conf = sh->raid_conf;
int disks = conf->raid_disks, i;
unsigned long flags;
@@ -2391,6 +2391,12 @@ int raid5_init (void)
err = register_md_personality (RAID5, &raid5_personality);
if (err)
return err;
+
+ /*
+ * pick a XOR routine, runtime.
+ */
+ calibrate_xor_block();
+
return 0;
}
diff --git a/drivers/block/xor.c b/drivers/block/xor.c
index 18abb6621..362ec6f8f 100644
--- a/drivers/block/xor.c
+++ b/drivers/block/xor.c
@@ -1827,6 +1827,8 @@ static struct buffer_head b1, b2;
void calibrate_xor_block(void)
{
+ if (xor_block)
+ return;
memset(&b1,0,sizeof(b1));
b2 = b1;
@@ -1885,6 +1887,8 @@ void calibrate_xor_block(void)
void calibrate_xor_block(void)
{
+ if (xor_block)
+ return;
printk(KERN_INFO "raid5: using high-speed VIS checksum routine\n");
xor_block = xor_block_VIS;
}
@@ -1892,3 +1896,12 @@ void calibrate_xor_block(void)
#endif /* __sparc_v9__ */
MD_EXPORT_SYMBOL(xor_block);
+MD_EXPORT_SYMBOL(calibrate_xor_block);
+
+#ifdef MODULE
+int init_module(void)
+{
+ calibrate_xor_block();
+ return 0;
+}
+#endif