]> sourceware.org Git - lvm2.git/commitdiff
Move .cache file into a new /etc/lvm/cache directory by default.
authorAlasdair Kergon <agk@redhat.com>
Wed, 28 Feb 2007 18:27:13 +0000 (18:27 +0000)
committerAlasdair Kergon <agk@redhat.com>
Wed, 28 Feb 2007 18:27:13 +0000 (18:27 +0000)
Add devices/cache_dir & devices/cache_file_prefix, deprecating devices/cache.
Create directory in fcntl_lock_file() if required.

WHATS_NEW
doc/example.conf
lib/commands/toolcontext.c
lib/config/defaults.h
lib/misc/lvm-file.c
man/lvm.conf.5

index 0f228148622d5f3b99aa81d86571c4a479ca18bf..639b936b287757bfc5fd251ae41023ea1242206d 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,8 @@
 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).
 
index 7cf406fd4a552345d4bc5d3d0b66e57e1ef71de4..5f4d089c3af88cb2896b756afa0a4de87f1145cb 100644 (file)
@@ -56,10 +56,14 @@ devices {
     # 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
index f9689e09e2973226b3ccac0581d6855dbfacab00..8a4074a73c0a8e48400c36715aa21257224ec2ad 100644 (file)
@@ -575,7 +575,7 @@ static struct dev_filter *_init_filter_components(struct cmd_context *cmd)
 
 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];
@@ -585,19 +585,35 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
        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;
        }
index cad77e778398c41dbb3d6abf60fc226087e0c5d8..ba42d5f6e20ce398be9c60393aef3da857246028 100644 (file)
@@ -21,6 +21,8 @@
 
 #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
index 06a33b5ce2818a6a2f317efe61d0b8e7f98024ff..c1ec8e305e974977f121dfc1127c9171f6120022 100644 (file)
@@ -256,6 +256,8 @@ void sync_dir(const char *file)
 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,
@@ -263,6 +265,17 @@ int fcntl_lock_file(const char *file, short lock_type, int warn_if_read_only)
                .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);
index d6f963ab80fba78b41296472aad15032bb556e2b..b690191083f321091d619902c5aac8f098cb8f1a 100644 (file)
@@ -95,8 +95,8 @@ pattern it is rejected; otherwise it is accepted.
 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.
@@ -364,9 +364,9 @@ understand how things work: to make changes you should always use
 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),
This page took 0.047073 seconds and 5 git commands to generate.