Don't like ads? PRO users don't see any ads ;-)
Guest

lib32-systemd-tools-194-4: 0001-Reinstate-TIMEOUT...

By: jtts on Oct 25th, 2012  |  syntax: None  |  size: 4.66 KB  |  hits: 5  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. From 2127f99fb43d2ef950e95329ce40bdd5da8b015c Mon Sep 17 00:00:00 2001
  2. From: Dave Reisner <dreisner@archlinux.org>
  3. Date: Fri, 25 May 2012 19:43:24 -0400
  4. Subject: [PATCH] Reinstate TIMEOUT= handling
  5.  
  6. This is mostly to deal with ipw2?00 drivers which have yet to be fixed
  7. in the kernel.
  8. ---
  9.  src/libudev/libudev-device.c  |   19 +++++++++++++++++++
  10.  src/libudev/libudev-private.h |    1 +
  11.  src/udev/udevd.c              |   13 ++++++++++---
  12.  3 files changed, 30 insertions(+), 3 deletions(-)
  13.  
  14. diff --git a/src/libudev/libudev-device.c b/src/libudev/libudev-device.c
  15. index a8277d1..5966189 100644
  16. --- a/src/libudev/libudev-device.c
  17. +++ b/src/libudev/libudev-device.c
  18. @@ -68,6 +68,7 @@ struct udev_device {
  19.          struct udev_list tags_list;
  20.          unsigned long long int seqnum;
  21.          unsigned long long int usec_initialized;
  22. +        int timeout;
  23.          int devlink_priority;
  24.          int refcount;
  25.          dev_t devnum;
  26. @@ -89,6 +90,21 @@ struct udev_device {
  27.          bool db_persist;
  28.  };
  29.  
  30. +int udev_device_get_timeout(struct udev_device *udev_device)
  31. +{
  32. +        return udev_device->timeout;
  33. +}
  34. +
  35. +static int udev_device_set_timeout(struct udev_device *udev_device, int timeout)
  36. +{
  37. +        char num[32];
  38. +
  39. +        udev_device->timeout = timeout;
  40. +        snprintf(num, sizeof(num), "%u", timeout);
  41. +        udev_device_add_property(udev_device, "TIMEOUT", num);
  42. +        return 0;
  43. +}
  44. +
  45.  /**
  46.   * udev_device_get_seqnum:
  47.   * @udev_device: udev device
  48. @@ -362,6 +378,8 @@ void udev_device_add_property_from_string_parse(struct udev_device *udev_device,
  49.  
  50.                  util_strscpyl(path, sizeof(path), TEST_PREFIX "/sys", &property[8], NULL);
  51.                  udev_device_set_syspath(udev_device, path);
  52. +        } else if (strncmp(property, "TIMEOUT=", 8) == 0) {
  53. +                udev_device_set_timeout(udev_device, strtoull(&property[8], NULL, 10));
  54.          } else if (startswith(property, "SUBSYSTEM=")) {
  55.                  udev_device_set_subsystem(udev_device, &property[10]);
  56.          } else if (startswith(property, "DEVTYPE=")) {
  57. @@ -605,6 +623,7 @@ struct udev_device *udev_device_new(struct udev *udev)
  58.          udev_list_init(udev, &udev_device->sysattr_value_list, true);
  59.          udev_list_init(udev, &udev_device->sysattr_list, false);
  60.          udev_list_init(udev, &udev_device->tags_list, true);
  61. +        udev_device->timeout = -1;
  62.          udev_device->watch_handle = -1;
  63.          /* copy global properties */
  64.          udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev))
  65. diff --git a/src/libudev/libudev-private.h b/src/libudev/libudev-private.h
  66. index 4eb4a59..99aefeb 100644
  67. --- a/src/libudev/libudev-private.h
  68. +++ b/src/libudev/libudev-private.h
  69. @@ -70,6 +70,7 @@ const char *udev_device_get_id_filename(struct udev_device *udev_device);
  70.  void udev_device_set_is_initialized(struct udev_device *udev_device);
  71.  int udev_device_add_tag(struct udev_device *udev_device, const char *tag);
  72.  void udev_device_cleanup_tags_list(struct udev_device *udev_device);
  73. +int udev_device_get_timeout(struct udev_device *udev_device);
  74.  unsigned long long udev_device_get_usec_initialized(struct udev_device *udev_device);
  75.  void udev_device_set_usec_initialized(struct udev_device *udev_device, unsigned long long usec_initialized);
  76.  int udev_device_get_devlink_priority(struct udev_device *udev_device);
  77. diff --git a/src/udev/udevd.c b/src/udev/udevd.c
  78. index 0d85960..cd24462 100644
  79. --- a/src/udev/udevd.c
  80. +++ b/src/udev/udevd.c
  81. @@ -384,7 +384,7 @@ out:
  82.          }
  83.  }
  84.  
  85. -static void event_run(struct event *event)
  86. +static void event_run(struct event *event, bool force)
  87.  {
  88.          struct udev_list_node *loop;
  89.  
  90. @@ -410,7 +410,7 @@ static void event_run(struct event *event)
  91.                  return;
  92.          }
  93.  
  94. -        if (children >= children_max) {
  95. +        if (!force && children >= children_max) {
  96.                  if (children_max > 1)
  97.                          log_debug("maximum number (%i) of children reached\n", children);
  98.                  return;
  99. @@ -444,6 +444,13 @@ static int event_queue_insert(struct udev_device *dev)
  100.  
  101.          event->state = EVENT_QUEUED;
  102.          udev_list_node_append(&event->node, &event_list);
  103. +
  104. +        /* run all events with a timeout set immediately */
  105. +        if (udev_device_get_timeout(dev) > 0) {
  106. +                event_run(event, true);
  107. +                return 0;
  108. +        }
  109. +
  110.          return 0;
  111.  }
  112.  
  113. @@ -549,7 +556,7 @@ static void event_queue_start(struct udev *udev)
  114.                  if (is_devpath_busy(event))
  115.                          continue;
  116.  
  117. -                event_run(event);
  118. +                event_run(event, false);
  119.          }
  120.  }
  121.  
  122. --
  123. 1.7.10.2