diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-07-27 23:20:03 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-07-27 23:20:03 +0000 |
commit | 89eba5eb77bbf92ffed6686c951cc35f4027e71f (patch) | |
tree | b56887b1753ca2573002bc7f60e5f3e47c33b116 /drivers/block | |
parent | f7ff3f5a67747c7714c3db772d05965a0c033705 (diff) |
Merge with Linux 2.4.0-test5-pre5.
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/Config.in | 2 | ||||
-rw-r--r-- | drivers/block/Makefile | 8 | ||||
-rw-r--r-- | drivers/block/ll_rw_blk.c | 1 | ||||
-rw-r--r-- | drivers/block/md.c | 64 | ||||
-rw-r--r-- | drivers/block/raid0.c | 2 | ||||
-rw-r--r-- | drivers/block/raid1.c | 14 | ||||
-rw-r--r-- | drivers/block/raid5.c | 8 | ||||
-rw-r--r-- | drivers/block/xor.c | 13 |
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 |