[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [linux-lvm] LVM1 on top of DRBD



Am Mittwoch, 20. August 2003 15:31 schrieb Heinz J . Mauelshagen:
> On Wed, Aug 20, 2003 at 01:54:36PM +0200, Joachim Banzhaf wrote:
> > Am Mittwoch, 20. August 2003 12:46 schrieb Heinz J . Mauelshagen:

> > > DRBD devices are just some other "local" ones for it.
> >
> > OK, but as i stated, I used them that way. LVM1 just seems to use the
> > lower level devices drbd works on instead. That's what's bothering me.
>
> Ah, missed that point :(
> LVM2 is your better option because it supports device name filters
> in a config file rather than hard-coded ones.

Well, I guess I have to - and hope for the best. Since I thought I had that 
filter implemented in LVM1 (see attached patch) and that did not work, my 
expectations aren't too high...

> > Again, to clear the ground: Should it be possible at all to use pv's on
> > top of drbd devices or am I forced to use drbd devices on top of lv's and
> > loose things like online resize feature?
> >
> > Have you - or anybody reading the list - ever sucessfully used that
> > scenario?
>
> I don't. List ?




--- LVM/1.0.6/tools/lib/lvm_dir_cache.c	2002-04-26 09:52:49.000000000 +0200
+++ LVM/1.0.6/tools/lib/lvm_dir_cache.with.ignore.c	2003-08-20 04:05:46.000000000 +0200
@@ -45,6 +45,7 @@
  *    07/07/2001 - realloc now doubles the size of the cache [JT]
  *    17/12/2001 - make it find loop devices again [HM]
  *    01/22/2002 - fix broken whole device support [HM]
+ *    08/18/2003 - add ignore devices feature for lvm on drbd [jbanzhaf ngi de]
  *
  */
 
@@ -52,6 +53,14 @@
 #include <liblvm.h>
 
 
+#define IGNOREDFILE "/etc/lvmconf/ignored_devices"
+
+typedef struct ignored_dev {
+	char *name;
+	struct ignored_dev *next;
+} ignored_dev_t;
+
+
 static void _scan_partitions();
 static void _scan_devs(int);
 static int _add(char *directory, char *devname);
@@ -59,12 +68,17 @@
 static int _alloc();
 static int _is_present(dev_t rdev);
 static void _collapse_slashes(char *str);
-
+static void _read_ignored();
+static void _free_ignored(ignored_dev_t **node);
+static int _ignore(char *str);
 
 static dir_cache_t *_dir_cache;
 static int _cache_size;
 static int _array_size;
 
+static ignored_dev_t *_ignored_head = NULL;
+
+
 /* devices *not* showing up in /proc/partitions must be scanned anyway */
 static char *_noprocdir[] = {
 	LVM_DIR_PREFIX "loop",
@@ -99,11 +113,13 @@
 	}
 
 	if (!_dir_cache) {
+		_read_ignored();
 		_scan_partitions();
 		if(!_cache_size)
 			_scan_devs( TRUE);
 		else
 			_scan_devs( FALSE);
+		_free_ignored(&_ignored_head);
 	}
 
 	*dir_cache_ptr = _dir_cache;
@@ -255,6 +271,9 @@
 
 	debug_enter("lvm_add_dir_cache -- CALLED with %s\n", devpath);
 
+	if (_ignore(devpath))
+		goto out;
+
 	if (stat(devpath, &stat_b) == -1)
 		goto out;
 
@@ -348,3 +367,78 @@
 
 	*str = *ptr;
 }
+
+static void _add_ignored(char *line, ignored_dev_t ***list_tail)
+{
+	int len;
+	int add = 1;
+	ignored_dev_t *new_node;
+	
+	len = strlen(line);
+	if (line[len - 1] == '\n') {
+		line[len - 1] = '\0';
+		len--;
+	}
+	
+	debug_enter("_add_ignored -- CALLED with %s\n", line);
+	
+	new_node = (ignored_dev_t *)malloc(sizeof(ignored_dev_t));
+	if (new_node) {
+		new_node->name = strdup(line);
+		if (new_node->name) {
+			new_node->next = NULL;
+			**list_tail = new_node;
+			*list_tail = &new_node->next;
+		} else {
+			free(new_node);
+			add = 0;
+		}
+	} else {
+		add = 0;
+	}
+	
+	debug_leave("_add_ignored '%s' -- LEAVING with ret: %s\n", line, add ? "OK" : "ERROR");
+}
+
+static void _read_ignored()
+{
+	FILE	       *f;
+	char	        line[NAME_LEN];
+	ignored_dev_t **list_tail = &_ignored_head;
+	
+	if ( (f=fopen(IGNOREDFILE, "r")) != NULL ) {
+		while(fgets(line, sizeof(line), f)) {
+			if (line[0] != '\0' && line[0] != '\n' && line[0] != '#') {
+				_add_ignored(line, &list_tail);
+			}
+		}	
+		fclose(f);
+	}
+}
+
+static void _free_ignored(ignored_dev_t **curr)
+{
+	if( *curr )
+	{
+		_free_ignored(&(*curr)->next);
+		free((*curr)->name);
+		free(*curr);
+		*curr = NULL;
+	}	
+}
+
+static int _ignore(char *str)
+{
+	int rc = 0;
+	ignored_dev_t *curr = _ignored_head;
+
+	while (curr) {
+		if (!strcmp(str, curr->name)) {
+			rc = 1;
+			break;
+		}
+		curr = curr->next;
+	}
+	return rc;
+}
+

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]