All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zac Slade <krakrjak@volumehost.com>
To: LVM general discussion and development <linux-lvm@redhat.com>
Subject: Re: [linux-lvm] pvresize patch pending
Date: Fri, 28 Oct 2005 12:55:52 -0500	[thread overview]
Message-ID: <1130522152.436266287429e@webmail.volumehost.com> (raw)
In-Reply-To: <1130519874.43625d4253324@webmail.volumehost.com>

Quoting Alasdair G Kergon <agk@redhat.com>:

> On Fri, Oct 28, 2005 at 12:17:54PM -0500, Zac Slade wrote:
> > Well alright.  Attached is a unified diff I validated that it merges
>
> Not attached:-)
>

Opps.  See previous in thread for patching:

diff -uNdr LVM2.2.01.13/lib/format_text/format-text.c
LVM2.2.01.13.patched/lib/format_text/format-text.c
--- LVM2.2.01.13/lib/format_text/format-text.c  2005-10-28 06:54:22.000000000 -0500
+++ LVM2.2.01.13.patched/lib/format_text/format-text.c  2005-10-28
06:55:13.000000000 -0500
@@ -1059,7 +1059,7 @@
        /* FIXME Test mode don't update cache? */

        if (!(info = lvmcache_add(fmt->labeller, (char *) &pv->id, pv->dev,
-                                 ORPHAN, NULL))) {
+                                 pv->vg_name, NULL))) {
                stack;
                return 0;
        }
diff -uNdr LVM2.2.01.13/tools/Makefile.in LVM2.2.01.13.patched/tools/Makefile.in
--- LVM2.2.01.13/tools/Makefile.in      2005-06-06 12:12:07.000000000 -0500
+++ LVM2.2.01.13.patched/tools/Makefile.in      2005-10-28 05:21:40.000000000 -0500
@@ -39,6 +39,7 @@
        polldaemon.c \
        pvchange.c \
        pvcreate.c \
+       pvresize.c \
        pvdisplay.c \
        pvmove.c \
        pvremove.c \
