[dm-devel] device-mapper ./WHATS_NEW dmeventd/.exported_s ...

agk at sourceware.org agk at sourceware.org
Mon Jan 22 15:03:59 UTC 2007


CVSROOT:	/cvs/dm
Module name:	device-mapper
Changes by:	agk at sourceware.org	2007-01-22 15:03:57

Modified files:
	.              : WHATS_NEW 
	dmeventd       : .exported_symbols dmeventd.c 
	                 libdevmapper-event.c libdevmapper-event.h 
	dmsetup        : dmsetup.c 
	lib            : libdevmapper.h libdm-common.c libdm-deptree.c 
	                 libdm-report.c libdm-string.c 
	lib/datastruct : hash.c 
	lib/mm         : dbg_malloc.c 

Log message:
	Add dm_event_handler_[gs]et_timeout functions.
	Streamline dm_report_field_* interface.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.155&r2=1.156
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/.exported_symbols.diff?cvsroot=dm&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.42&r2=1.43
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.c.diff?cvsroot=dm&r1=1.19&r2=1.20
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.h.diff?cvsroot=dm&r1=1.11&r2=1.12
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmsetup/dmsetup.c.diff?cvsroot=dm&r1=1.77&r2=1.78
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdevmapper.h.diff?cvsroot=dm&r1=1.65&r2=1.66
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-common.c.diff?cvsroot=dm&r1=1.42&r2=1.43
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-deptree.c.diff?cvsroot=dm&r1=1.30&r2=1.31
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-report.c.diff?cvsroot=dm&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-string.c.diff?cvsroot=dm&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/datastruct/hash.c.diff?cvsroot=dm&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/mm/dbg_malloc.c.diff?cvsroot=dm&r1=1.9&r2=1.10

--- device-mapper/WHATS_NEW	2007/01/19 17:22:17	1.155
+++ device-mapper/WHATS_NEW	2007/01/22 15:03:56	1.156
@@ -1,5 +1,7 @@
 Version 1.02.16 -
 ===================================
+  Add dm_event_handler_[gs]et_timeout functions.
+  Streamline dm_report_field_* interface.
   Add cmdline debug & version options to dmeventd.
   Add DM_LIB_VERSION definition to configure.h.
   Suppress 'Unrecognised field' error if report field is 'help'.
--- device-mapper/dmeventd/.exported_symbols	2007/01/16 18:03:40	1.8
+++ device-mapper/dmeventd/.exported_symbols	2007/01/22 15:03:57	1.9
@@ -15,3 +15,5 @@
 dm_event_register_handler
 dm_event_unregister_handler
 dm_event_get_registered_device
+dm_event_handler_set_timeout
+dm_event_handler_get_timeout
--- device-mapper/dmeventd/dmeventd.c	2007/01/19 18:08:36	1.42
+++ device-mapper/dmeventd/dmeventd.c	2007/01/22 15:03:57	1.43
@@ -41,6 +41,8 @@
 #ifdef linux
 #  include <malloc.h>
 
+#  define OOM_ADJ_FILE "/proc/self/oom_adj"
+
 /* From linux/oom.h */
 #  define OOM_DISABLE (-17)
 #  define OOM_ADJUST_MIN (-16)
@@ -64,7 +66,6 @@
 #define	UNLINK_THREAD(x)	UNLINK(x)
 
 #define DAEMON_NAME "dmeventd"
-#define OOM_ADJ_FILE "/proc/self/oom_adj"
 
 /*
   Global mutex for thread list access. Has to be held when:
@@ -192,7 +193,7 @@
         va_start(ap,fmt);
 
         time(&P);
-        fprintf(stderr, "dmeventd[%x]: %.15s ", (int)pthread_self(), ctime(&P)+4 );
+        fprintf(stderr, "dmeventd[%p]: %.15s ", (void *) pthread_self(), ctime(&P)+4 );
         vfprintf(stderr, fmt, ap);
 	fprintf(stderr, "\n");
 
@@ -449,14 +450,14 @@
 	dm_lib_exit();
 }
 
-static void _exit_timeout(void *unused)
+static void _exit_timeout(void *unused __attribute((unused)))
 {
 	_timeout_running = 0;
 	pthread_mutex_unlock(&_timeout_mutex);
 }
 
 /* Wake up monitor threads every so often. */
