public inbox for lvm2-cvs@sourceware.org
help / color / mirror / Atom feed
* LVM2 libdm/libdevmapper.h libdm/libdm-common.c ...
@ 2011-12-18 21:56 mornfall
0 siblings, 0 replies; 2+ messages in thread
From: mornfall @ 2011-12-18 21:56 UTC (permalink / raw)
To: lvm-devel, lvm2-cvs
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: mornfall@sourceware.org 2011-12-18 21:56:04
Modified files:
libdm : libdevmapper.h libdm-common.c libdm-config.c
lib/cache : lvmcache.c
lib/commands : toolcontext.c
lib/config : config.c config.h
lib/filters : filter-persistent.c
lib/format_text: import.c
Log message:
Make a cleaner split between config tree and config file functionality. Move
the latter out of libdm.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/libdm/libdevmapper.h.diff?cvsroot=lvm2&r1=1.170&r2=1.171
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/libdm/libdm-common.c.diff?cvsroot=lvm2&r1=1.128&r2=1.129
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/libdm/libdm-config.c.diff?cvsroot=lvm2&r1=1.17&r2=1.18
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/cache/lvmcache.c.diff?cvsroot=lvm2&r1=1.120&r2=1.121
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/commands/toolcontext.c.diff?cvsroot=lvm2&r1=1.143&r2=1.144
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/config/config.c.diff?cvsroot=lvm2&r1=1.110&r2=1.111
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/config/config.h.diff?cvsroot=lvm2&r1=1.39&r2=1.40
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/filters/filter-persistent.c.diff?cvsroot=lvm2&r1=1.51&r2=1.52
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/import.c.diff?cvsroot=lvm2&r1=1.55&r2=1.56
--- LVM2/libdm/libdevmapper.h 2011/12/11 23:18:20 1.170
+++ LVM2/libdm/libdevmapper.h 2011/12/18 21:56:03 1.171
@@ -1321,16 +1321,15 @@
struct dm_config_tree {
struct dm_config_node *root;
struct dm_config_tree *cascade;
+ struct dm_pool *mem;
+ void *custom;
};
-struct dm_config_tree *dm_config_create(const char *filename, int keep_open);
+struct dm_config_tree *dm_config_create(void);
struct dm_config_tree *dm_config_from_string(const char *config_settings);
int dm_config_parse(struct dm_config_tree *cft, const char *start, const char *end);
void *dm_config_get_custom(struct dm_config_tree *cft);
-int dm_config_check_file(struct dm_config_tree *cft, const char **filename, struct stat *info);
-int dm_config_keep_open(struct dm_config_tree *ctf);
-
void dm_config_set_custom(struct dm_config_tree *cft, void *custom);
/*
@@ -1349,9 +1348,6 @@
typedef int (*dm_putline_fn)(const char *line, void *baton);
int dm_config_write_node(const struct dm_config_node *cn, dm_putline_fn putline, void *baton);
-time_t dm_config_timestamp(struct dm_config_tree *cft);
-int dm_config_changed(struct dm_config_tree *cft);
-
struct dm_config_node *dm_config_find_node(struct dm_config_node *cn, const char *path);
int dm_config_has_node(const struct dm_config_node *cn, const char *path);
const char *dm_config_find_str(const struct dm_config_node *cn, const char *path, const char *fail);
--- LVM2/libdm/libdm-common.c 2011/11/18 19:34:03 1.128
+++ LVM2/libdm/libdm-common.c 2011/12/18 21:56:03 1.129
@@ -900,7 +900,7 @@
break; /* no other DEL ops */
}
}
- else if ((type == NODE_RENAME))
+ else if (type == NODE_RENAME)
/*
* Ignore any outstanding operations if renaming it.
*
--- LVM2/libdm/libdm-config.c 2011/12/11 23:18:20 1.17
+++ LVM2/libdm/libdm-config.c 2011/12/18 21:56:03 1.18
@@ -50,17 +50,6 @@
struct dm_pool *mem;
};
-struct cs {
- struct dm_config_tree cft;
- struct dm_pool *mem;
- time_t timestamp;
- off_t st_size;
- char *filename;
- int exists;
- int keep_open; // FIXME AGK Remove this before release
- void *custom; /* LVM uses this for a device pointer */
-};
-
struct output_line {
struct dm_pool *mem;
dm_putline_fn putline;
@@ -100,12 +89,9 @@
return !(*str || (b != e));
}
-/*
- * public interface
- */
-struct dm_config_tree *dm_config_create(const char *filename, int keep_open)
+struct dm_config_tree *dm_config_create()
{
- struct cs *c;
+ struct dm_config_tree *cft;
struct dm_pool *mem = dm_pool_create("config", 10 * 1024);
if (!mem) {
@@ -113,54 +99,31 @@
return 0;
}
- if (!(c = dm_pool_zalloc(mem, sizeof(*c)))) {
+ if (!(cft = dm_pool_zalloc(mem, sizeof(*cft)))) {
log_error("Failed to allocate config tree.");
dm_pool_destroy(mem);
return 0;
}
-
- c->mem = mem;
- c->cft.root = (struct dm_config_node *) NULL;
- c->cft.cascade = NULL;
- c->timestamp = 0;
- c->exists = 0;
- c->keep_open = keep_open;
- c->custom = NULL;
- if (filename &&
- !(c->filename = dm_pool_strdup(c->mem, filename))) {
- log_error("Failed to duplicate filename.");
- dm_pool_destroy(mem);
- return 0;
- }
-
- return &c->cft;
+ cft->root = NULL;
+ cft->cascade = NULL;
+ cft->custom = NULL;
+ cft->mem = mem;
+ return cft;
}
void dm_config_set_custom(struct dm_config_tree *cft, void *custom)
{
- struct cs *c = (struct cs *) cft;
-
- c->custom = custom;
+ cft->custom = custom;
}
void *dm_config_get_custom(struct dm_config_tree *cft)
{
- struct cs *c = (struct cs *) cft;
-
- return c->custom;
-}
-
-int dm_config_keep_open(struct dm_config_tree *cft)
-{
- struct cs *c = (struct cs *) cft;
-
- return c->keep_open;
+ return cft->custom;
}
void dm_config_destroy(struct dm_config_tree *cft)
{
- struct cs *c = (struct cs *) cft;
- dm_pool_destroy(c->mem);
+ dm_pool_destroy(cft->mem);
}
/*
@@ -194,12 +157,11 @@
{
/* TODO? if (start == end) return 1; */
- struct cs *c = (struct cs *) cft;
struct parser *p;
- if (!(p = dm_pool_alloc(c->mem, sizeof(*p))))
+ if (!(p = dm_pool_alloc(cft->mem, sizeof(*p))))
return_0;
- p->mem = c->mem;
+ p->mem = cft->mem;
p->fb = start;
p->fe = end;
p->tb = p->te = p->fb;
@@ -216,7 +178,7 @@
{
struct dm_config_tree *cft;
- if (!(cft = dm_config_create(NULL, 0)))
+ if (!(cft = dm_config_create()))
return_NULL;
if (!dm_config_parse(cft, config_settings, config_settings + strlen(config_settings))) {
@@ -227,88 +189,6 @@
return cft;
}
-/*
- * Doesn't populate filename if the file is empty.
- */
-int dm_config_check_file(struct dm_config_tree *cft, const char **filename, struct stat *info)
-{
- struct cs *c = (struct cs *) cft;
- struct stat _info;
-
- if (!info)
- info = &_info;
-
- if (stat(c->filename, info)) {
- log_sys_error("stat", c->filename);
- c->exists = 0;
- return 0;
- }
-
- if (!S_ISREG(info->st_mode)) {
- log_error("%s is not a regular file", c->filename);
- c->exists = 0;
- return 0;
- }
-
- c->exists = 1;
- c->timestamp = info->st_ctime;
- c->st_size = info->st_size;
-
- if (info->st_size == 0)
- log_verbose("%s is empty", c->filename);
- else if (filename)
- *filename = c->filename;
-
- return 1;
-}
-
-time_t dm_config_timestamp(struct dm_config_tree *cft)
-{
- struct cs *c = (struct cs *) cft;
-
- return c->timestamp;
-}
-
-/*
- * Return 1 if config files ought to be reloaded
- */
-int dm_config_changed(struct dm_config_tree *cft)
-{
- struct cs *c = (struct cs *) cft;
- struct stat info;
-
- if (!c->filename)
- return 0;
-
- if (stat(c->filename, &info) == -1) {
- /* Ignore a deleted config file: still use original data */
- if (errno == ENOENT) {
- if (!c->exists)
- return 0;
- log_very_verbose("Config file %s has disappeared!",
- c->filename);
- goto reload;
- }
- log_sys_error("stat", c->filename);
- log_error("Failed to reload configuration files");
- return 0;
- }
-
- if (!S_ISREG(info.st_mode)) {
- log_error("Configuration file %s is not a regular file",
- c->filename);
- goto reload;
- }
-
- /* Unchanged? */
- if (c->timestamp == info.st_ctime && c->st_size == info.st_size)
- return 0;
-
- reload:
- log_verbose("Detected config file change to %s", c->filename);
- return 1;
-}
-
static int _line_start(struct output_line *outline)
{
if (!dm_pool_begin_object(outline->mem, 128)) {
@@ -1242,24 +1122,22 @@
struct dm_config_node *dm_config_clone_node(struct dm_config_tree *cft, const struct dm_config_node *node, int sib)
{
- struct cs *c = (struct cs *) cft;
- return dm_config_clone_node_with_mem(c->mem, node, sib);
+ return dm_config_clone_node_with_mem(cft->mem, node, sib);
}
struct dm_config_node *dm_config_create_node(struct dm_config_tree *cft, const char *key)
{
- struct cs *c = (struct cs *) cft;
struct dm_config_node *cn;
- if (!(cn = _create_node(c->mem))) {
+ if (!(cn = _create_node(cft->mem))) {
log_error("Failed to create config node.");
return NULL;
}
- if (!(cn->key = dm_pool_strdup(c->mem, key))) {
+ if (!(cn->key = dm_pool_strdup(cft->mem, key))) {
log_error("Failed to create config node's key.");
return NULL;
}
- if (!(cn->v = _create_value(c->mem))) {
+ if (!(cn->v = _create_value(cft->mem))) {
log_error("Failed to create config node's value.");
return NULL;
}
@@ -1272,12 +1150,10 @@
struct dm_config_value *dm_config_create_value(struct dm_config_tree *cft)
{
- struct cs *c = (struct cs *) cft;
- return _create_value(c->mem);
+ return _create_value(cft->mem);
}
struct dm_pool *dm_config_memory(struct dm_config_tree *cft)
{
- struct cs *c = (struct cs *) cft;
- return c->mem;
+ return cft->mem;
}
--- LVM2/lib/cache/lvmcache.c 2011/12/08 23:18:00 1.120
+++ LVM2/lib/cache/lvmcache.c 2011/12/18 21:56:03 1.121
@@ -85,7 +85,7 @@
/* Release also cached config tree */
if (vginfo->cft) {
- destroy_config_tree(vginfo->cft);
+ dm_config_destroy(vginfo->cft);
vginfo->cft = NULL;
}
--- LVM2/lib/commands/toolcontext.c 2011/12/08 21:24:09 1.143
+++ LVM2/lib/commands/toolcontext.c 2011/12/18 21:56:03 1.144
@@ -500,7 +500,7 @@
return 0;
}
- if (!(cfl->cft = dm_config_create(config_file, 0))) {
+ if (!(cfl->cft = config_file_open(config_file, 0))) {
log_error("config_tree allocation failed");
return 0;
}
@@ -512,14 +512,14 @@
goto out;
}
log_sys_error("stat", config_file);
- destroy_config_tree(cfl->cft);
+ config_file_destroy(cfl->cft);
return 0;
}
log_very_verbose("Loading config file: %s", config_file);
- if (!read_config_file(cfl->cft)) {
+ if (!config_file_read(cfl->cft)) {
log_error("Failed to load config file %s", config_file);
- destroy_config_tree(cfl->cft);
+ config_file_destroy(cfl->cft);
return 0;
}
@@ -540,7 +540,7 @@
{
/* No config file if LVM_SYSTEM_DIR is empty */
if (!*cmd->system_dir) {
- if (!(cmd->cft = dm_config_create(NULL, 0))) {
+ if (!(cmd->cft = config_file_open(NULL, 0))) {
log_error("Failed to create config tree");
return 0;
}
@@ -573,7 +573,7 @@
/* Replace temporary duplicate copy of lvm.conf */
if (cft->root) {
- if (!(cft = dm_config_create(NULL, 0))) {
+ if (!(cft = config_file_open(NULL, 0))) {
log_error("Failed to create config tree");
return 0;
}
@@ -602,7 +602,7 @@
struct config_tree_list *cfl;
dm_list_iterate_items(cfl, &cmd->config_files) {
- if (dm_config_changed(cfl->cft))
+ if (config_file_changed(cfl->cft))
return 1;
}
@@ -627,11 +627,11 @@
dm_list_iterate_items(cfl, &cmd->config_files) {
if (cfl->cft == cmd->cft)
cmd->cft = NULL;
- destroy_config_tree(cfl->cft);
+ config_file_destroy(cfl->cft);
}
if (cmd->cft) {
- destroy_config_tree(cmd->cft);
+ config_file_destroy(cmd->cft);
cmd->cft = NULL;
}
@@ -852,7 +852,7 @@
*/
if (load_persistent_cache && !cmd->is_long_lived &&
!stat(dev_cache, &st) &&
- (st.st_ctime > dm_config_timestamp(cmd->cft)) &&
+ (st.st_ctime > config_file_timestamp(cmd->cft)) &&
!persistent_filter_load(f4, NULL))
log_verbose("Failed to load existing device cache from %s",
dev_cache);
--- LVM2/lib/config/config.c 2011/12/12 00:08:23 1.110
+++ LVM2/lib/config/config.c 2011/12/18 21:56:03 1.111
@@ -29,13 +29,128 @@
#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>
+#include <assert.h>
-void destroy_config_tree(struct dm_config_tree *cft)
+struct config_file {
+ time_t timestamp;
+ off_t st_size;
+ char *filename;
+ int exists;
+ int keep_open;
+ struct device *dev;
+};
+
+/*
+ * public interface
+ */
+struct dm_config_tree *config_file_open(const char *filename, int keep_open)
{
- struct device *dev = dm_config_get_custom(cft);
+ struct dm_config_tree *cft = dm_config_create();
+ struct config_file *cf;
+ if (!cft)
+ return NULL;
- if (dev)
- dev_close(dev);
+ cf = dm_pool_zalloc(cft->mem, sizeof(struct config_file));
+ if (!cf) goto fail;
+
+ cf->timestamp = 0;
+ cf->exists = 0;
+ cf->keep_open = keep_open;
+ dm_config_set_custom(cft, cf);
+
+ if (filename &&
+ !(cf->filename = dm_pool_strdup(cft->mem, filename))) {
+ log_error("Failed to duplicate filename.");
+ goto fail;
+ }
+
+ return cft;
+fail:
+ dm_config_destroy(cft);
+ return NULL;
+}
+
+/*
+ * Doesn't populate filename if the file is empty.
+ */
+int config_file_check(struct dm_config_tree *cft, const char **filename, struct stat *info)
+{
+ struct config_file *cf = dm_config_get_custom(cft);
+ struct stat _info;
+
+ if (!info)
+ info = &_info;
+
+ if (stat(cf->filename, info)) {
+ log_sys_error("stat", cf->filename);
+ cf->exists = 0;
+ return 0;
+ }
+
+ if (!S_ISREG(info->st_mode)) {
+ log_error("%s is not a regular file", cf->filename);
+ cf->exists = 0;
+ return 0;
+ }
+
+ cf->exists = 1;
+ cf->timestamp = info->st_ctime;
+ cf->st_size = info->st_size;
+
+ if (info->st_size == 0)
+ log_verbose("%s is empty", cf->filename);
+ else if (filename)
+ *filename = cf->filename;
+
+ return 1;
+}
+
+/*
+ * Return 1 if config files ought to be reloaded
+ */
+int config_file_changed(struct dm_config_tree *cft)
+{
+ struct config_file *cf = dm_config_get_custom(cft);
+ struct stat info;
+
+ if (!cf->filename)
+ return 0;
+
+ if (stat(cf->filename, &info) == -1) {
+ /* Ignore a deleted config file: still use original data */
+ if (errno == ENOENT) {
+ if (!cf->exists)
+ return 0;
+ log_very_verbose("Config file %s has disappeared!",
+ cf->filename);
+ goto reload;
+ }
+ log_sys_error("stat", cf->filename);
+ log_error("Failed to reload configuration files");
+ return 0;
+ }
+
+ if (!S_ISREG(info.st_mode)) {
+ log_error("Configuration file %s is not a regular file",
+ cf->filename);
+ goto reload;
+ }
+
+ /* Unchanged? */
+ if (cf->timestamp == info.st_ctime && cf->st_size == info.st_size)
+ return 0;
+
+ reload:
+ log_verbose("Detected config file change to %s", cf->filename);
+ return 1;
+}
+
+void config_file_destroy(struct dm_config_tree *cft)
+{
+ struct config_file *cf = dm_config_get_custom(cft);
+
+ if (cf && cf->dev)
+ dev_close(cf->dev);
dm_config_destroy(cft);
}
@@ -74,9 +189,9 @@
return 0;
}
-int read_config_fd(struct dm_config_tree *cft, struct device *dev,
- off_t offset, size_t size, off_t offset2, size_t size2,
- checksum_fn_t checksum_fn, uint32_t checksum)
+int config_file_read_fd(struct dm_config_tree *cft, struct device *dev,
+ off_t offset, size_t size, off_t offset2, size_t size2,
+ checksum_fn_t checksum_fn, uint32_t checksum)
{
const char *fb, *fe;
int r = 0;
@@ -137,40 +252,46 @@
return r;
}
-int read_config_file(struct dm_config_tree *cft)
+int config_file_read(struct dm_config_tree *cft)
{
const char *filename = NULL;
- struct device *dev = dm_config_get_custom(cft);
+ struct config_file *cf = dm_config_get_custom(cft);
struct stat info;
int r;
- if (!dm_config_check_file(cft, &filename, &info))
+ if (!config_file_check(cft, &filename, &info))
return_0;
/* Nothing to do. E.g. empty file. */
if (!filename)
return 1;
- if (!dev) {
- if (!(dev = dev_create_file(filename, NULL, NULL, 1)))
+ if (!cf->dev) {
+ if (!(cf->dev = dev_create_file(filename, NULL, NULL, 1)))
return_0;
- if (!dev_open_readonly_buffered(dev))
+ if (!dev_open_readonly_buffered(cf->dev))
return_0;
}
- dm_config_set_custom(cft, dev);
- r = read_config_fd(cft, dev, 0, (size_t) info.st_size, 0, 0,
- (checksum_fn_t) NULL, 0);
-
- if (!dm_config_keep_open(cft)) {
- dev_close(dev);
- dm_config_set_custom(cft, NULL);
+ r = config_file_read_fd(cft, cf->dev, 0, (size_t) info.st_size, 0, 0,
+ (checksum_fn_t) NULL, 0);
+
+ if (!cf->keep_open) {
+ dev_close(cf->dev);
+ cf->dev = NULL;
}
return r;
}
+time_t config_file_timestamp(struct dm_config_tree *cft)
+{
+ struct config_file *cf = dm_config_get_custom(cft);
+ assert(cf);
+ return cf->timestamp;
+}
+
const struct dm_config_node *find_config_tree_node(struct cmd_context *cmd,
const char *path)
{
--- LVM2/lib/config/config.h 2011/12/11 23:18:20 1.39
+++ LVM2/lib/config/config.h 2011/12/18 21:56:03 1.40
@@ -23,19 +23,23 @@
int override_config_tree_from_string(struct cmd_context *cmd,
const char *config_settings);
-void destroy_config_tree(struct dm_config_tree *cft);
struct dm_config_tree *remove_overridden_config_tree(struct cmd_context *cmd);
typedef uint32_t (*checksum_fn_t) (uint32_t initial, const uint8_t *buf, uint32_t size);
-int read_config_fd(struct dm_config_tree *cft, struct device *dev,
- off_t offset, size_t size, off_t offset2, size_t size2,
- checksum_fn_t checksum_fn, uint32_t checksum);
-
+struct dm_config_tree *config_file_open(const char *filename, int keep_open);
+int config_file_read_fd(struct dm_config_tree *cft, struct device *dev,
+ off_t offset, size_t size, off_t offset2, size_t size2,
+ checksum_fn_t checksum_fn, uint32_t checksum);
+ int config_file_read(struct dm_config_tree *cft);
int config_write(struct dm_config_tree *cft, const char *file,
int argc, char **argv);
+void config_file_destroy(struct dm_config_tree *cft);
+
+time_t config_file_timestamp(struct dm_config_tree *cft);
+int config_file_changed(struct dm_config_tree *cft);
+int config_file_check(struct dm_config_tree *cft, const char **filename, struct stat *info);
-int read_config_file(struct dm_config_tree *cft);
int merge_config_tree(struct cmd_context *cmd, struct dm_config_tree *cft,
struct dm_config_tree *newdata);
--- LVM2/lib/filters/filter-persistent.c 2011/08/30 14:55:16 1.51
+++ LVM2/lib/filters/filter-persistent.c 2011/12/18 21:56:04 1.52
@@ -122,10 +122,10 @@
return_0;
}
- if (!(cft = dm_config_create(pf->file, 1)))
+ if (!(cft = config_file_open(pf->file, 1)))
return_0;
- if (!read_config_file(cft))
+ if (!config_file_read(cft))
goto_out;
_read_array(pf, cft, "persistent_filter_cache/valid_devices",
@@ -147,7 +147,7 @@
if (r && cft_out)
*cft_out = cft;
else
- destroy_config_tree(cft);
+ config_file_destroy(cft);
return r;
}
@@ -271,7 +271,7 @@
fcntl_unlock_file(lockfd);
if (cft)
- destroy_config_tree(cft);
+ config_file_destroy(cft);
return r;
}
--- LVM2/lib/format_text/import.c 2011/08/30 14:55:17 1.55
+++ LVM2/lib/format_text/import.c 2011/12/18 21:56:04 1.56
@@ -49,12 +49,12 @@
_init_text_import();
- if (!(cft = dm_config_create(NULL, 0)))
+ if (!(cft = config_file_open(NULL, 0)))
return_NULL;
- if ((!dev && !read_config_file(cft)) ||
- (dev && !read_config_fd(cft, dev, offset, size,
- offset2, size2, checksum_fn, checksum)))
+ if ((!dev && !config_file_read(cft)) ||
+ (dev && !config_file_read_fd(cft, dev, offset, size,
+ offset2, size2, checksum_fn, checksum)))
goto_out;
/*
@@ -72,7 +72,7 @@
}
out:
- destroy_config_tree(cft);
+ config_file_destroy(cft);
return vgname;
}
@@ -94,12 +94,12 @@
*desc = NULL;
*when = 0;
- if (!(cft = dm_config_create(file, 0)))
+ if (!(cft = config_file_open(file, 0)))
return_NULL;
- if ((!dev && !read_config_file(cft)) ||
- (dev && !read_config_fd(cft, dev, offset, size,
- offset2, size2, checksum_fn, checksum))) {
+ if ((!dev && !config_file_read(cft)) ||
+ (dev && !config_file_read_fd(cft, dev, offset, size,
+ offset2, size2, checksum_fn, checksum))) {
log_error("Couldn't read volume group metadata.");
goto out;
}
@@ -119,7 +119,7 @@
}
out:
- destroy_config_tree(cft);
+ config_file_destroy(cft);
return vg;
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* LVM2 libdm/libdevmapper.h libdm/libdm-common.c ...
@ 2009-08-06 15:04 prajnoha
0 siblings, 0 replies; 2+ messages in thread
From: prajnoha @ 2009-08-06 15:04 UTC (permalink / raw)
To: lvm-devel, lvm2-cvs
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: prajnoha@sourceware.org 2009-08-06 15:04:30
Modified files:
libdm : libdevmapper.h libdm-common.c
tools : dmsetup.c
Log message:
Add 'udevcomplete_all' command for dmsetup. Export DM_COOKIE_MAGIC in libdevmapper.h.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/libdm/libdevmapper.h.diff?cvsroot=lvm2&r1=1.95&r2=1.96
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/libdm/libdm-common.c.diff?cvsroot=lvm2&r1=1.75&r2=1.76
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/dmsetup.c.diff?cvsroot=lvm2&r1=1.120&r2=1.121
--- LVM2/libdm/libdevmapper.h 2009/08/03 18:01:47 1.95
+++ LVM2/libdm/libdevmapper.h 2009/08/06 15:04:30 1.96
@@ -1014,6 +1014,8 @@
void dm_report_field_set_value(struct dm_report_field *field, const void *value,
const void *sortvalue);
+#define DM_COOKIE_MAGIC 0x0D4D
+
int dm_cookie_supported(void);
/*
--- LVM2/libdm/libdm-common.c 2009/08/06 15:00:25 1.75
+++ LVM2/libdm/libdm-common.c 2009/08/06 15:04:30 1.76
@@ -39,7 +39,6 @@
#endif
#define DEV_DIR "/dev/"
-#define COOKIE_MAGIC 0x0D4D
static char _dm_dir[PATH_MAX] = DEV_DIR DM_DIR;
@@ -837,7 +836,7 @@
static int _get_cookie_sem(uint32_t cookie, int *semid)
{
- if (!(cookie >> 16 & COOKIE_MAGIC)) {
+ if (cookie >> 16 != DM_COOKIE_MAGIC) {
log_error("Could not continue to access notification "
"semaphore identified by cookie value %"
PRIu32 " (0x%x). Incorrect cookie prefix.",
@@ -952,7 +951,7 @@
goto bad;
}
- gen_cookie = COOKIE_MAGIC << 16 | base_cookie;
+ gen_cookie = DM_COOKIE_MAGIC << 16 | base_cookie;
if (base_cookie && (gen_semid = semget((key_t) gen_cookie,
1, 0600 | IPC_CREAT | IPC_EXCL)) < 0) {
@@ -1093,6 +1092,9 @@
if (semop(semid, &sb, 1) < 0) {
if (errno == EINTR)
goto repeat_wait;
+ else if (errno == EIDRM)
+ return 1;
+
log_error("Could not set wait state for notification semaphore "
"identified by cookie value %" PRIu32 " (0x%x): %s",
cookie, cookie, strerror(errno));
--- LVM2/tools/dmsetup.c 2009/08/03 18:01:46 1.120
+++ LVM2/tools/dmsetup.c 2009/08/06 15:04:30 1.121
@@ -40,6 +40,12 @@
#include <fcntl.h>
#include <sys/stat.h>
+#ifdef UDEV_SYNC_SUPPORT
+# include <sys/types.h>
+# include <sys/ipc.h>
+# include <sys/sem.h>
+#endif
+
/* FIXME Unused so far */
#undef HAVE_SYS_STATVFS_H
@@ -273,6 +279,34 @@
struct dm_split_name *split_name;
};
+static char _yes_no_prompt(const char *prompt, ...)
+{
+ int c = 0, ret = 0;
+ va_list ap;
+
+ do {
+ if (c == '\n' || !c) {
+ va_start(ap, prompt);
+ vprintf(prompt, ap);
+ va_end(ap);
+ }
+
+ if ((c = getchar()) == EOF) {
+ ret = 'n';
+ break;
+ }
+
+ c = tolower(c);
+ if ((c == 'y') || (c == 'n'))
+ ret = c;
+ } while (!ret || c != '\n');
+
+ if (c != '\n')
+ printf("\n");
+
+ return ret;
+}
+
static struct dm_task *_get_deps_task(int major, int minor)
{
struct dm_task *dmt;
@@ -763,6 +797,62 @@
return dm_udev_complete(cookie);
}
+#ifndef UDEV_SYNC_SUPPORT
+static int _udevcomplete_all(int argc __attribute((unused)), char **argv __attribute((unused)), void *data __attribute((unused)))
+{
+ return 1;
+}
+
+#else
+
+static int _udevcomplete_all(int argc __attribute((unused)), char **argv __attribute((unused)), void *data __attribute((unused)))
+{
+ int max_id, id, sid;
+ struct seminfo sinfo;
+ struct semid_ds sdata;
+ int counter = 0;
+
+ log_warn("This operation will destroy all semaphores with keys "
+ "that have a prefix %" PRIu16 " (0x%" PRIx16 ").",
+ DM_COOKIE_MAGIC, DM_COOKIE_MAGIC);
+
+ if (_yes_no_prompt("Do you really want to continue? [y/n]: ") == 'n') {
+ log_print("Semaphores with keys prefixed by %" PRIu16
+ " (0x%" PRIx16 ") NOT destroyed.",
+ DM_COOKIE_MAGIC, DM_COOKIE_MAGIC);
+ return 1;
+ }
+
+ if ((max_id = semctl(0, 0, SEM_INFO, &sinfo)) < 0) {
+ log_sys_error("semctl", "SEM_INFO");
+ return 0;
+ }
+
+ for (id = 0; id <= max_id; id++) {
+ if ((sid = semctl(id, 0, SEM_STAT, &sdata)) < 0)
+ continue;
+
+ if (sdata.sem_perm.__key >> 16 == DM_COOKIE_MAGIC) {
+ if (semctl(sid, 0, IPC_RMID, 0) < 0) {
+ log_error("Could not cleanup notification semaphore "
+ "with semid %d and cookie value "
+ "%" PRIu32 " (0x%" PRIx32 ")", sid,
+ sdata.sem_perm.__key, sdata.sem_perm.__key);
+ continue;
+ }
+
+ counter++;
+ }
+ }
+
+ log_print("%d semaphores with keys prefixed by "
+ "%" PRIu16 " (0x%" PRIx16 ") destroyed.",
+ counter, DM_COOKIE_MAGIC, DM_COOKIE_MAGIC);
+
+ return 1;
+}
+#endif
+
static int _version(int argc __attribute((unused)), char **argv __attribute((unused)), void *data __attribute((unused)))
{
char version[80];
@@ -2294,6 +2384,7 @@
{"wait", "<device> [<event_nr>]", 0, 2, _wait},
{"mknodes", "[<device>]", 0, 1, _mknodes},
{"udevcomplete", "<cookie>", 1, 1, _udevcomplete},
+ {"udevcomplete_all", "", 0, 0, _udevcomplete_all},
{"targets", "", 0, 0, _targets},
{"version", "", 0, 0, _version},
{"setgeometry", "<device> <cyl> <head> <sect> <start>", 5, 5, _setgeometry},
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-12-18 21:56 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-18 21:56 LVM2 libdm/libdevmapper.h libdm/libdm-common.c mornfall
-- strict thread matches above, loose matches on Subject: below --
2009-08-06 15:04 prajnoha
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).