\"     $NetBSD: dm.3,v 1.7 2022/09/10 12:14:17 rillig Exp $
\"
\" Copyright (c) 2004,2009 The NetBSD Foundation, Inc.
\" All rights reserved.
\"
\" This code is derived from software contributed to The NetBSD Foundation
\" by Adam Hamsik.
\"
\" Redistribution and use in source and binary forms, with or without
\" modification, are permitted provided that the following conditions
\" are met:
\" 1. Redistributions of source code must retain the above copyright
\"    notice, this list of conditions and the following disclaimer.
\" 2. Redistributions in binary form must reproduce the above copyright
\"    notice, this list of conditions and the following disclaimer in the
\"    documentation and/or other materials provided with the distribution.
\"
\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
\" POSSIBILITY OF SUCH DAMAGE.
Dd January 22, 2016
Dt DM 3
Os
Sh NAME
Nm dm
Nd device-mapper access manipulation library
Sh LIBRARY
Lb libdm
Sh SYNOPSIS
In dm.h
Ft void
Fn libdm_iter_destroy "libdm_iter_t libdm_iter"
Ft int
Fn libdm_task_run "libdm_task_t *libdm_task"
Ft libdm_task_t
Fn libdm_task_create "const char *command"
Ft void
Fn libdm_task_destroy "libdm_task_t libdm_task"
Ft int
Fn libdm_task_set_name "const char *name" "libdm_task_t libdm_task"
Ft char *
Fn libdm_task_get_name "libdm_task_t libdm_task"
Ft int
Fn libdm_task_set_uuid "const char *uuid" "libdm_task_t libdm_task"
Ft char *
Fn libdm_task_get_uuid "libdm_task_t libdm_task"
Ft char *
Fn libdm_task_get_command "libdm_task_t libdm_task"
Ft int32_t
Fn libdm_task_get_cmd_version "libdm_task_t libdm_task" "uint32_t *ver" "size_t size"
Ft int
Fn libdm_task_set_minor "uint32_t minor" "libdm_task_t libdm_task"
Ft uint32_t
Fn libdm_task_get_minor "libdm_task_t libdm_task"
Ft int
Fn libdm_task_set_flags "uint32_t flags" "libdm_task_t libdm_task"
Ft uint32_t
Fn libdm_task_get_flags "libdm_task_t libdm_task"
Ft uint32_t
Fn libdm_task_get_target_num "libdm_task_t libdm_task"
Ft int32_t
Fn libdm_task_get_open_num "libdm_task_t libdm_task"
Ft uint32_t
Fn libdm_task_get_event_num "libdm_task_t libdm_task"
Ft int
Fn libdm_task_set_cmd "libdm_cmd_t libdm_cmd" "libdm_task_t libdm_task"
Ft libdm_cmd_t
Fn libdm_task_get_cmd "libdm_task_t libdm_task"
Ft libdm_cmd_t
Fn libdm_cmd_create "void"
Ft void
Fn libdm_cmd_destroy "libdm_cmd_t libdm_cmd"
Ft libdm_iter_t
Fn libdm_cmd_iter_create "libdm_cmd_t libdm_cmd"
Ft int
Fn libdm_cmd_set_table "libdm_table_t libdm_table" "libdm_cmd_t libdm_cmd"
Ft libdm_table_t
Fn libdm_cmd_get_table "libdm_iter_t iter"
Ft libdm_target_t
Fn libdm_cmd_get_target "libdm_iter_t iter"
Ft libdm_dev_t
Fn libdm_cmd_get_dev "libdm_iter_t iter"
Ft uint64_t
Fn libdm_cmd_get_deps "libdm_iter_t libdm_iter"
Ft libdm_table_t
Fn libdm_table_create "void"
Ft void
Fn libdm_table_destroy "libdm_table_t libdm_table"
Ft int
Fn libdm_table_set_start "uint64_t start" "libdm_table_t libdm_table"
Ft uint64_t
Fn libdm_table_get_start "libdm_table_t libdm_table"
Ft int
Fn libdm_table_set_length "uint64_t length" "libdm_table_t libdm_table"
Ft uint64_t
Fn libdm_table_get_length "libdm_table_t libdm_table"
Ft int
Fn libdm_table_set_target "const char *name" "libdm_table_t libdm_table"
Ft char *
Fn libdm_table_get_target "libdm_table_t libdm_table"
Ft int
Fn libdm_table_set_params "const char *params" "libdm_table_t libdm_table"
Ft char *
Fn libdm_table_get_params "libdm_table_t libdm_table"
Ft int32_t
Fn libdm_table_get_status "libdm_table_t libdm_table"
Ft void
Fn libdm_target_destroy "libdm_target_t libdm_target"
Ft char *
Fn libdm_target_get_name "libdm_target_t libdm_target"
Ft int32_t
Fn libdm_target_get_version "libdm_target_t libdm_target" "uint32_t *ver" "size_t size"
Ft void
Fn libdm_dev_destroy "libdm_dev_t libdm_dev"
Ft char *
Fn libdm_dev_get_name "libdm_dev_t libdm_dev"
Ft uint32_t
Fn libdm_dev_get_minor "libdm_dev_t libdm_dev"
Ft int
Fn libdm_dev_set_newname "const char *newname" "libdm_cmd_t libdm_cmd"
Sh DESCRIPTION
Every object in libdm has its own create and destroy routine.
Bl -bullet -offset indent -compact
It
libdm_task_t
It
libdm_cmd_t
It
libdm_table_t
El
Pp
Except
Vt libdm_dev_t
which is received from kernel as list of physical devices on which
the logical device depends.
Vt libdm_target_t
which is received from kernel as list of available targets to use.
Vt libdm_iter_t
which is used as iteration counter for array entries in the task structure.
Pp
Every object attribute in libdm can be set and gotten by appropriate routines,
therefore there always are set and get routines.
Ss LIBDM TASK
The
Fn libdm_task_create
function creates a libdm task dictionary with command string set to
Fa command .
If
Fa command
is
Dv NULL ,
libdm_task_t is not created and the function returns
Dv NULL .
Pp
Fn libdm_task_destroy
free all memory allocated to
Fa libdm_task
by
Fn libdm_task_create .
Pp
Fn libdm_task_run
Sends created
Fa libdm_task
to kernel and receives new one as reply.
Pp
List of attributes available in
Vt libdm_task_t :
Bl -column -offset indent "DM_IOCTL_TARGET_COUNT" "Number of table entries" "XXX"
It Sy Attribute Ta Sy Description Ta Sy Mode
It Li DM_IOCTL_OPEN Ta Device open-count Ta Read-Only
It Li DM_IOCTL_MINOR Ta Device minor number Ta Read-Write
It Li DM_IOCTL_NAME Ta Device name Ta Read-Write
It Li DM_IOCTL_UUID Ta Device uuid Ta Read-Write
It Li DM_IOCTL_TARGET_COUNT Ta Number of table entries Ta Read-Only
\".It Li DM_IOCTL_EVENT Ta Not implemented Ta not imp
It Li DM_IOCTL_FLAGS Ta Device status flags Ta Read-Write
El
Pp
Fn libdm_task_set_name
and
Fn libdm_task_get_name
Set name of the device for commands which need to have a dm device
identifier.
The device-mapper later uses the device name to look up the device
from the list of all devices.
The get routine will fetch the device name from the task dictionary.
Pp
Fn libdm_task_set_uuid
and
Fn libdm_task_get_uuid
Set uuid of device for commands which need to have a dm device
identifier.
The device-mapper later uses the device uuid to look up the device
from the list of all devices.
The get routine will fetch the device uuid from the task dictionary.
Pp
Fn libdm_task_set_minor
and
Fn libdm_task_get_minor
Set minor device number of device for commands which need to have
a dm device identifier.
The device-mapper later uses the device minor number to look up
the device from the list of all devices.
The get routine will fetch the device minor number from the task
dictionary.
Pp
Fn libdm_task_set_flags
and
Fn libdm_task_get_flags
Set/fetch device status flags from the task dictionary.
Pp
Fn libdm_task_get_open_num
Fetch number of opened devices from the kernel and return them as count.
Pp
Fn libdm_task_get_target_num
Fetch number of opened devices from the kernel and return them as count.
Pp
Fn libdm_task_get_cmd_version
Get the version of the dm driver in the kernel as array
Fa uint32_t *ver
of size
Fa size .
Fn libdm_task_set_cmd
and
Fn libdm_task_get_cmd
Add and fetch cmd structure from
Vt libdm_task_t .
Vt libdm_cmd_t
is the container used to carry information specific for the particular
command.
cmd is usually set before libdm_task_run is used and is taken from
the task structure after the task run was called.
Ss LIBDM TASK CMD
The
Fn libdm_cmd_create
function will allocate a cmd structure which can later be put in
to the task.
Pp
Fn libdm_cmd_destroy
will deallocate a previously allocated cmd structure.
Pp
Fn libdm_cmd_set_table
Will load and fetch the device mapping table from the dm device.
The table is usually loaded to the device during initial device
creation or device resizing.
Pp
Because libdm_cmd is an array of structures, all _get routines need an
iterator to work.
For every entry we can have more than one.
Fn libdm_cmd_get_table
When the user creates a task with the "status" command, the kernel
sends cmd with a table in it.
Pp
Fn libdm_cmd_get_target
Get mapping target description from cmd.
Target contains target_name and target_version.
Pp
Fn libdm_cmd_get_dev
When user creates a task with the "info" command, the kernel sends
cmd with information about dm device to user.
Pp
Fn libdm_cmd_get_deps
When user creates a task with the "deps" command, the kernel sends
cmd with an array of physical devices attached to the dm device.
Pp
Usually the device has more than one table entry in the device command.
Therefore cmd iterators are needed for
Vt libdm_cmd_t ;
they can be created by the
Fn libdm_cmd_iter_create
function.
Ss LIBDM CMD TABLE
A device table describes the logical mapping between the dm device and
physical devices.
Every table has the logical block start, the table length (in disk
blocks), the target used by table, the physical device, and the
offset on it.
The physical device and the offset on it are parameters which are
target specific and are passed down to the target as param string.
Pp
Example device table entry
Dl 0 1024 linear /dev/wd1a 384
Bl -column -offset indent "DM_TABLE_LENGTH" "Number of table entries"
It Sy Attribute Ta Sy Description
It Li DM_TABLE_TYPE Ta Used device mapper target
It Li DM_TABLE_START Ta Device Logical start block
It Li DM_TABLE_STAT Ta Is 1 if this is current active table
It Li DM_TABLE_LENGTH Ta Logical length described by table
It Li DM_TABLE_PARAMS Ta Params passed down to target
El
Pp
Fn libdm_table_set_start
and
Fn libdm_table_get_start
Set start table from
Fa start
value to
Fa libdm_table
argument.
Get routine will get the table start from kernel as
Vt libdm_table .
Pp
Fn libdm_table_set_length
and
Fn libdm_table_get_length
Set table length from
Fa length
value to
Fa libdm_table
argument.
Get routine will get the table length from kernel as
Vt libdm_table .
Pp
Fn libdm_table_set_target
and
Fn libdm_table_get_target
Set target name from
Fa target
value to
Fa libdm_table
argument.
The target must be actually present in the kernel, otherwise
Fn libdm_task_run
will fail.
Get routine will get the table entry target from kernel as
Vt libdm_table .
Pp
Fn libdm_table_set_params
and
Fn libdm_table_get_params
Set table target parameter string from
Fa params
argument to
Fa libdm_table .
This is later in the kernel passed to the target init routine.
Get routine will get the table parameter string from kernel as
Vt libdm_table .
Pp
Fn libdm_table_get_status
Get table status which can be Active/Inactive.
This tells if this table is actually used or not.
Ss LIBDM_TARGET
Fn libdm_target_destroy
Destroy target received from
Vt libdm_cmd
with libdm_cmd_iter iterator.
Pp
Fn libdm_target_get_name
returns pointer to a string with available target name.
Pp
Fn libdm_target_get_version
Sets argument
Fa ver[3]
to a in-kernel loaded target version.
Ss LIBDM_DEV
Fn libdm_dev_destroy
Destroy device received from
Vt libdm_cmd
with libdm_cmd_iter iterator.
Pp
Fn libdm_dev_get_name
Return pointer to a string with underlying device name from
Vt libdm_dev_t
Pp
Fn libdm_dev_get_minor
Return underlying device minor number.
Ss MISC
Fn libdm_dev_set_newname
This routine will set new dm device name attribute to
Fa newname .
User must then called libdm_task_run on this task to
change the device name.
Sh RETURN VALUES
Upon success, all described functions return zero or
Pf non- Dv NULL
pointer.
Otherwise, an error number will be returned to indicate the error.
Sh SEE ALSO
Xr dm 4
Sh HISTORY
The
Nm
was written and contributed to
Nx
by
An Adam Hamsik
and first appeared in
Nx 6.0 .