mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
82f6dbfaf7
Scenario: $ vgs -o+vg_mda_copies VG #PV #LV #SN Attr VSize VFree #VMdaCps fedora 1 2 0 wz--n- 9.51g 0 unmanaged vg 16 9 0 wz--n- 1.94g 1.83g 2 $ lvs -o+read_ahead vg/lvol6 vg/lvol7 LV VG Attr LSize Pool Origin Data% Rahead lvol6 vg Vwi-a-tz-- 1.00g pool lvol5 0.00 auto lvol7 vg Vwi---tz-k 1.00g pool lvol6 256.00k Before this patch: $vgs -o vg_name,vg_mda_copies -S 'vg_mda_copies < unmanaged' VG #VMdaCps vg 2 Problem: Reserved values can be only used with exact match = or !=, not <,<=,>,>=. In the example above, the "unamanaged" is internally represented as 18446744073709551615, but this should be ignored while not comparing field directly with "unmanaged" reserved name with = or !=. Users should not be aware of this internal mapping of the reserved value name to its internal value and hence it doesn't make sense for such reserved value to take place in results of <,<=,> and >=. There's no order defined for reserved values!!! It's a special *reserved* value that is taken out of the usual value range of that type. This is very similar to what we have already fixed with2f7f6932dc
, but it's the other way round now - we're using reserved value name in selection criteria now (in the patch2f7f693
, we had concrete value and we compared it with the reserved value). So this patch completes patch2f7f693
. This patch also fixes this problem: $ lvs -o+read_ahead vg/lvol6 vg/lvol7 -S 'read_ahead > 32k' LV VG Attr LSize Pool Origin Data% Rahead lvol6 vg Vwi-a-tz-- 1.00g pool lvol5 0.00 auto lvol7 vg Vwi---tz-k 1.00g pool lvol6 256.00k Problem: In the example above, the internal reserved value "auto" is in the range of selection "> 32k" - it shouldn't match as well. Here the "auto" is internally represented as MAX_DBL and of course, numerically, MAX_DBL > 256k. But for users, the reserved value should be uncomparable to any number so the mapping of the reserved value name to its interna value is transparent to users. Again, there's no order defined for reserved values and hence it should never match if using <,<=,>,>= operators. This is actually exactly the same problem as already described in2f7f6932dc
, but that patch failed for size field types because of incorrect internal representation used. With this patch applied, both problematic scenarios mentioned above are fixed now: $ vgs -o vg_name,vg_mda_copies -S 'vg_mda_copies < unmanaged' (blank) $ lvs -o+read_ahead vg/lvol6 vg/lvol7 -S 'read_ahead > 32k' LV VG Attr LSize Pool Origin Rahead lvol7 vg Vwi---tz-k 1.00g pool lvol6 256.00k
100 lines
5.8 KiB
C
100 lines
5.8 KiB
C
/*
|
|
* Copyright (C) 2014 Red Hat, Inc. All rights reserved.
|
|
*
|
|
* This file is part of LVM2.
|
|
*
|
|
* This copyrighted material is made available to anyone wishing to use,
|
|
* modify, copy, or redistribute it subject to the terms and conditions
|
|
* of the GNU Lesser General Public License v.2.1.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
/*
|
|
* This file defines reserved names for field values.
|
|
*
|
|
* This is used for registering reserved names with reporting code that
|
|
* uses the exact value defined whenever the reserved name is hit, for
|
|
* example during selection criteria processing.
|
|
*
|
|
* TYPE_RESERVED_VALUE defines reserved value that is not bound to any field,
|
|
* but rather it's bound to a certain type. This can be used as a reserved
|
|
* value for all fields of that type then. When naming type reserved value,
|
|
* please follow this naming scheme:
|
|
* <report type name in lowercase>_<reserved_value_name>
|
|
*
|
|
* FIELD_RESERVED_VALUE defines reserved value bound to a single field.
|
|
* When naming reserved value for the field, please follow this naming scheme:
|
|
* <field_name>_<reserved_value_name>
|
|
*
|
|
* FIELD_BINARY_RESERVED_VALUE is similar to FIELD_RESERVED_VALUE but it
|
|
* is specifically designed for defintion of reserved names for fields
|
|
* with binary values where the reserved names given denote value 1.
|
|
* The first reserved_name given is also used for reporting,
|
|
* others are synonyms which are recognized in addition.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* TYPE_RESERVED_VALUE(type, reserved_value_id, description, value, reserved_name, ...)
|
|
* FIELD_RESERVED_VALUE(field_id, reserved_value_id, description, value, reserved_name, ...)
|
|
* FIELD_BINARY_RESERVED_VALUE(field_id, reserved_value_id, description, reserved_name for 1, ...)
|
|
*/
|
|
|
|
/* *INDENT-OFF* */
|
|
|
|
/* Per-type reserved values usable for all fields of certain type. */
|
|
TYPE_RESERVED_VALUE(NUM, num_undef_64, "Reserved value for undefined numeric value.", UINT64_C(-1), "-1", "unknown", "undefined", "undef")
|
|
|
|
/* Reserved values for PV fields */
|
|
FIELD_RESERVED_BINARY_VALUE(pv_allocatable, pv_allocatable, "", "allocatable")
|
|
FIELD_RESERVED_BINARY_VALUE(pv_exported, pv_exported, "", "exported")
|
|
FIELD_RESERVED_BINARY_VALUE(pv_missing, pv_missing, "", "missing")
|
|
|
|
/* Reserved values for VG fields */
|
|
FIELD_RESERVED_BINARY_VALUE(vg_extendable, vg_extendable, "", "extendable")
|
|
FIELD_RESERVED_BINARY_VALUE(vg_exported, vg_exported, "", "exported")
|
|
FIELD_RESERVED_BINARY_VALUE(vg_partial, vg_partial, "", "partial")
|
|
FIELD_RESERVED_BINARY_VALUE(vg_clustered, vg_clustered, "", "clustered")
|
|
FIELD_RESERVED_VALUE(vg_permissions, vg_permissions_rw, "", "writeable", "writeable", "rw", "read-write")
|
|
FIELD_RESERVED_VALUE(vg_permissions, vg_permissions_r, "", "read-only", "read-only", "r", "ro")
|
|
FIELD_RESERVED_VALUE(vg_mda_copies, vg_mda_copies_unmanaged, "", &GET_TYPE_RESERVED_VALUE(num_undef_64), "unmanaged")
|
|
|
|
/* Reserved values for LV fields */
|
|
FIELD_RESERVED_BINARY_VALUE(lv_initial_image_sync, lv_initial_image_sync, "", "initial image sync", "sync")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_image_synced, lv_image_synced, "", "image synced", "synced")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_merging, lv_merging, "", "merging")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_converting, lv_converting, "", "converting")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_allocation_locked, lv_allocation_locked, "", "allocation locked", "locked")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_fixed_minor, lv_fixed_minor, "", "fixed minor", "fixed")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_active_locally, lv_active_locally, "", "active locally", "active", "locally")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_active_remotely, lv_active_remotely, "", "active remotely", "active", "remotely")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_active_exclusively, lv_active_exclusively, "", "active exclusively", "active", "exclusively")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_merge_failed, lv_merge_failed, "", "merge failed", "failed")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_snapshot_invalid, lv_snapshot_invalid, "", "snapshot invalid", "invalid")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_suspended, lv_suspended, "", "suspended")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_live_table, lv_live_table, "", "live table present", "live table", "live")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_inactive_table, lv_inactive_table, "", "inactive table present", "inactive table", "inactive")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_device_open, lv_device_open, "", "open")
|
|
FIELD_RESERVED_BINARY_VALUE(lv_skip_activation, lv_skip_activation, "", "skip activation", "skip")
|
|
FIELD_RESERVED_BINARY_VALUE(zero, zero, "", "zero")
|
|
FIELD_RESERVED_VALUE(lv_permissions, lv_permissions_rw, "", "writeable", "writeable", "rw", "read-write")
|
|
FIELD_RESERVED_VALUE(lv_permissions, lv_permissions_r, "", "read-only", "read-only", "r", "ro")
|
|
FIELD_RESERVED_VALUE(lv_permissions, lv_permissions_r_override, "", "read-only-override", "read-only-override", "ro-override", "r-override", "R")
|
|
FIELD_RESERVED_VALUE(lv_read_ahead, lv_read_ahead_auto, "", &_siz_max, "auto")
|
|
FIELD_RESERVED_VALUE(lv_when_full, lv_when_full_error, "", "error", "error", "error when full", "error if no space")
|
|
FIELD_RESERVED_VALUE(lv_when_full, lv_when_full_queue, "", "queue", "queue", "queue when full", "queue if no space")
|
|
FIELD_RESERVED_VALUE(lv_when_full, lv_when_full_undef, "", "", "", "undefined")
|
|
|
|
/* Reserved values for SEG fields */
|
|
FIELD_RESERVED_VALUE(cache_policy, cache_policy_undef, "", "", "", "undefined")
|
|
FIELD_RESERVED_VALUE(seg_monitor, seg_monitor_undef, "", "", "", "undefined")
|
|
FIELD_RESERVED_VALUE(lv_health_status, health_undef, "", "", "", "undefined")
|
|
/* TODO the following 2 need STR_LIST support for reserved values
|
|
FIELD_RESERVED_VALUE(cache_settings, cache_settings_default, "", "default", "default")
|
|
FIELD_RESERVED_VALUE(cache_settings, cache_settings_undef, "", "undefined", "undefined") */
|
|
|
|
/* *INDENT-ON* */
|