diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2017-02-28 22:34:00 +0100 |
---|---|---|
committer | Heinz Mauelshagen <heinzm@redhat.com> | 2017-02-28 22:34:00 +0100 |
commit | 80a6de616a19e1be2e4125878ee904e5a1eeedf9 (patch) | |
tree | 0276eec057577ce487cc609d19ec5554cceafd75 /libdm/libdevmapper.h | |
parent | 21456dcf7fc062518202f133ad27594eda4278fb (diff) | |
download | lvm2-80a6de616a19e1be2e4125878ee904e5a1eeedf9.tar.gz |
lvconvert: libdm RAID API compatibility versioning
Commit 27384c52cf6a lowered the maximum number of devices
back to 64 for compatibility.
Because more members have been added to the API in
'struct dm_tree_node_raid_params *', we have to version
the public libdm RAID API to not break any existing users.
Changes:
- keep the previous 'struct dm_tree_node_raid_params' and
dm_tree_node_add_raid_target_with_params()/dm_tree_node_add_raid_target()
in order to expose the already released public RAID API
- introduce 'struct dm_tree_node_raid_params_v2' and additional functions
dm_tree_node_add_raid_target_with_params_v2()/dm_tree_node_add_raid_target_v2()
to be used by the new lvm2 lib reshape extentions
With this new API, the bitfields for rebuild/writemostly legs in
'struct dm_tree_node_raid_params_v2' can be raised to 256 bits
again (253 legs maximum supported in MD kernel).
Mind that we can limit the maximum usable number via the
DEFAULT_RAID{1}_MAX_IMAGES definition in defaults.h.
Related: rhbz834579
Related: rhbz1191935
Related: rhbz1191978
Diffstat (limited to 'libdm/libdevmapper.h')
-rw-r--r-- | libdm/libdevmapper.h | 63 |
1 files changed, 53 insertions, 10 deletions
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h index 7136261b9..b515f6d98 100644 --- a/libdm/libdevmapper.h +++ b/libdm/libdevmapper.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2015 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2017 Red Hat, Inc. All rights reserved. * Copyright (C) 2006 Rackable Systems All rights reserved. * * This file is part of the device-mapper userspace tools. @@ -1720,9 +1720,18 @@ int dm_tree_node_add_raid_target(struct dm_tree_node *node, const char *raid_type, uint32_t region_size, uint32_t stripe_size, - uint64_t *rebuilds, + uint64_t rebuilds, uint64_t flags); +/* Version 2 coping with 253 (MD kernel limitation) devices */ +int dm_tree_node_add_raid_target_v2(struct dm_tree_node *node, + uint64_t size, + const char *raid_type, + uint32_t region_size, + uint32_t stripe_size, + uint64_t *rebuilds, + uint64_t flags); + /* * Defines below are based on kernel's dm-cache.c defines * DM_CACHE_MIN_DATA_BLOCK_SIZE (32 * 1024 >> SECTOR_SHIFT) @@ -1742,13 +1751,7 @@ int dm_tree_node_add_raid_target(struct dm_tree_node *node, /* * Define number of elements in rebuild and writemostly arrays * 'of struct dm_tree_node_raid_params'. - * - * Set to one to keep the current libdm API! - * - * If we ever raise the maximum number of RAID devices past 64 thus - * changing the API, we have to version it for backwards API compatibility. */ -#define RAID_BITMAP_SIZE 1 struct dm_tree_node_raid_params { const char *raid_type; @@ -1758,6 +1761,42 @@ struct dm_tree_node_raid_params { uint32_t region_size; uint32_t stripe_size; + /* + * 'rebuilds' and 'writemostly' are bitfields that signify + * which devices in the array are to be rebuilt or marked + * writemostly. The kernel supports up to 253 legs. + * We limit ourselves by choosing a lower value + * for DEFAULT_RAID{1}_MAX_IMAGES in defaults.h. + */ + uint64_t rebuilds; + uint64_t writemostly; + uint32_t writebehind; /* I/Os (kernel default COUNTER_MAX / 2) */ + uint32_t sync_daemon_sleep; /* ms (kernel default = 5sec) */ + uint32_t max_recovery_rate; /* kB/sec/disk */ + uint32_t min_recovery_rate; /* kB/sec/disk */ + uint32_t stripe_cache; /* sectors */ + + uint64_t flags; /* [no]sync */ + uint32_t reserved2; +}; + +/* + * Version 2 of above node raid params struct to keeep API compatibility. + * + * Extended for more than 64 legs (max 253 in the MD kernel runtime!), + * delta_disks for disk add/remove reshaping, + * data_offset for out-of-place reshaping + * and data_copies for odd number of raid10 legs. + */ +#define RAID_BITMAP_SIZE 4 /* 4 * 64 bit elements in rebuilds/writemostly arrays */ +struct dm_tree_node_raid_params_v2 { + const char *raid_type; + + uint32_t stripes; + uint32_t mirrors; + uint32_t region_size; + uint32_t stripe_size; + int delta_disks; /* +/- number of disks to add/remove (reshaping) */ int data_offset; /* data offset to set (out-of-place reshaping) */ @@ -1771,20 +1810,24 @@ struct dm_tree_node_raid_params { uint64_t rebuilds[RAID_BITMAP_SIZE]; uint64_t writemostly[RAID_BITMAP_SIZE]; uint32_t writebehind; /* I/Os (kernel default COUNTER_MAX / 2) */ + uint32_t data_copies; /* RAID # of data copies */ uint32_t sync_daemon_sleep; /* ms (kernel default = 5sec) */ uint32_t max_recovery_rate; /* kB/sec/disk */ uint32_t min_recovery_rate; /* kB/sec/disk */ - uint32_t data_copies; /* RAID # of data copies */ uint32_t stripe_cache; /* sectors */ uint64_t flags; /* [no]sync */ - uint64_t reserved2; }; int dm_tree_node_add_raid_target_with_params(struct dm_tree_node *node, uint64_t size, const struct dm_tree_node_raid_params *p); +/* Version 2 API function taking dm_tree_node_raid_params_v2 for aforementioned extensions. */ +int dm_tree_node_add_raid_target_with_params_v2(struct dm_tree_node *node, + uint64_t size, + const struct dm_tree_node_raid_params_v2 *p); + /* Cache feature_flags */ #define DM_CACHE_FEATURE_WRITEBACK 0x00000001 #define DM_CACHE_FEATURE_WRITETHROUGH 0x00000002 |