]> sourceware.org Git - lvm2.git/commitdiff
Add lvm_vg_reduce to liblvm2app
authorDave Wysochanski <dwysocha@redhat.com>
Mon, 27 Jul 2009 17:44:29 +0000 (17:44 +0000)
committerDave Wysochanski <dwysocha@redhat.com>
Mon, 27 Jul 2009 17:44:29 +0000 (17:44 +0000)
Extend lvm_vg_write to remove pvs removed in lvm_vg_reduce. The lvm
volume_group internal structure removed_pvs is used for that. The list is
empty afterwards.

Add new test for vg->pvs emptyness to lvm_vg_write to prevent to write empty
vgs. This is needed because of lvm_vg_reduce and lv_vg_create, which creates
empty vgs.

Signed-off-by: Thomas Woerner <twoerner@redhat.com>
Acked-by: Dave Wysochanski <dwysocha@redhat.com>
Author: Dave Wysochanski <dwysocha@redhat.com>

liblvm/.exported_symbols
liblvm/lvm.h
liblvm/lvm_vg.c

index 991142304de5d2458de537c945d861fc59e30781..68edb870eca05373a876675018081d04435544bc 100644 (file)
@@ -21,6 +21,7 @@ lvm_lv_is_active
 lvm_lv_is_suspended
 lvm_vg_create
 lvm_vg_extend
+lvm_vg_reduce
 lvm_vg_set_extent_size
 lvm_vg_write
 lvm_vg_open
index 73ba6d947de45e38581b6cb211afc07ad9def0b2..1247d44b6163bb9fa4376b589f8f26405b8d776f 100644 (file)
@@ -330,6 +330,24 @@ int lvm_vg_close(vg_t *vg);
  */
 int lvm_vg_extend(vg_t *vg, const char *device);
 
+/**
+ * Reduce a VG by removing an unused device.
+ *
+ * This API requires calling lvm_vg_write to commit the change to disk.
+ * After successfully removing a device, use lvm_vg_write to commit the new VG
+ * to disk.  Upon failure, retry the operation or release the VG handle with
+ * lvm_vg_close.
+ *
+ * \param   vg
+ *          VG handle obtained from lvm_vg_create or lvm_vg_open.
+ *
+ * \param   device
+ *          Name of device to remove from VG.
+ *
+ * \return  0 (success) or -1 (failure).
+ */
+int lvm_vg_reduce(vg_t *vg, const char *device);
+
 /**
  * Set the extent size of a VG.
  *
index cd2ef46c20f0a34d92cec6b222af96751254c183..b83e31c974222a4a91e1de5a5f4c33add697aa1d 100644 (file)
@@ -68,6 +68,16 @@ int lvm_vg_extend(vg_t *vg, const char *device)
        return 0;
 }
 
+int lvm_vg_reduce(vg_t *vg, const char *device)
+{
+       if (vg_read_error(vg))
+               return -1;
+
+       if (!vg_reduce(vg, (char *)device))
+               return -1;
+       return 0;
+}
+
 int lvm_vg_set_extent_size(vg_t *vg, uint32_t new_size)
 {
        if (vg_read_error(vg))
@@ -80,15 +90,40 @@ int lvm_vg_set_extent_size(vg_t *vg, uint32_t new_size)
 
 int lvm_vg_write(vg_t *vg)
 {
+       struct pv_list *pvl;
+
        if (vg_read_error(vg))
                return -1;
 
+       if (dm_list_empty(&vg->pvs)) {
+               log_error("Volume group %s does not contain any "
+                         "physical volumes.\n", vg->name);
+               return -1;
+       }
+
+       if (! dm_list_empty(&vg->removed_pvs)) {
+               if (!lock_vol(vg->cmd, VG_ORPHANS, LCK_VG_WRITE)) {
+                       log_error("Can't get lock for orphan PVs");
+                       return 0;
+               }
+       }
+
        if (!archive(vg))
                return -1;
 
        /* Store VG on disk(s) */
        if (!vg_write(vg) || !vg_commit(vg))
                return -1;
+
+       if (! dm_list_empty(&vg->removed_pvs)) {
+               dm_list_iterate_items(pvl, &vg->removed_pvs) {
+                       pv_write_orphan(vg->cmd, pvl->pv);
+                       /* FIXME: do pvremove / label_remove()? */
+               }
+               dm_list_init(&vg->removed_pvs);
+               unlock_vg(vg->cmd, VG_ORPHANS);
+       }
+
        return 0;
 }
 
This page took 0.282686 seconds and 5 git commands to generate.