]> sourceware.org Git - lvm2.git/commitdiff
lvcreate should close the initialised snapshot device immediately.
authorAlasdair Kergon <agk@redhat.com>
Fri, 14 Nov 2003 17:55:39 +0000 (17:55 +0000)
committerAlasdair Kergon <agk@redhat.com>
Fri, 14 Nov 2003 17:55:39 +0000 (17:55 +0000)
lib/device/dev-cache.c
lib/device/dev-io.c
lib/device/device.h
tools/lvcreate.c

index 6f896c002bc4b70cd8d123783ed27be5aad1dddb..4da101d38be684d8ac7137a07bd9a1ee557e2d03 100644 (file)
@@ -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)
index e8d272776068b867cf5a0646268e54d5f751a41a..296d82c5ce3c046acb937bf1dc8bc862b0024215 100644 (file)
@@ -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;
index eb3b6ec01dc857f5d5b7b672f732ffbecb78b6e1..a72ca1695523cfd34c29ec6df394a53efc74a97e 100644 (file)
@@ -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)
index 1db141d074f5dcc0fbcd3d064393a0a23630ecc6..27830973a09688a4efef58e827b2be1c0cac1ac8 100644 (file)
@@ -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;
 }
This page took 0.046991 seconds and 5 git commands to generate.