[linux-lvm] pvresize patch pending
Zac Slade
krakrjak at volumehost.com
Fri Oct 28 17:55:52 UTC 2005
Quoting Alasdair G Kergon <agk at 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 at volumehost.com>
+ * Zac Slade <krakrjak at 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 at volumehost.com
-------------------------------------------------
This mail sent through IMP: http://horde.org/imp/
More information about the linux-lvm
mailing list