| /* |
| * Copyright (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #include "lib.h" |
| #include "filter.h" |
| |
| static DM_LIST_INIT(_allow_devs); |
| |
| int internal_filter_allow(struct dm_pool *mem, struct device *dev) |
| { |
| struct device_list *devl; |
| |
| if (!(devl = dm_pool_alloc(mem, sizeof(*devl)))) { |
| log_error("device_list element allocation failed"); |
| return 0; |
| } |
| devl->dev = dev; |
| |
| dm_list_add(&_allow_devs, &devl->list); |
| return 1; |
| } |
| |
| void internal_filter_clear(void) |
| { |
| dm_list_init(&_allow_devs); |
| } |
| |
| static int _passes_internal(struct dev_filter *f __attribute__((unused)), |
| struct device *dev) |
| { |
| struct device_list *devl; |
| |
| if (!internal_filtering()) |
| return 1; |
| |
| dm_list_iterate_items(devl, &_allow_devs) { |
| if (devl->dev == dev) |
| return 1; |
| } |
| |
| log_debug_devs("%s: Skipping for internal filtering.", dev_name(dev)); |
| return 0; |
| } |
| |
| static void _destroy(struct dev_filter *f) |
| { |
| if (f->use_count) |
| log_error(INTERNAL_ERROR "Destroying internal filter while in use %u times.", f->use_count); |
| |
| dm_free(f); |
| } |
| |
| struct dev_filter *internal_filter_create(void) |
| { |
| struct dev_filter *f; |
| |
| if (!(f = dm_zalloc(sizeof(*f)))) { |
| log_error("md filter allocation failed"); |
| return NULL; |
| } |
| |
| f->passes_filter = _passes_internal; |
| f->destroy = _destroy; |
| f->use_count = 0; |
| |
| log_debug_devs("internal filter initialised."); |
| |
| return f; |
| } |
| |