diff -urN lvm/drivers/block/lvm.c lvm-hardsect/drivers/block/lvm.c --- lvm/drivers/block/lvm.c Mon Feb 19 01:56:25 2001 +++ lvm-hardsect/drivers/block/lvm.c Mon Feb 19 01:56:48 2001 @@ -382,10 +382,9 @@ /* gendisk structures */ static struct hd_struct lvm_hd_struct[MAX_LV]; -static int lvm_blocksizes[MAX_LV] = -{0,}; -static int lvm_size[MAX_LV] = -{0,}; +static int lvm_blocksizes[MAX_LV]; +static int lvm_hardsectsizes[MAX_LV]; +static int lvm_size[MAX_LV]; static struct gendisk lvm_gendisk = { MAJOR_NR, /* major # */ @@ -1792,6 +1791,30 @@ return 0; } +static void lvm_lv_update_hardblocksize(lv_t * lv) +{ + int le, e; + int max_hardblocksize = 0, hardblocksize; + + for (le = 0; le < lv->lv_allocated_le; le++) { + hardblocksize = get_hardblocksize(lv->lv_current_pe[le].dev); + if (hardblocksize == 0) + hardblocksize = 512; + if (hardblocksize > max_hardblocksize) + max_hardblocksize = hardblocksize; + } + if (lv->lv_access & LV_SNAPSHOT) { + for (e = 0; e < lv->lv_remap_ptr; e++) { + hardblocksize = get_hardblocksize(lv->lv_block_exception[e].rdev_org); + if (hardblocksize == 0) + hardblocksize = 512; + if (hardblocksize > max_hardblocksize) + max_hardblocksize = hardblocksize; + } + } + + lvm_hardsectsizes[MINOR(lv->lv_dev)] = max_hardblocksize; +} /* * character device support function logical extend remap @@ -1820,6 +1843,9 @@ le_remap_req.new_dev; lv_ptr->lv_current_pe[le].pe = le_remap_req.new_pe; + + lvm_lv_update_hardblocksize(lv_ptr); + return 0; } } @@ -2334,6 +2360,7 @@ vg_ptr->lv_cur++; lv_ptr->lv_status = lv_status_save; + lvm_lv_update_hardblocksize(lv); lvm_do_create_proc_entry_of_lv ( vg_ptr, lv_ptr); @@ -2680,8 +2707,11 @@ lv_ptr->lv_size = lv_ptr->lv_snapshot_org->lv_size; lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].nr_sects = lv_ptr->lv_size; lvm_size[MINOR(lv_ptr->lv_dev)] = lv_ptr->lv_size >> 1; + + lvm_lv_update_hardblocksize(lv_ptr); } } + lvm_lv_update_hardblocksize(lv); return 0; } /* lvm_do_lv_extend_reduce() */ @@ -3053,7 +3083,7 @@ blk_size[MAJOR_NR] = lvm_size; blksize_size[MAJOR_NR] = lvm_blocksizes; - hardsect_size[MAJOR_NR] = lvm_blocksizes; + hardsect_size[MAJOR_NR] = lvm_hardsectsizes; return; } /* lvm_gen_init() */