diff --git a/lib/config/config.c b/lib/config/config.c index 5b3a5999a..df287ef96 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -49,7 +49,6 @@ struct config_file { off_t st_size; char *filename; int exists; - int keep_open; struct device *dev; }; @@ -104,7 +103,7 @@ static inline int _is_file_based_config_source(config_source_t source) */ struct dm_config_tree *config_open(config_source_t source, const char *filename, - int keep_open) + int unused) { struct dm_config_tree *cft = dm_config_create(); struct config_source *cs; @@ -124,7 +123,6 @@ struct dm_config_tree *config_open(config_source_t source, goto fail; } - cf->keep_open = keep_open; if (filename && !(cf->filename = dm_pool_strdup(cft->mem, filename))) { log_error("Failed to duplicate filename."); @@ -241,22 +239,8 @@ int config_file_changed(struct dm_config_tree *cft) void config_destroy(struct dm_config_tree *cft) { - struct config_source *cs; - struct config_file *cf; - - if (!cft) - return; - - cs = dm_config_get_custom(cft); - - if (_is_file_based_config_source(cs->type)) { - cf = cs->source.file; - if (cf && cf->dev) - if (!dev_close(cf->dev)) - stack; - } - - dm_config_destroy(cft); + if (cft) + dm_config_destroy(cft); } struct dm_config_tree *config_file_open_and_read(const char *config_file, @@ -611,6 +595,10 @@ int config_file_read(struct dm_config_tree *cft) struct config_source *cs = dm_config_get_custom(cft); struct config_file *cf; struct stat info; + struct device fake_dev = { 0 }; + struct dm_str_list *alias; + int free_fake = 0; + int fd; int r; if (!config_file_check(cft, &filename, &info)) @@ -622,25 +610,43 @@ int config_file_read(struct dm_config_tree *cft) cf = cs->source.file; - if (!cf->dev) { - if (!(cf->dev = dev_create_file(filename, NULL, NULL, 1))) - return_0; + /* fixme: get rid of fake dev and just + add separate code paths for files */ - if (!dev_open_readonly_buffered(cf->dev)) { - dev_destroy_file(cf->dev); - cf->dev = NULL; + if (!cf->dev) { + if (!(alias = zalloc(sizeof(*alias)))) + return_0; + if (!(alias->str = strdup(filename))) { + free(alias); return_0; } + dev_init(&fake_dev); + fake_dev.flags = DEV_REGULAR; + dm_list_add(&fake_dev.aliases, &alias->list); + + if ((fd = open(filename, O_RDONLY, 0777)) < 0) { + log_error("Failed to open config file %s.", filename); + free((void*)alias->str); + free((void*)alias); + return_0; + } + fake_dev.fd = fd; + free_fake = 1; + cf->dev = &fake_dev; } r = config_file_read_fd(cft, cf->dev, DEV_IO_MDA_CONTENT, 0, (size_t) info.st_size, 0, 0, (checksum_fn_t) NULL, 0, 0, 0); - if (!cf->keep_open) { + if (free_fake) { + free((void*)alias->str); + free((void*)alias); + close(fd); + } else { if (!dev_close(cf->dev)) stack; - cf->dev = NULL; } + cf->dev = NULL; return r; } diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c index a36ed9775..602d9cd0e 100644 --- a/lib/device/dev-cache.c +++ b/lib/device/dev-cache.c @@ -94,66 +94,6 @@ void dev_init(struct device *dev) dm_list_init(&dev->wwids); } -void dev_destroy_file(struct device *dev) -{ - if (!(dev->flags & DEV_ALLOCED)) - return; - - free((void *) dm_list_item(dev->aliases.n, struct dm_str_list)->str); - free(dev->aliases.n); - free(dev); -} - -struct device *dev_create_file(const char *filename, struct device *dev, - struct dm_str_list *alias, int use_malloc) -{ - int allocate = !dev; - - if (allocate) { - if (use_malloc) { - if (!(dev = zalloc(sizeof(*dev)))) { - log_error("struct device allocation failed"); - return NULL; - } - if (!(alias = zalloc(sizeof(*alias)))) { - log_error("struct dm_str_list allocation failed"); - free(dev); - return NULL; - } - if (!(alias->str = strdup(filename))) { - log_error("filename strdup failed"); - free(dev); - free(alias); - return NULL; - } - } else { - if (!(dev = _zalloc(sizeof(*dev)))) { - log_error("struct device allocation failed"); - return NULL; - } - if (!(alias = _zalloc(sizeof(*alias)))) { - log_error("struct dm_str_list allocation failed"); - _free(dev); - return NULL; - } - if (!(alias->str = _strdup(filename))) { - log_error("filename strdup failed"); - _free(dev); - return NULL; - } - } - } else if (!(alias->str = strdup(filename))) { - log_error("filename strdup failed"); - return NULL; - } - - dev_init(dev); - dev->flags = DEV_REGULAR | ((use_malloc) ? DEV_ALLOCED : 0); - dm_list_add(&dev->aliases, &alias->list); - - return dev; -} - static struct device *_dev_create(dev_t d) { struct device *dev; diff --git a/lib/device/dev-cache.h b/lib/device/dev-cache.h index 23c58d69d..3cc58d1e3 100644 --- a/lib/device/dev-cache.h +++ b/lib/device/dev-cache.h @@ -34,6 +34,8 @@ struct dev_filter { const char *name; }; +void dev_init(struct device *dev); + struct dm_list *dev_cache_get_dev_list_for_vgid(const char *vgid); struct dm_list *dev_cache_get_dev_list_for_lvid(const char *lvid); diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c index 73c35f9ef..ab00ba677 100644 --- a/lib/device/dev-io.c +++ b/lib/device/dev-io.c @@ -448,11 +448,6 @@ int dev_open_readonly(struct device *dev) return dev_open_flags(dev, O_RDONLY, 1, 0); } -int dev_open_readonly_buffered(struct device *dev) -{ - return dev_open_flags(dev, O_RDONLY, 0, 0); -} - int dev_open_readonly_quiet(struct device *dev) { return dev_open_flags(dev, O_RDONLY, 1, 1); @@ -465,9 +460,6 @@ static void _close(struct device *dev) dev->fd = -1; log_debug_devs("Closed %s", dev_name(dev)); - - if (dev->flags & DEV_ALLOCED) - dev_destroy_file(dev); } static int _dev_close(struct device *dev, int immediate) diff --git a/lib/device/device.h b/lib/device/device.h index ac59934a5..cd2b4e36a 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -220,7 +220,6 @@ int dev_open(struct device *dev); int dev_open_quiet(struct device *dev); int dev_open_flags(struct device *dev, int flags, int direct, int quiet); int dev_open_readonly(struct device *dev); -int dev_open_readonly_buffered(struct device *dev); int dev_open_readonly_quiet(struct device *dev); int dev_close(struct device *dev); int dev_close_immediate(struct device *dev); @@ -230,10 +229,6 @@ const char *dev_name(const struct device *dev); void dev_flush(struct device *dev); -struct device *dev_create_file(const char *filename, struct device *dev, - struct dm_str_list *alias, int use_malloc); -void dev_destroy_file(struct device *dev); - int dev_mpath_init(const char *config_wwids_file); void dev_mpath_exit(void); int parse_vpd_ids(const unsigned char *vpd_data, int vpd_datalen, struct dm_list *ids); diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 18331fae8..07becd16f 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -5762,7 +5762,6 @@ static int _lv_reduce_vdo_discard(struct cmd_context *cmd, if (!dev_discard_max_bytes(cmd->dev_types, dev) || !dev_discard_granularity(cmd->dev_types, dev)) { log_error("%s: max bytes and granularity query fails.", name); - dev_destroy_file(dev); return 0; } @@ -5773,11 +5772,9 @@ static int _lv_reduce_vdo_discard(struct cmd_context *cmd, if (!dev_discard_blocks(dev, ((uint64_t)lp->extents * vg->extent_size) << SECTOR_SHIFT, ((uint64_t)(lv->le_count - lp->extents) * vg->extent_size) << SECTOR_SHIFT)) { log_error("%s: discarding failed.", name); - dev_destroy_file(dev); return 0; } - dev_destroy_file(dev); return 1; }