-static void *_timeout_thread(void *unused)
+static void *_timeout_thread(void *unused __attribute((unused)))
 {
 	struct timespec timeout;
 	time_t curr_time;
@@ -468,16 +469,16 @@
 	while (!list_empty(&_timeout_registry)) {
 		struct thread_status *thread;
 
-		timeout.tv_sec = (time_t) -1;
+		timeout.tv_sec = 0;
 		curr_time = time(NULL);
 
 		list_iterate_items_gen(thread, &_timeout_registry, timeout_list) {
-			if (thread->next_time < curr_time) {
+			if (thread->next_time <= curr_time) {
 				thread->next_time = curr_time + thread->timeout;
 				pthread_kill(thread->thread, SIGALRM);
 			}
 
-			if (thread->next_time < timeout.tv_sec)
+			if (thread->next_time < timeout.tv_sec || !timeout.tv_sec)
 				timeout.tv_sec = thread->next_time;
 		}
 
@@ -682,6 +683,23 @@
 	_unlock_mutex();
 }
 
+static struct dm_task *_get_device_status(struct thread_status *ts)
+{
+	struct dm_task *dmt = dm_task_create(DM_DEVICE_STATUS);
+
+	if (!dmt)
+		return NULL;
+
+	dm_task_set_uuid(dmt, ts->device.uuid);
+
+	if (!dm_task_run(dmt)) {
+		dm_task_destroy(dmt);
+		return NULL;
+	}
+
+	return dmt;
+}
+
 /* Device monitoring thread. */
 static void *_monitor_thread(void *arg)
 {
@@ -708,6 +726,18 @@
 		if (wait_error == DM_WAIT_FATAL)
 			break;
 
+		/* Timeout occurred, task is not filled properly.
+		 * We get device status here for processing it in DSO.
+		 */
+		if (wait_error == DM_WAIT_INTR &&
+		    thread->current_events & DM_EVENT_TIMEOUT) {
+			dm_task_destroy(task);
+			task = _get_device_status(thread);
+			/* FIXME: syslog fail here ? */
+			if (!(thread->current_task = task))
+				continue;
+		}
+
 		/*
 		 * We know that wait succeeded and stored a
 		 * pointer to dm_task with device status into task.
@@ -798,8 +828,7 @@
 }
 
 /* Lookup DSO symbols we need. */
-static int _lookup_symbol(void *dl, struct dso_data *data,
-			 void **symbol, const char *name)
+static int _lookup_symbol(void *dl, void **symbol, const char *name)
 {
 	if ((*symbol = dlsym(dl, name)))
 		return 1;
@@ -809,11 +838,11 @@
 
 static int lookup_symbols(void *dl, struct dso_data *data)
 {
-	return _lookup_symbol(dl, data, (void *) &data->process_event,
+	return _lookup_symbol(dl, (void *) &data->process_event,
 			     "process_event") &&
-	    _lookup_symbol(dl, data, (void *) &data->register_device,
+	    _lookup_symbol(dl, (void *) &data->register_device,
 			  "register_device") &&
-	    _lookup_symbol(dl, data, (void *) &data->unregister_device,
+	    _lookup_symbol(dl, (void *) &data->unregister_device,
 			  "unregister_device");
 }
 
@@ -909,7 +938,7 @@
 	   usually means we are so starved on resources that we are
 	   almost as good as dead already... */
 	if (thread_new->events & DM_EVENT_TIMEOUT) {
-		ret = -_register_for_timeout(thread);
+		ret = -_register_for_timeout(thread_new);
 		if (ret) {
 		    _unlock_mutex();
 		    goto out;
@@ -1426,7 +1455,7 @@
 	_unlock_mutex();
 }
 
-static void _sig_alarm(int signum)
+static void _sig_alarm(int signum __attribute((unused)))
 {
 	pthread_testcancel();
 }
@@ -1458,7 +1487,7 @@
  * Set the global variable which the process should
  * be watching to determine when to exit.
  */
-static void _exit_handler(int sig)
+static void _exit_handler(int sig __attribute((unused)))
 {
 	/*
 	 * We exit when '_exit_now' is set.
@@ -1492,6 +1521,7 @@
 	return 0;
 }
 
+#ifdef linux
 /*
  * Protection against OOM killer if kernel supports it
  */
@@ -1519,6 +1549,7 @@
 
 	return 1;
 }
+#endif
 
 static void _daemonize(void)
 {
@@ -1643,8 +1674,10 @@
 	signal(SIGHUP, &_exit_handler);
 	signal(SIGQUIT, &_exit_handler);
 
+#ifdef linux
 	if (!_set_oom_adj(OOM_DISABLE) && !_set_oom_adj(OOM_ADJUST_MIN))
 		syslog(LOG_ERR, "Failed to set oom_adj to protect against OOM killer");
+#endif
 
 	_init_thread_signals();
 
--- device-mapper/dmeventd/libdevmapper-event.c	2007/01/17 14:45:10	1.19
+++ device-mapper/dmeventd/libdevmapper-event.c	2007/01/22 15:03:57	1.20
@@ -38,6 +38,7 @@
 	char *uuid;
 	int major;
 	int minor;
+	uint32_t timeout;
 
 	enum dm_event_mask mask;
 };
@@ -62,6 +63,7 @@
 	dmevh->dso = dmevh->dev_name = dmevh->uuid = NULL;
 	dmevh->major = dmevh->minor = 0;
 	dmevh->mask = 0;
+	dmevh->timeout = 0;
 
 	return dmevh;
 }
@@ -140,6 +142,11 @@
 	dmevh->mask = evmask;
 }
 
+void dm_event_handler_set_timeout(struct dm_event_handler *dmevh, int timeout)
+{
+	dmevh->timeout = timeout;
+}
+
 const char *dm_event_handler_get_dso(const struct dm_event_handler *dmevh)
 {
 	return dmevh->dso;
@@ -165,6 +172,11 @@
 	return dmevh->minor;
 }
 
+int dm_event_handler_get_timeout(const struct dm_event_handler *dmevh)
+{
+	return dmevh->timeout;
+}
+
 enum dm_event_mask dm_event_handler_get_event_mask(const struct dm_event_handler *dmevh)
 {
 	return dmevh->mask;
@@ -484,8 +496,8 @@
 
 /* Handle the event (de)registration call and return negative error codes. */
 static int _do_event(int cmd, struct dm_event_daemon_message *msg,
-		    const char *dso_name, const char *dev_name,
-		    enum dm_event_mask evmask, uint32_t timeout)
+		     const char *dso_name, const char *dev_name,
+		     enum dm_event_mask evmask, uint32_t timeout)
 {
 	int ret;
 	struct dm_event_fifos fifos;
@@ -519,7 +531,7 @@
 	uuid = dm_task_get_uuid(dmt);
 
 	if ((err = _do_event(DM_EVENT_CMD_REGISTER_FOR_EVENT, &msg,
-			     dmevh->dso, uuid, dmevh->mask, 0)) < 0) {
+			     dmevh->dso, uuid, dmevh->mask, dmevh->timeout)) < 0) {
 		log_error("%s: event registration failed: %s",
 			  dm_task_get_name(dmt),
 			  msg.data ? msg.data : strerror(-err));
@@ -549,7 +561,7 @@
 	uuid = dm_task_get_uuid(dmt);
 
 	if ((err = _do_event(DM_EVENT_CMD_UNREGISTER_FOR_EVENT, &msg,
-			    dmevh->dso, uuid, dmevh->mask, 0)) < 0) {
+			    dmevh->dso, uuid, dmevh->mask, dmevh->timeout)) < 0) {
 		log_error("%s: event deregistration failed: %s",
 			  dm_task_get_name(dmt),
 			  msg.data ? msg.data : strerror(-err));
@@ -690,8 +702,9 @@
 
 	if (!device_exists(device_path))
 		return -ENODEV;
+
 	return _do_event(DM_EVENT_CMD_SET_TIMEOUT, &msg,
-			NULL, device_path, 0, timeout);
+			 NULL, device_path, 0, timeout);
 }
 
 int dm_event_get_timeout(const char *device_path, uint32_t *timeout)
--- device-mapper/dmeventd/libdevmapper-event.h	2007/01/19 20:42:09	1.11
+++ device-mapper/dmeventd/libdevmapper-event.h	2007/01/22 15:03:57	1.12
@@ -71,6 +71,7 @@
 
 void dm_event_handler_set_major(struct dm_event_handler *dmevh, int major);
 void dm_event_handler_set_minor(struct dm_event_handler *dmevh, int minor);
+void dm_event_handler_set_timeout(struct dm_event_handler *dmevh, int timeout);
 
 /*
  * Specify mask for events to monitor.
@@ -83,6 +84,7 @@
 const char *dm_event_handler_get_uuid(const struct dm_event_handler *dmevh);
 int dm_event_handler_get_major(const struct dm_event_handler *dmevh);
 int dm_event_handler_get_minor(const struct dm_event_handler *dmevh);
+int dm_event_handler_get_timeout(const struct dm_event_handler *dmevh);
 enum dm_event_mask dm_event_handler_get_event_mask(const struct dm_event_handler *dmevh);
 
 /* FIXME Review interface (what about this next thing?) */
--- device-mapper/dmsetup/dmsetup.c	2007/01/18 17:47:57	1.77
+++ device-mapper/dmsetup/dmsetup.c	2007/01/22 15:03:57	1.78
@@ -1705,7 +1705,8 @@
 /*
  *  create a table for a mapped device using the loop target.
  */
-static int _loop_table(char *table, size_t tlen, char *file, char *dev, off_t off)
+static int _loop_table(char *table, size_t tlen, char *file,
+		       char *dev __attribute((unused)), off_t off)
 {
 	struct stat fbuf;
 	off_t size, sectors;
--- device-mapper/lib/libdevmapper.h	2007/01/18 17:47:58	1.65
+++ device-mapper/lib/libdevmapper.h	2007/01/22 15:03:57	1.66
@@ -687,26 +687,27 @@
 int dm_report_output(struct dm_report *rh);
 void dm_report_free(struct dm_report *rh);
 
-/* report functions for common types */
-int dm_report_field_string(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data);
-int dm_report_field_int32(struct dm_report *rh, struct dm_pool *mem,
-			  struct dm_report_field *field, const void *data);
-int dm_report_field_uint32(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data);
-int dm_report_field_int(struct dm_report *rh, struct dm_pool *mem,
-			struct dm_report_field *field, const void *data);
-int dm_report_field_uint64(struct dm_report *rh, struct dm_pool *mem,
-			struct dm_report_field *field, const void *data);
-
 /*
- * Helper function for custom reporting functions
+ * Report functions are provided for simple data types.
+ * They take care of allocating copies of the data.
  */
+int dm_report_field_string(struct dm_report *rh, struct dm_report_field *field,
+			   const char **data);
+int dm_report_field_int32(struct dm_report *rh, struct dm_report_field *field,
+			  const int32_t *data);
+int dm_report_field_uint32(struct dm_report *rh, struct dm_report_field *field,
+			   const uint32_t *data);
+int dm_report_field_int(struct dm_report *rh, struct dm_report_field *field,
+			const int *data);
+int dm_report_field_uint64(struct dm_report *rh, struct dm_report_field *field,
+			   const uint64_t *data);
 
 /*
- * sortvalue may be NULL if it's the same as value
+ * For custom fields, allocate the data in 'mem' and use
+ * dm_report_field_set_value().
+ * 'sortvalue' may be NULL if it matches 'value'
  */
-void dm_report_field_set_value(struct dm_report_field *field,
-			       const void *value, const void *sortvalue);
+void dm_report_field_set_value(struct dm_report_field *field, const void *value,
+			       const void *sortvalue);
 
 #endif				/* LIB_DEVICE_MAPPER_H */
--- device-mapper/lib/libdm-common.c	2006/05/10 16:23:41	1.42
+++ device-mapper/lib/libdm-common.c	2007/01/22 15:03:57	1.43
@@ -38,8 +38,8 @@
  * Library users can provide their own logging
  * function.
  */
-static void _default_log(int level, const char *file, int line,
-			 const char *f, ...)
+static void _default_log(int level, const char *file __attribute((unused)),
+			 int line __attribute((unused)), const char *f, ...)
 {
 	va_list ap;
 
--- device-mapper/lib/libdm-deptree.c	2007/01/09 19:44:07	1.30
+++ device-mapper/lib/libdm-deptree.c	2007/01/22 15:03:57	1.31
@@ -1212,7 +1212,9 @@
 	return 1;
 }
 
-static int _emit_areas_line(struct dm_task *dmt, struct load_segment *seg, char *params, size_t paramsize, int *pos)
+static int _emit_areas_line(struct dm_task *dmt __attribute((unused)),
+			    struct load_segment *seg, char *params,
+			    size_t paramsize, int *pos)
 {
 	struct seg_area *area;
 	char devbuf[10];
--- device-mapper/lib/libdm-report.c	2007/01/18 22:15:04	1.5
+++ device-mapper/lib/libdm-report.c	2007/01/22 15:03:57	1.6
@@ -99,12 +99,12 @@
  * Data-munging functions to prepare each data type for display and sorting
  */
 
-int dm_report_field_string(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data)
+int dm_report_field_string(struct dm_report *rh,
+			   struct dm_report_field *field, const char **data)
 {
 	char *repstr;
 
-	if (!(repstr = dm_pool_strdup(rh->mem, *(const char **) data))) {
+	if (!(repstr = dm_pool_strdup(rh->mem, *data))) {
 		log_error("dm_report_field_string: dm_pool_strdup failed");
 		return 0;
 	}
@@ -115,10 +115,10 @@
 	return 1;
 }
 
-int dm_report_field_int(struct dm_report *rh, struct dm_pool *mem,
-			struct dm_report_field *field, const void *data)
+int dm_report_field_int(struct dm_report *rh,
+			struct dm_report_field *field, const int *data)
 {
-	const int value = *(const int *) data;
+	const int value = *data;
 	uint64_t *sortval;
 	char *repstr;
 
@@ -144,10 +144,10 @@
 	return 1;
 }
 
-int dm_report_field_uint32(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data)
+int dm_report_field_uint32(struct dm_report *rh,
+			   struct dm_report_field *field, const uint32_t *data)
 {
-	const uint32_t value = *(const uint32_t *) data;
+	const uint32_t value = *data;
 	uint64_t *sortval;
 	char *repstr;
 
@@ -173,10 +173,10 @@
 	return 1;
 }
 
-int dm_report_field_int32(struct dm_report *rh, struct dm_pool *mem,
-			  struct dm_report_field *field, const void *data)
+int dm_report_field_int32(struct dm_report *rh,
+			  struct dm_report_field *field, const int32_t *data)
 {
-	const int32_t value = *(const int32_t *) data;
+	const int32_t value = *data;
 	uint64_t *sortval;
 	char *repstr;
 
@@ -202,10 +202,10 @@
 	return 1;
 }
 
-int dm_report_field_uint64(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data)
+int dm_report_field_uint64(struct dm_report *rh,
+			   struct dm_report_field *field, const uint64_t *data)
 {
-	const int value = *(const uint64_t *) data;
+	const int value = *data;
 	uint64_t *sortval;
 	char *repstr;
 
--- device-mapper/lib/libdm-string.c	2007/01/15 18:21:01	1.6
+++ device-mapper/lib/libdm-string.c	2007/01/22 15:03:57	1.7
@@ -37,7 +37,8 @@
  * Split buffer into NULL-separated words in argv.
  * Returns number of words.
  */
-int dm_split_words(char *buffer, unsigned max, unsigned ignore_comments,
+int dm_split_words(char *buffer, unsigned max,
+		   unsigned ignore_comments __attribute((unused)),
 		   char **argv)
 {
 	unsigned arg;
--- device-mapper/lib/datastruct/hash.c	2006/01/09 20:35:24	1.4
+++ device-mapper/lib/datastruct/hash.c	2007/01/22 15:03:57	1.5
@@ -230,12 +230,14 @@
 	t->num_nodes = 0u;
 }
 
-char *dm_hash_get_key(struct dm_hash_table *t, struct dm_hash_node *n)
+char *dm_hash_get_key(struct dm_hash_table *t __attribute((unused)),
+		      struct dm_hash_node *n)
 {
 	return n->key;
 }
 
-void *dm_hash_get_data(struct dm_hash_table *t, struct dm_hash_node *n)
+void *dm_hash_get_data(struct dm_hash_table *t __attribute((unused)),
+		       struct dm_hash_node *n)
 {
 	return n->data;
 }
--- device-mapper/lib/mm/dbg_malloc.c	2007/01/15 14:39:12	1.9
+++ device-mapper/lib/mm/dbg_malloc.c	2007/01/22 15:03:57	1.10
@@ -231,7 +231,8 @@
 	}
 }
 
-void *dm_malloc_aux(size_t s, const char *file, int line)
+void *dm_malloc_aux(size_t s, const char *file __attribute((unused)),
+		    int line __attribute((unused)))
 {
 	if (s > 50000000) {
 		log_error("Huge memory allocation (size %" PRIsize_t




More information about the dm-devel mailing list