[linux-lvm] Bug in LVM tools 0.9
Dr. Steffen Stempel
steffen.stempel at security.kpnqwest.com
Tue Jan 9 18:51:47 UTC 2001
Hi,
I've discovered some minor and one serious bug in the LVM-0.9
distribution.
The environment I'm using LVM is:
- linux-2.4.0 with reiserfs patch applied
- LVM 0.9 (I've tried debian packages and the source code)
- a Raid-1 MD device is used as a physical volume
Problems detected:
1. lvm tools have a problem with physical volumes on /dev/md?
As far as I've figured out, at least the functions pv_get_size
doesn't handle md devices properly. They try to access the
partition table just as if the device is an ordinary.
I've done a "quick and very dirty" patch to check for "/dev/md"
at the beginning of the device name. It would be fancier to check
for the major device number of /dev/md? ....
Another problem with /dev/md devices is in vg_read_from_pv.c:
if pv_read returns LVM_EPV_READ_MD_DEVICE the function
vg_read_from_pv should not fail.
This problem is also solved by the patch
2. at least ``vgchange'' dumps core with segemntation fault if the
device node for one of the physical volumes can't be accessed. This
is independent from the /dev/md? problem.
3. The debian pacjet for 0.9 installs a broken /etc/init.d/lvm script:
Binaries are installed in /usr/sbin, the lvm script looks form
them in /sbin.
Please note that the patch I've included was indended to make lvm work
in my environment. There might be additional locations which need some
modification in order to make lvm tools work with md devices.
Hope these hints help you to improve lvm - it's very nice work!
Best regards
Steffen Stempel
----------------------------------------------------------------------
diff -cr 0.9/tools/lib/pv_get_size.c 0.9-patched/tools/lib/pv_get_size.c
*** 0.9/tools/lib/pv_get_size.c Mon Nov 13 01:20:11 2000
--- 0.9-patched/tools/lib/pv_get_size.c Sat Jan 6 21:08:33 2001
***************
*** 88,93 ****
--- 88,104 ----
}
if ( ( cache_entry = lvm_dir_cache_find ( dev_name)) != NULL) {
+ if (!strncmp(dev_name,"/dev/md",7) && isdigit(dev_name[7])) {
+ if ( ( pv_handle = open ( dev_name, O_RDONLY)) == -1) {
+ ret = -LVM_EPV_GET_SIZE_OPEN;
+ }
+ else {
+ ioctl ( pv_handle, BLKGETSIZE, &ret);
+ close(pv_handle);
+ }
+ goto pv_get_size_end;
+ }
+
if ( lvm_check_partitioned_dev ( cache_entry->st_rdev) == TRUE) {
st_rdev = cache_entry->st_rdev -
( cache_entry->st_rdev %
Only in 0.9-patched/tools/lib: pv_get_size.c~
diff -cr 0.9/tools/lib/vg_read_from_pv.c
0.9-patched/tools/lib/vg_read_from_pv.c
*** 0.9/tools/lib/vg_read_from_pv.c Mon Nov 13 01:26:33 2000
--- 0.9-patched/tools/lib/vg_read_from_pv.c Sat Jan 6 21:41:17 2001
***************
*** 32,37 ****
--- 32,38 ----
static vg_disk_t vg_this;
pv_t pv_this;
pv_t *pv_this_ptr = &pv_this;
+ int h;
#ifdef DEBUG
***************
*** 45,51 ****
goto vg_read_from_pv_end;
}
! if ( pv_read ( pv_name, &pv_this_ptr, NULL) == 0) {
/* read the VG info */
if ( ( pv_handle = open ( pv_name, O_RDONLY)) == -1)
ret = -LVM_EVG_READ_OPEN;
--- 46,53 ----
goto vg_read_from_pv_end;
}
! if ( (h=pv_read ( pv_name, &pv_this_ptr, NULL)) == 0 ||
! h == -LVM_EPV_READ_MD_DEVICE ) {
/* read the VG info */
if ( ( pv_handle = open ( pv_name, O_RDONLY)) == -1)
ret = -LVM_EVG_READ_OPEN;
More information about the linux-lvm
mailing list