]> sourceware.org Git - lvm2.git/commitdiff
Remove dmeventd mirror status line word limit
authorAlasdair Kergon <agk@redhat.com>
Thu, 11 Jan 2007 19:52:06 +0000 (19:52 +0000)
committerAlasdair Kergon <agk@redhat.com>
Thu, 11 Jan 2007 19:52:06 +0000 (19:52 +0000)
WHATS_NEW
daemons/dmeventd/plugins/mirror/dmeventd_mirror.c
dmeventd/mirror/dmeventd_mirror.c

index 74a2946db2f4bec1480c06d3048070b6d4008b19..25f5aecbb62d55451d234b10f1824dce783a3e66 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.18 -
 ====================================
+  Remove dmeventd mirror status line word limit.
   Use CFLAGS when linking so mixed sparc builds can supply -m64.
   Prevent permission changes on active mirrors.
   Print warning instead of error message if lvconvert cannot zero volume.
index a76a0f3ea0d8b88650d42e414bfa77d6ca45856e..9492e3f4513aa90eb52f4342df8ff4f405df8d91 100644 (file)
@@ -54,54 +54,51 @@ static pthread_mutex_t _event_mutex = PTHREAD_MUTEX_INITIALIZER;
 static int _get_mirror_event(char *params)
 {
        int i, r = ME_INSYNC;
-
-#define MAX_ARGS 30    /* should support at least 8-way mirrors */
-/* FIXME Remove unnecessary limit.  It tells you how many devices there are - use it! */
-
-       char *args[MAX_ARGS];
+       char **args = NULL;
        char *dev_status_str;
        char *log_status_str;
        char *sync_str;
        char *p;
-       int log_argc, num_devs, num_failures=0;
-
-       /* FIXME Remove unnecessary limit - get num_devs here */
-       if (MAX_ARGS <= dm_split_words(params, MAX_ARGS, 0, args)) {
-               syslog(LOG_ERR, "Unable to split mirror parameters: Arg list too long");
-               return -E2BIG;  /* FIXME Why? Unused */
-       }
+       int log_argc, num_devs;
 
        /*
         * Unused:  0 409600 mirror
         * Used  :  2 253:4 253:5 400/400 1 AA 3 cluster 253:3 A
-       */
-       num_devs = atoi(args[0]);
+        */
+
+       /* number of devices */
+       if (!dm_split_words(params, 1, 0, &p))
+               goto out_parse;
+
+       num_devs = atoi(p);
+       p += strlen(p) + 1;
 
-       /* FIXME *Now* split rest of args */
+       /* devices names + max log parameters */
+       args = dm_malloc((num_devs + 8) * sizeof(char *));
+       if (!args || dm_split_words(p, num_devs + 8, 0, args) < num_devs)
+               goto out_parse;
 
-       dev_status_str = args[3 + num_devs];
-       log_argc = atoi(args[4 + num_devs]);
-       log_status_str = args[4 + num_devs + log_argc];
-       sync_str = args[1 + num_devs];
+       dev_status_str = args[2 + num_devs];
+       log_argc = atoi(args[3 + num_devs]);
+       log_status_str = args[3 + num_devs + log_argc];
+       sync_str = args[num_devs];
 
        /* Check for bad mirror devices */
        for (i = 0; i < num_devs; i++)
                if (dev_status_str[i] == 'D') {
-                       syslog(LOG_ERR, "Mirror device, %s, has failed.\n", args[i+1]);
-                       num_failures++;
+                       syslog(LOG_ERR, "Mirror device, %s, has failed.\n", args[i]);
+                       r = ME_FAILURE;
                }
 
-       /* Check for bad log device */
-       if (log_status_str[0] == 'D') {
+       /* Check for bad disk log device */
+       if (log_argc > 1 && log_status_str[0] == 'D') {
                syslog(LOG_ERR, "Log device, %s, has failed.\n",
-                      args[3 + num_devs + log_argc]);
-               num_failures++;
+                      args[2 + num_devs + log_argc]);
+               r = ME_FAILURE;
        }
 
-       if (num_failures) {
-               r = ME_FAILURE;
+       if (r == ME_FAILURE)
                goto out;
-       }
 
        p = strstr(sync_str, "/");
        if (p) {
@@ -109,16 +106,19 @@ static int _get_mirror_event(char *params)
                if (strcmp(sync_str, p+1))
                        r = ME_IGNORE;
                p[0] = '/';
-       } else {
-               /*
-                * How the hell did we get this?
-                * Might mean all our parameters are screwed.
-                */
-               syslog(LOG_ERR, "Unable to parse sync string.");
-               r = ME_IGNORE;
-       }
- out:
+       } else
+               goto out_parse;
+
+out:
+       if (args)
+               dm_free(args);
        return r;
