1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-07 21:18:59 +03:00
lvm2/lib
Peter Rajnoha b5249fa3c2
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).
2024-11-07 07:57:23 +01:00
..
activate cleanup: typos in comments 2024-08-30 16:51:15 +02:00
cache cleanup: typos in comments 2024-08-30 16:51:15 +02:00
cache_segtype metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
commands config: introduce validate_metadata 2024-10-31 17:55:31 +01:00
config config: introduce validate_metadata 2024-10-31 17:55:31 +01:00
datastruct cleanup: eliminate unused assign 2021-03-11 00:18:01 +01:00
device cov: add stacktraces 2024-10-30 13:08:56 +01:00
display get_alloc_string: compare only enum 2024-10-30 12:57:34 +01:00
error error: try with modprobe 2024-05-27 15:16:26 +02:00
filters cleanup: typos in comments 2024-08-30 16:51:15 +02:00
format_text lv_manip: init major minor in alloc_lv 2024-10-28 20:07:37 +01:00
freeseg device_mapper: remove dbg_malloc. 2018-06-08 13:40:53 +01:00
integrity metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
label cleanup: typos in comments 2024-08-30 16:51:15 +02:00
locking lvmlockd: update prototype for non-lvmlockd build 2024-11-01 11:27:02 +01:00
log log: postpone some initialization 2024-10-24 17:38:09 +02:00
lvmpolld cleanup: typos in logging 2024-08-30 16:51:15 +02:00
metadata lv_manip: fix stripe count and size validation for RAID LVs 2024-11-07 07:57:23 +01:00
mirror metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
misc gcc: make older compilers happier 2024-11-06 00:04:54 +01:00
mm memlock: use value of 0 to disable memory locking 2024-09-27 13:42:45 +02:00
notify cleanup: fix typos 2024-09-27 13:42:45 +02:00
properties cleanup: typos in comments 2024-08-30 16:51:15 +02:00
raid metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
report reporting: prepare id string only for json output 2024-10-22 19:36:00 +02:00
snapshot metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
striped metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
thin metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
unknown metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
uuid cleanup: use _ for static var 2024-06-03 15:30:05 +02:00
vdo metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
writecache metadata: use radix tree to find lv_names 2024-10-24 17:38:09 +02:00
zero const: _ops segtype handler 2024-05-04 01:01:57 +02:00
Makefile.in devices: factor common list functions 2022-11-07 11:38:46 -06:00