1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-18 10:04:20 +03:00

dmsetup: Process -S to filter input device lists.

The following commands now pass the device list through a
--select|-S filter before processing:

suspend resume clear wipe_table remove deps status table
This commit is contained in:
Alasdair G Kergon 2017-09-14 23:41:17 +01:00
parent 8e8755319c
commit d73eddcdc0
3 changed files with 47 additions and 18 deletions

View File

@ -1,5 +1,6 @@
Version 1.02.144 - Version 1.02.144 -
====================================== ======================================
Take -S with dmsetup suspend/resume/clear/wipe_table/remove/deps/status/table.
Version 1.02.143 - 13th September 2017 Version 1.02.143 - 13th September 2017
====================================== ======================================

View File

@ -559,14 +559,14 @@ Set the table being loaded read-only.
.BR -S | --select .BR -S | --select
.IR selection .IR selection
.br .br
Display only rows that match \fIselection\fP criteria. All rows are displayed Process only items that match \fIselection\fP criteria. If the command is
with the additional "selected" column (\fB-o selected\fP) showing 1 if the row producing report output, adding the "selected" column (\fB-o
matches the \fIselection\fP and 0 otherwise. The selection criteria are defined selected\fP) displays all rows and shows 1 if the row matches the
by specifying column names and their valid values while making use of \fIselection\fP and 0 otherwise. The selection criteria are defined by
supported comparison operators. As a quick help and to see full list of specifying column names and their valid values while making use of supported
column names that can be used in selection and the set of supported comparison operators. As a quick help and to see full list of column names that
selection operators, check the output of \fBdmsetup\ info\ -c\ -S\ help\fP can be used in selection and the set of supported selection operators, check
command. the output of \fBdmsetup\ info\ -c\ -S\ help\fP command.
. .
.HP .HP
.BR --table .BR --table

View File

