]> sourceware.org Git - lvm2.git/commitdiff
o Deal with sparse lv arrays (on disk)
authorJoe Thornber <thornber@redhat.com>
Tue, 13 Nov 2001 18:52:52 +0000 (18:52 +0000)
committerJoe Thornber <thornber@redhat.com>
Tue, 13 Nov 2001 18:52:52 +0000 (18:52 +0000)
o  new fn. dev_zero which zero's an area of a device

lib/device/dev-io.c
lib/device/device.h
lib/format1/disk-rep.c
lib/format1/import-export.c
lib/metadata/pv_map.c

index 6ff16e8d4e7770d3ee9632b19ea65a1bf7bb5bf4..1ece40263098ebad6db50ba378018453d3886f46 100644 (file)
 #include <sys/ioctl.h>
 #include <sys/mount.h>
 
+/*
+ * FIXME: all this opening and closing devices is
+ * killing performance.
+ */
+
 int dev_get_size(struct device *dev, uint64_t *size)
 {
        int fd;
@@ -126,3 +131,39 @@ int64_t dev_write(struct device *dev, uint64_t offset,
        close(fd);
        return r;
 }
+
+int dev_zero(struct device *dev, uint64_t offset, int64_t len)
+{
+       int64_t r, s;
+       char buffer[4096];
+       const char *name = dev_name(dev);
+       int fd = open(name, O_WRONLY);
+
+       if (fd < 0) {
+               log_sys_error("open", name);
+               return 0;
+       }
+
+       if (lseek(fd, offset, SEEK_SET) < 0) {
+               log_sys_error("lseek", name);
+               return 0;
+       }
+
+       memset(buffer, 0, sizeof(buffer));
+       while (1) {
+               s = len > sizeof(buffer) ? sizeof(buffer) : len;
+               r = _write(fd, buffer, s);
+
+               if (r <= 0)
+                       break;
+
+               len -= r;
+               if (!len) {
+                       r = 1;
+                       break;
+               }
+       }
+
+       close(fd);
+       return r;
+}
index e690b979ca95775cbee3f99d67ee4212fd980f7f..cdea303183c42d4e29121b038ab29d2919912ee0 100644 (file)
@@ -29,6 +29,7 @@ int64_t dev_read(struct device *dev,
                 uint64_t offset, int64_t len, void *buffer);
 int64_t dev_write(struct device *dev,
                  uint64_t offset, int64_t len, void *buffer);
+int dev_zero(struct device *dev, uint64_t offset, int64_t len);
 
 static inline const char *dev_name(struct device *dev) {
        return list_item(dev->aliases.n, struct str_list)->str;
index 7a590af80f7e1edbc7131fc41da9ce6ed95d0ef3..f06ece0bec04a77f3176265d51cb68118241f2fe 100644 (file)
@@ -179,25 +179,19 @@ static int _read_uuids(struct disk_list *data)
        return 1;
 }
 
-static int _check_lvd(struct lv_disk *lvd)
+static inline int _check_lvd(struct lv_disk *lvd)
 {
-       /* FIXME: add more checks */
-       if (lvd->lv_name[0] == '\0') {
-               log_debug("lv has no name");
-               return 0;
-       }
-
-       return 1;
+       return !(lvd->lv_name[0] == '\0');
 }
 
 static int _read_lvs(struct disk_list *data)
 {
-       int i;
+       int i, read = 0;
        unsigned long pos;
        struct lvd_list *ll;
+       struct vg_disk *vgd = &data->vgd;
 
-       /* FIXME May be gaps - use lv_max */
-       for(i = 0; i < data->vgd.lv_cur; i++) {
+       for(i = 0; (i < vgd->lv_max) && (read < vgd->lv_cur); i++) {
                pos = data->pvd.lv_on_disk.base + (i * sizeof(struct lv_disk));
                ll = pool_alloc(data->mem, sizeof(*ll));
 
@@ -208,8 +202,9 @@ static int _read_lvs(struct disk_list *data)
                        fail;
 
                if (!_check_lvd(&ll->lvd))
-                       fail;
+                       continue;
 
+               read++;
                list_add(&data->lvds, &ll->list);
        }
 
@@ -391,6 +386,13 @@ static int _write_lvs(struct disk_list *data)
        unsigned long pos;
 
        pos = data->pvd.lv_on_disk.base;
+
+       if (!dev_zero(data->dev, pos, data->pvd.lv_on_disk.size)) {
+               log_err("couldn't zero lv area on device '%s'",
+                       dev_name(data->dev));
+               return 0;
+       }
+
        list_iterate(lvh, &data->lvds) {
                struct lvd_list *ll = list_item(lvh, struct lvd_list);
 
index 84dca77da3187b8ffed10110faf8c337867507a9..cd692258913f837536b40dd4ad15b9f99cd0760b 100644 (file)
@@ -476,7 +476,7 @@ int export_lvs(struct disk_list *dl, struct volume_group *vg,
        struct list *lvh;
        struct lv_list *ll;
        struct lvd_list *lvdl;
-       int lv_num = 1, len;
+       int lv_num = 0, len;
 
        /*
         * setup the pv's extents array
@@ -498,13 +498,14 @@ int export_lvs(struct disk_list *dl, struct volume_group *vg,
 
                export_lv(&lvdl->lvd, vg, &ll->lv, prefix);
                lvdl->lvd.lv_number = lv_num;
-               if (!export_extents(dl, lv_num++, &ll->lv, pv)) {
+               if (!export_extents(dl, lv_num + 1, &ll->lv, pv)) {
                        stack;
                        return 0;
                }
 
                list_add(&dl->lvds, &lvdl->list);
                dl->pvd.lv_cur++;
+               lv_num++;
        }
        return 1;
 }
index 5a3a8de000559a7a920920b9ab8dc03adac228af..9666e1b87b946a3db8bec85f02f8fc8eb218df37 100644 (file)
@@ -29,7 +29,6 @@ static int _create_maps(struct pool *mem, struct list *pvs, struct list *maps)
                }
 
                list_init(&pvm->areas);
-
                list_add(maps, &pvm->list);
        }
 
This page took 0.048015 seconds and 5 git commands to generate.