Add devices/cache_dir & devices/cache_file_prefix, deprecating devices/cache.
Create directory in fcntl_lock_file() if required.
Version 2.02.23 -
====================================
+ Move .cache file into a new /etc/lvm/cache directory by default.
+ Add devices/cache_dir & devices/cache_file_prefix, deprecating devices/cache.
+ Create directory in fcntl_lock_file() if required.
Exclude readline support from lvm.static.
Fix a leak in a reporting error path (2.02.19).
# filter = [ "a|^/dev/hda8$|", "r/.*/" ]
# The results of the filtering are cached on disk to avoid
- # rescanning dud devices (which can take a very long time). By
- # default this cache file is hidden in the /etc/lvm directory.
- # It is safe to delete this file: the tools regenerate it.
- cache = "/etc/lvm/.cache"
+ # rescanning dud devices (which can take a very long time).
+ # By default this cache is stored in the /etc/lvm/cache directory
+ # in a file called '.cache'.
+ # It is safe to delete the contents: the tools regenerate it.
+ # (The old setting 'cache' is still respected if neither of
+ # these new ones is present.)
+ cache_dir = "/etc/lvm/cache"
+ cache_file_prefix = ""
# You can turn off writing this cache file by setting this to 0.
write_cache_state = 1
static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache)
{
- const char *dev_cache;
+ const char *dev_cache = NULL, *cache_dir, *cache_file_prefix;
struct dev_filter *f3, *f4;
struct stat st;
char cache_file[PATH_MAX];
if (!(f3 = _init_filter_components(cmd)))
return 0;
- if (dm_snprintf(cache_file, sizeof(cache_file),
- "%s/.cache", cmd->sys_dir) < 0) {
- log_error("Persistent cache filename too long ('%s/.cache').",
- cmd->sys_dir);
- return 0;
- }
-
init_ignore_suspended_devices(find_config_tree_int(cmd,
"devices/ignore_suspended_devices", DEFAULT_IGNORE_SUSPENDED_DEVICES));
- dev_cache = find_config_tree_str(cmd, "devices/cache",
- cache_file);
- if (!(f4 = persistent_filter_create(f3, dev_cache))) {
+ /*
+ * If 'cache_dir' or 'cache_file_prefix' is set, ignore 'cache'.
+ */
+ cache_dir = find_config_tree_str(cmd, "devices/cache_dir", NULL);
+ cache_file_prefix = find_config_tree_str(cmd, "devices/cache_file_prefix", NULL);
+
+ if (cache_dir || cache_file_prefix) {
+ if (dm_snprintf(cache_file, sizeof(cache_file),
+ "%s%s%s/%s.cache",
+ cache_dir ? "" : cmd->sys_dir,
+ cache_dir ? "" : "/",
+ cache_dir ? : DEFAULT_CACHE_SUBDIR,
+ cache_file_prefix ? : DEFAULT_CACHE_FILE_PREFIX) < 0) {
+ log_error("Persistent cache filename too long.");
+ return 0;
+ }
+ } else if (!(dev_cache = find_config_tree_str(cmd, "devices/cache", NULL)) &&
+ (dm_snprintf(cache_file, sizeof(cache_file),
+ "%s/%s/%s.cache",
+ cmd->sys_dir, DEFAULT_CACHE_SUBDIR,
+ DEFAULT_CACHE_FILE_PREFIX) < 0)) {
+ log_error("Persistent cache filename too long.");
+ return 0;
+ }
+
+ if (!(f4 = persistent_filter_create(f3, dev_cache ? : cache_file))) {
log_error("Failed to create persistent device filter");
return 0;
}
#define DEFAULT_ARCHIVE_SUBDIR "archive"
#define DEFAULT_BACKUP_SUBDIR "backup"
+#define DEFAULT_CACHE_SUBDIR "cache"
+#define DEFAULT_CACHE_FILE_PREFIX ""
#define DEFAULT_ARCHIVE_DAYS 30
#define DEFAULT_ARCHIVE_NUMBER 10
int fcntl_lock_file(const char *file, short lock_type, int warn_if_read_only)
{
int lockfd;
+ char *dir;
+ char *c;
struct flock lock = {
.l_type = lock_type,
.l_whence = 0,
.l_len = 0
};
+ if (!(dir = dm_strdup(file))) {
+ log_error("fcntl_lock_file failed in strdup.");
+ return -1;
+ }
+
+ if ((c = strrchr(dir, '/')))
+ *c = '\0';
+
+ if (!create_dir(dir))
+ return -1;
+
log_very_verbose("Locking %s (%s, %hd)", file,
(lock_type == F_WRLCK) ? "F_WRLCK" : "F_RDLCK",
lock_type);
As an example, to ignore /dev/cdrom you could use:
\fBdevices { filter=["r|cdrom|"] }\fP
.IP
-\fBcache\fP \(em Persistent filter cache file.
-Defaults to "/etc/lvm/.cache".
+\fBcache_dir\fP \(em Persistent filter cache file directory.
+Defaults to "/etc/lvm/cache".
.IP
\fBwrite_cache_state\fP \(em Set to 0 to disable the writing out of the
persistent filter cache file when \fBlvm\fP exits.
the tools as normal, or else vgcfgbackup, edit backup, vgcfgrestore.
.SH FILES
.I /etc/lvm/lvm.conf
-.I /etc/lvm/.cache
.I /etc/lvm/archive
.I /etc/lvm/backup
+.I /etc/lvm/cache/.cache
.I /var/lock/lvm
.SH SEE ALSO
.BR lvm (8),