Version 2.02.101 -
===================================
+ Move mpath device filter before partitioned filter (which opens devices).
+ Split partitioned filter out of lvm_type filter.
+ Merge filter*.h into a single filter.h.
Require confirmation for vgchange -c when no VGs listed explicitly.
Also skip /var and /var/log by default in blkdeactivate when unmounting.
Add support for bind mounts in blkdeactivate.
@top_srcdir@/lib/device/dev-type.h
@top_srcdir@/lib/device/device.h
@top_srcdir@/lib/display/display.h
-@top_srcdir@/lib/filters/filter-composite.h
-@top_srcdir@/lib/filters/filter-md.h
-@top_srcdir@/lib/filters/filter-mpath.h
-@top_srcdir@/lib/filters/filter-persistent.h
-@top_srcdir@/lib/filters/filter-regex.h
-@top_srcdir@/lib/filters/filter-sysfs.h
@top_srcdir@/lib/filters/filter.h
@top_srcdir@/lib/format1/format1.h
@top_srcdir@/lib/format_pool/format_pool.h
filters/filter-sysfs.c \
filters/filter-md.c \
filters/filter-mpath.c \
- filters/filter.c \
+ filters/filter-partitioned.c \
+ filters/filter-type.c \
format_text/archive.c \
format_text/archiver.c \
format_text/export.c \
#include "lvm-string.h"
#include "activate.h"
#include "filter.h"
-#include "filter-composite.h"
-#include "filter-md.h"
-#include "filter-mpath.h"
-#include "filter-persistent.h"
-#include "filter-regex.h"
-#include "filter-sysfs.h"
#include "label.h"
#include "lvm-file.h"
#include "format-text.h"
#include "segtype.h"
#include "lvmcache.h"
#include "lvmetad.h"
-#include "dev-cache.h"
#include "archiver.h"
#ifdef HAVE_LIBDL
return 1;
}
-#define MAX_FILTERS 5
+#define MAX_FILTERS 6
static struct dev_filter *_init_filter_components(struct cmd_context *cmd)
{
if (!(cn = find_config_tree_node(cmd, devices_filter_CFG, NULL)))
log_very_verbose("devices/filter not found in config file: "
"no regex filter installed");
-
else if (!(filters[nr_filt] = regex_filter_create(cn->v))) {
log_error("Failed to create regex device filter");
goto bad;
}
nr_filt++;
+ /* mpath component filter. Optional, non-critical. */
+ if (find_config_tree_bool(cmd, devices_multipath_component_detection_CFG, NULL)) {
+ if ((filters[nr_filt] = mpath_filter_create(cmd->dev_types)))
+ nr_filt++;
+ }
+
+ /* partitioned device filter. Required. */
+ if (!(filters[nr_filt] = partitioned_filter_create(cmd->dev_types))) {
+ log_error("Failed to create partitioned device filter");
+ goto bad;
+ }
+ nr_filt++;
+
/* md component filter. Optional, non-critical. */
if (find_config_tree_bool(cmd, devices_md_component_detection_CFG, NULL)) {
init_md_filtering(1);
nr_filt++;
}
- /* mpath component filter. Optional, non-critical. */
- if (find_config_tree_bool(cmd, devices_multipath_component_detection_CFG, NULL)) {
- if ((filters[nr_filt] = mpath_filter_create(cmd->dev_types)))
- nr_filt++;
- }
-
/* Only build a composite filter if we really need it. */
if (nr_filt == 1)
return filters[0];
goto_bad;
return composite;
+
bad:
while (--nr_filt >= 0)
filters[nr_filt]->destroy(filters[nr_filt]);
*/
#include "lib.h"
-#include "dev-cache.h"
#include "lvm-types.h"
#include "btree.h"
-#include "filter.h"
#include "config.h"
#include "toolcontext.h"
}
}
- return (d && (!f || (d->flags & DEV_REGULAR) ||
- f->passes_filter(f, d))) ? d : NULL;
+ if (!d || (f && !(d->flags & DEV_REGULAR) && !(f->passes_filter(f, d))))
+ return NULL;
+
+ log_debug_devs("Using %s", dev_name(d));
+ return d;
}
static struct device *_dev_cache_seek_devt(dev_t dev)
while (iter->current) {
struct device *d = _iter_next(iter);
if (!iter->filter || (d->flags & DEV_REGULAR) ||
- iter->filter->passes_filter(iter->filter, d))
+ iter->filter->passes_filter(iter->filter, d)) {
+ log_debug_devs("Using %s", dev_name(d));
return d;
+ }
}
return NULL;
*/
#include "lib.h"
-#include "filter-composite.h"
+#include "filter.h"
static int _and_p(struct dev_filter *f, struct device *dev)
{
for (filters = (struct dev_filter **) f->private; *filters; ++filters)
if (!(*filters)->passes_filter(*filters, dev))
- return_0;
-
- log_debug_devs("Using %s", dev_name(dev));
+ return 0; /* No 'stack': a filter, not an error. */
return 1;
}
cft->use_count = 0;
cft->private = filters_copy;
+ log_debug_devs("Composite filter initialised.");
+
return cft;
}
+++ /dev/null
-/*
- * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
- *
- * This file is part of LVM2.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License v.2.1.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef _LVM_FILTER_COMPOSITE_H
-#define _LVM_FILTER_COMPOSITE_H
-
-#include "dev-cache.h"
-
-struct dev_filter *composite_filter_create(int n, struct dev_filter **filters);
-
-#endif
*/
#include "lib.h"
-#include "filter-md.h"
+#include "filter.h"
#ifdef linux
f->use_count = 0;
f->private = dt;
+ log_debug_devs("MD filter initialised.");
+
return f;
}
+++ /dev/null
-/*
- * Copyright (C) 2004 Luca Berra
- *
- * This file is part of LVM2.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License v.2.1.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef _LVM_FILTER_MD_H
-#define _LVM_FILTER_MD_H
-
-#include "dev-cache.h"
-#include "dev-type.h"
-
-struct dev_filter *md_filter_create(struct dev_types *dt);
-
-#endif
-
*/
#include "lib.h"
-#include "filter-mpath.h"
+#include "filter.h"
#include "activate.h"
#ifdef linux
f->use_count = 0;
f->private = dt;
+ log_debug_devs("mpath filter initialised.");
+
return f;
}
+++ /dev/null
-/*
- * Copyright (C) 2011 Red Hat, Inc. All rights reserved.
- *
- * This file is part of LVM2.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License v.2.1.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef _LVM_FILTER_MPATH_H
-#define _LVM_FILTER_MPATH_H
-
-#include "dev-cache.h"
-#include "dev-type.h"
-
-struct dev_filter *mpath_filter_create(struct dev_types *dt);
-
-#endif
-
--- /dev/null
+/*
+ * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
+ * Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved.
+ *
+ * This file is part of LVM2.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License v.2.1.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "lib.h"
+#include "filter.h"
+
+static int _passes_partitioned_filter(struct dev_filter *f, struct device *dev)
+{
+ struct dev_types *dt = (struct dev_types *) f->private;
+ const char *name = dev_name(dev);
+ int ret = 0;
+ uint64_t size;
+
+ /* Check it's accessible */
+ if (!dev_open_readonly_quiet(dev)) {
+ log_debug_devs("%s: Skipping: open failed", name);
+ return 0;
+ }
+
+ /* Check it's not too small */
+ if (!dev_get_size(dev, &size)) {
+ log_debug_devs("%s: Skipping: dev_get_size failed", name);
+ goto out;
+ }
+
+ if (size < pv_min_size()) {
+ log_debug_devs("%s: Skipping: Too small to hold a PV", name);
+ goto out;
+ }
+
+ if (dev_is_partitioned(dt, dev)) {
+ log_debug_devs("%s: Skipping: Partition table signature found",
+ name);
+ goto out;
+ }
+
+ ret = 1;
+
+ out:
+ if (!dev_close(dev))
+ stack;
+
+ return ret;
+}
+
+static void _partitioned_filter_destroy(struct dev_filter *f)
+{
+ if (f->use_count)
+ log_error(INTERNAL_ERROR "Destroying partitioned filter while in use %u times.", f->use_count);
+
+ dm_free(f);
+}
+
+struct dev_filter *partitioned_filter_create(struct dev_types *dt)
+{
+ struct dev_filter *f;
+
+ if (!(f = dm_zalloc(sizeof(struct dev_filter)))) {
+ log_error("Partitioned filter allocation failed");
+ return NULL;
+ }
+
+ f->passes_filter = _passes_partitioned_filter;
+ f->destroy = _partitioned_filter_destroy;
+ f->use_count = 0;
+ f->private = dt;
+
+ log_debug_devs("Partitioned filter initialised.");
+
+ return f;
+}
*/
#include "lib.h"
-#include "filter-persistent.h"
+#include "filter.h"
#include "config.h"
#include "lvm-file.h"
#include "activate.h"
f->wipe = _persistent_filter_wipe;
f->dump = _persistent_filter_dump;
+ log_debug_devs("Persistent filter initialised.");
+
return f;
bad:
+++ /dev/null
-/*
- * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
- *
- * This file is part of LVM2.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License v.2.1.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef _LVM_FILTER_PERSISTENT_H
-#define _LVM_FILTER_PERSISTENT_H
-
-#include "dev-cache.h"
-#include "dev-type.h"
-
-struct dev_filter *persistent_filter_create(struct dev_types *dt,
- struct dev_filter *f,
- const char *file);
-
-int persistent_filter_load(struct dev_filter *f, struct dm_config_tree **cft_out);
-
-#endif
*/
#include "lib.h"
-#include "filter-regex.h"
+#include "filter.h"
struct rfilter {
struct dm_pool *mem;
f->destroy = _regex_destroy;
f->use_count = 0;
f->private = rf;
+
+ log_debug_devs("Regex filter initialised.");
+
return f;
bad:
+++ /dev/null
-/*
- * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
- *
- * This file is part of LVM2.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License v.2.1.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef _LVM_FILTER_REGEX_H
-#define _LVM_FILTER_REGEX_H
-
-#include "dev-cache.h"
-
-/*
- * patterns must be an array of strings of the form:
- * [ra]<sep><regex><sep>, eg,
- * r/cdrom/ - reject cdroms
- * a|loop/[0-4]| - accept loops 0 to 4
- * r|.*| - reject everything else
- */
-
-struct dev_filter *regex_filter_create(const struct dm_config_value *patterns);
-
-#endif
*/
#include "lib.h"
-#include "filter-sysfs.h"
+#include "filter.h"
#ifdef linux
f->destroy = _destroy;
f->use_count = 0;
f->private = ds;
+
+ log_debug_devs("Sysfs filter initialised.");
+
return f;
bad:
+++ /dev/null
-/*
- * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
- *
- * This file is part of LVM2.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License v.2.1.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef _LVM_FILTER_SYSFS_H
-#define _LVM_FILTER_SYSFS_H
-
-#include "dev-cache.h"
-
-struct dev_filter *sysfs_filter_create(void);
-
-#endif
{
struct dev_types *dt = (struct dev_types *) f->private;
const char *name = dev_name(dev);
- int ret = 0;
- uint64_t size;
/* Is this a recognised device type? */
if (!dt->dev_type_array[MAJOR(dev->dev)].max_partitions) {
return 0;
}
- /* Check it's accessible */
- if (!dev_open_readonly_quiet(dev)) {
- log_debug_devs("%s: Skipping: open failed", name);
- return 0;
- }
-
- /* Check it's not too small */
- if (!dev_get_size(dev, &size)) {
- log_debug_devs("%s: Skipping: dev_get_size failed", name);
- goto out;
- }
-
- if (size < pv_min_size()) {
- log_debug_devs("%s: Skipping: Too small to hold a PV", name);
- goto out;
- }
-
- if (dev_is_partitioned(dt, dev)) {
- log_debug_devs("%s: Skipping: Partition table signature found",
- name);
- goto out;
- }
-
- ret = 1;
-
- out:
- if (!dev_close(dev))
- stack;
-
- return ret;
+ return 1;
}
static void _lvm_type_filter_destroy(struct dev_filter *f)
f->use_count = 0;
f->private = dt;
+ log_debug_devs("LVM type filter initialised.");
+
return f;
}
/*
- * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
+ * Copyright (C) 2004 Luca Berra
+ * Copyright (C) 2004-2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
#include "dev-cache.h"
#include "dev-type.h"
+struct dev_filter *composite_filter_create(int n, struct dev_filter **filters);
struct dev_filter *lvm_type_filter_create(struct dev_types *dt);
+struct dev_filter *md_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 *sysfs_filter_create(void);
-#endif
+/*
+ * patterns must be an array of strings of the form:
+ * [ra]<sep><regex><sep>, eg,
+ * r/cdrom/ - reject cdroms
+ * a|loop/[0-4]| - accept loops 0 to 4
+ * r|.*| - reject everything else
+ */
+
+struct dev_filter *regex_filter_create(const struct dm_config_value *patterns);
+
+int persistent_filter_load(struct dev_filter *f, struct dm_config_tree **cft_out);
+
+#endif /* _LVM_FILTER_H */
#include "device.h"
#include "display.h"
#include "errors.h"
-#include "filter.h"
-#include "filter-composite.h"
-#include "filter-persistent.h"
-#include "filter-regex.h"
#include "metadata-exported.h"
#include "locking.h"
#include "lvm-exec.h"