mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
devices file: rename unused system.devices
If lvm.conf has use_devicesfile=0 and /etc/lvm/device/system.devices exists, then rename it to system.devices-unused.YYYYMMDD.HHMMSS. This prevents an old, incorrect system.devices from being used in the future if lvm.conf is changed to use_devicesfile=1.
This commit is contained in:
parent
e59027e4f7
commit
4f9215e70f
@ -29,6 +29,7 @@
|
||||
#include <unistd.h>
|
||||
#include <dirent.h>
|
||||
#include <locale.h>
|
||||
#include <time.h>
|
||||
/* coverity[unnecessary_header] needed for MuslC */
|
||||
#include <sys/file.h>
|
||||
|
||||
@ -1813,6 +1814,50 @@ static int _setup_devices_file_dmeventd(struct cmd_context *cmd)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* When lvm.conf use_devicesfile=0, then an existing system.devices
|
||||
* is renamed to system.devices-unused.<date>.<time>. Because,
|
||||
* if lvm.conf is later changed to use_devicesfile=1, then the
|
||||
* old system.devices file would immediately be used again, and
|
||||
* the old file may not longer be correct due to changes to the
|
||||
* system while it was disabled.
|
||||
*/
|
||||
static void devices_file_rename_unused(struct cmd_context *cmd)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
char path2[PATH_MAX];
|
||||
char datetime_str[48] = {0};
|
||||
const char *filename;
|
||||
time_t t;
|
||||
struct tm *tm;
|
||||
struct stat st;
|
||||
|
||||
filename = find_config_tree_str(cmd, devices_devicesfile_CFG, NULL);
|
||||
|
||||
if (!filename || !strlen(filename))
|
||||
return;
|
||||
|
||||
if (dm_snprintf(path, sizeof(path), "%s/devices/%s", cmd->system_dir, filename) < 0)
|
||||
return;
|
||||
|
||||
if (stat(path, &st))
|
||||
return;
|
||||
|
||||
t = time(NULL);
|
||||
if (!(tm = localtime(&t)))
|
||||
return;
|
||||
strftime(datetime_str, sizeof(datetime_str), "%Y%m%d.%H%M%S", tm);
|
||||
|
||||
if (dm_snprintf(path2, sizeof(path2), "%s/devices/%s-unused.%s", cmd->system_dir, filename, datetime_str) < 0)
|
||||
return;
|
||||
|
||||
if (rename(path, path2) < 0) {
|
||||
stack;
|
||||
return;
|
||||
}
|
||||
log_debug("Devices file moved to %s", path2);
|
||||
}
|
||||
|
||||
int setup_devices_file(struct cmd_context *cmd)
|
||||
{
|
||||
char dirpath[PATH_MAX];
|
||||
@ -1848,8 +1893,15 @@ int setup_devices_file(struct cmd_context *cmd)
|
||||
}
|
||||
}
|
||||
|
||||
if (!cmd->enable_devices_file)
|
||||
if (!cmd->enable_devices_file) {
|
||||
struct dm_config_tree *cft;
|
||||
/* rename unused system.devices to system.devices.unused.<date>.<time> */
|
||||
if (!cmd->devicesfile &&
|
||||
(cft = get_config_tree_by_source(cmd, CONFIG_MERGED_FILES)) &&
|
||||
!find_config_bool(cmd, cft, devices_use_devicesfile_CFG))
|
||||
devices_file_rename_unused(cmd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (dm_snprintf(dirpath, sizeof(dirpath), "%s/devices", cmd->system_dir) < 0) {
|
||||
log_error("Failed to copy devices dir path");
|
||||
@ -1873,6 +1925,7 @@ int setup_devices_file(struct cmd_context *cmd)
|
||||
log_error("Failed to copy devices file path");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -42,6 +42,23 @@ DFDIR="$LVM_SYSTEM_DIR/devices"
|
||||
mkdir -p "$DFDIR" || true
|
||||
DF="$DFDIR/system.devices"
|
||||
|
||||
#
|
||||
# Test that unused system.devices is renamed
|
||||
#
|
||||
|
||||
aux lvmconf 'devices/use_devicesfile = 1'
|
||||
wipe_all
|
||||
rm -f "$DF"
|
||||
rm -f "$DF.unused.*"
|
||||
touch "$DF"
|
||||
pvcreate "$dev1"
|
||||
grep "$dev1" "$DF"
|
||||
aux lvmconf 'devices/use_devicesfile = 0'
|
||||
pvs "$dev1"
|
||||
not ls "$DF"
|
||||
ls "$DF"-unused*
|
||||
rm -f "$DF-unused.*"
|
||||
|
||||
#
|
||||
# Test with use_devicesfile=0 (no devices file is being applied by default)
|
||||
#
|
||||
|
Loading…
Reference in New Issue
Block a user