+       
+out_parse:
+       if (args)
+               dm_free(args);
+       syslog(LOG_ERR, "Unable to parse mirror status string.");
+       return ME_IGNORE;
 }
 
 static void _temporary_log_fn(int level, const char *file,
index a76a0f3ea0d8b88650d42e414bfa77d6ca45856e..9492e3f4513aa90eb52f4342df8ff4f405df8d91 100644 (file)
@@ -54,54 +54,51 @@ static pthread_mutex_t _event_mutex = PTHREAD_MUTEX_INITIALIZER;
 static int _get_mirror_event(char *params)
 {
        int i, r = ME_INSYNC;
-
-#define MAX_ARGS 30    /* should support at least 8-way mirrors */
-/* FIXME Remove unnecessary limit.  It tells you how many devices there are - use it! */
-
-       char *args[MAX_ARGS];
+       char **args = NULL;
        char *dev_status_str;
        char *log_status_str;
        char *sync_str;
        char *p;
-       int log_argc, num_devs, num_failures=0;
-
-       /* FIXME Remove unnecessary limit - get num_devs here */
-       if (MAX_ARGS <= dm_split_words(params, MAX_ARGS, 0, args)) {
-               syslog(LOG_ERR, "Unable to split mirror parameters: Arg list too long");
-               return -E2BIG;  /* FIXME Why? Unused */
-       }
+       int log_argc, num_devs;
 
        /*
         * Unused:  0 409600 mirror
         * Used  :  2 253:4 253:5 400/400 1 AA 3 cluster 253:3 A
-       */
-       num_devs = atoi(args[0]);
+        */
+
+       /* number of devices */
+       if (!dm_split_words(params, 1, 0, &p))
+               goto out_parse;
+
+       num_devs = atoi(p);
+       p += strlen(p) + 1;
 
-       /* FIXME *Now* split rest of args */
+       /* devices names + max log parameters */
+       args = dm_malloc((num_devs + 8) * sizeof(char *));
+       if (!args || dm_split_words(p, num_devs + 8, 0, args) < num_devs)
+               goto out_parse;
 
-       dev_status_str = args[3 + num_devs];
-       log_argc = atoi(args[4 + num_devs]);
-       log_status_str = args[4 + num_devs + log_argc];
-       sync_str = args[1 + num_devs];
+       dev_status_str = args[2 + num_devs];
+       log_argc = atoi(args[3 + num_devs]);
+       log_status_str = args[3 + num_devs + log_argc];
+       sync_str = args[num_devs];
 
        /* Check for bad mirror devices */
        for (i = 0; i < num_devs; i++)
                if (dev_status_str[i] == 'D') {
-                       syslog(LOG_ERR, "Mirror device, %s, has failed.\n", args[i+1]);
-                       num_failures++;
+                       syslog(LOG_ERR, "Mirror device, %s, has failed.\n", args[i]);
+                       r = ME_FAILURE;
                }
 
-       /* Check for bad log device */
-       if (log_status_str[0] == 'D') {
+       /* Check for bad disk log device */
+       if (log_argc > 1 && log_status_str[0] == 'D') {
                syslog(LOG_ERR, "Log device, %s, has failed.\n",
-                      args[3 + num_devs + log_argc]);
-               num_failures++;
+                      args[2 + num_devs + log_argc]);
+               r = ME_FAILURE;
        }
 
-       if (num_failures) {
-               r = ME_FAILURE;
+       if (r == ME_FAILURE)
                goto out;
-       }
 
        p = strstr(sync_str, "/");
        if (p) {
@@ -109,16 +106,19 @@ static int _get_mirror_event(char *params)
                if (strcmp(sync_str, p+1))
                        r = ME_IGNORE;
                p[0] = '/';
-       } else {
-               /*
-                * How the hell did we get this?
-                * Might mean all our parameters are screwed.
-                */
-               syslog(LOG_ERR, "Unable to parse sync string.");
-               r = ME_IGNORE;
-       }
- out:
+       } else
+               goto out_parse;
+
+out:
+       if (args)
+               dm_free(args);
        return r;
+       
+out_parse:
+       if (args)
+               dm_free(args);
+       syslog(LOG_ERR, "Unable to parse mirror status string.");
+       return ME_IGNORE;
 }
 
 static void _temporary_log_fn(int level, const char *file,
This page took 0.044361 seconds and 5 git commands to generate.