libstorage-ng
Loading...
Searching...
No Matches
Md.h
1/*
2 * Copyright (c) [2016-2023] SUSE LLC
3 *
4 * All Rights Reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License as published
8 * by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, contact Novell, Inc.
17 *
18 * To contact Novell about this file by physical or electronic mail, you may
19 * find current contact information at www.novell.com.
20 */
21
22
23#ifndef STORAGE_MD_H
24#define STORAGE_MD_H
25
26
27#include <functional>
28
29#include "storage/Devices/Partitionable.h"
30
31
32namespace storage
33{
34
35 class MdUser;
36
37
41 enum class MdLevel
42 {
43 UNKNOWN, RAID0, RAID1, RAID4, RAID5, RAID6, RAID10, CONTAINER, LINEAR
44 };
45
46
50 enum class MdParity
51 {
52 DEFAULT, LEFT_ASYMMETRIC, LEFT_SYMMETRIC, RIGHT_ASYMMETRIC,
53 RIGHT_SYMMETRIC, FIRST, LAST, LEFT_ASYMMETRIC_6, LEFT_SYMMETRIC_6,
54 RIGHT_ASYMMETRIC_6, RIGHT_SYMMETRIC_6, FIRST_6, NEAR_2, OFFSET_2,
55 FAR_2, NEAR_3, OFFSET_3, FAR_3
56 };
57
58
64 std::string get_md_level_name(MdLevel md_level);
65
66
72 std::string get_md_parity_name(MdParity md_parity);
73
74
78 class Md : public Partitionable
79 {
80 public:
81
91 static Md* create(Devicegraph* devicegraph, const std::string& name);
92
93 static Md* load(Devicegraph* devicegraph, const xmlNode* node);
94
104
108 void remove_device(BlkDevice* blk_device);
109
110 std::vector<BlkDevice*> get_devices() ST_DEPRECATED;
111 std::vector<const BlkDevice*> get_devices() const ST_DEPRECATED;
112
117 std::vector<BlkDevice*> get_blk_devices();
118
122 std::vector<const BlkDevice*> get_blk_devices() const;
123
127 bool is_numeric() const;
128
134 unsigned int get_number() const;
135
142
148 void set_md_level(MdLevel md_level);
149
157
164 void set_md_parity(MdParity md_parity);
165
173 std::vector<MdParity> get_allowed_md_parities() const;
174
179
186 unsigned long get_chunk_size() const;
187
202 void set_chunk_size(unsigned long chunk_size);
203
209 const std::string& get_uuid() const;
210
216 void set_uuid(const std::string& uuid);
217
222 const std::string& get_metadata() const;
223
232 void set_metadata(const std::string& metadata);
233
239 unsigned int minimal_number_of_devices() const;
240
246
252
257 bool is_in_etc_mdadm() const;
258
262 void set_in_etc_mdadm(bool in_etc_mdadm);
263
267 static std::vector<Md*> get_all(Devicegraph* devicegraph);
268
272 static std::vector<const Md*> get_all(const Devicegraph* devicegraph);
273
277 static std::vector<Md*> get_all_if(Devicegraph* devicegraph,
278 std::function<bool(const Md*)> pred);
279
283 static std::vector<const Md*> get_all_if(const Devicegraph* devicegraph,
284 std::function<bool(const Md*)> pred);
285
292 static Md* find_by_name(Devicegraph* devicegraph, const std::string& name);
293
297 static const Md* find_by_name(const Devicegraph* devicegraph, const std::string& name);
298
305 static std::string find_free_numeric_name(const Devicegraph* devicegraph);
306
317 static unsigned long long calculate_underlying_size(MdLevel md_level, unsigned int number_of_devices,
318 unsigned long long size);
319
327 static bool compare_by_number(const Md* lhs, const Md* rhs);
328
329 public:
330
331 class Impl;
332
333 Impl& get_impl();
334 const Impl& get_impl() const;
335
336 virtual Md* clone() const override;
337
338 Md(Impl* impl);
339
340 };
341
342
348 bool is_md(const Device* device);
349
356 Md* to_md(Device* device);
357
361 const Md* to_md(const Device* device);
362
363}
364
365#endif
An abstract Block Device.
Definition BlkDevice.h:49
An abstract base class for storage devices.
Definition Device.h:82
The main container of the libstorage-ng.
Definition Devicegraph.h:170
Holder from a BlkDevice to an Md.
Definition MdUser.h:39
A MD device.
Definition Md.h:79
unsigned long get_chunk_size() const
Get the chunk size of the MD RAID.
bool supports_journal_device() const
Return whether the RAID supports a journal device.
MdUser * add_device(BlkDevice *blk_device)
Add another device to a RAID.
unsigned int minimal_number_of_devices() const
Return the minimal number of devices required by the RAID (without spare and journal devices).
void set_in_etc_mdadm(bool in_etc_mdadm)
Set whether the MD RAID will be present in /etc/mdadm.conf.
bool is_numeric() const
Returns true if the name of the MD is numeric.
unsigned int get_number() const
Returns the number of the MD.
std::vector< BlkDevice * > get_blk_devices()
Return blk devices used for the MD RAID.
bool supports_spare_devices() const
Return whether the RAID supports spare devices.
static unsigned long long calculate_underlying_size(MdLevel md_level, unsigned int number_of_devices, unsigned long long size)
Calculate the required size of the underlying block devices to get an MD of the desired size.
bool is_in_etc_mdadm() const
Query whether the MD RAID is present (probed devicegraph) or will be present (staging devicegraph) in...
void set_md_parity(MdParity md_parity)
Set the parity of the MD RAID.
const std::string & get_uuid() const
Get the UUID.
MdLevel get_md_level() const
Get the MD RAID level.
const std::string & get_metadata() const
A string like "1.0" or "1.2" for Linux RAID, "imsm" or "ddf" for BIOS RAID containers and empty for B...
bool is_chunk_size_meaningful() const
Is the chunk size meaningful for the RAID (so far only depends on RAID level)?
void remove_device(BlkDevice *blk_device)
void set_md_level(MdLevel md_level)
Set the MD RAID level.
std::vector< MdParity > get_allowed_md_parities() const
Get the allowed parities for the MD RAID.
static std::string find_free_numeric_name(const Devicegraph *devicegraph)
Find a free numeric name for a MD, e.g.
void set_uuid(const std::string &uuid)
Set the UUID.
static Md * find_by_name(Devicegraph *devicegraph, const std::string &name)
Find a Md by its name.
static std::vector< Md * > get_all(Devicegraph *devicegraph)
Get all Mds.
void set_chunk_size(unsigned long chunk_size)
Set the chunk size of the MD RAID.
static Md * create(Devicegraph *devicegraph, const std::string &name)
Create a MD in devicegraph with name.
static bool compare_by_number(const Md *lhs, const Md *rhs)
Compare (less than) two Mds by number.
static std::vector< Md * > get_all_if(Devicegraph *devicegraph, std::function< bool(const Md *)> pred)
Get all Mds for which the predicate pred returns true.
void set_metadata(const std::string &metadata)
Set metadata for new created Linux RAID.
MdParity get_md_parity() const
Get the parity of the MD RAID.
Definition Partitionable.h:40
The storage namespace.
Definition Actiongraph.h:40
Md * to_md(Device *device)
Converts pointer to Device to pointer to Md.
bool is_md(const Device *device)
Checks whether device points to a Md.
std::string get_md_parity_name(MdParity md_parity)
Convert the MD parity algorithm md_parity to a string.
MdParity
MD parity algorithms for RAID5, RAID6 and RAID10.
Definition Md.h:51
std::string get_md_level_name(MdLevel md_level)
Convert the MD RAID level md_level to a string.
MdLevel
MD RAID levels.
Definition Md.h:42