| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright (c) 2017 Intel Corporation. |
| * All Rights Reserved. |
| */ |
| |
| #include "platform_defs.h" |
| #include <libdevmapper.h> |
| #include "command.h" |
| #include "init.h" |
| #include "io.h" |
| |
| static cmdinfo_t log_writes_cmd; |
| |
| static int |
| mark_log(const char *device, const char *mark) |
| { |
| struct dm_task *dmt; |
| const int size = 80; |
| char message[size]; |
| int len, ret = 0; |
| |
| len = snprintf(message, size, "mark %s", mark); |
| if (len >= size) { |
| printf("mark '%s' is too long\n", mark); |
| return ret; |
| } |
| |
| if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG))) |
| return ret; |
| |
| if (!dm_task_set_name(dmt, device)) |
| goto out; |
| |
| if (!dm_task_set_sector(dmt, 0)) |
| goto out; |
| |
| if (!dm_task_set_message(dmt, message)) |
| goto out; |
| |
| if (dm_task_run(dmt)) |
| ret = 1; |
| out: |
| dm_task_destroy(dmt); |
| return ret; |
| } |
| |
| static int |
| log_writes_f( |
| int argc, |
| char **argv) |
| { |
| const char *device = NULL; |
| const char *mark = NULL; |
| int c; |
| |
| while ((c = getopt(argc, argv, "d:m:")) != EOF) { |
| switch (c) { |
| case 'd': |
| device = optarg; |
| break; |
| case 'm': |
| mark = optarg; |
| break; |
| default: |
| exitcode = 1; |
| return command_usage(&log_writes_cmd); |
| } |
| } |
| |
| if (device == NULL || mark == NULL) { |
| exitcode = 1; |
| return command_usage(&log_writes_cmd); |
| } |
| |
| if (!mark_log(device, mark)) |
| exitcode = 1; |
| |
| return 0; |
| } |
| |
| void |
| log_writes_init(void) |
| { |
| log_writes_cmd.name = "log_writes"; |
| log_writes_cmd.altname = "lw"; |
| log_writes_cmd.cfunc = log_writes_f; |
| log_writes_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK |
| | CMD_FLAG_ONESHOT; |
| log_writes_cmd.argmin = 0; |
| log_writes_cmd.argmax = -1; |
| log_writes_cmd.args = _("-d device -m mark"); |
| log_writes_cmd.oneline = |
| _("create mark <mark> in the dm-log-writes log specified by <device>"); |
| |
| add_command(&log_writes_cmd); |
| } |