mirror of
git://sourceware.org/git/lvm2.git
synced 2025-12-27 00:23:49 +03:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e748a5d5f4 | ||
|
|
99c5a3ae46 | ||
|
|
51da710f5a | ||
|
|
569d69b3d2 | ||
|
|
059a6b1d90 |
@@ -337,7 +337,7 @@ static int _status_run(const char *name, const char *uuid,
|
||||
int r = 0;
|
||||
struct dm_task *dmt;
|
||||
void *next = NULL;
|
||||
unsigned long long start, length;
|
||||
uint64_t start, length;
|
||||
char *type = NULL;
|
||||
char *params = NULL;
|
||||
|
||||
|
||||
@@ -62,6 +62,12 @@ int dev_get_sectsize(struct device *dev, uint32_t * size)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static void _flush(int fd)
|
||||
{
|
||||
ioctl(fd, BLKFLSBUF, 0);
|
||||
}
|
||||
|
||||
int dev_open(struct device *dev, int flags)
|
||||
{
|
||||
struct stat buf;
|
||||
@@ -92,17 +98,12 @@ int dev_open(struct device *dev, int flags)
|
||||
dev_close(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
_flush(dev->fd);
|
||||
dev->flags = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void _flush(int fd)
|
||||
{
|
||||
ioctl(fd, BLKFLSBUF, 0);
|
||||
}
|
||||
|
||||
int dev_close(struct device *dev)
|
||||
{
|
||||
if (dev->fd < 0) {
|
||||
|
||||
@@ -31,23 +31,12 @@ install_fs: fs/libdevmapper.so
|
||||
|
||||
install_ioctl: ioctl/libdevmapper.so
|
||||
$(INSTALL) -D -o $(OWNER) -g $(GROUP) -m 555 $(STRIP) $< \
|
||||
$(libdir)/libdevmapper.so.$(LIB_VERSION).$(IOCTL_VERSION)
|
||||
$(LN_S) -f libdevmapper.so.$(LIB_VERSION).$(IOCTL_VERSION) \
|
||||
$(libdir)/libdevmapper.so.$(LIB_VERSION)
|
||||
|
||||
ioctl/libdevmapper.o: ioctl_version
|
||||
|
||||
ioctl_version: ioctl/libdevmapper.c
|
||||
@echo Checking library version compatible with kernel version in dm-ioctl.h
|
||||
test "$(IOCTL_VERSION)" = \
|
||||
"$(shell $(CC) -E -dM $(INCLUDES) $(CFLAGS) \
|
||||
ioctl/libdevmapper.c | \
|
||||
awk -F '[ \t\"]+' '/DM_IOCTL_VERSION/ {print $$3}' )"
|
||||
$(libdir)/libdevmapper.so.$(LIB_VERSION)
|
||||
|
||||
distclean_lib:
|
||||
$(RM) libdm-common.h
|
||||
|
||||
distclean: distclean_lib
|
||||
|
||||
.PHONY: ioctl_version distclean_lib distclean
|
||||
.PHONY: distclean_lib distclean
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include <errno.h>
|
||||
#include <linux/kdev_t.h>
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/limits.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/dm-ioctl.h>
|
||||
|
||||
@@ -25,20 +25,32 @@
|
||||
|
||||
#define ALIGNMENT sizeof(int)
|
||||
|
||||
static char *dm_cmd_list[] = {
|
||||
"create",
|
||||
"reload",
|
||||
"remove",
|
||||
"remove_all",
|
||||
"suspend",
|
||||
"resume",
|
||||
"info",
|
||||
"deps",
|
||||
"rename",
|
||||
"version",
|
||||
"status",
|
||||
"table",
|
||||
"waitevent"
|
||||
/*
|
||||
* Ensure build compatibility. The hard-coded version here (major, minor)
|
||||
* is the highest present in the _cmd_data array below.
|
||||
*/
|
||||
#if DM_VERSION_MAJOR != 1 || DM_VERSION_MINOR < 0
|
||||
#error The version of dm-ioctl.h included is incompatible.
|
||||
#endif
|
||||
|
||||
static struct {
|
||||
char *name;
|
||||
int cmd;
|
||||
int version[3];
|
||||
} _cmd_data[] = {
|
||||
{ "create", DM_DEV_CREATE, {1, 0, 0} },
|
||||
{ "reload", DM_DEV_RELOAD, {1, 0, 0} },
|
||||
{ "remove", DM_DEV_REMOVE, {1, 0, 0} },
|
||||
{ "remove_all", DM_REMOVE_ALL, {1, 0, 0} },
|
||||
{ "suspend", DM_DEV_SUSPEND, {1, 0, 0} },
|
||||
{ "resume", DM_DEV_SUSPEND, {1, 0, 0} },
|
||||
{ "info", DM_DEV_STATUS, {1, 0, 0} },
|
||||
{ "deps", DM_DEV_DEPS, {1, 0, 0} },
|
||||
{ "rename", DM_DEV_RENAME, {1, 0, 0} },
|
||||
{ "version", DM_VERSION, {1, 0, 0} },
|
||||
{ "status", DM_TARGET_STATUS, {1, 0, 0} },
|
||||
{ "table", DM_TARGET_STATUS, {1, 0, 0} },
|
||||
{ "waitevent", DM_TARGET_WAIT, {1, 0, 0} },
|
||||
};
|
||||
|
||||
static void *_align(void *ptr, unsigned int a)
|
||||
@@ -76,11 +88,13 @@ void dm_task_destroy(struct dm_task *dmt)
|
||||
|
||||
int dm_task_get_driver_version(struct dm_task *dmt, char *version, size_t size)
|
||||
{
|
||||
unsigned int *v;
|
||||
|
||||
if (!dmt->dmi)
|
||||
return 0;
|
||||
|
||||
strncpy(version, dmt->dmi->version, size);
|
||||
|
||||
v = dmt->dmi->version;
|
||||
snprintf(version, size, "%u.%u.%u", v[0], v[1], v[2]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -281,7 +295,9 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt)
|
||||
|
||||
memset(dmi, 0, len);
|
||||
|
||||
strncpy(dmi->version, DM_IOCTL_VERSION, sizeof(dmi->version));
|
||||
dmi->version[0] = _cmd_data[dmt->type].version[0];
|
||||
dmi->version[1] = _cmd_data[dmt->type].version[1];
|
||||
dmi->version[2] = _cmd_data[dmt->type].version[2];
|
||||
dmi->data_size = len;
|
||||
dmi->data_start = sizeof(struct dm_ioctl);
|
||||
|
||||
@@ -339,71 +355,23 @@ int dm_task_run(struct dm_task *dmt)
|
||||
goto bad;
|
||||
}
|
||||
|
||||
switch (dmt->type) {
|
||||
case DM_DEVICE_CREATE:
|
||||
command = DM_CREATE;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_RELOAD:
|
||||
command = DM_RELOAD;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_REMOVE:
|
||||
command = DM_REMOVE;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_REMOVE_ALL:
|
||||
command = DM_REMOVE_ALL;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_SUSPEND:
|
||||
command = DM_SUSPEND;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_RESUME:
|
||||
command = DM_SUSPEND;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_INFO:
|
||||
command = DM_INFO;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_DEPS:
|
||||
command = DM_DEPS;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_RENAME:
|
||||
command = DM_RENAME;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_VERSION:
|
||||
command = DM_VERSION;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_STATUS:
|
||||
command = DM_GET_STATUS;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_TABLE:
|
||||
dmi->flags |= DM_STATUS_TABLE_FLAG;
|
||||
command = DM_GET_STATUS;
|
||||
break;
|
||||
|
||||
case DM_DEVICE_WAITEVENT:
|
||||
command = DM_WAIT_EVENT;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (dmt->type >= (sizeof(_cmd_data) / sizeof(*_cmd_data))) {
|
||||
log_error("Internal error: unknown device-mapper task %d",
|
||||
dmt->type);
|
||||
goto bad;
|
||||
}
|
||||
|
||||
log_debug("dm %s %s %s %s", dm_cmd_list[dmt->type], dmi->name,
|
||||
command = _cmd_data[dmt->type].cmd;
|
||||
|
||||
if (dmt->type == DM_DEVICE_TABLE)
|
||||
dmi->flags |= DM_STATUS_TABLE_FLAG;
|
||||
|
||||
|
||||
log_debug("dm %s %s %s %s", _cmd_data[dmt->type].name, dmi->name,
|
||||
dmi->uuid, dmt->newname ? dmt->newname : "");
|
||||
if (ioctl(fd, command, dmi) < 0) {
|
||||
log_error("device-mapper ioctl cmd %d failed: %s", dmt->type,
|
||||
strerror(errno));
|
||||
log_error("device-mapper ioctl cmd %d failed: %s",
|
||||
_IOC_NR(command), strerror(errno));
|
||||
goto bad;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,11 +4,14 @@ dmsetup \- low level logical volume management
|
||||
.SH SYNOPSIS
|
||||
.ad l
|
||||
.B dmsetup create
|
||||
.I device_name table_file
|
||||
.I device_name table_file [uuid]
|
||||
.br
|
||||
.B dmsetup remove
|
||||
.I device_name
|
||||
.br
|
||||
.B dmsetup rename
|
||||
.I device_name new_name
|
||||
.br
|
||||
.B dmsetup suspend
|
||||
.I device_name
|
||||
.br
|
||||
@@ -20,6 +23,23 @@ dmsetup \- low level logical volume management
|
||||
.br
|
||||
.B dmsetup info
|
||||
.I device_name
|
||||
.br
|
||||
.B dmsetup deps
|
||||
.I device_name
|
||||
.br
|
||||
.B dmsetup status
|
||||
.I device_name
|
||||
.br
|
||||
.B dmsetup table
|
||||
.I device_name
|
||||
.br
|
||||
.B dmsetup wait
|
||||
.I device_name
|
||||
.br
|
||||
.B dmsetup remove_all
|
||||
.I device_name
|
||||
.br
|
||||
.B dmsetup version
|
||||
.ad b
|
||||
.SH DESCRIPTION
|
||||
dmsetup manages logical devices that use the device-mapper driver.
|
||||
@@ -27,19 +47,25 @@ Devices are created by loading a table that specifies a target for
|
||||
each sector in the logical device.
|
||||
|
||||
The first argument to dmsetup is a command.
|
||||
The second argument is the logical device name.
|
||||
The second argument is the logical device name or uuid.
|
||||
.SH COMMANDS
|
||||
.IP \fBcreate
|
||||
.I device_name table_file
|
||||
.I device_name table_file [uuid]
|
||||
.br
|
||||
Attempts to create a device using the table file given. If
|
||||
Attempts to create a device using the table file given.
|
||||
The optional uuid can be used in place of
|
||||
device_name in subsequent dmsetup commands. If
|
||||
successful a device will appear as
|
||||
/dev/device-mapper/<device-name>. See below for information
|
||||
on the table file format.
|
||||
.IP \fBremove
|
||||
.I device_name
|
||||
.br
|
||||
Removes the device
|
||||
Removes a device
|
||||
.IP \fBrename
|
||||
.I device_name new_name
|
||||
.br
|
||||
Renames a device
|
||||
.IP \fBsuspend
|
||||
.I device_name
|
||||
.br
|
||||
@@ -67,14 +93,40 @@ Outputs some brief information about the device in the form:
|
||||
major,minor
|
||||
.br
|
||||
target_count
|
||||
.IP \fBdeps
|
||||
.I device_name
|
||||
.br
|
||||
Outputs a list of (major, minor) pairs for devices referenced by the
|
||||
specified device.
|
||||
.IP \fBstatus
|
||||
.I device_name
|
||||
.br
|
||||
Outputs status information for each of the device's targets.
|
||||
.IP \fBtable
|
||||
.I device_name
|
||||
.br
|
||||
Outputs the current table for the device in a format than can be fed
|
||||
back in using the create or reload commands.
|
||||
.IP \fBwait
|
||||
.I device_name
|
||||
.br
|
||||
Sleeps until an event is triggered against a device.
|
||||
.IP \fBremove_all
|
||||
.br
|
||||
Attempts to remove all device definitions i.e. reset the driver.
|
||||
Use with care!
|
||||
.IP \fBversion
|
||||
.I device_name
|
||||
.br
|
||||
Outputs version information.
|
||||
.SH TABLE FORMAT
|
||||
Each line of the table specifies a single target and is of the form:
|
||||
.br
|
||||
logical_start_sector num_sectors target_type target_args
|
||||
.br
|
||||
.br
|
||||
At the moment there are 3 simple target types available - though your
|
||||
system might have more in the form of modules.
|
||||
There are currently three simple target types available together
|
||||
with more complex optional ones that implement snapshots and mirrors.
|
||||
|
||||
.IP \fBlinear
|
||||
.I destination_device start_sector
|
||||
|
||||
Reference in New Issue
Block a user