mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
lvmdevices: print changes for product_uuid or hostname
used by the recently added refresh feature
This commit is contained in:
parent
e38d974b50
commit
2b7c832847
@ -634,18 +634,14 @@ static void _init_device_ids_refresh(struct cmd_context *cmd)
|
|||||||
check_hostname = 1;
|
check_hostname = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* product_uuid is preferred */
|
|
||||||
|
|
||||||
if (check_product_uuid) {
|
if (check_product_uuid) {
|
||||||
const char *sysfs_dir = cmd->device_id_sysfs_dir ?: dm_sysfs_dir();
|
const char *sysfs_dir = cmd->device_id_sysfs_dir ?: dm_sysfs_dir();
|
||||||
if (dm_snprintf(path, sizeof(path), "%sdevices/virtual/dmi/id/product_uuid", sysfs_dir) < 0)
|
if (dm_snprintf(path, sizeof(path), "%sdevices/virtual/dmi/id/product_uuid", sysfs_dir) < 0)
|
||||||
return;
|
return;
|
||||||
if (get_sysfs_value(path, uuid, sizeof(uuid), 0) && uuid[0])
|
if (get_sysfs_value(path, uuid, sizeof(uuid), 0) && uuid[0])
|
||||||
cmd->product_uuid = dm_pool_strdup(cmd->libmem, uuid);;
|
cmd->product_uuid = dm_pool_strdup(cmd->libmem, uuid);;
|
||||||
if (cmd->product_uuid) {
|
if (cmd->product_uuid)
|
||||||
cmd->device_ids_check_product_uuid = 1;
|
cmd->device_ids_check_product_uuid = 1;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_hostname && cmd->hostname)
|
if (check_hostname && cmd->hostname)
|
||||||
|
@ -44,6 +44,10 @@ static char _devices_lockfile[PATH_MAX];
|
|||||||
static char _devices_file_version[VERSION_LINE_MAX];
|
static char _devices_file_version[VERSION_LINE_MAX];
|
||||||
static const char *_searched_file = DEFAULT_RUN_DIR "/searched_devnames";
|
static const char *_searched_file = DEFAULT_RUN_DIR "/searched_devnames";
|
||||||
|
|
||||||
|
/* Only for displaying in lvmdevices command output. */
|
||||||
|
char devices_file_hostname_orig[PATH_MAX];
|
||||||
|
char devices_file_product_uuid_orig[PATH_MAX];
|
||||||
|
|
||||||
char *devices_file_version(void)
|
char *devices_file_version(void)
|
||||||
{
|
{
|
||||||
return _devices_file_version;
|
return _devices_file_version;
|
||||||
@ -1044,13 +1048,15 @@ int device_ids_read(struct cmd_context *cmd)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The use_devices list should rarely if ever be non-empty at this
|
* Note: lvmdevices calls device_ids_read() a second
|
||||||
* point, it means device_ids_read has been called twice.
|
* time to get the original entries to compare with
|
||||||
* If we wanted to redo reading the file, we'd need to
|
* updated entries. Prior to calling it again, it
|
||||||
* free_dus(&cmd->use_devices) and clear the MATCHED_USE_ID flag in all
|
* moves the cmd->use_devices entries out of the way.
|
||||||
* dev->flags.
|
* Otherwise, device_ids_read() should only be called
|
||||||
|
* once at the start of a command.
|
||||||
*/
|
*/
|
||||||
if (!dm_list_empty(&cmd->use_devices)) {
|
if (!dm_list_empty(&cmd->use_devices)) {
|
||||||
|
/* shouldn't happen */
|
||||||
log_debug("device_ids_read already done");
|
log_debug("device_ids_read already done");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1071,11 +1077,17 @@ int device_ids_read(struct cmd_context *cmd)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!strncmp(line, "HOSTNAME", 8)) {
|
if (!strncmp(line, "HOSTNAME", 8)) {
|
||||||
if (!cmd->device_ids_check_hostname)
|
|
||||||
continue;
|
|
||||||
hostname_found = 1;
|
|
||||||
_copy_idline_str(line, check_id, sizeof(check_id));
|
_copy_idline_str(line, check_id, sizeof(check_id));
|
||||||
log_debug("read devices file hostname %s", check_id);
|
log_debug("read devices file hostname %s", check_id);
|
||||||
|
|
||||||
|
/* Save original for lvmdevices output. */
|
||||||
|
if (!strcmp(cmd->name, "lvmdevices"))
|
||||||
|
strncpy(devices_file_hostname_orig, check_id, PATH_MAX-1);
|
||||||
|
|
||||||
|
if (!cmd->device_ids_check_hostname)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
hostname_found = 1;
|
||||||
if (cmd->hostname && strcmp(cmd->hostname, check_id)) {
|
if (cmd->hostname && strcmp(cmd->hostname, check_id)) {
|
||||||
log_debug("Devices file hostname %s vs local %s.",
|
log_debug("Devices file hostname %s vs local %s.",
|
||||||
check_id[0] ? check_id : "none", cmd->hostname ?: "none");
|
check_id[0] ? check_id : "none", cmd->hostname ?: "none");
|
||||||
@ -1085,11 +1097,17 @@ int device_ids_read(struct cmd_context *cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!strncmp(line, "PRODUCT_UUID", 12)) {
|
if (!strncmp(line, "PRODUCT_UUID", 12)) {
|
||||||
if (!cmd->device_ids_check_product_uuid)
|
|
||||||
continue;
|
|
||||||
product_uuid_found = 1;
|
|
||||||
_copy_idline_str(line, check_id, sizeof(check_id));
|
_copy_idline_str(line, check_id, sizeof(check_id));
|
||||||
log_debug("read devices file product_uuid %s", check_id);
|
log_debug("read devices file product_uuid %s", check_id);
|
||||||
|
|
||||||
|
/* Save original for lvmdevices output. */
|
||||||
|
if (!strcmp(cmd->name, "lvmdevices"))
|
||||||
|
strncpy(devices_file_product_uuid_orig, check_id, PATH_MAX-1);
|
||||||
|
|
||||||
|
if (!cmd->device_ids_check_product_uuid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
product_uuid_found = 1;
|
||||||
if ((!cmd->product_uuid && check_id[0]) ||
|
if ((!cmd->product_uuid && check_id[0]) ||
|
||||||
(cmd->product_uuid && strcmp(cmd->product_uuid, check_id))) {
|
(cmd->product_uuid && strcmp(cmd->product_uuid, check_id))) {
|
||||||
log_debug("Devices file product_uuid %s vs local %s.",
|
log_debug("Devices file product_uuid %s vs local %s.",
|
||||||
@ -1163,13 +1181,16 @@ int device_ids_read(struct cmd_context *cmd)
|
|||||||
}
|
}
|
||||||
if (fclose(fp))
|
if (fclose(fp))
|
||||||
stack;
|
stack;
|
||||||
|
|
||||||
if (!product_uuid_found && !hostname_found &&
|
|
||||||
(cmd->device_ids_check_product_uuid || cmd->device_ids_check_hostname)) {
|
|
||||||
cmd->device_ids_refresh_trigger = 1;
|
|
||||||
log_debug("Devices file refresh due to no product_uuid or hostname.");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!product_uuid_found && cmd->device_ids_check_product_uuid) {
|
||||||
|
cmd->device_ids_refresh_trigger = 1;
|
||||||
|
log_debug("Devices file refresh: missing product_uuid");
|
||||||
|
} else if ((!product_uuid_found && !hostname_found) &&
|
||||||
|
(cmd->device_ids_check_product_uuid || cmd->device_ids_check_hostname)) {
|
||||||
|
cmd->device_ids_refresh_trigger = 1;
|
||||||
|
log_debug("Devices file refresh: missing product_uuid and hostname");
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1274,9 +1295,10 @@ int device_ids_write(struct cmd_context *cmd)
|
|||||||
fprintf(fp, "# LVM uses devices listed in this file.\n");
|
fprintf(fp, "# LVM uses devices listed in this file.\n");
|
||||||
fprintf(fp, "# Created by LVM command %s pid %d at %s", cmd->name, getpid(), ctime(&t));
|
fprintf(fp, "# Created by LVM command %s pid %d at %s", cmd->name, getpid(), ctime(&t));
|
||||||
|
|
||||||
|
/* if product_uuid is included, then hostname is unnecessary */
|
||||||
if (cmd->product_uuid && cmd->device_ids_check_product_uuid)
|
if (cmd->product_uuid && cmd->device_ids_check_product_uuid)
|
||||||
fprintf(fp, "PRODUCT_UUID=%s\n", cmd->product_uuid);
|
fprintf(fp, "PRODUCT_UUID=%s\n", cmd->product_uuid);
|
||||||
if (cmd->hostname && cmd->device_ids_check_hostname)
|
else if (cmd->hostname && cmd->device_ids_check_hostname)
|
||||||
fprintf(fp, "HOSTNAME=%s\n", cmd->hostname);
|
fprintf(fp, "HOSTNAME=%s\n", cmd->hostname);
|
||||||
|
|
||||||
if (dm_snprintf(version_buf, VERSION_LINE_MAX, "VERSION=%u.%u.%u", DEVICES_FILE_MAJOR, DEVICES_FILE_MINOR, df_counter+1) < 0)
|
if (dm_snprintf(version_buf, VERSION_LINE_MAX, "VERSION=%u.%u.%u", DEVICES_FILE_MAJOR, DEVICES_FILE_MINOR, df_counter+1) < 0)
|
||||||
|
@ -21,6 +21,9 @@
|
|||||||
/* coverity[unnecessary_header] needed for MuslC */
|
/* coverity[unnecessary_header] needed for MuslC */
|
||||||
#include <sys/file.h>
|
#include <sys/file.h>
|
||||||
|
|
||||||
|
extern char devices_file_hostname_orig[PATH_MAX];
|
||||||
|
extern char devices_file_product_uuid_orig[PATH_MAX];
|
||||||
|
|
||||||
static void _search_devs_for_pvids(struct cmd_context *cmd, struct dm_list *search_pvids, struct dm_list *found_devs)
|
static void _search_devs_for_pvids(struct cmd_context *cmd, struct dm_list *search_pvids, struct dm_list *found_devs)
|
||||||
{
|
{
|
||||||
struct dev_iter *iter;
|
struct dev_iter *iter;
|
||||||
@ -151,11 +154,51 @@ static void _print_check(struct cmd_context *cmd)
|
|||||||
dm_list_init(&done_old);
|
dm_list_init(&done_old);
|
||||||
dm_list_init(&done_new);
|
dm_list_init(&done_new);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Move the entries that have been processed out of the way so
|
||||||
|
* original entries can be added to use_devices by device_ids_read().
|
||||||
|
* The processed entries are moved back to cmd->use_devices at the
|
||||||
|
* end of this function.
|
||||||
|
*/
|
||||||
dm_list_splice(&use_new, &cmd->use_devices);
|
dm_list_splice(&use_new, &cmd->use_devices);
|
||||||
device_ids_read(cmd);
|
device_ids_read(cmd);
|
||||||
dm_list_splice(&use_old, &cmd->use_devices);
|
dm_list_splice(&use_old, &cmd->use_devices);
|
||||||
dm_list_init(&cmd->use_devices);
|
dm_list_init(&cmd->use_devices);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if system identifier is changed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (cmd->device_ids_refresh_trigger) {
|
||||||
|
int include_product_uuid = 0;
|
||||||
|
int include_hostname = 0;
|
||||||
|
|
||||||
|
if (cmd->product_uuid && cmd->device_ids_check_product_uuid) {
|
||||||
|
include_product_uuid = 1;
|
||||||
|
if (devices_file_product_uuid_orig[0] &&
|
||||||
|
strcmp(cmd->product_uuid, devices_file_product_uuid_orig))
|
||||||
|
log_print_unless_silent("PRODUCT_UUID=%s (old %s): update",
|
||||||
|
cmd->product_uuid, devices_file_product_uuid_orig);
|
||||||
|
else if (!devices_file_product_uuid_orig[0])
|
||||||
|
log_print_unless_silent("PRODUCT_UUID=%s: add", cmd->product_uuid);
|
||||||
|
}
|
||||||
|
if (!include_product_uuid && devices_file_product_uuid_orig[0])
|
||||||
|
log_print_unless_silent("PRODUCT_UUID=%s: remove", devices_file_product_uuid_orig);
|
||||||
|
|
||||||
|
/* hostname is only updated or added if product_uuid is not included */
|
||||||
|
if (cmd->hostname && cmd->device_ids_check_hostname && !include_product_uuid) {
|
||||||
|
include_hostname = 1;
|
||||||
|
if (devices_file_hostname_orig[0] &&
|
||||||
|
strcmp(cmd->hostname, devices_file_hostname_orig))
|
||||||
|
log_print_unless_silent("HOSTNAME=%s (old %s): update",
|
||||||
|
cmd->hostname, devices_file_hostname_orig);
|
||||||
|
else if (!devices_file_hostname_orig[0])
|
||||||
|
log_print_unless_silent("HOSTNAME=%s: add", cmd->hostname);
|
||||||
|
}
|
||||||
|
if (!include_hostname && devices_file_hostname_orig[0])
|
||||||
|
log_print_unless_silent("HOSTNAME=%s: remove", devices_file_hostname_orig);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check entries with proper id types.
|
* Check entries with proper id types.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user