1*86d7f5d3SJohn Marino /*      $NetBSD: filter_netbsd.c,v 1.3 2009/12/02 01:53:25 haad Exp $        */
2*86d7f5d3SJohn Marino 
3*86d7f5d3SJohn Marino /*
4*86d7f5d3SJohn Marino  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5*86d7f5d3SJohn Marino  * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
6*86d7f5d3SJohn Marino  * Copyright (C) 2008 Adam Hamsik. All rights reserved.
7*86d7f5d3SJohn Marino  * Copyright (C) 2010 Alex Hornung. All rights reserved.
8*86d7f5d3SJohn Marino  *
9*86d7f5d3SJohn Marino  * This file is part of LVM2.
10*86d7f5d3SJohn Marino  *
11*86d7f5d3SJohn Marino  * This copyrighted material is made available to anyone wishing to use,
12*86d7f5d3SJohn Marino  * modify, copy, or redistribute it subject to the terms and conditions
13*86d7f5d3SJohn Marino  * of the GNU Lesser General Public License v.2.1.
14*86d7f5d3SJohn Marino  *
15*86d7f5d3SJohn Marino  * You should have received a copy of the GNU Lesser General Public License
16*86d7f5d3SJohn Marino  * along with this program; if not, write to the Free Software Foundation,
17*86d7f5d3SJohn Marino  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18*86d7f5d3SJohn Marino  */
19*86d7f5d3SJohn Marino 
20*86d7f5d3SJohn Marino #include "lib.h"
21*86d7f5d3SJohn Marino #include "dev-cache.h"
22*86d7f5d3SJohn Marino #include "filter.h"
23*86d7f5d3SJohn Marino #include "lvm-string.h"
24*86d7f5d3SJohn Marino #include "config.h"
25*86d7f5d3SJohn Marino #include "metadata.h"
26*86d7f5d3SJohn Marino #include "activate.h"
27*86d7f5d3SJohn Marino 
28*86d7f5d3SJohn Marino #include <sys/filio.h>
29*86d7f5d3SJohn Marino #include <sys/device.h>
30*86d7f5d3SJohn Marino #include <sys/sysctl.h>
31*86d7f5d3SJohn Marino 
32*86d7f5d3SJohn Marino #include <ctype.h>
33*86d7f5d3SJohn Marino #include <dirent.h>
34*86d7f5d3SJohn Marino #include <fcntl.h>
35*86d7f5d3SJohn Marino #include <limits.h>
36*86d7f5d3SJohn Marino #include <unistd.h>
37*86d7f5d3SJohn Marino 
38*86d7f5d3SJohn Marino #define NUMBER_OF_MAJORS 4096
39*86d7f5d3SJohn Marino 
40*86d7f5d3SJohn Marino #define LVM_SUCCESS 1
41*86d7f5d3SJohn Marino #define LVM_FAILURE 0
42*86d7f5d3SJohn Marino 
43*86d7f5d3SJohn Marino /* -1 means LVM won't use this major number. */
44*86d7f5d3SJohn Marino static int _char_device_major[NUMBER_OF_MAJORS];
45*86d7f5d3SJohn Marino static int _block_device_major[NUMBER_OF_MAJORS];
46*86d7f5d3SJohn Marino 
47*86d7f5d3SJohn Marino typedef struct {
48*86d7f5d3SJohn Marino 	const char *name;
49*86d7f5d3SJohn Marino 	const int max_partitions;
50*86d7f5d3SJohn Marino } device_info_t;
51*86d7f5d3SJohn Marino 
52*86d7f5d3SJohn Marino static int _md_major = -1;
53*86d7f5d3SJohn Marino static int _device_mapper_major = -1;
54*86d7f5d3SJohn Marino 
md_major(void)55*86d7f5d3SJohn Marino int md_major(void)
56*86d7f5d3SJohn Marino {
57*86d7f5d3SJohn Marino 	return _md_major;
58*86d7f5d3SJohn Marino }
59*86d7f5d3SJohn Marino 
dev_subsystem_part_major(const struct device * dev)60*86d7f5d3SJohn Marino int dev_subsystem_part_major(const struct device *dev)
61*86d7f5d3SJohn Marino {
62*86d7f5d3SJohn Marino 	return 0;
63*86d7f5d3SJohn Marino }
64*86d7f5d3SJohn Marino 
dev_subsystem_name(const struct device * dev)65*86d7f5d3SJohn Marino const char *dev_subsystem_name(const struct device *dev)
66*86d7f5d3SJohn Marino {
67*86d7f5d3SJohn Marino 	return "";
68*86d7f5d3SJohn Marino }
69*86d7f5d3SJohn Marino 
70*86d7f5d3SJohn Marino 
71*86d7f5d3SJohn Marino /*
72*86d7f5d3SJohn Marino  * Test if device passes filter tests and can be inserted in to cache.
73*86d7f5d3SJohn Marino  */
_passes_lvm_type_device_filter(struct dev_filter * f __attribute ((unused)),struct device * dev)74*86d7f5d3SJohn Marino static int _passes_lvm_type_device_filter(struct dev_filter *f __attribute((unused)),
75*86d7f5d3SJohn Marino 					  struct device *dev)
76*86d7f5d3SJohn Marino {
77*86d7f5d3SJohn Marino 	const char *name = dev_name(dev);
78*86d7f5d3SJohn Marino 	int fd, type;
79*86d7f5d3SJohn Marino 	int ret = LVM_FAILURE;
80*86d7f5d3SJohn Marino 	uint64_t size;
81*86d7f5d3SJohn Marino 
82*86d7f5d3SJohn Marino 	log_debug("Checking: %s", name);
83*86d7f5d3SJohn Marino 
84*86d7f5d3SJohn Marino 	if ((fd = open(name, O_RDONLY)) < 0) {
85*86d7f5d3SJohn Marino 		log_debug("%s: Skipping: Could not open device", name);
86*86d7f5d3SJohn Marino 		return LVM_FAILURE;
87*86d7f5d3SJohn Marino 	}
88*86d7f5d3SJohn Marino 	if (ioctl(fd, FIODTYPE, &type) == -1) {
89*86d7f5d3SJohn Marino 		close(fd);
90*86d7f5d3SJohn Marino 		log_debug("%s: Skipping: Could not get device type", name);
91*86d7f5d3SJohn Marino 		return LVM_FAILURE;
92*86d7f5d3SJohn Marino 	} else {
93*86d7f5d3SJohn Marino 		if (!(type & D_DISK)) {
94*86d7f5d3SJohn Marino 			close(fd);
95*86d7f5d3SJohn Marino 			log_debug("%s: Skipping: Device is not of type D_DISK", name);
96*86d7f5d3SJohn Marino 			return LVM_FAILURE;
97*86d7f5d3SJohn Marino 		}
98*86d7f5d3SJohn Marino 	}
99*86d7f5d3SJohn Marino 
100*86d7f5d3SJohn Marino 	close(fd);
101*86d7f5d3SJohn Marino 
102*86d7f5d3SJohn Marino 	/* Skip suspended devices */
103*86d7f5d3SJohn Marino 	if (MAJOR(dev->dev) == _device_mapper_major &&
104*86d7f5d3SJohn Marino 	    ignore_suspended_devices() && !device_is_usable(dev->dev)) {
105*86d7f5d3SJohn Marino 		log_debug("%s: Skipping: Suspended dm device", name);
106*86d7f5d3SJohn Marino 		return LVM_FAILURE;
107*86d7f5d3SJohn Marino 	}
108*86d7f5d3SJohn Marino 
109*86d7f5d3SJohn Marino 	/* Check it's accessible */
110*86d7f5d3SJohn Marino 	if (!dev_open_flags(dev, O_RDONLY, 0, 1)) {
111*86d7f5d3SJohn Marino 		log_debug("%s: Skipping: open failed", name);
112*86d7f5d3SJohn Marino 		return LVM_FAILURE;
113*86d7f5d3SJohn Marino 	}
114*86d7f5d3SJohn Marino 
115*86d7f5d3SJohn Marino 	/* Check it's not too small */
116*86d7f5d3SJohn Marino 	if (!dev_get_size(dev, &size)) {
117*86d7f5d3SJohn Marino 		log_debug("%s: Skipping: dev_get_size failed", name);
118*86d7f5d3SJohn Marino 		goto out;
119*86d7f5d3SJohn Marino 	}
120*86d7f5d3SJohn Marino 
121*86d7f5d3SJohn Marino 	if (size < PV_MIN_SIZE) {
122*86d7f5d3SJohn Marino 		log_debug("%s: Skipping: Too small to hold a PV", name);
123*86d7f5d3SJohn Marino 		goto out;
124*86d7f5d3SJohn Marino 	}
125*86d7f5d3SJohn Marino 
126*86d7f5d3SJohn Marino 	if (is_partitioned_dev(dev)) {
127*86d7f5d3SJohn Marino 		log_debug("%s: Skipping: Partition table signature found",
128*86d7f5d3SJohn Marino 			  name);
129*86d7f5d3SJohn Marino 		goto out;
130*86d7f5d3SJohn Marino 	}
131*86d7f5d3SJohn Marino 
132*86d7f5d3SJohn Marino 	ret = LVM_SUCCESS;
133*86d7f5d3SJohn Marino 
134*86d7f5d3SJohn Marino       out:
135*86d7f5d3SJohn Marino 	dev_close(dev);
136*86d7f5d3SJohn Marino 
137*86d7f5d3SJohn Marino 	return ret;
138*86d7f5d3SJohn Marino }
139*86d7f5d3SJohn Marino 
max_partitions(int major)140*86d7f5d3SJohn Marino int max_partitions(int major)
141*86d7f5d3SJohn Marino {
142*86d7f5d3SJohn Marino 	/* XXX */
143*86d7f5d3SJohn Marino 	return 64;
144*86d7f5d3SJohn Marino }
145*86d7f5d3SJohn Marino 
lvm_type_filter_create(const char * proc,const struct config_node * cn)146*86d7f5d3SJohn Marino struct dev_filter *lvm_type_filter_create(const char *proc,
147*86d7f5d3SJohn Marino 					  const struct config_node *cn)
148*86d7f5d3SJohn Marino {
149*86d7f5d3SJohn Marino 	struct dev_filter *f;
150*86d7f5d3SJohn Marino 
151*86d7f5d3SJohn Marino 	if (!(f = dm_malloc(sizeof(struct dev_filter)))) {
152*86d7f5d3SJohn Marino 		log_error("LVM type filter allocation failed");
153*86d7f5d3SJohn Marino 		return NULL;
154*86d7f5d3SJohn Marino 	}
155*86d7f5d3SJohn Marino 
156*86d7f5d3SJohn Marino 	f->passes_filter = _passes_lvm_type_device_filter;
157*86d7f5d3SJohn Marino 	f->destroy = lvm_type_filter_destroy;
158*86d7f5d3SJohn Marino 	f->private = NULL;
159*86d7f5d3SJohn Marino 
160*86d7f5d3SJohn Marino 	return f;
161*86d7f5d3SJohn Marino }
162*86d7f5d3SJohn Marino 
lvm_type_filter_destroy(struct dev_filter * f)163*86d7f5d3SJohn Marino void lvm_type_filter_destroy(struct dev_filter *f)
164*86d7f5d3SJohn Marino {
165*86d7f5d3SJohn Marino 	dm_free(f);
166*86d7f5d3SJohn Marino 	return;
167*86d7f5d3SJohn Marino }
168