From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12726 invoked by alias); 18 Dec 2011 21:56:06 -0000 Received: (qmail 12709 invoked by uid 9699); 18 Dec 2011 21:56:05 -0000 Date: Sun, 18 Dec 2011 21:56:00 -0000 Message-ID: <20111218215605.12707.qmail@sourceware.org> From: mornfall@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2 libdm/libdevmapper.h libdm/libdm-common.c ... Mailing-List: contact lvm2-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: lvm2-cvs-owner@sourceware.org X-SW-Source: 2011-12/txt/msg00030.txt.bz2 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 #include #include +#include -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; }