@ -275,6 +275,8 @@ static char _disp_units = 's';
const char *_program_id = DM_STATS_PROGRAM_ID; /* program_id used for reports. */ const char *_program_id = DM_STATS_PROGRAM_ID; /* program_id used for reports. */
static uint64_t _statstype = 0; /* stats objects to report */ static uint64_t _statstype = 0; /* stats objects to report */
static int _concise_output_produced = 0; /* Was any concise output already printed? */ static int _concise_output_produced = 0; /* Was any concise output already printed? */
struct command;
static const struct command *_selection_cmd = NULL; /* Command to run against each device select with -S */
/* string names for stats object types */ /* string names for stats object types */
const char *_stats_types[] = { const char *_stats_types[] = {
@ -308,7 +310,6 @@ static uint64_t _last_interval = 0; /* approx. measured interval in nsecs */
* Commands * Commands
*/ */
struct command;
#define CMD_ARGS const struct command *cmd, const char *subcommand, int argc, char **argv, struct dm_names *names, int multiple_devices #define CMD_ARGS const struct command *cmd, const char *subcommand, int argc, char **argv, struct dm_names *names, int multiple_devices
typedef int (*command_fn) (CMD_ARGS); typedef int (*command_fn) (CMD_ARGS);
@ -318,6 +319,7 @@ struct command {
int min_args; int min_args;
int max_args; int max_args;
int repeatable_cmd; /* Repeat to process device list? */ int repeatable_cmd; /* Repeat to process device list? */
/* 2 means --select is also supported */
int has_subcommands; /* Command implements sub-commands. */ int has_subcommands; /* Command implements sub-commands. */
command_fn fn; command_fn fn;
}; };
@ -861,6 +863,8 @@ static int _display_info_cols(struct dm_task *dmt, struct dm_info *info)
struct dmsetup_report_obj obj; struct dmsetup_report_obj obj;
uint64_t walk_flags = _statstype; uint64_t walk_flags = _statstype;
int r = 0; int r = 0;
int selected;
char *device_name;
if (!info->exists) { if (!info->exists) {
fprintf(stderr, "Device does not exist.\n"); fprintf(stderr, "Device does not exist.\n");
@ -891,8 +895,17 @@ static int _display_info_cols(struct dm_task *dmt, struct dm_info *info)
goto_out; goto_out;
if (!(_report_type & (DR_STATS | DR_STATS_META))) { if (!(_report_type & (DR_STATS | DR_STATS_META))) {
if (!dm_report_object(_report, &obj)) /*
* If _selection_cmd is set we are applying -S to some other command, so suppress
* output and run that other command if the device matches the criteria.
*/
if (!dm_report_object_is_selected(_report, &obj, _selection_cmd ? 0 : 1, &selected))
goto_out; goto_out;
if (_selection_cmd && selected) {
device_name = dm_task_get_name(dmt);
if (!_selection_cmd->fn(_selection_cmd, NULL, 1, &device_name, NULL, 1))
goto_out;
}
r = 1; r = 1;
goto out; goto out;
} }
@ -2177,6 +2190,11 @@ static int _error_device(CMD_ARGS)
name = names ? names->name : argv[0]; name = names ? names->name : argv[0];
if (!name || !*name) {
printf("No device specified\n");
return_0;
}
size = _get_device_size(name); size = _get_device_size(name);
if (!(dmt = dm_task_create(DM_DEVICE_RELOAD))) if (!(dmt = dm_task_create(DM_DEVICE_RELOAD)))
@ -6161,24 +6179,24 @@ static struct command _dmsetup_commands[] = {
"\t [--readahead {[+]<sectors>|auto|none}]\n" "\t [--readahead {[+]<sectors>|auto|none}]\n"
"\t [-n|--notable|--table {<table>|<table_file>}]\n" "\t [-n|--notable|--table {<table>|<table_file>}]\n"
"\tcreate --concise [<concise_device_spec_list>]", 0, 2, 0, 0, _create}, "\tcreate --concise [<concise_device_spec_list>]", 0, 2, 0, 0, _create},
{"remove", "[--deferred] [-f|--force] [--retry] <device>...", 0, -1, 1, 0, _remove}, {"remove", "[--deferred] [-f|--force] [--retry] <device>...", 0, -1, 2, 0, _remove},
{"remove_all", "[-f|--force]", 0, 0, 0, 0, _remove_all}, {"remove_all", "[-f|--force]", 0, 0, 0, 0, _remove_all},
{"suspend", "[--noflush] [--nolockfs] <device>...", 0, -1, 1, 0, _suspend}, {"suspend", "[--noflush] [--nolockfs] <device>...", 0, -1, 2, 0, _suspend},
{"resume", "[--noflush] [--nolockfs] <device>...\n" {"resume", "[--noflush] [--nolockfs] <device>...\n"
"\t [--addnodeonresume|--addnodeoncreate]\n" "\t [--addnodeonresume|--addnodeoncreate]\n"
"\t [--readahead {[+]<sectors>|auto|none}]", 0, -1, 1, 0, _resume}, "\t [--readahead {[+]<sectors>|auto|none}]", 0, -1, 2, 0, _resume},
{"load", "<device> [<table>|<table_file>]", 0, 2, 0, 0, _load}, {"load", "<device> [<table>|<table_file>]", 0, 2, 0, 0, _load},
{"clear", "<device>", 0, -1, 1, 0, _clear}, {"clear", "<device>", 0, -1, 2, 0, _clear},
{"reload", "<device> [<table>|<table_file>]", 0, 2, 0, 0, _load}, {"reload", "<device> [<table>|<table_file>]", 0, 2, 0, 0, _load},
{"wipe_table", "[-f|--force] [--noflush] [--nolockfs] <device>...", 1, -1, 1, 0, _error_device}, {"wipe_table", "[-f|--force] [--noflush] [--nolockfs] <device>...", 0, -1, 2, 0, _error_device},
{"rename", "<device> [--setuuid] <new_name_or_uuid>", 1, 2, 0, 0, _rename}, {"rename", "<device> [--setuuid] <new_name_or_uuid>", 1, 2, 0, 0, _rename},
{"message", "<device> <sector> <message>", 2, -1, 0, 0, _message}, {"message", "<device> <sector> <message>", 2, -1, 0, 0, _message},
{"ls", "[--target <target_type>] [--exec <command>] [-o <options>] [--tree]", 0, 0, 0, 0, _ls}, {"ls", "[--target <target_type>] [--exec <command>] [-o <options>] [--tree]", 0, 0, 0, 0, _ls},
{"info", "[<device>...]", 0, -1, 1, 0, _info}, {"info", "[<device>...]", 0, -1, 1, 0, _info},
{"deps", "[-o <options>] [<device>...]", 0, -1, 1, 0, _deps}, {"deps", "[-o <options>] [<device>...]", 0, -1, 2, 0, _deps},
{"stats", "<command> [<options>] [<device>...]", 1, -1, 1, 1, _stats}, {"stats", "<command> [<options>] [<device>...]", 1, -1, 1, 1, _stats},
{"status", "[<device>...] [--noflush] [--target <target_type>]", 0, -1, 1, 0, _status}, {"status", "[<device>...] [--noflush] [--target <target_type>]", 0, -1, 2, 0, _status},
{"table", "[<device>...] [--concise] [--target <target_type>] [--showkeys]", 0, -1, 1, 0, _status}, {"table", "[<device>...] [--concise] [--target <target_type>] [--showkeys]", 0, -1, 2, 0, _status},
{"wait", "<device> [<event_nr>] [--noflush]", 0, 2, 0, 0, _wait}, {"wait", "<device> [<event_nr>] [--noflush]", 0, 2, 0, 0, _wait},
{"mknodes", "[<device>...]", 0, -1, 1, 0, _mknodes}, {"mknodes", "[<device>...]", 0, -1, 1, 0, _mknodes},
{"mangle", "[<device>...]", 0, -1, 1, 0, _mangle}, {"mangle", "[<device>...]", 0, -1, 1, 0, _mangle},
@ -7326,6 +7344,16 @@ unknown:
/* Default to success */ /* Default to success */
ret = 0; ret = 0;
/* When -S is given, store the real command for later and run "info -c" first */
if (_switches[SELECT_ARG] && (cmd->repeatable_cmd == 2)) {
_selection_cmd = cmd;
_switches[COLS_ARG] = 1;
if (!(cmd = _find_dmsetup_command("info"))) {
fprintf(stderr, "Internal error finding dmsetup info command struct.\n");
goto out;
}
}
if (_switches[COLS_ARG]) { if (_switches[COLS_ARG]) {
if (!_report_init(cmd, subcommand)) if (!_report_init(cmd, subcommand))
ret = 1; ret = 1;