mirror of
git://sourceware.org/git/lvm2.git
synced 2025-02-02 13:47:42 +03:00
Peter Rajnoha
f2e8b49e1d
lv_manip: fix stripe count and size validation for RAID LVs
Fix stripe count and size parameter validation for RAID LVs and include existing automatic setting of these parameters based on current shape of the RAID LV in case these are not set on command line fully. Previously, this was done only to a certain subset given by this condition (where the 'stripes' is the '-i|--stripes' cmd line arg and the 'stripe_size' is actually the '-I|--stripesize' cmd line arg): !(stripes == 1 || (stripes > 1 && stripe_size)) This condition is a bit harder to follow at first sight and there are no comments around with explanation for why this one is used, so let's analyze it a bit more. First, let's convert this to an equivalent condition (De Morgan law) so it's easier to read for humans: stripes != 1 && !(stripes > 1 && stripe_size) Note: Both stripe and stripesize are unsigned integers, so they can't be negative. Now, based on that condition, we were running the code to deduce the stripe/stripesize and do the checks ("the code") only if both of these are true: - stripes is different from 1 - we don't have stripes > 1 and stripe_size defined at the same time But this is not correct in all cases, because: A) if someone uses stripes = 0, then "the code" is executed (correct) B) if someone uses stripes = 1, then "the code" is not executed (wrong: we still need to be able to check the args against existing RAID LV stripes whether it matches) - if someone uses stripes > 1, then "the code" is: C) if stripe_size = 0, executed (correct) D) if stripe_size > 0, not executed (wrong: we still want to check against existing RAID LV stripes) Current issues with this condition: The B) ends up with segfault. ❯ lvextend -i 1 -l+1 vg/lvol0 Rounding size 4.00 MiB (1 extents) up to stripe boundary size 8.00 MiB (2 extents). Segmentation fault (core dumped) The D) ends up with errors like: ❯ lvextend -i 3 -l+1 -I128k vg/lvol0 Rounding size 4.00 MiB (1 extents) up to stripe boundary size 8.00 MiB (2 extents). Rounding size (4 extents) up to stripe boundary size for segment (5 extents). Size of logical volume vg/lvol0 changed from 8.00 MiB (2 extents) to 20.00 MiB (5 extents). LV lvol0: segment 1 with len=5 has inconsistent area_len 3 Couldn't read all logical volumes for volume group vg. Failed to write VG vg. Conclusion: The condition needs to be removed so we always run "the code" to check given striping args given on command line against existing RAID LV striping. The reason is that we don't want to allow changing stripe count for RAID LVs through lvextend and we need to end up with the error: "Unable to extend <RAID segment type> segment type with different number of stripes" (We do support changing the striping by lvconvert's reshaping functionality only). (cherry picked from commit b5249fa3c20fe5d9e1d4811e7e5bfd957b15a820)
This tree contains the LVM2 and device-mapper tools and libraries. For more information about LVM2 read the changelog in the WHATS_NEW file. Installation instructions are in INSTALL. There is no warranty - see COPYING and COPYING.LIB. Tarballs are available from: ftp://sourceware.org/pub/lvm2/ https://github.com/lvmteam/lvm2/releases The source code is stored in git: https://gitlab.com/lvmteam/lvm2 Clone: git clone git@gitlab.com:lvmteam/lvm2.git Anonymous access: git clone https://gitlab.com/lvmteam/lvm2.git Mirrored to: * https://github.com/lvmteam/lvm2 git clone https://github.com/lvmteam/lvm2.git git clone git@github.com:lvmteam/lvm2.git * https://sourceware.org/git/?p=lvm2.git git clone https://sourceware.org/git/lvm2.git git clone git://sourceware.org/git/lvm2.git Mailing list for general discussion related to LVM2: linux-lvm@lists.linux.dev Subscribe via email to: linux-lvm+subscribe@lists.linux.dev Archive https://lore.kernel.org/linux-lvm/ Older archive https://listman.redhat.com/archives/linux-lvm/ Mailing lists for LVM2 development, patches and commits: lvm-devel@lists.linux.dev Subscribe via email to: lvm-devel+subscribe@lists.linux.dev Archive https://lore.kernel.org/lvm-devel/ Older archive https://listman.redhat.com/archives/lvm-devel/ lvm2-commits@lists.fedorahosted.org (Read-only archive of commits) Subscribe from https://fedorahosted.org/mailman/listinfo/lvm2-commits Mailing list for device-mapper development, including kernel patches and multipath-tools: dm-devel@redhat.com Subscribe from https://www.redhat.com/mailman/listinfo/dm-devel Website: https://sourceware.org/lvm2/ Report upstream bugs at: https://bugzilla.redhat.com/enter_bug.cgi?product=LVM%20and%20device-mapper or open issues at: https://gitlab.com/groups/lvmteam/-/issues https://github.com/lvmteam/lvm2/issues The source code repository used until 7th June 2012 is accessible using CVS: cvs -d :pserver:cvs@sourceware.org:/cvs/lvm2 login cvs cvs -d :pserver:cvs@sourceware.org:/cvs/lvm2 checkout LVM2 The password is cvs.
Description
Languages
C
75.5%
Shell
18.7%
Python
2.9%
M4
1%
Makefile
0.8%
Other
1%