Jason, Thanks for the patch. I've cleaned it up quite a bit, and attached my changes. I just successfully built a 2.4.12ac5 kernel with it -- about to try it out. Thanks again! -- Patrick Thank you sir. May I have another?
diff -ruN md.old/lvm-snap.c md/lvm-snap.c --- md.old/lvm-snap.c Mon Oct 22 18:18:14 2001 +++ md/lvm-snap.c Mon Oct 22 18:24:28 2001 @@ -438,7 +438,7 @@ int lvm_snapshot_alloc_iobuf_pages(struct kiobuf * iobuf, int sectors) { int bytes, nr_pages, err, i; - + bytes = sectors * SECTOR_SIZE; nr_pages = (bytes + ~PAGE_MASK) >> PAGE_SHIFT; err = expand_kiobuf(iobuf, nr_pages); @@ -511,9 +511,10 @@ int lvm_snapshot_alloc(lv_t * lv_snap) { int ret, max_sectors; + int nbhs = KIO_MAX_SECTORS; /* allocate kiovec to do chunk io */ - ret = alloc_kiovec(1, &lv_snap->lv_iobuf); + ret = alloc_kiovec_sz(1, &lv_snap->lv_iobuf,&nbhs); if (ret) goto out; max_sectors = KIO_MAX_SECTORS << (PAGE_SHIFT-9); @@ -522,7 +523,7 @@ if (ret) goto out_free_kiovec; /* allocate kiovec to do exception table io */ - ret = alloc_kiovec(1, &lv_snap->lv_COW_table_iobuf); + ret = alloc_kiovec_sz(1, &lv_snap->lv_COW_table_iobuf,&nbhs); if (ret) goto out_free_kiovec; ret = lvm_snapshot_alloc_iobuf_pages(lv_snap->lv_COW_table_iobuf, @@ -538,12 +539,12 @@ out_free_both_kiovecs: unmap_kiobuf(lv_snap->lv_COW_table_iobuf); - free_kiovec(1, &lv_snap->lv_COW_table_iobuf); + free_kiovec_sz(1, &lv_snap->lv_COW_table_iobuf,&nbhs); lv_snap->lv_COW_table_iobuf = NULL; out_free_kiovec: unmap_kiobuf(lv_snap->lv_iobuf); - free_kiovec(1, &lv_snap->lv_iobuf); + free_kiovec_sz(1, &lv_snap->lv_iobuf,&nbhs); lv_snap->lv_iobuf = NULL; if (lv_snap->lv_snapshot_hash_table != NULL) vfree(lv_snap->lv_snapshot_hash_table); @@ -553,6 +554,8 @@ void lvm_snapshot_release(lv_t * lv) { + int nbhs = KIO_MAX_SECTORS; + if (lv->lv_block_exception) { vfree(lv->lv_block_exception); @@ -568,14 +571,14 @@ { kiobuf_wait_for_io(lv->lv_iobuf); unmap_kiobuf(lv->lv_iobuf); - free_kiovec(1, &lv->lv_iobuf); + free_kiovec_sz(1, &lv->lv_iobuf,&nbhs); lv->lv_iobuf = NULL; } if (lv->lv_COW_table_iobuf) { kiobuf_wait_for_io(lv->lv_COW_table_iobuf); unmap_kiobuf(lv->lv_COW_table_iobuf); - free_kiovec(1, &lv->lv_COW_table_iobuf); + free_kiovec_sz(1, &lv->lv_COW_table_iobuf,&nbhs); lv->lv_COW_table_iobuf = NULL; } } diff -ruN md.old/lvm.c md/lvm.c --- md.old/lvm.c Mon Oct 22 18:18:14 2001 +++ md/lvm.c Mon Oct 22 18:21:15 2001 @@ -432,8 +432,6 @@ */ int lvm_init(void) { - struct gendisk *gendisk_ptr = NULL; - if (devfs_register_chrdev(LVM_CHAR_MAJOR, lvm_name, &lvm_chr_fops) < 0) { printk(KERN_ERR "%s -- devfs_register_chrdev failed\n", @@ -455,18 +453,7 @@ lvm_geninit(&lvm_gendisk); /* insert our gendisk at the corresponding major */ - if (gendisk_head != NULL) { - gendisk_ptr = gendisk_head; - while (gendisk_ptr->next != NULL && - gendisk_ptr->major > lvm_gendisk.major) { - gendisk_ptr = gendisk_ptr->next; - } - lvm_gendisk.next = gendisk_ptr->next; - gendisk_ptr->next = &lvm_gendisk; - } else { - gendisk_head = &lvm_gendisk; - lvm_gendisk.next = NULL; - } + add_gendisk(&lvm_gendisk); #ifdef LVM_HD_NAME /* reference from drivers/block/genhd.c */ @@ -499,7 +486,6 @@ static void lvm_cleanup(void) { - struct gendisk *gendisk_ptr = NULL, *gendisk_ptr_prev = NULL; if (devfs_unregister_chrdev(LVM_CHAR_MAJOR, lvm_name) < 0) printk(KERN_ERR "%s -- devfs_unregister_chrdev failed\n", @@ -508,18 +494,7 @@ printk(KERN_ERR "%s -- devfs_unregister_blkdev failed\n", lvm_name); - - - gendisk_ptr = gendisk_ptr_prev = gendisk_head; - while (gendisk_ptr != NULL) { - if (gendisk_ptr == &lvm_gendisk) - break; - gendisk_ptr_prev = gendisk_ptr; - gendisk_ptr = gendisk_ptr->next; - } - /* delete our gendisk from chain */ - if (gendisk_ptr == &lvm_gendisk) - gendisk_ptr_prev->next = gendisk_ptr->next; + del_gendisk(&lvm_gendisk); blk_size[MAJOR_NR] = NULL; blksize_size[MAJOR_NR] = NULL;