2008-02-20 15:45:33 +00:00
|
|
|
/*
|
2011-04-17 06:34:10 +00:00
|
|
|
* storage_backend_logical.c: storage backend for logical volume handling
|
2008-02-20 15:45:33 +00:00
|
|
|
*
|
2016-01-22 16:01:05 +00:00
|
|
|
* Copyright (C) 2007-2016 Red Hat, Inc.
|
2008-02-20 15:45:33 +00:00
|
|
|
* Copyright (C) 2007-2008 Daniel P. Berrange
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
2012-09-20 22:30:55 +00:00
|
|
|
* License along with this library. If not, see
|
2012-07-21 10:06:23 +00:00
|
|
|
* <http://www.gnu.org/licenses/>.
|
2008-02-20 15:45:33 +00:00
|
|
|
*
|
|
|
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include <sys/wait.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <regex.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
2012-12-13 18:21:53 +00:00
|
|
|
#include "virerror.h"
|
2008-02-20 15:45:33 +00:00
|
|
|
#include "storage_backend_logical.h"
|
|
|
|
#include "storage_conf.h"
|
2012-12-12 16:27:01 +00:00
|
|
|
#include "vircommand.h"
|
2012-12-12 18:06:53 +00:00
|
|
|
#include "viralloc.h"
|
2012-12-12 17:59:27 +00:00
|
|
|
#include "virlog.h"
|
2011-07-19 18:32:58 +00:00
|
|
|
#include "virfile.h"
|
2013-04-03 10:36:23 +00:00
|
|
|
#include "virstring.h"
|
2017-01-11 17:04:15 +00:00
|
|
|
#include "storage_util.h"
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2009-01-20 17:13:33 +00:00
|
|
|
#define VIR_FROM_THIS VIR_FROM_STORAGE
|
|
|
|
|
2014-02-28 12:16:17 +00:00
|
|
|
VIR_LOG_INIT("storage.storage_backend_logical");
|
|
|
|
|
2008-02-20 15:45:33 +00:00
|
|
|
#define PV_BLANK_SECTOR_SIZE 512
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2010-02-04 22:41:52 +00:00
|
|
|
virStorageBackendLogicalSetActive(virStoragePoolObjPtr pool,
|
2008-02-20 15:45:33 +00:00
|
|
|
int on)
|
|
|
|
{
|
2012-07-11 14:56:55 +00:00
|
|
|
int ret;
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandPtr cmd =
|
|
|
|
virCommandNewArgList(VGCHANGE,
|
|
|
|
on ? "-aly" : "-aln",
|
2017-07-26 18:16:52 +00:00
|
|
|
def->source.name,
|
2012-07-11 14:56:55 +00:00
|
|
|
NULL);
|
|
|
|
|
|
|
|
ret = virCommandRun(cmd, NULL);
|
|
|
|
virCommandFree(cmd);
|
|
|
|
return ret;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-12-15 11:39:42 +00:00
|
|
|
/*
|
|
|
|
* @path: Path to the device
|
|
|
|
*
|
|
|
|
* Remove the pv device since we're done with it. This ensures a subsequent
|
|
|
|
* create won't require special arguments in order for force recreation.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
virStorageBackendLogicalRemoveDevice(const char *path)
|
|
|
|
{
|
|
|
|
virCommandPtr cmd = virCommandNewArgList(PVREMOVE, path, NULL);
|
|
|
|
|
|
|
|
if (virCommandRun(cmd, NULL) < 0)
|
|
|
|
VIR_INFO("Failed to pvremove logical device '%s'", path);
|
|
|
|
virCommandFree(cmd);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-12-15 12:15:48 +00:00
|
|
|
/*
|
|
|
|
* @path: Path to the device
|
|
|
|
*
|
|
|
|
* Initialize and pvcreate the device.
|
|
|
|
*
|
|
|
|
* Returns 0 on success, -1 on failure with error message set
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
virStorageBackendLogicalInitializeDevice(const char *path)
|
|
|
|
{
|
|
|
|
int ret = -1;
|
|
|
|
virCommandPtr pvcmd = NULL;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LVM requires that the first sector is blanked if using
|
|
|
|
* a whole disk as a PV. So we just blank them out regardless
|
|
|
|
* rather than trying to figure out if we're a disk or partition
|
|
|
|
*/
|
2017-04-07 15:53:07 +00:00
|
|
|
if (virStorageBackendZeroPartitionTable(path, 1024 * 1024) < 0)
|
2016-12-15 12:15:48 +00:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Initialize the physical volume because vgcreate is not
|
|
|
|
* clever enough todo this for us :-(
|
|
|
|
*/
|
|
|
|
pvcmd = virCommandNewArgList(PVCREATE, path, NULL);
|
|
|
|
if (virCommandRun(pvcmd, NULL) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
virCommandFree(pvcmd);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_STRIPED "striped"
|
2016-02-01 14:59:44 +00:00
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_MIRROR "mirror"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_RAID "raid"
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
|
2014-03-18 14:35:01 +00:00
|
|
|
struct virStorageBackendLogicalPoolVolData {
|
|
|
|
virStoragePoolObjPtr pool;
|
|
|
|
virStorageVolDefPtr vol;
|
|
|
|
};
|
|
|
|
|
2008-02-20 15:45:33 +00:00
|
|
|
static int
|
2016-01-22 17:02:18 +00:00
|
|
|
virStorageBackendLogicalParseVolExtents(virStorageVolDefPtr vol,
|
|
|
|
char **const groups)
|
2008-02-20 15:45:33 +00:00
|
|
|
{
|
2016-01-22 17:02:18 +00:00
|
|
|
int nextents, ret = -1;
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
const char *regex_unit = "(\\S+)\\((\\S+)\\)";
|
|
|
|
char *regex = NULL;
|
|
|
|
regex_t *reg = NULL;
|
|
|
|
regmatch_t *vars = NULL;
|
|
|
|
char *p = NULL;
|
Convert 'int i' to 'size_t i' in src/storage/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2016-01-22 17:02:18 +00:00
|
|
|
int err, nvars;
|
|
|
|
unsigned long long offset, size, length;
|
2016-02-01 14:39:00 +00:00
|
|
|
virStorageVolSourceExtent extent;
|
|
|
|
|
|
|
|
memset(&extent, 0, sizeof(extent));
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
|
2016-02-01 14:59:44 +00:00
|
|
|
/* Assume 1 extent (the regex for 'devices' is "(\\S+)") and only
|
|
|
|
* check the 'stripes' field if we have a striped, mirror, or one of
|
|
|
|
* the raid (raid1, raid4, raid5*, raid6*, or raid10) segtypes in which
|
|
|
|
* case the stripes field will denote the number of lv's within the
|
|
|
|
* 'devices' field in order to generate the proper regex to decode
|
|
|
|
* the field
|
|
|
|
*/
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
nextents = 1;
|
2016-02-01 14:59:44 +00:00
|
|
|
if (STREQ(groups[4], VIR_STORAGE_VOL_LOGICAL_SEGTYPE_STRIPED) ||
|
|
|
|
STREQ(groups[4], VIR_STORAGE_VOL_LOGICAL_SEGTYPE_MIRROR) ||
|
|
|
|
STRPREFIX(groups[4], VIR_STORAGE_VOL_LOGICAL_SEGTYPE_RAID)) {
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
if (virStrToLong_i(groups[5], NULL, 10, &nextents) < 0) {
|
2012-07-18 11:38:29 +00:00
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
|
_("malformed volume extent stripes value"));
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
}
|
2008-02-20 15:45:33 +00:00
|
|
|
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
if (virStrToLong_ull(groups[6], NULL, 10, &length) < 0) {
|
2012-07-18 11:38:29 +00:00
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
"%s", _("malformed volume extent length value"));
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
2016-01-22 17:02:18 +00:00
|
|
|
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
if (virStrToLong_ull(groups[7], NULL, 10, &size) < 0) {
|
2012-07-18 11:38:29 +00:00
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
"%s", _("malformed volume extent size value"));
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2016-02-01 15:26:02 +00:00
|
|
|
/* Allocate space for 'nextents' regex_unit strings plus a comma for each */
|
|
|
|
if (VIR_ALLOC_N(regex, nextents * (strlen(regex_unit) + 1) + 1) < 0)
|
2013-05-03 12:49:08 +00:00
|
|
|
goto cleanup;
|
2016-02-03 08:48:40 +00:00
|
|
|
strcat(regex, regex_unit);
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
for (i = 1; i < nextents; i++) {
|
2011-10-10 20:02:06 +00:00
|
|
|
/* "," is the separator of "devices" field */
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
strcat(regex, ",");
|
2016-02-03 08:48:40 +00:00
|
|
|
strcat(regex, regex_unit);
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
}
|
|
|
|
|
2013-07-04 10:16:29 +00:00
|
|
|
if (VIR_ALLOC(reg) < 0)
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
/* Each extent has a "path:offset" pair, and vars[0] will
|
|
|
|
* be the whole matched string.
|
|
|
|
*/
|
|
|
|
nvars = (nextents * 2) + 1;
|
2013-07-04 10:16:29 +00:00
|
|
|
if (VIR_ALLOC_N(vars, nvars) < 0)
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
err = regcomp(reg, regex, REG_EXTENDED);
|
|
|
|
if (err != 0) {
|
|
|
|
char error[100];
|
|
|
|
regerror(err, reg, error, sizeof(error));
|
2012-07-18 11:38:29 +00:00
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
_("Failed to compile regex %s"),
|
|
|
|
error);
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
|
2013-01-10 19:44:26 +00:00
|
|
|
err = regexec(reg, groups[3], nvars, vars, 0);
|
|
|
|
regfree(reg);
|
|
|
|
if (err != 0) {
|
2012-07-18 11:38:29 +00:00
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
|
_("malformed volume extent devices value"));
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
p = groups[3];
|
2008-02-20 15:45:33 +00:00
|
|
|
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
/* vars[0] is skipped */
|
|
|
|
for (i = 0; i < nextents; i++) {
|
Convert 'int i' to 'size_t i' in src/storage/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t j;
|
|
|
|
int len;
|
2013-05-03 12:49:08 +00:00
|
|
|
char *offset_str = NULL;
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
|
|
|
|
j = (i * 2) + 1;
|
|
|
|
len = vars[j].rm_eo - vars[j].rm_so;
|
|
|
|
p[vars[j].rm_eo] = '\0';
|
|
|
|
|
2016-02-01 14:39:00 +00:00
|
|
|
if (VIR_STRNDUP(extent.path,
|
2013-05-03 12:49:08 +00:00
|
|
|
p + vars[j].rm_so, len) < 0)
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
len = vars[j + 1].rm_eo - vars[j + 1].rm_so;
|
2013-05-03 12:49:08 +00:00
|
|
|
if (VIR_STRNDUP(offset_str, p + vars[j + 1].rm_so, len) < 0)
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (virStrToLong_ull(offset_str, NULL, 10, &offset) < 0) {
|
2012-07-18 11:38:29 +00:00
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
|
_("malformed volume extent offset value"));
|
2011-10-13 21:06:01 +00:00
|
|
|
VIR_FREE(offset_str);
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
VIR_FREE(offset_str);
|
2016-02-01 14:39:00 +00:00
|
|
|
extent.start = offset * size;
|
|
|
|
extent.end = (offset * size) + length;
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
|
2016-02-01 14:39:00 +00:00
|
|
|
if (VIR_APPEND_ELEMENT(vol->source.extents, vol->source.nextent,
|
|
|
|
extent) < 0)
|
|
|
|
goto cleanup;
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
}
|
|
|
|
|
2016-01-22 17:02:18 +00:00
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
VIR_FREE(regex);
|
|
|
|
VIR_FREE(reg);
|
|
|
|
VIR_FREE(vars);
|
2016-02-01 14:39:00 +00:00
|
|
|
VIR_FREE(extent.path);
|
2016-01-22 17:02:18 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
virStorageBackendLogicalMakeVol(char **const groups,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
struct virStorageBackendLogicalPoolVolData *data = opaque;
|
|
|
|
virStoragePoolObjPtr pool = data->pool;
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
2016-01-22 17:02:18 +00:00
|
|
|
virStorageVolDefPtr vol = NULL;
|
|
|
|
bool is_new_vol = false;
|
|
|
|
int ret = -1;
|
|
|
|
const char *attrs = groups[9];
|
|
|
|
|
|
|
|
/* Skip inactive volume */
|
|
|
|
if (attrs[4] != 'a')
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Skip thin pools(t). These show up in normal lvs output
|
|
|
|
* but do not have a corresponding /dev/$vg/$lv device that
|
|
|
|
* is created by udev. This breaks assumptions in later code.
|
|
|
|
*/
|
|
|
|
if (attrs[0] == 't')
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* See if we're only looking for a specific volume */
|
|
|
|
if (data->vol != NULL) {
|
|
|
|
vol = data->vol;
|
|
|
|
if (STRNEQ(vol->name, groups[0]))
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Or filling in more data on an existing volume */
|
|
|
|
if (vol == NULL)
|
|
|
|
vol = virStorageVolDefFindByName(pool, groups[0]);
|
|
|
|
|
|
|
|
/* Or a completely new volume */
|
|
|
|
if (vol == NULL) {
|
|
|
|
if (VIR_ALLOC(vol) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
is_new_vol = true;
|
|
|
|
vol->type = VIR_STORAGE_VOL_BLOCK;
|
|
|
|
|
|
|
|
if (VIR_STRDUP(vol->name, groups[0]) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vol->target.path == NULL) {
|
|
|
|
if (virAsprintf(&vol->target.path, "%s/%s",
|
2017-07-26 18:16:52 +00:00
|
|
|
def->target.path, vol->name) < 0)
|
2016-01-22 17:02:18 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Mark the (s) sparse/snapshot lv, e.g. the lv created using
|
|
|
|
* the --virtualsize/-V option. We've already ignored the (t)hin
|
|
|
|
* pool definition. In the manner libvirt defines these, the
|
|
|
|
* thin pool is hidden to the lvs output, except as the name
|
|
|
|
* in brackets [] described for the groups[1] (backingStore).
|
|
|
|
*/
|
|
|
|
if (attrs[0] == 's')
|
|
|
|
vol->target.sparse = true;
|
|
|
|
|
|
|
|
/* Skips the backingStore of lv created with "--virtualsize",
|
|
|
|
* its original device "/dev/$vgname/$lvname_vorigin" is
|
|
|
|
* just for lvm internal use, one should never use it.
|
|
|
|
*
|
|
|
|
* (lvs outputs "[$lvname_vorigin] for field "origin" if the
|
|
|
|
* lv is created with "--virtualsize").
|
|
|
|
*/
|
|
|
|
if (groups[1] && STRNEQ(groups[1], "") && (groups[1][0] != '[')) {
|
|
|
|
if (VIR_ALLOC(vol->target.backingStore) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (virAsprintf(&vol->target.backingStore->path, "%s/%s",
|
2017-07-26 18:16:52 +00:00
|
|
|
def->target.path, groups[1]) < 0)
|
2016-01-22 17:02:18 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
vol->target.backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
|
2017-10-12 18:31:33 +00:00
|
|
|
vol->target.backingStore->type = VIR_STORAGE_TYPE_BLOCK;
|
2016-01-22 17:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!vol->key && VIR_STRDUP(vol->key, groups[2]) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (virStorageBackendUpdateVolInfo(vol, false,
|
|
|
|
VIR_STORAGE_VOL_OPEN_DEFAULT, 0) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (virStrToLong_ull(groups[8], NULL, 10, &vol->target.allocation) < 0) {
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
"%s", _("malformed volume allocation value"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virStorageBackendLogicalParseVolExtents(vol, groups) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
2017-05-09 12:05:16 +00:00
|
|
|
if (is_new_vol && virStoragePoolObjAddVol(pool, vol) < 0)
|
2014-03-07 08:33:31 +00:00
|
|
|
goto cleanup;
|
2017-05-09 12:05:16 +00:00
|
|
|
vol = NULL;
|
2011-12-12 07:26:20 +00:00
|
|
|
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
ret = 0;
|
|
|
|
|
2014-03-25 06:52:40 +00:00
|
|
|
cleanup:
|
2016-02-19 19:03:16 +00:00
|
|
|
if (is_new_vol)
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
virStorageVolDefFree(vol);
|
|
|
|
return ret;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
2016-02-02 13:27:55 +00:00
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_PREFIX_REGEX "^\\s*"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_LV_NAME_REGEX "(\\S+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_ORIGIN_REGEX "(\\S*)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_UUID_REGEX "(\\S+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_DEVICES_REGEX "(\\S+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_REGEX "(\\S+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_STRIPES_REGEX "([0-9]+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_SEG_SIZE_REGEX "(\\S+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_VG_EXTENT_SIZE_REGEX "([0-9]+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_SIZE_REGEX "([0-9]+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_LV_ATTR_REGEX "(\\S+)#"
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_SUFFIX_REGEX "?\\s*$"
|
|
|
|
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_REGEX_COUNT 10
|
|
|
|
#define VIR_STORAGE_VOL_LOGICAL_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_PREFIX_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_LV_NAME_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_ORIGIN_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_UUID_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_DEVICES_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_SEGTYPE_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_STRIPES_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_SEG_SIZE_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_VG_EXTENT_SIZE_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_SIZE_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_LV_ATTR_REGEX \
|
|
|
|
VIR_STORAGE_VOL_LOGICAL_SUFFIX_REGEX
|
|
|
|
|
2008-02-20 15:45:33 +00:00
|
|
|
static int
|
2010-02-10 11:42:56 +00:00
|
|
|
virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
|
2008-02-20 15:45:33 +00:00
|
|
|
virStorageVolDefPtr vol)
|
|
|
|
{
|
|
|
|
/*
|
2016-01-22 16:01:05 +00:00
|
|
|
* # lvs --separator # --noheadings --units b --unbuffered --nosuffix --options \
|
|
|
|
* "lv_name,origin,uuid,devices,segtype,stripes,seg_size,vg_extent_size,size,lv_attr" VGNAME
|
storage: Skip inactive lv volumes
If the volume is of a clustered volume group, and not active, the
related pool APIs fails on opening /dev/vg/lv. If the volume is
suspended, it hangs on open(2) the volume.
Though the best solution is to expose the volume status in volume
XML, and even better to provide API to activate/deactivate the volume,
but it's not the work I want to touch currently. Volume status in
other status is just fine to skip.
About the 5th field of lv_attr (from man lvs[8])
<quote>
5 State: (a)ctive, (s)uspended, (I)nvalid snapshot, invalid
(S)uspended snapshot, snapshot (m)erge failed,suspended
snapshot (M)erge failed, mapped (d)evice present without
tables, mapped device present with (i)nactive table
</quote>
2013-05-07 10:29:29 +00:00
|
|
|
*
|
2016-01-22 16:01:05 +00:00
|
|
|
* RootLV##06UgP5-2rhb-w3Bo-3mdR-WeoL-pytO-SAa2ky#/dev/hda2(0)#linear#1#5234491392#33554432#5234491392#-wi-ao
|
|
|
|
* SwapLV##oHviCK-8Ik0-paqS-V20c-nkhY-Bm1e-zgzU0M#/dev/hda2(156)#linear#1#1040187392#33554432#1040187392#-wi-ao
|
|
|
|
* Test2##3pg3he-mQsA-5Sui-h0i6-HNmc-Cz7W-QSndcR#/dev/hda2(219)#linear#1#1073741824#33554432#1073741824#owi-a-
|
|
|
|
* Test3##UB5hFw-kmlm-LSoX-EI1t-ioVd-h7GL-M0W8Ht#/dev/hda2(251)#linear#1#2181038080#33554432#2181038080#-wi-a-
|
|
|
|
* Test3#Test2#UB5hFw-kmlm-LSoX-EI1t-ioVd-h7GL-M0W8Ht#/dev/hda2(187)#linear#1#1040187392#33554432#1040187392#swi-a-
|
|
|
|
* test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#/dev/sdc1(10240),/dev/sdd1(0)#striped#2#42949672960#4194304#-wi-a-
|
2008-02-20 15:45:33 +00:00
|
|
|
*
|
storage: Skip inactive lv volumes
If the volume is of a clustered volume group, and not active, the
related pool APIs fails on opening /dev/vg/lv. If the volume is
suspended, it hangs on open(2) the volume.
Though the best solution is to expose the volume status in volume
XML, and even better to provide API to activate/deactivate the volume,
but it's not the work I want to touch currently. Volume status in
other status is just fine to skip.
About the 5th field of lv_attr (from man lvs[8])
<quote>
5 State: (a)ctive, (s)uspended, (I)nvalid snapshot, invalid
(S)uspended snapshot, snapshot (m)erge failed,suspended
snapshot (M)erge failed, mapped (d)evice present without
tables, mapped device present with (i)nactive table
</quote>
2013-05-07 10:29:29 +00:00
|
|
|
* Pull out name, origin, & uuid, device, device extent start #,
|
|
|
|
* segment size, extent size, size, attrs
|
2008-02-20 15:45:33 +00:00
|
|
|
*
|
|
|
|
* NB can be multiple rows per volume if they have many extents
|
2008-07-30 08:52:44 +00:00
|
|
|
*
|
2016-01-22 16:01:05 +00:00
|
|
|
* NB lvs from some distros (e.g. SLES10 SP2) outputs trailing ","
|
|
|
|
* on each line
|
2008-11-14 16:10:47 +00:00
|
|
|
*
|
|
|
|
* NB Encrypted logical volumes can print ':' in their name, so it is
|
|
|
|
* not a suitable separator (rhbz 470693).
|
2016-01-22 16:01:05 +00:00
|
|
|
*
|
storage: Do not use comma as seperator for lvs output
* src/storage/storage_backend_logical.c:
If a logical vol is created as striped. (e.g. --stripes 3),
the "device" field of lvs output will have multiple fileds which are
seperated by comma. Thus the RE we write in the codes will not
work well anymore. E.g. (lvs output for a stripped vol, uses "#" as
seperator here):
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#\
/dev/sdc1(10240),/dev/sdd1(0)#42949672960#4194304
The RE we use:
const char *regexes[] = {
"^\\s*(\\S+),(\\S*),(\\S+),(\\S+)\\((\\S+)\\),(\\S+),([0-9]+),?\\s*$"
};
Also the RE doesn't match the "devices" field of striped vol properly,
it contains multiple "device path" and "offset".
This patch mainly does:
1) Change the seperator into "#"
2) Change the RE for "devices" field from "(\\S+)\\((\\S+)\\)"
into "(\\S+)".
3) Add two new options for lvs command, (segtype, stripes)
4) Extend the RE to match the value for the two new fields.
5) Parse the "devices" field seperately in virStorageBackendLogicalMakeVol,
multiple "extents" info are generated if the vol is striped. The
number of "extents" is equal to the stripes number of the striped vol.
A incidental fix: (virStorageBackendLogicalMakeVol)
Free "vol" if it's new created and there is error.
Demo on striped vol with the patch applied:
% virsh vol-dumpxml /dev/test_vg/vol_striped2
<volume>
<name>vol_striped2</name>
<key>QuWqmn-kIkZ-IATt-67rc-OWEP-1PHX-Cl2ICs</key>
<source>
<device path='/dev/sda5'>
<extent start='79691776' end='88080384'/>
</device>
<device path='/dev/sda6'>
<extent start='62914560' end='71303168'/>
</device>
</source>
<capacity>8388608</capacity>
<allocation>8388608</allocation>
<target>
<path>/dev/test_vg/vol_striped2</path>
<permissions>
<mode>0660</mode>
<owner>0</owner>
<group>6</group>
<label>system_u:object_r:fixed_disk_device_t:s0</label>
</permissions>
</target>
</volume>
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=727474
2011-10-10 12:34:59 +00:00
|
|
|
* NB "devices" field has multiple device paths and "," if the volume is
|
|
|
|
* striped, so "," is not a suitable separator either (rhbz 727474).
|
2008-02-20 15:45:33 +00:00
|
|
|
*/
|
|
|
|
const char *regexes[] = {
|
2016-02-02 13:27:55 +00:00
|
|
|
VIR_STORAGE_VOL_LOGICAL_REGEX
|
2008-02-20 15:45:33 +00:00
|
|
|
};
|
|
|
|
int vars[] = {
|
2016-02-02 13:27:55 +00:00
|
|
|
VIR_STORAGE_VOL_LOGICAL_REGEX_COUNT
|
2008-02-20 15:45:33 +00:00
|
|
|
};
|
2012-07-11 14:56:55 +00:00
|
|
|
int ret = -1;
|
|
|
|
virCommandPtr cmd;
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
2014-03-18 14:35:01 +00:00
|
|
|
struct virStorageBackendLogicalPoolVolData cbdata = {
|
|
|
|
.pool = pool,
|
|
|
|
.vol = vol,
|
|
|
|
};
|
2012-07-11 14:56:55 +00:00
|
|
|
|
|
|
|
cmd = virCommandNewArgList(LVS,
|
|
|
|
"--separator", "#",
|
|
|
|
"--noheadings",
|
|
|
|
"--units", "b",
|
|
|
|
"--unbuffered",
|
|
|
|
"--nosuffix",
|
storage: Skip inactive lv volumes
If the volume is of a clustered volume group, and not active, the
related pool APIs fails on opening /dev/vg/lv. If the volume is
suspended, it hangs on open(2) the volume.
Though the best solution is to expose the volume status in volume
XML, and even better to provide API to activate/deactivate the volume,
but it's not the work I want to touch currently. Volume status in
other status is just fine to skip.
About the 5th field of lv_attr (from man lvs[8])
<quote>
5 State: (a)ctive, (s)uspended, (I)nvalid snapshot, invalid
(S)uspended snapshot, snapshot (m)erge failed,suspended
snapshot (M)erge failed, mapped (d)evice present without
tables, mapped device present with (i)nactive table
</quote>
2013-05-07 10:29:29 +00:00
|
|
|
"--options",
|
|
|
|
"lv_name,origin,uuid,devices,segtype,stripes,seg_size,vg_extent_size,size,lv_attr",
|
2017-07-26 18:16:52 +00:00
|
|
|
def->source.name,
|
2012-07-11 14:56:55 +00:00
|
|
|
NULL);
|
2014-03-18 14:35:01 +00:00
|
|
|
if (virCommandRunRegex(cmd,
|
|
|
|
1,
|
|
|
|
regexes,
|
|
|
|
vars,
|
|
|
|
virStorageBackendLogicalMakeVol,
|
|
|
|
&cbdata,
|
2016-05-13 16:36:39 +00:00
|
|
|
"lvs",
|
|
|
|
NULL) < 0)
|
2012-07-11 14:56:55 +00:00
|
|
|
goto cleanup;
|
2008-06-17 12:45:24 +00:00
|
|
|
|
2012-07-11 14:56:55 +00:00
|
|
|
ret = 0;
|
2014-03-25 06:52:40 +00:00
|
|
|
cleanup:
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandFree(cmd);
|
|
|
|
return ret;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2014-03-18 14:35:01 +00:00
|
|
|
virStorageBackendLogicalRefreshPoolFunc(char **const groups,
|
|
|
|
void *data)
|
2008-02-20 15:45:33 +00:00
|
|
|
{
|
2014-03-18 14:35:01 +00:00
|
|
|
virStoragePoolObjPtr pool = data;
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
|
|
|
|
|
|
|
if (virStrToLong_ull(groups[0], NULL, 10, &def->capacity) < 0)
|
2008-02-20 15:45:33 +00:00
|
|
|
return -1;
|
2017-07-26 18:16:52 +00:00
|
|
|
if (virStrToLong_ull(groups[1], NULL, 10, &def->available) < 0)
|
2008-02-20 15:45:33 +00:00
|
|
|
return -1;
|
2017-07-26 18:16:52 +00:00
|
|
|
def->allocation = def->capacity - def->available;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-08-27 20:05:58 +00:00
|
|
|
static int
|
2014-03-18 14:35:01 +00:00
|
|
|
virStorageBackendLogicalFindPoolSourcesFunc(char **const groups,
|
2008-08-27 20:05:58 +00:00
|
|
|
void *data)
|
|
|
|
{
|
2008-10-23 11:39:53 +00:00
|
|
|
virStoragePoolSourceListPtr sourceList = data;
|
|
|
|
char *pvname = NULL;
|
|
|
|
char *vgname = NULL;
|
Convert 'int i' to 'size_t i' in src/storage/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2008-10-23 11:39:53 +00:00
|
|
|
virStoragePoolSourceDevicePtr dev;
|
|
|
|
virStoragePoolSource *thisSource;
|
|
|
|
|
2013-05-03 12:49:08 +00:00
|
|
|
if (VIR_STRDUP(pvname, groups[0]) < 0 ||
|
|
|
|
VIR_STRDUP(vgname, groups[1]) < 0)
|
|
|
|
goto error;
|
2008-10-23 11:39:53 +00:00
|
|
|
|
|
|
|
thisSource = NULL;
|
2013-05-21 07:21:21 +00:00
|
|
|
for (i = 0; i < sourceList->nsources; i++) {
|
2008-10-23 11:39:53 +00:00
|
|
|
if (STREQ(sourceList->sources[i].name, vgname)) {
|
|
|
|
thisSource = &sourceList->sources[i];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2008-08-27 20:05:58 +00:00
|
|
|
|
2008-10-23 11:39:53 +00:00
|
|
|
if (thisSource == NULL) {
|
2010-02-10 11:42:56 +00:00
|
|
|
if (!(thisSource = virStoragePoolSourceListNewSource(sourceList)))
|
2013-05-03 12:49:08 +00:00
|
|
|
goto error;
|
2008-10-23 11:39:53 +00:00
|
|
|
|
|
|
|
thisSource->name = vgname;
|
2008-08-27 20:05:58 +00:00
|
|
|
}
|
2008-10-23 11:39:53 +00:00
|
|
|
else
|
|
|
|
VIR_FREE(vgname);
|
2008-08-27 20:05:58 +00:00
|
|
|
|
2013-07-04 10:16:29 +00:00
|
|
|
if (VIR_REALLOC_N(thisSource->devices, thisSource->ndevice + 1) != 0)
|
2013-05-03 12:49:08 +00:00
|
|
|
goto error;
|
2008-08-27 20:05:58 +00:00
|
|
|
|
2008-10-23 11:39:53 +00:00
|
|
|
dev = &thisSource->devices[thisSource->ndevice];
|
|
|
|
thisSource->ndevice++;
|
2008-11-04 21:54:21 +00:00
|
|
|
thisSource->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
|
2008-10-23 11:39:53 +00:00
|
|
|
|
|
|
|
memset(dev, 0, sizeof(*dev));
|
|
|
|
dev->path = pvname;
|
2008-08-27 20:05:58 +00:00
|
|
|
|
|
|
|
return 0;
|
2008-10-23 11:39:53 +00:00
|
|
|
|
2014-03-25 06:52:40 +00:00
|
|
|
error:
|
2008-10-23 11:39:53 +00:00
|
|
|
VIR_FREE(pvname);
|
|
|
|
VIR_FREE(vgname);
|
|
|
|
|
|
|
|
return -1;
|
2008-08-27 20:05:58 +00:00
|
|
|
}
|
|
|
|
|
2015-12-07 16:27:03 +00:00
|
|
|
/*
|
|
|
|
* @sourceList: Pointer to a storage pool source list
|
|
|
|
*
|
|
|
|
* Use the pvs command to fill the list of pv_name and vg_name associated
|
|
|
|
* into the passed sourceList.
|
|
|
|
*
|
|
|
|
* Returns 0 if successful, -1 and sets error on failure
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
virStorageBackendLogicalGetPoolSources(virStoragePoolSourceListPtr sourceList)
|
2008-08-27 20:05:58 +00:00
|
|
|
{
|
|
|
|
/*
|
2008-10-23 11:39:53 +00:00
|
|
|
* # pvs --noheadings -o pv_name,vg_name
|
|
|
|
* /dev/sdb
|
|
|
|
* /dev/sdc VolGroup00
|
2008-08-27 20:05:58 +00:00
|
|
|
*/
|
|
|
|
const char *regexes[] = {
|
2008-10-23 11:39:53 +00:00
|
|
|
"^\\s*(\\S+)\\s+(\\S+)\\s*$"
|
2008-08-27 20:05:58 +00:00
|
|
|
};
|
|
|
|
int vars[] = {
|
2008-10-23 11:39:53 +00:00
|
|
|
2
|
2008-08-27 20:05:58 +00:00
|
|
|
};
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandPtr cmd;
|
2015-12-07 16:27:03 +00:00
|
|
|
int ret = -1;
|
2011-07-06 22:51:23 +00:00
|
|
|
|
2008-11-05 11:41:43 +00:00
|
|
|
/*
|
|
|
|
* NOTE: ignoring errors here; this is just to "touch" any logical volumes
|
|
|
|
* that might be hanging around, so if this fails for some reason, the
|
|
|
|
* worst that happens is that scanning doesn't pick everything up
|
|
|
|
*/
|
2012-07-11 14:56:55 +00:00
|
|
|
cmd = virCommandNew(VGSCAN);
|
|
|
|
if (virCommandRun(cmd, NULL) < 0)
|
2011-05-09 09:24:09 +00:00
|
|
|
VIR_WARN("Failure when running vgscan to refresh physical volumes");
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandFree(cmd);
|
2008-11-05 11:41:43 +00:00
|
|
|
|
2012-07-11 14:56:55 +00:00
|
|
|
cmd = virCommandNewArgList(PVS,
|
|
|
|
"--noheadings",
|
|
|
|
"-o", "pv_name,vg_name",
|
2016-05-13 16:36:39 +00:00
|
|
|
NULL, NULL);
|
2014-03-18 14:35:01 +00:00
|
|
|
if (virCommandRunRegex(cmd, 1, regexes, vars,
|
|
|
|
virStorageBackendLogicalFindPoolSourcesFunc,
|
2016-05-13 16:36:39 +00:00
|
|
|
sourceList, "pvs", NULL) < 0)
|
2015-12-07 16:27:03 +00:00
|
|
|
goto cleanup;
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
cleanup:
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandFree(cmd);
|
2015-12-07 16:27:03 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static char *
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalFindPoolSources(const char *srcSpec ATTRIBUTE_UNUSED,
|
2015-12-07 16:27:03 +00:00
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
virStoragePoolSourceList sourceList;
|
|
|
|
size_t i;
|
|
|
|
char *retval = NULL;
|
|
|
|
|
|
|
|
virCheckFlags(0, NULL);
|
|
|
|
|
|
|
|
memset(&sourceList, 0, sizeof(sourceList));
|
|
|
|
sourceList.type = VIR_STORAGE_POOL_LOGICAL;
|
|
|
|
|
|
|
|
if (virStorageBackendLogicalGetPoolSources(&sourceList) < 0)
|
|
|
|
goto cleanup;
|
2008-08-27 20:05:58 +00:00
|
|
|
|
2010-02-10 11:42:56 +00:00
|
|
|
retval = virStoragePoolSourceListFormat(&sourceList);
|
2008-08-27 20:05:58 +00:00
|
|
|
if (retval == NULL) {
|
2012-07-18 11:38:29 +00:00
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
|
_("failed to get source from sourceList"));
|
2008-08-27 20:05:58 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
2008-10-23 11:39:53 +00:00
|
|
|
for (i = 0; i < sourceList.nsources; i++)
|
2011-10-21 22:44:52 +00:00
|
|
|
virStoragePoolSourceClear(&sourceList.sources[i]);
|
2008-10-23 11:39:53 +00:00
|
|
|
VIR_FREE(sourceList.sources);
|
2008-08-27 20:05:58 +00:00
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-12-07 20:06:17 +00:00
|
|
|
/*
|
|
|
|
* virStorageBackendLogicalMatchPoolSource
|
|
|
|
* @pool: Pointer to the source pool object
|
|
|
|
*
|
|
|
|
* Search the output generated by a 'pvs --noheadings -o pv_name,vg_name'
|
|
|
|
* to match the 'vg_name' with the pool def->source.name and for the list
|
|
|
|
* of pool def->source.devices[].
|
|
|
|
*
|
|
|
|
* Returns true if the volume group name matches the pool's source.name
|
|
|
|
* and at least one of the pool's def->source.devices[] matches the
|
|
|
|
* list of physical device names listed for the pool. Return false if
|
|
|
|
* we cannot find a matching volume group name and if we cannot match
|
|
|
|
* the any device list members.
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
virStorageBackendLogicalMatchPoolSource(virStoragePoolObjPtr pool)
|
|
|
|
{
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
2015-12-07 20:06:17 +00:00
|
|
|
virStoragePoolSourceList sourceList;
|
Initialize couple of variables.
While trying to build with -Os couple of compile errors showed
up.
conf/domain_conf.c: In function 'virDomainChrRemove':
conf/domain_conf.c:13666:24: error: 'ret' may be used uninitialized in this function [-Werror=maybe-uninitialized]
virDomainChrDefPtr ret, **arrPtr = NULL;
^
Compiler fails to see that @ret is used only if set in the loop,
but whatever, there's no harm in initializing the variable.
In vboxAttachDrivesNew and _vboxAttachDrivesOld compiler thinks
that @rc may be used uninitialized. Well, not directly, but maybe
after some optimization. Yet again, no harm in initializing a
variable.
In file included from ./util/virthread.h:26:0,
from ./datatypes.h:28,
from vbox/vbox_tmpl.c:43,
from vbox/vbox_V3_1.c:37:
vbox/vbox_tmpl.c: In function '_vboxAttachDrivesOld':
./util/virerror.h:181:5: error: 'rc' may be used uninitialized in this function [-Werror=maybe-uninitialized]
virReportErrorHelper(VIR_FROM_THIS, code, __FILE__, \
^
In file included from vbox/vbox_V3_1.c:37:0:
vbox/vbox_tmpl.c:1041:14: note: 'rc' was declared here
nsresult rc;
^
Yet again, one uninitialized variable:
qemu/qemu_driver.c: In function 'qemuDomainBlockCommit':
qemu/qemu_driver.c:17194:9: error: 'baseSource' may be used uninitialized in this function [-Werror=maybe-uninitialized]
qemuDomainPrepareDiskChainElement(driver, vm, baseSource,
^
And another one:
storage/storage_backend_logical.c: In function 'virStorageBackendLogicalMatchPoolSource.isra.2':
storage/storage_backend_logical.c:618:33: error: 'thisSource' may be used uninitialized in this function [-Werror=maybe-uninitialized]
thisSource->devices[j].path))
^
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
2016-03-03 08:10:27 +00:00
|
|
|
virStoragePoolSource *thisSource = NULL;
|
2015-12-07 20:06:17 +00:00
|
|
|
size_t i, j;
|
|
|
|
int matchcount = 0;
|
|
|
|
bool ret = false;
|
|
|
|
|
|
|
|
memset(&sourceList, 0, sizeof(sourceList));
|
|
|
|
sourceList.type = VIR_STORAGE_POOL_LOGICAL;
|
|
|
|
|
|
|
|
if (virStorageBackendLogicalGetPoolSources(&sourceList) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
/* Search the pvs output for this pool's source.name */
|
|
|
|
for (i = 0; i < sourceList.nsources; i++) {
|
|
|
|
thisSource = &sourceList.sources[i];
|
2017-07-26 18:16:52 +00:00
|
|
|
if (STREQ(thisSource->name, def->source.name))
|
2015-12-07 20:06:17 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i == sourceList.nsources) {
|
|
|
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
|
|
_("cannot find logical volume group name '%s'"),
|
2017-07-26 18:16:52 +00:00
|
|
|
def->source.name);
|
2015-12-07 20:06:17 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2015-12-16 16:54:04 +00:00
|
|
|
/* If the pool has defined source device(s), then let's make sure
|
|
|
|
* they match as well; otherwise, matching can only occur on the
|
|
|
|
* pool's name.
|
|
|
|
*/
|
2017-07-26 18:16:52 +00:00
|
|
|
if (!def->source.ndevice) {
|
2015-12-16 16:54:04 +00:00
|
|
|
ret = true;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2015-12-07 20:06:17 +00:00
|
|
|
/* Let's make sure the pool's device(s) match what the pvs output has
|
|
|
|
* for volume group devices.
|
|
|
|
*/
|
2017-07-26 18:16:52 +00:00
|
|
|
for (i = 0; i < def->source.ndevice; i++) {
|
2015-12-07 20:06:17 +00:00
|
|
|
for (j = 0; j < thisSource->ndevice; j++) {
|
2017-07-26 18:16:52 +00:00
|
|
|
if (STREQ(def->source.devices[i].path,
|
2015-12-07 20:06:17 +00:00
|
|
|
thisSource->devices[j].path))
|
|
|
|
matchcount++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If we didn't find any matches, then this pool has listed (a) source
|
|
|
|
* device path(s) that don't/doesn't match what was created for the pool
|
|
|
|
*/
|
|
|
|
if (matchcount == 0) {
|
|
|
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
|
|
_("cannot find any matching source devices for logical "
|
2017-07-26 18:16:52 +00:00
|
|
|
"volume group '%s'"), def->source.name);
|
2015-12-07 20:06:17 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Either there's more devices in the pool source device list or there's
|
|
|
|
* more devices in the pvs output. Could easily happen if someone decides
|
|
|
|
* to 'add' to or 'remove' from the volume group outside of libvirt's
|
|
|
|
* knowledge. Rather than fail on that, provide a warning and move on.
|
|
|
|
*/
|
2017-07-26 18:16:52 +00:00
|
|
|
if (matchcount != def->source.ndevice)
|
2015-12-07 20:06:17 +00:00
|
|
|
VIR_WARN("pool device list count doesn't match pvs device list count");
|
|
|
|
|
|
|
|
ret = true;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < sourceList.nsources; i++)
|
|
|
|
virStoragePoolSourceClear(&sourceList.sources[i]);
|
|
|
|
VIR_FREE(sourceList.sources);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-11-11 20:09:20 +00:00
|
|
|
static int
|
2015-03-09 14:34:35 +00:00
|
|
|
virStorageBackendLogicalCheckPool(virStoragePoolObjPtr pool,
|
2010-11-11 20:09:20 +00:00
|
|
|
bool *isActive)
|
|
|
|
{
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
|
|
|
|
2015-12-07 20:06:17 +00:00
|
|
|
/* If we can find the target.path as well as ensure that the
|
|
|
|
* pool's def source
|
|
|
|
*/
|
2017-07-26 18:16:52 +00:00
|
|
|
*isActive = virFileExists(def->target.path) &&
|
2015-12-07 20:06:17 +00:00
|
|
|
virStorageBackendLogicalMatchPoolSource(pool);
|
2010-11-11 20:09:20 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-02-20 15:45:33 +00:00
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalStartPool(virStoragePoolObjPtr pool)
|
2008-02-20 15:45:33 +00:00
|
|
|
{
|
2015-12-07 20:06:17 +00:00
|
|
|
/* Let's make sure that the pool's name matches the pvs output and
|
|
|
|
* that the pool's source devices match the pvs output.
|
|
|
|
*/
|
|
|
|
if (!virStorageBackendLogicalMatchPoolSource(pool) ||
|
|
|
|
virStorageBackendLogicalSetActive(pool, 1) < 0)
|
2008-02-20 15:45:33 +00:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalBuildPool(virStoragePoolObjPtr pool,
|
2011-07-06 22:51:23 +00:00
|
|
|
unsigned int flags)
|
2008-02-20 15:45:33 +00:00
|
|
|
{
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
2016-12-15 13:39:13 +00:00
|
|
|
virCommandPtr vgcmd = NULL;
|
2012-07-11 14:56:55 +00:00
|
|
|
int ret = -1;
|
2016-12-15 13:39:13 +00:00
|
|
|
size_t i = 0;
|
|
|
|
|
|
|
|
virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE |
|
|
|
|
VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret);
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2016-12-15 13:39:13 +00:00
|
|
|
VIR_EXCLUSIVE_FLAGS_GOTO(VIR_STORAGE_POOL_BUILD_OVERWRITE,
|
|
|
|
VIR_STORAGE_POOL_BUILD_NO_OVERWRITE,
|
|
|
|
cleanup);
|
2011-07-06 22:51:23 +00:00
|
|
|
|
2017-07-26 18:16:52 +00:00
|
|
|
vgcmd = virCommandNewArgList(VGCREATE, def->source.name, NULL);
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2017-07-26 18:16:52 +00:00
|
|
|
for (i = 0; i < def->source.ndevice; i++) {
|
|
|
|
const char *path = def->source.devices[i].path;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2016-12-15 13:39:13 +00:00
|
|
|
/* The blkid FS and Part probing code doesn't know "lvm2" (this
|
|
|
|
* pool's only format type), but it does know "LVM2_member", so
|
|
|
|
* we'll pass that here */
|
|
|
|
if (!(flags & VIR_STORAGE_POOL_BUILD_OVERWRITE) &&
|
|
|
|
!virStorageBackendDeviceIsEmpty(path, "LVM2_member", true))
|
|
|
|
goto cleanup;
|
|
|
|
|
2016-12-15 12:15:48 +00:00
|
|
|
if (virStorageBackendLogicalInitializeDevice(path) < 0)
|
2008-02-20 15:45:33 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
2016-12-15 12:15:48 +00:00
|
|
|
virCommandAddArg(vgcmd, path);
|
2012-07-11 14:56:55 +00:00
|
|
|
}
|
2008-02-20 15:45:33 +00:00
|
|
|
|
|
|
|
/* Now create the volume group itself */
|
2012-07-11 14:56:55 +00:00
|
|
|
if (virCommandRun(vgcmd, NULL) < 0)
|
2008-02-20 15:45:33 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
2012-07-11 14:56:55 +00:00
|
|
|
ret = 0;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2014-03-25 06:52:40 +00:00
|
|
|
cleanup:
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandFree(vgcmd);
|
2016-12-15 11:39:42 +00:00
|
|
|
|
|
|
|
/* On any failure, run through the devices that had pvcreate run in
|
|
|
|
* in order to run pvremove on the device; otherwise, subsequent build
|
|
|
|
* will fail if a pvcreate had been run already. */
|
|
|
|
if (ret < 0) {
|
|
|
|
size_t j;
|
|
|
|
for (j = 0; j < i; j++)
|
2017-07-26 18:16:52 +00:00
|
|
|
virStorageBackendLogicalRemoveDevice(def->source.devices[j].path);
|
2016-12-15 11:39:42 +00:00
|
|
|
}
|
2012-07-11 14:56:55 +00:00
|
|
|
return ret;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalRefreshPool(virStoragePoolObjPtr pool)
|
2008-02-20 15:45:33 +00:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* # vgs --separator : --noheadings --units b --unbuffered --nosuffix --options "vg_size,vg_free" VGNAME
|
|
|
|
* 10603200512:4328521728
|
|
|
|
*
|
|
|
|
* Pull out size & free
|
2008-07-30 08:52:44 +00:00
|
|
|
*
|
|
|
|
* NB vgs from some distros (e.g. SLES10 SP2) outputs trailing ":" on each line
|
2008-02-20 15:45:33 +00:00
|
|
|
*/
|
|
|
|
const char *regexes[] = {
|
2008-07-30 08:52:44 +00:00
|
|
|
"^\\s*(\\S+):([0-9]+):?\\s*$"
|
2008-02-20 15:45:33 +00:00
|
|
|
};
|
|
|
|
int vars[] = {
|
|
|
|
2
|
|
|
|
};
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandPtr cmd = NULL;
|
|
|
|
int ret = -1;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2017-02-20 12:00:51 +00:00
|
|
|
virWaitForDevices();
|
2008-11-28 07:50:20 +00:00
|
|
|
|
2008-02-20 15:45:33 +00:00
|
|
|
/* Get list of all logical volumes */
|
2012-07-11 14:56:55 +00:00
|
|
|
if (virStorageBackendLogicalFindLVs(pool, NULL) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
cmd = virCommandNewArgList(VGS,
|
|
|
|
"--separator", ":",
|
|
|
|
"--noheadings",
|
|
|
|
"--units", "b",
|
|
|
|
"--unbuffered",
|
|
|
|
"--nosuffix",
|
|
|
|
"--options", "vg_size,vg_free",
|
2017-07-26 18:16:52 +00:00
|
|
|
def->source.name,
|
2012-07-11 14:56:55 +00:00
|
|
|
NULL);
|
2008-02-20 15:45:33 +00:00
|
|
|
|
|
|
|
/* Now get basic volgrp metadata */
|
2014-03-18 14:35:01 +00:00
|
|
|
if (virCommandRunRegex(cmd,
|
|
|
|
1,
|
|
|
|
regexes,
|
|
|
|
vars,
|
|
|
|
virStorageBackendLogicalRefreshPoolFunc,
|
|
|
|
pool,
|
2016-05-13 16:36:39 +00:00
|
|
|
"vgs",
|
|
|
|
NULL) < 0)
|
2012-07-11 14:56:55 +00:00
|
|
|
goto cleanup;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2012-07-11 14:56:55 +00:00
|
|
|
ret = 0;
|
|
|
|
|
2014-03-25 06:52:40 +00:00
|
|
|
cleanup:
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandFree(cmd);
|
|
|
|
if (ret < 0)
|
|
|
|
virStoragePoolObjClearVols(pool);
|
|
|
|
return ret;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
2008-09-22 20:22:35 +00:00
|
|
|
/*
|
|
|
|
* This is actually relatively safe; if you happen to try to "stop" the
|
|
|
|
* pool that your / is on, for instance, you will get failure like:
|
|
|
|
* "Can't deactivate volume group "VolGroup00" with 3 open logical volume(s)"
|
2008-02-20 15:45:33 +00:00
|
|
|
*/
|
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalStopPool(virStoragePoolObjPtr pool)
|
2008-02-20 15:45:33 +00:00
|
|
|
{
|
2010-02-04 22:41:52 +00:00
|
|
|
if (virStorageBackendLogicalSetActive(pool, 0) < 0)
|
2008-02-20 15:45:33 +00:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalDeletePool(virStoragePoolObjPtr pool,
|
2011-07-06 22:51:23 +00:00
|
|
|
unsigned int flags)
|
2008-02-20 15:45:33 +00:00
|
|
|
{
|
2017-07-26 18:16:52 +00:00
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandPtr cmd = NULL;
|
|
|
|
size_t i;
|
|
|
|
int ret = -1;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2011-07-06 22:51:23 +00:00
|
|
|
virCheckFlags(0, -1);
|
|
|
|
|
2008-09-22 20:22:35 +00:00
|
|
|
/* first remove the volume group */
|
2012-07-11 14:56:55 +00:00
|
|
|
cmd = virCommandNewArgList(VGREMOVE,
|
2017-07-26 18:16:52 +00:00
|
|
|
"-f", def->source.name,
|
2012-07-11 14:56:55 +00:00
|
|
|
NULL);
|
|
|
|
if (virCommandRun(cmd, NULL) < 0)
|
|
|
|
goto cleanup;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2008-09-22 20:22:35 +00:00
|
|
|
/* now remove the pv devices and clear them out */
|
2017-07-26 18:16:52 +00:00
|
|
|
for (i = 0; i < def->source.ndevice; i++)
|
|
|
|
virStorageBackendLogicalRemoveDevice(def->source.devices[i].path);
|
2016-12-15 11:39:42 +00:00
|
|
|
|
2012-07-11 14:56:55 +00:00
|
|
|
ret = 0;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
2014-03-25 06:52:40 +00:00
|
|
|
cleanup:
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandFree(cmd);
|
|
|
|
return ret;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalDeleteVol(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
2008-02-20 15:45:33 +00:00
|
|
|
virStorageVolDefPtr vol,
|
2013-12-11 14:36:56 +00:00
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
virCommandPtr lvchange_cmd = NULL;
|
|
|
|
virCommandPtr lvremove_cmd = NULL;
|
|
|
|
|
|
|
|
virCheckFlags(0, -1);
|
|
|
|
|
2017-02-20 12:00:51 +00:00
|
|
|
virWaitForDevices();
|
2013-12-11 14:36:56 +00:00
|
|
|
|
|
|
|
lvchange_cmd = virCommandNewArgList(LVCHANGE, "-aln", vol->target.path, NULL);
|
|
|
|
lvremove_cmd = virCommandNewArgList(LVREMOVE, "-f", vol->target.path, NULL);
|
|
|
|
|
|
|
|
if (virCommandRun(lvremove_cmd, NULL) < 0) {
|
|
|
|
if (virCommandRun(lvchange_cmd, NULL) < 0) {
|
|
|
|
goto cleanup;
|
|
|
|
} else {
|
|
|
|
if (virCommandRun(lvremove_cmd, NULL) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
2014-03-25 06:52:40 +00:00
|
|
|
cleanup:
|
2013-12-11 14:36:56 +00:00
|
|
|
virCommandFree(lvchange_cmd);
|
|
|
|
virCommandFree(lvremove_cmd);
|
|
|
|
return ret;
|
|
|
|
}
|
2008-02-20 15:45:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
static int
|
2017-10-06 16:45:01 +00:00
|
|
|
virStorageBackendLogicalLVCreate(virStorageVolDefPtr vol,
|
|
|
|
virStoragePoolDefPtr def)
|
2008-02-20 15:45:33 +00:00
|
|
|
{
|
2017-10-06 16:45:01 +00:00
|
|
|
int ret;
|
2017-10-06 20:30:47 +00:00
|
|
|
unsigned long long capacity = vol->target.capacity;
|
2012-07-11 14:56:55 +00:00
|
|
|
virCommandPtr cmd = NULL;
|
2008-08-20 13:33:01 +00:00
|
|
|
|
2018-05-29 15:01:15 +00:00
|
|
|
if (vol->target.encryption &&
|
|
|
|
vol->target.encryption->format != VIR_STORAGE_ENCRYPTION_FORMAT_LUKS) {
|
|
|
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
|
|
_("storage pool only supports LUKS encrypted volumes"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2012-07-11 14:56:55 +00:00
|
|
|
cmd = virCommandNewArgList(LVCREATE,
|
|
|
|
"--name", vol->name,
|
|
|
|
NULL);
|
|
|
|
virCommandAddArg(cmd, "-L");
|
2017-10-06 20:30:47 +00:00
|
|
|
if (capacity != vol->target.allocation) {
|
2012-10-17 00:30:23 +00:00
|
|
|
virCommandAddArgFormat(cmd, "%lluK",
|
conf: track sizes directly in source struct
One of the features of qcow2 is that a wrapper file can have
more capacity than its backing file from the guest's perspective;
what's more, sparse files make tracking allocation of both
the active and backing file worthwhile. As such, it makes
more sense to show allocation numbers for each file in a chain,
and not just the top-level file. This sets up the fields for
the tracking, although it does not modify XML to display any
new information.
* src/util/virstoragefile.h (_virStorageSource): Add fields.
* src/conf/storage_conf.h (_virStorageVolDef): Drop redundant
fields.
* src/storage/storage_backend.c (virStorageBackendCreateBlockFrom)
(createRawFile, virStorageBackendCreateQemuImgCmd)
(virStorageBackendCreateQcowCreate): Update clients.
* src/storage/storage_driver.c (storageVolDelete)
(storageVolCreateXML, storageVolCreateXMLFrom, storageVolResize)
(storageVolWipeInternal, storageVolGetInfo): Likewise.
* src/storage/storage_backend_fs.c (virStorageBackendProbeTarget)
(virStorageBackendFileSystemRefresh)
(virStorageBackendFileSystemVolResize)
(virStorageBackendFileSystemVolRefresh): Likewise.
* src/storage/storage_backend_logical.c
(virStorageBackendLogicalMakeVol)
(virStorageBackendLogicalCreateVol): Likewise.
* src/storage/storage_backend_scsi.c
(virStorageBackendSCSINewLun): Likewise.
* src/storage/storage_backend_mpath.c
(virStorageBackendMpathNewVol): Likewise.
* src/storage/storage_backend_rbd.c
(volStorageBackendRBDRefreshVolInfo)
(virStorageBackendRBDCreateImage): Likewise.
* src/storage/storage_backend_disk.c
(virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol): Likewise.
* src/storage/storage_backend_sheepdog.c
(virStorageBackendSheepdogBuildVol)
(virStorageBackendSheepdogParseVdiList): Likewise.
* src/storage/storage_backend_gluster.c
(virStorageBackendGlusterRefreshVol): Likewise.
* src/conf/storage_conf.c (virStorageVolDefFormat)
(virStorageVolDefParseXML): Likewise.
* src/test/test_driver.c (testOpenVolumesForPool)
(testStorageVolCreateXML, testStorageVolCreateXMLFrom)
(testStorageVolDelete, testStorageVolGetInfo): Likewise.
* src/esx/esx_storage_backend_iscsi.c (esxStorageVolGetXMLDesc):
Likewise.
* src/esx/esx_storage_backend_vmfs.c (esxStorageVolGetXMLDesc)
(esxStorageVolCreateXML): Likewise.
* src/parallels/parallels_driver.c (parallelsAddHddByVolume):
Likewise.
* src/parallels/parallels_storage.c (parallelsDiskDescParseNode)
(parallelsStorageVolDefineXML, parallelsStorageVolCreateXMLFrom)
(parallelsStorageVolDefRemove, parallelsStorageVolGetInfo):
Likewise.
* src/vbox/vbox_tmpl.c (vboxStorageVolCreateXML)
(vboxStorageVolGetXMLDesc): Likewise.
* tests/storagebackendsheepdogtest.c (test_vdi_list_parser):
Likewise.
* src/phyp/phyp_driver.c (phypStorageVolCreateXML): Likewise.
2014-04-01 23:43:36 +00:00
|
|
|
VIR_DIV_UP(vol->target.allocation
|
|
|
|
? vol->target.allocation : 1, 1024));
|
2014-12-16 14:15:03 +00:00
|
|
|
virCommandAddArgList(cmd, "--type", "snapshot", NULL);
|
2012-07-11 16:28:39 +00:00
|
|
|
virCommandAddArg(cmd, "--virtualsize");
|
2014-07-17 16:41:43 +00:00
|
|
|
vol->target.sparse = true;
|
2012-07-11 16:28:39 +00:00
|
|
|
}
|
2017-10-06 20:30:47 +00:00
|
|
|
|
|
|
|
/* If we're going to encrypt using LUKS, then we could need up to
|
|
|
|
* an extra 2MB for the LUKS header - so account for that now */
|
2018-05-29 15:01:15 +00:00
|
|
|
if (vol->target.encryption)
|
2017-10-06 20:30:47 +00:00
|
|
|
capacity += 2 * 1024 * 1024;
|
|
|
|
virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(capacity, 1024));
|
|
|
|
|
2017-10-12 17:27:40 +00:00
|
|
|
if (virStorageSourceHasBacking(&vol->target))
|
2014-07-14 13:19:49 +00:00
|
|
|
virCommandAddArgList(cmd, "-s", vol->target.backingStore->path, NULL);
|
2012-07-11 14:56:55 +00:00
|
|
|
else
|
2017-07-26 18:16:52 +00:00
|
|
|
virCommandAddArg(cmd, def->source.name);
|
2012-07-11 14:56:55 +00:00
|
|
|
|
2017-10-06 16:45:01 +00:00
|
|
|
ret = virCommandRun(cmd, NULL);
|
2013-03-06 11:57:40 +00:00
|
|
|
virCommandFree(cmd);
|
2017-10-06 16:45:01 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalCreateVol(virStoragePoolObjPtr pool,
|
2017-10-06 16:45:01 +00:00
|
|
|
virStorageVolDefPtr vol)
|
|
|
|
{
|
|
|
|
int fd = -1;
|
|
|
|
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
|
|
|
|
virErrorPtr err;
|
|
|
|
struct stat sb;
|
|
|
|
|
|
|
|
vol->type = VIR_STORAGE_VOL_BLOCK;
|
|
|
|
|
|
|
|
VIR_FREE(vol->target.path);
|
|
|
|
if (virAsprintf(&vol->target.path, "%s/%s",
|
|
|
|
def->target.path, vol->name) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (virStorageBackendLogicalLVCreate(vol, def) < 0)
|
|
|
|
return -1;
|
2013-03-06 11:57:40 +00:00
|
|
|
|
2017-10-06 20:30:47 +00:00
|
|
|
if (vol->target.encryption &&
|
2018-01-26 13:15:33 +00:00
|
|
|
virStorageBackendCreateVolUsingQemuImg(pool, vol, NULL, 0) < 0)
|
2017-10-06 20:30:47 +00:00
|
|
|
goto error;
|
|
|
|
|
2014-03-30 23:01:23 +00:00
|
|
|
if ((fd = virStorageBackendVolOpen(vol->target.path, &sb,
|
|
|
|
VIR_STORAGE_VOL_OPEN_DEFAULT)) < 0)
|
2013-03-06 11:57:40 +00:00
|
|
|
goto error;
|
2008-02-20 15:45:33 +00:00
|
|
|
|
|
|
|
/* We can only chown/grp if root */
|
2013-10-09 11:13:45 +00:00
|
|
|
if (geteuid() == 0) {
|
2014-03-30 02:27:44 +00:00
|
|
|
if (fchown(fd, vol->target.perms->uid, vol->target.perms->gid) < 0) {
|
2010-02-04 20:02:58 +00:00
|
|
|
virReportSystemError(errno,
|
2009-01-20 17:13:33 +00:00
|
|
|
_("cannot set file owner '%s'"),
|
|
|
|
vol->target.path);
|
2013-03-06 11:57:40 +00:00
|
|
|
goto error;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
}
|
2018-04-25 12:42:34 +00:00
|
|
|
if (fchmod(fd, (vol->target.perms->mode == (mode_t)-1 ?
|
2015-04-27 20:48:05 +00:00
|
|
|
VIR_STORAGE_DEFAULT_VOL_PERM_MODE :
|
|
|
|
vol->target.perms->mode)) < 0) {
|
2010-02-04 20:02:58 +00:00
|
|
|
virReportSystemError(errno,
|
2009-01-20 17:13:33 +00:00
|
|
|
_("cannot set file mode '%s'"),
|
|
|
|
vol->target.path);
|
2013-03-06 11:57:40 +00:00
|
|
|
goto error;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
2010-10-28 15:43:16 +00:00
|
|
|
if (VIR_CLOSE(fd) < 0) {
|
2010-02-04 20:02:58 +00:00
|
|
|
virReportSystemError(errno,
|
2009-01-20 17:13:33 +00:00
|
|
|
_("cannot close file '%s'"),
|
|
|
|
vol->target.path);
|
2013-03-06 11:57:40 +00:00
|
|
|
goto error;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Fill in data about this new vol */
|
2010-02-10 11:42:56 +00:00
|
|
|
if (virStorageBackendLogicalFindLVs(pool, vol) < 0) {
|
2010-02-04 20:02:58 +00:00
|
|
|
virReportSystemError(errno,
|
2009-01-20 17:13:33 +00:00
|
|
|
_("cannot find newly created volume '%s'"),
|
|
|
|
vol->target.path);
|
2013-03-06 11:57:40 +00:00
|
|
|
goto error;
|
2008-02-20 15:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
2014-02-12 13:23:30 +00:00
|
|
|
error:
|
2012-10-17 00:25:41 +00:00
|
|
|
err = virSaveLastError();
|
2010-10-28 15:43:16 +00:00
|
|
|
VIR_FORCE_CLOSE(fd);
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalDeleteVol(pool, vol, 0);
|
2012-10-17 00:25:41 +00:00
|
|
|
virSetError(err);
|
2013-03-06 11:57:40 +00:00
|
|
|
virFreeError(err);
|
2008-02-20 15:45:33 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2009-07-09 23:17:31 +00:00
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalBuildVolFrom(virStoragePoolObjPtr pool,
|
2009-07-09 23:17:31 +00:00
|
|
|
virStorageVolDefPtr vol,
|
|
|
|
virStorageVolDefPtr inputvol,
|
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
virStorageBackendBuildVolFrom build_func;
|
|
|
|
|
2010-02-10 11:42:56 +00:00
|
|
|
build_func = virStorageBackendGetBuildVolFromFunction(vol, inputvol);
|
2009-07-09 23:17:31 +00:00
|
|
|
if (!build_func)
|
|
|
|
return -1;
|
|
|
|
|
2018-01-26 13:31:58 +00:00
|
|
|
return build_func(pool, vol, inputvol, flags);
|
2009-07-09 23:17:31 +00:00
|
|
|
}
|
|
|
|
|
2014-07-17 16:41:43 +00:00
|
|
|
static int
|
2018-01-26 13:31:58 +00:00
|
|
|
virStorageBackendLogicalVolWipe(virStoragePoolObjPtr pool,
|
2014-07-17 16:41:43 +00:00
|
|
|
virStorageVolDefPtr vol,
|
|
|
|
unsigned int algorithm,
|
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
if (!vol->target.sparse)
|
2018-01-26 13:31:58 +00:00
|
|
|
return virStorageBackendVolWipeLocal(pool, vol, algorithm, flags);
|
2014-07-17 16:41:43 +00:00
|
|
|
|
|
|
|
/* The wiping algorithms will write something to the logical volume.
|
|
|
|
* Writing to a sparse logical volume causes it to be filled resulting
|
|
|
|
* in the volume becoming INACTIVE because there is some amount of
|
|
|
|
* metadata contained within the sparse lv. Choosing to only write
|
|
|
|
* a wipe pattern to the already written portion lv based on what
|
|
|
|
* 'lvs' shows in the "Data%" column/field for the sparse lv was
|
|
|
|
* considered. However, there is no guarantee that sparse lv could
|
|
|
|
* grow or shrink outside of libvirt's knowledge and thus still render
|
|
|
|
* the volume INACTIVE. Until there is some sort of wipe function
|
|
|
|
* implemented by lvm for one of these sparse lv, we'll just return
|
|
|
|
* unsupported.
|
|
|
|
*/
|
|
|
|
virReportError(VIR_ERR_NO_SUPPORT,
|
2015-06-09 22:21:57 +00:00
|
|
|
_("logical volume '%s' is sparse, volume wipe "
|
|
|
|
"not supported"),
|
2014-07-17 16:41:43 +00:00
|
|
|
vol->target.path);
|
|
|
|
return -1;
|
|
|
|
}
|
2008-02-20 15:45:33 +00:00
|
|
|
|
|
|
|
virStorageBackend virStorageBackendLogical = {
|
|
|
|
.type = VIR_STORAGE_POOL_LOGICAL,
|
|
|
|
|
2008-08-27 20:05:58 +00:00
|
|
|
.findPoolSources = virStorageBackendLogicalFindPoolSources,
|
2010-11-11 20:09:20 +00:00
|
|
|
.checkPool = virStorageBackendLogicalCheckPool,
|
2008-02-20 15:45:33 +00:00
|
|
|
.startPool = virStorageBackendLogicalStartPool,
|
|
|
|
.buildPool = virStorageBackendLogicalBuildPool,
|
|
|
|
.refreshPool = virStorageBackendLogicalRefreshPool,
|
|
|
|
.stopPool = virStorageBackendLogicalStopPool,
|
|
|
|
.deletePool = virStorageBackendLogicalDeletePool,
|
2014-02-12 13:23:30 +00:00
|
|
|
.buildVol = NULL,
|
2009-07-09 23:17:31 +00:00
|
|
|
.buildVolFrom = virStorageBackendLogicalBuildVolFrom,
|
2008-02-20 15:45:33 +00:00
|
|
|
.createVol = virStorageBackendLogicalCreateVol,
|
|
|
|
.deleteVol = virStorageBackendLogicalDeleteVol,
|
2014-07-07 14:50:11 +00:00
|
|
|
.uploadVol = virStorageBackendVolUploadLocal,
|
|
|
|
.downloadVol = virStorageBackendVolDownloadLocal,
|
2014-07-17 16:41:43 +00:00
|
|
|
.wipeVol = virStorageBackendLogicalVolWipe,
|
2008-02-20 15:45:33 +00:00
|
|
|
};
|
2017-01-13 15:50:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
virStorageBackendLogicalRegister(void)
|
|
|
|
{
|
|
|
|
return virStorageBackendRegister(&virStorageBackendLogical);
|
|
|
|
}
|