Sophie

Sophie

distrib > Mandriva > 8.2 > i586 > media > main-src > by-pkgid > 276c4c69ed5efcebe43ee6121194cf59 > files > 68

kernel22-2.2.20-9mdk.src.rpm

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 <asm/io.h>
 #include <asm/uaccess.h>
 #include <linux/blk.h>
-#include <linux/raid/md.h>
 
 #ifdef CONFIG_POWERMAC
 #include <asm/ide.h>
@@ -31,14 +30,6 @@
 
 #include <linux/module.h>
 
-#if defined CONFIG_BLK_DEV_LVM || defined CONFIG_BLK_DEV_LVM_MODULE
-#include <linux/lvm.h>
-   /* 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