From ee8518bd9caf7feae5c5dfca8a3a03c18e002335 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Fri, 14 Nov 2003 17:55:39 +0000 Subject: [PATCH] lvcreate should close the initialised snapshot device immediately. --- lib/device/dev-cache.c | 17 ++++++++++++++--- lib/device/dev-io.c | 16 +++++++++++++--- lib/device/device.h | 1 + tools/lvcreate.c | 2 +- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c index 6f896c002..4da101d38 100644 --- a/lib/device/dev-cache.c +++ b/lib/device/dev-cache.c @@ -406,11 +406,22 @@ static inline void _check_for_open_devices(void) void dev_cache_exit(void) { - _check_for_open_devices(); - - pool_destroy(_cache.mem); if (_cache.names) + _check_for_open_devices(); + + if (_cache.mem) { + pool_destroy(_cache.mem); + _cache.mem = NULL; + } + + if (_cache.names) { hash_destroy(_cache.names); + _cache.names = NULL; + } + + _cache.devices = NULL; + _cache.has_scanned = 0; + list_init(&_cache.dirs); } int dev_cache_add_dir(const char *path) diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c index e8d272776..296d82c5c 100644 --- a/lib/device/dev-io.c +++ b/lib/device/dev-io.c @@ -155,7 +155,7 @@ static int _aligned_io(struct device_area *where, void *buffer, } if (!block_size) - block_size = SECTOR_SIZE * 2; + block_size = getpagesize(); _widen_region(block_size, where, &widened); @@ -353,7 +353,7 @@ static void _close(struct device *dev) } } -int dev_close(struct device *dev) +static int _dev_close(struct device *dev, int immediate) { if (dev->fd < 0) { log_error("Attempt to close device '%s' " @@ -367,12 +367,22 @@ int dev_close(struct device *dev) #endif /* FIXME lookup device in cache to get vgname and see if it's locked? */ - if (--dev->open_count < 1 && !vgs_locked()) + if (--dev->open_count < 1 && (immediate || !vgs_locked())) _close(dev); return 1; } +int dev_close(struct device *dev) +{ + return _dev_close(dev, 0); +} + +int dev_close_immediate(struct device *dev) +{ + return _dev_close(dev, 1); +} + void dev_close_all(void) { struct list *doh, *doht; diff --git a/lib/device/device.h b/lib/device/device.h index eb3b6ec01..a72ca1695 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -54,6 +54,7 @@ int dev_open(struct device *dev); int dev_open_quiet(struct device *dev); int dev_open_flags(struct device *dev, int flags, int append, int quiet); int dev_close(struct device *dev); +int dev_close_immediate(struct device *dev); void dev_close_all(void); static inline int dev_fd(struct device *dev) diff --git a/tools/lvcreate.c b/tools/lvcreate.c index 1db141d07..27830973a 100644 --- a/tools/lvcreate.c +++ b/tools/lvcreate.c @@ -347,7 +347,7 @@ static int _zero_lv(struct cmd_context *cmd, struct logical_volume *lv) return 0; dev_zero(dev, UINT64_C(0), (size_t) 4096); - dev_close(dev); + dev_close_immediate(dev); return 1; } -- 2.43.5