summaryrefslogtreecommitdiff
path: root/lib/filters
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2018-06-13 14:00:47 -0500
committerDavid Teigland <teigland@redhat.com>2018-06-13 14:00:47 -0500
commit22c5467add88268554a7d163a26892166dbc3104 (patch)
tree469c8ac1ac0ba397eaba8a7f5580c0ad5330fd1c /lib/filters
parent17f5572bc972c932bcf62fc2bff3029268ae0109 (diff)
downloadlvm2-22c5467add88268554a7d163a26892166dbc3104.tar.gz
filters: remove cache file in persistent filter
It creates problems because it's not always correct, and it doesn't actually help much.
Diffstat (limited to 'lib/filters')
-rw-r--r--lib/filters/filter-composite.c13
-rw-r--r--lib/filters/filter-persistent.c233
-rw-r--r--lib/filters/filter.h6
3 files changed, 2 insertions, 250 deletions
diff --git a/lib/filters/filter-composite.c b/lib/filters/filter-composite.c
index 8691aebf3..ba837afc6 100644
--- a/lib/filters/filter-composite.c
+++ b/lib/filters/filter-composite.c
@@ -58,18 +58,6 @@ static void _composite_destroy(struct dev_filter *f)
free(f);
}
-static int _dump(struct dev_filter *f, int merge_existing)
-{
- struct dev_filter **filters;
-
- for (filters = (struct dev_filter **) f->private; *filters; ++filters)
- if ((*filters)->dump &&
- !(*filters)->dump(*filters, merge_existing))
- return_0;
-
- return 1;
-}
-
static void _wipe(struct dev_filter *f)
{
struct dev_filter **filters;
@@ -102,7 +90,6 @@ struct dev_filter *composite_filter_create(int n, int use_dev_ext_info, struct d
cft->passes_filter = use_dev_ext_info ? _and_p_with_dev_ext_info : _and_p;
cft->destroy = _composite_destroy;
- cft->dump = _dump;
cft->wipe = _wipe;
cft->use_count = 0;
cft->private = filters_copy;
diff --git a/lib/filters/filter-persistent.c b/lib/filters/filter-persistent.c
index 643c34910..9ee395793 100644
--- a/lib/filters/filter-persistent.c
+++ b/lib/filters/filter-persistent.c
@@ -17,13 +17,10 @@
#include "lib/misc/lib.h"
#include "lib/filters/filter.h"
#include "lib/config/config.h"
-#include "lib/misc/lvm-file.h"
struct pfilter {
- char *file;
struct dm_hash_table *devices;
struct dev_filter *real;
- struct timespec ctime;
struct dev_types *dt;
};
@@ -44,11 +41,6 @@ struct pfilter {
* times. A device should be checked against the filter once, and then not
* need to be checked again. With scanning now controlled, we could probably
* do this.
- *
- * FIXME: "persistent" isn't a great name for this caching filter. This filter
- * at one time saved its cache results to a file, which is how it got the name.
- * That .cache file does not work well, causes problems, and is no longer used
- * by default. The old code for it should be removed.
*/
/*
@@ -76,214 +68,6 @@ static void _persistent_filter_wipe(struct dev_filter *f)
dm_hash_wipe(pf->devices);
}
-static int _read_array(struct pfilter *pf, struct dm_config_tree *cft,
- const char *path, void *data)
-{
- const struct dm_config_node *cn;
- const struct dm_config_value *cv;
-
- if (!(cn = dm_config_find_node(cft->root, path))) {
- log_very_verbose("Couldn't find %s array in '%s'",
- path, pf->file);
- return 0;
- }
-
- /*
- * iterate through the array, adding
- * devices as we go.
- */
- for (cv = cn->v; cv; cv = cv->next) {
- if (cv->type != DM_CFG_STRING) {
- log_verbose("Devices array contains a value "
- "which is not a string ... ignoring");
- continue;
- }
-
- if (!dm_hash_insert(pf->devices, cv->v.str, data))
- log_verbose("Couldn't add '%s' to filter ... ignoring",
- cv->v.str);
- /* Populate dev_cache ourselves */
- dev_cache_get(cv->v.str, NULL);
- }
- return 1;
-}
-
-int persistent_filter_load(struct dev_filter *f, struct dm_config_tree **cft_out)
-{
- struct pfilter *pf = (struct pfilter *) f->private;
- struct dm_config_tree *cft;
- struct stat info;
- int r = 0;
-
- if (obtain_device_list_from_udev()) {
- if (!stat(pf->file, &info)) {
- log_very_verbose("Obtaining device list from udev. "
- "Removing obsolete %s.",
- pf->file);
- if (unlink(pf->file) < 0 && errno != EROFS)
- log_sys_error("unlink", pf->file);
- }
- return 1;
- }
-
- if (!stat(pf->file, &info))
- lvm_stat_ctim(&pf->ctime, &info);
- else {
- log_very_verbose("%s: stat failed: %s", pf->file,
- strerror(errno));
- return_0;
- }
-
- if (!(cft = config_open(CONFIG_FILE_SPECIAL, pf->file, 1)))
- return_0;
-
- if (!config_file_read(cft))
- goto_out;
-
- log_debug_devs("Loading persistent filter cache from %s", pf->file);
- _read_array(pf, cft, "persistent_filter_cache/valid_devices",
- PF_GOOD_DEVICE);
- /* We don't gain anything by holding invalid devices */
- /* _read_array(pf, cft, "persistent_filter_cache/invalid_devices",
- PF_BAD_DEVICE); */
-
- log_very_verbose("Loaded persistent filter cache from %s", pf->file);
-
- out:
- if (r && cft_out)
- *cft_out = cft;
- else
- config_destroy(cft);
- return r;
-}
-
-static void _write_array(struct pfilter *pf, FILE *fp, const char *path,
- void *data)
-{
- void *d;
- int first = 1;
- char buf[2 * PATH_MAX];
- struct dm_hash_node *n;
-
- for (n = dm_hash_get_first(pf->devices); n;
- n = dm_hash_get_next(pf->devices, n)) {
- d = dm_hash_get_data(pf->devices, n);
-
- if (d != data)
- continue;
-
- if (!first)
- fprintf(fp, ",\n");
- else {
- fprintf(fp, "\t%s=[\n", path);
- first = 0;
- }
-
- dm_escape_double_quotes(buf, dm_hash_get_key(pf->devices, n));
- fprintf(fp, "\t\t\"%s\"", buf);
- }
-
- if (!first)
- fprintf(fp, "\n\t]\n");
-}
-
-static int _persistent_filter_dump(struct dev_filter *f, int merge_existing)
-{
- struct pfilter *pf;
- char *tmp_file;
- struct stat info, info2;
- struct timespec ts;
- struct dm_config_tree *cft = NULL;
- FILE *fp;
- int lockfd;
- int r = 0;
-
- if (obtain_device_list_from_udev())
- return 1;
-
- if (!f)
- return_0;
- pf = (struct pfilter *) f->private;
-
- if (!dm_hash_get_num_entries(pf->devices)) {
- log_very_verbose("Internal persistent device cache empty "
- "- not writing to %s", pf->file);
- return 1;
- }
- if (!dev_cache_has_scanned()) {
- log_very_verbose("Device cache incomplete - not writing "
- "to %s", pf->file);
- return 0;
- }
-
- log_very_verbose("Dumping persistent device cache to %s", pf->file);
-
- while (1) {
- if ((lockfd = fcntl_lock_file(pf->file, F_WRLCK, 0)) < 0)
- return_0;
-
- /*
- * Ensure we locked the file we expected
- */
- if (fstat(lockfd, &info)) {
- log_sys_error("fstat", pf->file);
- goto out;
- }
- if (stat(pf->file, &info2)) {
- log_sys_error("stat", pf->file);
- goto out;
- }
-
- if (is_same_inode(info, info2))
- break;
-
- fcntl_unlock_file(lockfd);
- }
-
- /*
- * If file contents changed since we loaded it, merge new contents
- */
- lvm_stat_ctim(&ts, &info);
- if (merge_existing && timespeccmp(&ts, &pf->ctime, !=))
- /* Keep cft open to avoid losing lock */
- persistent_filter_load(f, &cft);
-
- tmp_file = alloca(strlen(pf->file) + 5);
- sprintf(tmp_file, "%s.tmp", pf->file);
-
- if (!(fp = fopen(tmp_file, "w"))) {
- /* EACCES has been reported over NFS */
- if (errno != EROFS && errno != EACCES)
- log_sys_error("fopen", tmp_file);
- goto out;
- }
-
- fprintf(fp, "# This file is automatically maintained by lvm.\n\n");
- fprintf(fp, "persistent_filter_cache {\n");
-
- _write_array(pf, fp, "valid_devices", PF_GOOD_DEVICE);
- /* We don't gain anything by remembering invalid devices */
- /* _write_array(pf, fp, "invalid_devices", PF_BAD_DEVICE); */
-
- fprintf(fp, "}\n");
- if (lvm_fclose(fp, tmp_file))
- goto_out;
-
- if (rename(tmp_file, pf->file))
- log_error("%s: rename to %s failed: %s", tmp_file, pf->file,
- strerror(errno));
-
- r = 1;
-
-out:
- fcntl_unlock_file(lockfd);
-
- if (cft)
- config_destroy(cft);
-
- return r;
-}
-
static int _lookup_p(struct dev_filter *f, struct device *dev)
{
struct pfilter *pf = (struct pfilter *) f->private;
@@ -361,19 +145,15 @@ static void _persistent_destroy(struct dev_filter *f)
log_error(INTERNAL_ERROR "Destroying persistent filter while in use %u times.", f->use_count);
dm_hash_destroy(pf->devices);
- free(pf->file);
pf->real->destroy(pf->real);
free(pf);
free(f);
}
-struct dev_filter *persistent_filter_create(struct dev_types *dt,
- struct dev_filter *real,
- const char *file)
+struct dev_filter *persistent_filter_create(struct dev_types *dt, struct dev_filter *real)
{
struct pfilter *pf;
struct dev_filter *f = NULL;
- struct stat info;
if (!(pf = zalloc(sizeof(*pf)))) {
log_error("Allocation of persistent filter failed.");
@@ -382,11 +162,6 @@ struct dev_filter *persistent_filter_create(struct dev_types *dt,
pf->dt = dt;
- if (!(pf->file = strdup(file))) {
- log_error("Filename duplication for persistent filter failed.");
- goto bad;
- }
-
pf->real = real;
if (!(_init_hash(pf))) {
@@ -399,23 +174,17 @@ struct dev_filter *persistent_filter_create(struct dev_types *dt,
goto bad;
}
- /* Only merge cache file before dumping it if it changed externally. */
- if (!stat(pf->file, &info))
- lvm_stat_ctim(&pf->ctime, &info);
-
f->passes_filter = _lookup_p;
f->destroy = _persistent_destroy;
f->use_count = 0;
f->private = pf;
f->wipe = _persistent_filter_wipe;
- f->dump = _persistent_filter_dump;
log_debug_devs("Persistent filter initialised.");
return f;
bad:
- free(pf->file);
if (pf->devices)
dm_hash_destroy(pf->devices);
free(pf);
diff --git a/lib/filters/filter.h b/lib/filters/filter.h
index ff9cc1bf5..cdd5a14d7 100644
--- a/lib/filters/filter.h
+++ b/lib/filters/filter.h
@@ -27,9 +27,7 @@ struct dev_filter *md_filter_create(struct cmd_context *cmd, struct dev_types *d
struct dev_filter *fwraid_filter_create(struct dev_types *dt);
struct dev_filter *mpath_filter_create(struct dev_types *dt);
struct dev_filter *partitioned_filter_create(struct dev_types *dt);
-struct dev_filter *persistent_filter_create(struct dev_types *dt,
- struct dev_filter *f,
- const char *file);
+struct dev_filter *persistent_filter_create(struct dev_types *dt, struct dev_filter *f);
struct dev_filter *sysfs_filter_create(void);
struct dev_filter *signature_filter_create(struct dev_types *dt);
@@ -54,6 +52,4 @@ typedef enum {
} filter_mode_t;
struct dev_filter *usable_filter_create(struct dev_types *dt, filter_mode_t mode);
-int persistent_filter_load(struct dev_filter *f, struct dm_config_tree **cft_out);
-
#endif /* _LVM_FILTER_H */