Sophie

Sophie

distrib > Mandriva > 10.0-com > i586 > by-pkgid > 276c4c69ed5efcebe43ee6121194cf59 > files > 43

kernel22-2.2.20-9mdk.src.rpm

diff -urN lvm/drivers/block/lvm.c lvm-hardblocksize/drivers/block/lvm.c
--- lvm/drivers/block/lvm.c	Tue Feb 20 21:26:34 2001
+++ lvm-hardblocksize/drivers/block/lvm.c	Tue Feb 20 21:27:46 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_end; e++) {
+			hardblocksize = get_hardblocksize(lv->lv_block_exception[e].rdev_new);
+			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() */