diff -urN generic-map-ref/drivers/block/ll_rw_blk.c generic-map/drivers/block/ll_rw_blk.c --- generic-map-ref/drivers/block/ll_rw_blk.c Mon Feb 19 01:58:01 2001 +++ generic-map/drivers/block/ll_rw_blk.c Mon Feb 19 01:58:12 2001 @@ -23,7 +23,6 @@ #include #include #include -#include #ifdef CONFIG_POWERMAC #include @@ -31,14 +30,6 @@ #include -#if defined CONFIG_BLK_DEV_LVM || defined CONFIG_BLK_DEV_LVM_MODULE -#include - /* function pointer to the LVM driver remapping function - which will be setup during driver/module init; neccessary - to be able to load LVM as a module */ -int (*lvm_map_ptr) (struct buffer_head *, int) = NULL; -#endif - /* * The request-struct contains all necessary data * to load a nr of sectors into memory @@ -816,7 +807,7 @@ { unsigned int major; int correct_size; - struct blk_dev_struct * dev; + struct blk_dev_struct * dev, * tdev = NULL; int i; /* Make sure that the first block contains something reasonable */ @@ -829,7 +820,7 @@ dev = NULL; if ((major = MAJOR(bh[0]->b_dev)) < MAX_BLKDEV) dev = blk_dev + major; - if (!dev || !dev->request_fn) { + if (!dev || (!dev->request_fn && !dev->makerq_fn && !dev->map_fn)) { printk(KERN_ERR "ll_rw_block: Trying to read nonexistent block-device %s (%ld)\n", kdevname(bh[0]->b_dev), bh[0]->b_blocknr); @@ -845,47 +836,38 @@ /* Verify requested block sizes. */ for (i = 0; i < nr; i++) { - if (bh[i] && bh[i]->b_size != correct_size) { + if (bh[i]->b_size != correct_size) { printk(KERN_NOTICE "ll_rw_block: device %s: " "only %d-char blocks implemented (%lu)\n", kdevname(bh[0]->b_dev), correct_size, bh[i]->b_size); goto sorry; } + /* LVM and MD remap blocks now */ -#if defined CONFIG_BLK_DEV_LVM || defined CONFIG_BLK_DEV_LVM_MODULE - major = MAJOR(bh[i]->b_dev); - if (major == LVM_BLK_MAJOR) { - if (lvm_map_ptr == NULL) { - printk(KERN_ERR - "Bad lvm_map_ptr in ll_rw_block\n"); - goto sorry; - } - if ((lvm_map_ptr) (bh[i], rw) != 0) { - printk(KERN_ERR - "Bad lvm_map in ll_rw_block\n"); - goto sorry; - } - /* remap major too ... */ - major = MAJOR(bh[i]->b_rdev); - } else { - bh[i]->b_rdev = bh[i]->b_dev; - bh[i]->b_rsector = bh[i]->b_blocknr * (bh[i]->b_size >> 9); - } -#else bh[i]->b_rdev = bh[i]->b_dev; bh[i]->b_rsector=bh[i]->b_blocknr*(bh[i]->b_size >> 9); -#endif -#ifdef CONFIG_BLK_DEV_MD - if (major==MD_MAJOR && - /* changed v to allow LVM to remap */ - md_map (bh[i]->b_rdev, &bh[i]->b_rdev, - &bh[i]->b_rsector, bh[i]->b_size >> 9)) { - printk (KERN_ERR - "Bad md_map in ll_rw_block\n"); - goto sorry; + + tdev = dev; + while (tdev->map_fn) { + kdev_t __rdev = bh[i]->b_rdev; + unsigned long __rsector = bh[i]->b_rsector; + + if (tdev->map_fn (bh[i]->b_rdev, &bh[i]->b_rdev, + &bh[i]->b_rsector, + bh[i]->b_size >> 9, rw)) { + printk (KERN_ERR "Bad map in ll_rw_block\n"); + goto sorry; + } + if (__rdev == bh[i]->b_rdev && + __rsector == bh[i]->b_rsector) + /* + * Break the loop if map_fn is a noop + * as it happens with raid1. + */ + break; + tdev = blk_dev + MAJOR(bh[i]->b_rdev); } -#endif } if ((rw == WRITE || rw == WRITEA) && is_read_only(bh[0]->b_dev)) { @@ -895,17 +877,12 @@ } for (i = 0; i < nr; i++) { - if (bh[i]) { - set_bit(BH_Req, &bh[i]->b_state); -#ifdef CONFIG_BLK_DEV_MD - /* changed v to allow LVM to remap */ - if (MAJOR(bh[i]->b_rdev) == MD_MAJOR) { - md_make_request(bh[i], rw); - continue; - } -#endif - make_request(MAJOR(bh[i]->b_rdev), rw, bh[i]); + set_bit(BH_Req, &bh[i]->b_state); + if (tdev->makerq_fn) { + tdev->makerq_fn(bh[i], rw); + continue; } + make_request(MAJOR(bh[i]->b_rdev), rw, bh[i]); } return; @@ -986,6 +963,8 @@ dev->request_fn = NULL; dev->queue = NULL; dev->current_request = NULL; + dev->map_fn = NULL; + dev->makerq_fn = NULL; dev->plug.rq_status = RQ_INACTIVE; dev->plug.cmd = -1; dev->plug.next = NULL; diff -urN generic-map-ref/drivers/block/lvm.c generic-map/drivers/block/lvm.c --- generic-map-ref/drivers/block/lvm.c Mon Feb 19 01:58:01 2001 +++ generic-map/drivers/block/lvm.c Mon Feb 19 01:58:20 2001 @@ -272,14 +272,11 @@ */ static void lvm_cleanup(void); static void lvm_init_vars(void); -#if LINUX_VERSION_CODE < KERNEL_VERSION ( 2, 3, 43) -extern int (*lvm_map_ptr) (struct buffer_head *, int); -#endif #ifdef LVM_HD_NAME extern void (*lvm_hd_name_ptr) (char *, int); #endif -static int lvm_map(struct buffer_head *, int); +static int lvm_map(kdev_t, kdev_t *, unsigned long *, unsigned long, int); static int lvm_do_lock_lvm(void); static int lvm_do_le_remap(vg_t *, void *); @@ -447,11 +444,6 @@ lvm_gendisk.next = NULL; } -#if LINUX_VERSION_CODE < KERNEL_VERSION ( 2, 3, 43) - /* reference from drivers/block/ll_rw_blk.c */ - lvm_map_ptr = lvm_map; -#endif - #ifdef LVM_HD_NAME /* reference from drivers/block/genhd.c */ lvm_hd_name_ptr = lvm_hd_name; @@ -459,6 +451,8 @@ blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; blk_dev[MAJOR_NR].current_request = NULL; + blk_dev[MAJOR_NR].makerq_fn = NULL; + blk_dev[MAJOR_NR].map_fn = lvm_map; /* optional read root VGDA */ /* @@ -498,6 +492,8 @@ #else blk_dev[MAJOR_NR].request_fn = NULL; blk_dev[MAJOR_NR].current_request = NULL; + blk_dev[MAJOR_NR].makerq_fn = NULL; + blk_dev[MAJOR_NR].map_fn = NULL; #endif gendisk_ptr = gendisk_ptr_prev = gendisk_head; @@ -519,11 +515,6 @@ remove_proc_entry(LVM_VG_SUBDIR, lvm_proc_dir); remove_proc_entry(LVM_DIR, &proc_root); -#if LINUX_VERSION_CODE < KERNEL_VERSION ( 2, 3, 43) - /* reference from linux/drivers/block/ll_rw_blk.c */ - lvm_map_ptr = NULL; -#endif - #ifdef LVM_HD_NAME /* reference from linux/drivers/block/genhd.c */ lvm_hd_name_ptr = NULL; @@ -1112,7 +1103,7 @@ bh.b_blocknr = block; bh.b_dev = bh.b_rdev = inode->i_rdev; bh.b_size = lvm_get_blksize(bh.b_dev); - if ((err=lvm_map(&bh, READ)) < 0) { + if ((err=lvm_map(bh.b_rdev, &bh.b_rdev, &bh.b_rsector, bh.b_size >> 9, READ)) < 0) { printk("lvm map failed: %d\n", err); return -EINVAL; } @@ -1518,15 +1509,14 @@ * block device support function for /usr/src/linux/drivers/block/ll_rw_blk.c * (see init_module/lvm_init) */ -static int lvm_map(struct buffer_head *bh, int rw) +static int lvm_map(kdev_t rdev_tmp, kdev_t * rdev_out, + unsigned long * rsector_out, unsigned long size, int rw) { - int minor = MINOR(bh->b_dev); + int minor = MINOR (rdev_tmp); ulong index; ulong pe_start; - ulong size = bh->b_size >> 9; - ulong rsector_tmp = bh->b_blocknr * size; + ulong rsector_tmp = *rsector_out; ulong rsector_sav; - kdev_t rdev_tmp = bh->b_dev; kdev_t rdev_sav; vg_t *vg_this = vg[VG_BLK(minor)]; lv_t *lv = vg_this->lv[LV_BLK(minor)]; @@ -1673,9 +1663,9 @@ } out: - bh->b_rdev = rdev_tmp; - bh->b_rsector = rsector_tmp; - return 1; + *rdev_out = rdev_tmp; + *rsector_out = rsector_tmp; + return 0; bad: return -1; diff -urN generic-map-ref/drivers/block/md.c generic-map/drivers/block/md.c --- generic-map-ref/drivers/block/md.c Mon Feb 19 01:58:01 2001 +++ generic-map/drivers/block/md.c Mon Feb 19 01:58:12 2001 @@ -2879,8 +2879,7 @@ #endif -int md_map (kdev_t dev, kdev_t *rdev, - unsigned long *rsector, unsigned long size) +int md_map (kdev_t dev, kdev_t *rdev, unsigned long *rsector, unsigned long size, int rw) { int err; mddev_t *mddev = kdev_to_mddev(dev); @@ -3933,6 +3932,8 @@ blk_dev[MD_MAJOR].request_fn = DEVICE_REQUEST; blk_dev[MD_MAJOR].current_request = NULL; + blk_dev[MD_MAJOR].makerq_fn=md_make_request; + blk_dev[MD_MAJOR].map_fn=md_map; read_ahead[MD_MAJOR] = INT_MAX; md_gendisk.next = gendisk_head; diff -urN generic-map-ref/drivers/block/raid1.c generic-map/drivers/block/raid1.c --- generic-map-ref/drivers/block/raid1.c Mon Feb 19 01:58:01 2001 +++ generic-map/drivers/block/raid1.c Mon Feb 19 01:58:12 2001 @@ -194,8 +194,7 @@ static void map_and_make_request (int rw, struct buffer_head *bh) { if (MAJOR (bh->b_rdev) == MD_MAJOR) - md_map (bh->b_rdev, &bh->b_rdev, - &bh->b_rsector, bh->b_size >> 9); + md_map (bh->b_rdev, &bh->b_rdev, &bh->b_rsector, bh->b_size >> 9, rw); clear_bit(BH_Lock, &bh->b_state); make_request (MAJOR (bh->b_rdev), rw, bh); } diff -urN generic-map-ref/include/linux/blkdev.h generic-map/include/linux/blkdev.h --- generic-map-ref/include/linux/blkdev.h Mon Feb 19 01:58:01 2001 +++ generic-map/include/linux/blkdev.h Mon Feb 19 01:58:12 2001 @@ -36,6 +36,8 @@ }; typedef void (request_fn_proc) (void); +typedef int (makerq_fn_proc) (struct buffer_head *, int rw); +typedef int (map_fn_proc) (kdev_t, kdev_t *, unsigned long *, unsigned long, int); typedef struct request ** (queue_proc) (kdev_t dev); typedef struct elevator_s @@ -66,6 +68,8 @@ struct blk_dev_struct { request_fn_proc *request_fn; + makerq_fn_proc *makerq_fn; + map_fn_proc *map_fn; /* * queue_proc has to be atomic */ @@ -89,11 +93,6 @@ extern void resetup_one_dev(struct gendisk *dev, int drive); extern void unplug_device(void * data); extern void make_request(int major,int rw, struct buffer_head * bh); - -/* md needs this function to remap requests */ -extern int md_map (kdev_t dev, kdev_t *rdev, - unsigned long *rsector, unsigned long size); -extern int md_make_request (struct buffer_head * bh, int rw); extern int * blk_size[MAX_BLKDEV]; diff -urN generic-map-ref/kernel/ksyms.c generic-map/kernel/ksyms.c --- generic-map-ref/kernel/ksyms.c Mon Feb 19 01:58:01 2001 +++ generic-map/kernel/ksyms.c Mon Feb 19 01:58:12 2001 @@ -86,10 +86,7 @@ EXPORT_SYMBOL(get_options); #ifdef CONFIG_BLK_DEV_LVM_MODULE - extern int (*lvm_map_ptr) ( int, kdev_t *, unsigned long *, - unsigned long, int); extern void (*lvm_hd_name_ptr) ( char*, int); - EXPORT_SYMBOL(lvm_map_ptr); EXPORT_SYMBOL(lvm_hd_name_ptr); #endif