diff -uNdr LVM2.2.01.13/tools/commands.h LVM2.2.01.13.patched/tools/commands.h
--- LVM2.2.01.13/tools/commands.h       2005-06-06 12:12:07.000000000 -0500
+++ LVM2.2.01.13.patched/tools/commands.h       2005-10-28 05:19:40.000000000 -0500
@@ -486,8 +487,9 @@
    force_ARG, test_ARG, yes_ARG)

 xx(pvresize,
-   "Resize a physical volume in use by a volume group",
-   "Not implemented.  Use pvcreate options.",
+   "Resize (grow only) a physical volume",
+   "pvresize " "\n"
+   "\tPhysicalVolume\n",
 /***
    "pvresize "
    "[-A|--autobackup {y|n}] "
Files LVM2.2.01.13/tools/lvm.o and LVM2.2.01.13.patched/tools/lvm.o differ
diff -uNdr LVM2.2.01.13/tools/pvresize.c LVM2.2.01.13.patched/tools/pvresize.c
--- LVM2.2.01.13/tools/pvresize.c       1969-12-31 18:00:00.000000000 -0600
+++ LVM2.2.01.13.patched/tools/pvresize.c       2005-10-28 06:49:09.000000000 -0500
@@ -0,0 +1,149 @@
+/* pvresize
+ * Currently this code only supports growing a pv
+ * And you can only resize it to the actual size
+ * of the PhysicalVolume.
+ *
+ * The tricky part is making it smaller.
+ *
+ * Code is copyright 2005:
+ * Boyd Smith <bss03@volumehost.com>
+ * Zac Slade <krakrjak@volumehost.com>
+ *
+ */
+
+#include "tools.h"
+
+static int _pvresize_single(struct cmd_context *cmd, struct physical_volume *pv,
+       void *handle)
+{
+    struct volume_group *vg = NULL;
+    struct pv_list *pvl;
+    const char *pv_name = dev_name(pv->dev);
+    char uuid[64];
+
+    if (*pv->vg_name != '\0') {
+       log_verbose("Finding volume group of physical volume \"%s\"",
+               pv_name);
+
+       if (!lock_vol(cmd, pv->vg_name, LCK_VG_WRITE)) {
+           log_error("Can't get lock for %s", pv->vg_name);
+           return ECMD_FAILED;
+       }
+
+       if (!(vg = vg_read(cmd, pv->vg_name, NULL))) {
+           unlock_vg(cmd, pv->vg_name);
+           log_error("Unable to find volume group of \"%s\"",
+                   pv_name);
+           return ECMD_FAILED;
+       }
+
+       if (vg->status & EXPORTED_VG) {
+           unlock_vg(cmd, pv->vg_name);
+           log_error("Volume group \"%s\" is exported", vg->name);
+           return ECMD_FAILED;
+       }
+
+       if (!(vg->status & LVM_WRITE)) {
+           unlock_vg(cmd, pv->vg_name);
+           log_error("Volume group \"%s\" is read-only", vg->name);
+           return ECMD_FAILED;
+       }
+
+       if (!(pvl = find_pv_in_vg(vg, pv_name))) {
+           unlock_vg(cmd, pv->vg_name);
+           log_error
+               ("Unable to find \"%s\" in volume group \"%s\"",
+                pv_name, vg->name);
+           return ECMD_FAILED;
+       }
+       if (arg_count(cmd, uuid_ARG) && lvs_in_vg_activated(vg)) {
+           unlock_vg(cmd, pv->vg_name);
+           log_error("Volume group containing %s has active "
+                   "logical volumes", pv_name);
+           return ECMD_FAILED;
+       }
+       pv = pvl->pv;
+       if (!archive(vg))
+           return ECMD_FAILED;
+    } else {
+       if (!lock_vol(cmd, ORPHAN, LCK_VG_WRITE)) {
+           log_error("Can't get lock for orphans");
+           return ECMD_FAILED;
+       }
+    }
+    uint64_t size =0;
+    struct device *dev;
+
+    if (!(dev = dev_cache_get(pv_name, cmd->filter))) {
+       log_error("%s: Couldn't find device.  Check your filters?",
+               pv_name);
+       goto error;
+    }
+
+    if (!dev_get_size(pv->dev, &size)) {
+       log_error("%s: Couldn't get size.", dev_name(pv->dev));
+       goto error;
+    }
+
+    if (size < pv->size) {
+       log_error("Trying to shrink pv %s to %lu bytes.", dev_name(pv->dev), size);
+       goto error;
+    } else if (size == pv->size) {
+       log_error("Trying to extend pv %s to the same size.", dev_name(pv->dev));
+       goto error;
+    }
+
+    pv->size = size;
+    /* No mda or label changes */
+    if (!(pv->fmt->ops->pv_write(pv->fmt, pv, NULL, -1))) {
+       log_error("Failed to write physical volume \"%s\"", pv_name);
+       goto error;
+    }
+
+    log_verbose("Updating physical volume \"%s\"", pv_name);
+    if (*pv->vg_name != '\0') {
+       if (!vg_write(vg) || !vg_commit(vg)) {
+           unlock_vg(cmd, pv->vg_name);
+           log_error("Failed to store physical volume \"%s\" in "
+                   "volume group \"%s\"", pv_name, vg->name);
+           return 0;
+       }
+       backup(vg);
+       unlock_vg(cmd, pv->vg_name);
+    } else {
+       if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
+           unlock_vg(cmd, ORPHAN);
+           log_error("Failed to store physical volume \"%s\"",
+                   pv_name);
+           return 0;
+       }
+       unlock_vg(cmd, ORPHAN);
+    }
+
+    log_print("Physical volume \"%s\" changed", pv_name);
+    return ECMD_PROCESSED;
+error:
+    unlock_vg(cmd, pv->vg_name);
+    return ECMD_FAILED;
+}
+
+int pvresize(struct cmd_context *cmd, int argc, char **argv)
+{
+    char *pv_name;
+    struct physical_volume *pv;
+    int done;
+    if (argc != 1) {
+       log_error("Currently limited to only One physical volume");
+       return EINVALID_CMD_LINE;
+    }
+    log_verbose("Using physical volume on command line");
+    pv_name = argv[0];
+    /* FIXME Read VG instead - pv_read will fail */
+    if (!(pv = pv_read(cmd, pv_name, NULL, NULL, 1))) {
+       log_error("Failed to read physical volume %s", pv_name);
+    }
+    done = _pvresize_single(cmd, pv, NULL);
+    return (done == 1) ? ECMD_PROCESSED : ECMD_FAILED;
+}
+
+
diff -uNdr LVM2.2.01.13/tools/stub.h LVM2.2.01.13.patched/tools/stub.h
--- LVM2.2.01.13/tools/stub.h   2004-03-30 13:35:43.000000000 -0600
+++ LVM2.2.01.13.patched/tools/stub.h   2005-10-28 05:31:40.000000000 -0500
@@ -19,7 +19,7 @@
 /*int e2fsadm(struct cmd_context *cmd, int argc, char **argv) unimplemented*/
 int lvmsadc(struct cmd_context *cmd, int argc, char **argv) unimplemented
 int lvmsar(struct cmd_context *cmd, int argc, char **argv) unimplemented
-int pvresize(struct cmd_context *cmd, int argc, char **argv) unimplemented
+/*int pvresize(struct cmd_context *cmd, int argc, char **argv) unimplemented*/

 int pvdata(struct cmd_context *cmd, int argc, char **argv) {
        log_error("There's no 'pvdata' command in LVM2.");

Zac Slade
krakrjak@volumehost.com

-------------------------------------------------
This mail sent through IMP: http://horde.org/imp/

  reply	other threads:[~2005-10-28 17:56 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-28 16:59 [linux-lvm] pvresize patch pending Zac Slade
2005-10-28 17:01 ` Alasdair G Kergon
2005-10-28 17:17   ` Zac Slade
2005-10-28 17:55     ` Zac Slade [this message]
2005-10-28 19:27       ` Alasdair G Kergon
2005-10-28 20:14         ` Zak Kipling
2005-10-28 21:21           ` Alasdair G Kergon
2005-10-29  0:37             ` Zac Slade
2005-10-29  1:02               ` Alasdair G Kergon
2005-10-29 20:08                 ` Alasdair G Kergon
2005-11-04  1:53                 ` Zac Slade
2005-10-31  2:42           ` Alasdair G Kergon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1130522152.436266287429e@webmail.volumehost.com \
    --to=krakrjak@volumehost.com \
    --cc=linux-lvm@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.