--- linux-2.0.34/kernel/ksyms.c.save Wed Jun 3 23:37:04 1998 +++ linux/kernel/ksyms.c Tue Jun 9 06:17:59 1998 @@ -65,6 +65,15 @@ #include #endif +/* Test Heinz Mauelshagen */ +/* Next line should go away from here */ +#define CONFIG_BLK_DEV_LVM +#ifdef CONFIG_BLK_DEV_LVM + extern int (*lvm_map_ptr) ( int, kdev_t *, unsigned long *, + unsigned long, int); +#endif +/* Ende Test Heinz Mauelshagen */ + extern char *get_options(char *str, int *ints); extern void set_device_ro(kdev_t dev,int flag); extern struct file_operations * get_blkfops(unsigned int); @@ -85,6 +94,11 @@ SYMBOL_NAME_STR (Using_Versions) }, #endif + X(proc_dir_inode_operations), +#ifdef CONFIG_BLK_DEV_LVM + X(lvm_map_ptr), + X(bad_user_access_length), +#endif /* stackable module support */ X(register_symtab_from), X(get_module_symbol), --- linux-2.0.34/drivers/block/ll_rw_blk.c.save Wed Feb 26 20:10:15 1997 +++ linux/drivers/block/ll_rw_blk.c Tue Jun 9 06:16:41 1998 @@ -21,6 +21,16 @@ #include #include +/* Logical Volume Manager (LVM) */ +/* Next 2 lines should go to /usr/src/linux/include/linux/lvm.h */ +#define CONFIG_BLK_DEV_LVM +#define LVM_MAJOR 42 +#ifdef CONFIG_BLK_DEV_LVM + int ( *lvm_map_ptr) ( int, kdev_t *, unsigned long *, + unsigned long, int) = NULL; +#endif +/* End LVM */ + /* * The request-struct contains all necessary data * to load a nr of sectors into memory @@ -360,8 +370,8 @@ cli(); req = blk_dev[major].current_request; if (!req) { - /* MD and loop can't handle plugging without deadlocking */ - if (major != MD_MAJOR && major != LOOP_MAJOR) + /* MD, loop and lvm can't handle plugging without deadlocking */ + if (major != MD_MAJOR && major != LOOP_MAJOR && major != LVM_MAJOR) plug_device(blk_dev + major); } else switch (major) { case IDE0_MAJOR: /* same as HD_MAJOR */ @@ -492,15 +502,44 @@ /* Md remaps blocks now */ bh[i]->b_rdev = bh[i]->b_dev; bh[i]->b_rsector=bh[i]->b_blocknr*(bh[i]->b_size >> 9); +#ifdef CONFIG_BLK_DEV_LVM + major = MAJOR ( bh[i]->b_dev); + if ( major == LVM_MAJOR) { + int ret; + + if ( lvm_map_ptr == NULL) { + printk ( KERN_ERR + "Bad lvm_map_ptr in ll_rw_block\n"); + goto sorry; + } + if ( ( ret = ( lvm_map_ptr) ( MINOR ( bh[i]->b_dev), + &bh[i]->b_rdev, + &bh[i]->b_rsector, + bh[i]->b_size >> 9, + rw)) == -EAGAIN) { + bh[i]->b_count++; + continue; + } else if ( ret != 0) { + printk ( KERN_ERR + "Bad lvm_map [%d] in in ll_rw_block\n", ret); + goto sorry; + } + /* remap major too ... */ + major = MAJOR(bh[i]->b_rdev); + } +#endif + #ifdef CONFIG_BLK_DEV_MD if (major==MD_MAJOR && - md_map (MINOR(bh[i]->b_dev), &bh[i]->b_rdev, + /* changed v to rdev, so that LVM can remap */ + md_map (MINOR(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; } #endif + } if ((rw == WRITE || rw == WRITEA) && is_read_only(bh[0]->b_dev)) { @@ -569,9 +608,34 @@ { rdev = dev; rsector = b[i] * (buffersize >> 9); +#ifdef CONFIG_BLK_DEV_LVM + major = MAJOR ( dev); + if ( major == LVM_MAJOR) { + int ret; + + if ( lvm_map_ptr == NULL) { + printk ( KERN_ERR + "Bad lvm_map_ptr in ll_rw_swap_file\n"); + return; + } + if ( ( ret = ( lvm_map_ptr) ( MINOR ( dev), &rdev, + &rsector, + buffersize >> 9, + rw)) != 0) { + if ( ret != -EAGAIN) + printk ( KERN_ERR + "Bad lvm_map [%d] in ll_rw_swap_file\n", ret); + return; + } + /* remap major too ... */ + major = MAJOR ( rdev); + } +#endif + #ifdef CONFIG_BLK_DEV_MD if (major==MD_MAJOR && - md_map (MINOR(dev), &rdev, + /* change v to rdev so that LVM can remap */ + md_map (MINOR(rdev), &rdev, &rsector, buffersize >> 9)) { printk (KERN_ERR "Bad md_map in ll_rw_swap_file\n");