All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Resize online
@ 2010-11-01 12:53 Zdenek Kabelac
  2010-11-01 12:53 ` [PATCH 1/3] Return different error value for check of mounted fs Zdenek Kabelac
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Zdenek Kabelac @ 2010-11-01 12:53 UTC (permalink / raw)
  To: lvm-devel

Patchset tries to deal with online resize where we need from
the user to instrument 'lvresize -r' tool to skip fsck part.

Now fsadm tool reports different status code for online mounted
filesystem and updated exec_cmd() is able to pass return status code,
so the new status code is recognized by lvresize and allows
to continue with online resize operation.

Zdenek Kabelac (3):
  Return different error value for check of mounted fs
  Document fsadm script return codes
  Handle new return code from fsadm check

 lib/activate/activate.c |    2 +-
 lib/misc/lvm-exec.c     |   14 ++++++++++++--
 lib/misc/lvm-exec.h     |    4 ++--
 man/fsadm.8.in          |    6 ++++++
 scripts/fsadm.sh        |   14 ++++++++++++--
 tools/lvresize.c        |   20 +++++++++++++-------
 6 files changed, 46 insertions(+), 14 deletions(-)
 mode change 100644 => 100755 scripts/fsadm.sh

-- 
1.7.3.2



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/3] Return different error value for check of mounted fs
  2010-11-01 12:53 [PATCH 0/3] Resize online Zdenek Kabelac
@ 2010-11-01 12:53 ` Zdenek Kabelac
  2010-11-01 12:53 ` [PATCH 2/3] Document fsadm script return codes Zdenek Kabelac
  2010-11-01 12:53 ` [PATCH 3/3] Handle new return code from fsadm check Zdenek Kabelac
  2 siblings, 0 replies; 4+ messages in thread
From: Zdenek Kabelac @ 2010-11-01 12:53 UTC (permalink / raw)
  To: lvm-devel

Patch modifies returns different error value for check requested
for mounted filesystem if such operation is not supported.

Also makes a more consistent  'break'  behavior and return exit code 2
for break inside the fsadm script.

Signed-off-by: Zdenek Kabelac <zkabelac@redhat.com>
---
 scripts/fsadm.sh |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)
 mode change 100644 => 100755 scripts/fsadm.sh

diff --git a/scripts/fsadm.sh b/scripts/fsadm.sh
old mode 100644
new mode 100755
index 945089a..9cee3c2
--- a/scripts/fsadm.sh
+++ b/scripts/fsadm.sh
@@ -23,6 +23,11 @@
 # reiserfs: resize_reiserfs, reiserfstune
 # xfs: xfs_growfs, xfs_info
 #
+# Return values:
+#   0 success
+#   1 error
+#   2 break detected
+#   3 unsupported online filesystem check for given mounted fs
 
 TOOL=fsadm
 
@@ -127,6 +132,8 @@ cleanup() {
 	IFS=$IFS_OLD
 	trap 2
 
+	test "$1" -eq 2 && verbose "Break detected"
+
 	if [ "$DO_LVRESIZE" -eq 2 ]; then
 		# start LVRESIZE with the filesystem modification flag
 		# and allow recursive call of fsadm
@@ -382,7 +389,6 @@ resize() {
 	# if the size parameter is missing use device size
 	#if [ -n "$NEWSIZE" -a $NEWSIZE <
 	test -z "$NEWSIZE" && NEWSIZE=${DEVSIZE}b
-	trap cleanup 2
 	IFS=$NL
 	case "$FSTYPE" in
 	  "ext3"|"ext2"|"ext4") resize_ext $NEWSIZE ;;
@@ -399,7 +405,10 @@ resize() {
 ###################
 check() {
 	detect_fs "$1"
-	detect_mounted && error "Cannot fsck device \"$VOLUME\", filesystem is mounted on $MOUNTED"
+	if detect_mounted ; then
+		verbose "Skipping filesystem check for device \"$VOLUME\" as the filesystem is mounted on $MOUNTED";
+		cleanup 3
+	fi
 	case "$FSTYPE" in
 	  "xfs") dry $XFS_CHECK "$VOLUME" ;;
 	  *)    # check if executed from interactive shell environment
@@ -414,6 +423,7 @@ check() {
 # start point of this script
 # - parsing parameters
 #############################
+trap "cleanup 2" 2
 
 # test if we are not invoked recursively
 test -n "$FSADM_RUNNING" && exit 0
-- 
1.7.3.2



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] Document fsadm script return codes
  2010-11-01 12:53 [PATCH 0/3] Resize online Zdenek Kabelac
  2010-11-01 12:53 ` [PATCH 1/3] Return different error value for check of mounted fs Zdenek Kabelac
@ 2010-11-01 12:53 ` Zdenek Kabelac
  2010-11-01 12:53 ` [PATCH 3/3] Handle new return code from fsadm check Zdenek Kabelac
  2 siblings, 0 replies; 4+ messages in thread
From: Zdenek Kabelac @ 2010-11-01 12:53 UTC (permalink / raw)
  To: lvm-devel


Signed-off-by: Zdenek Kabelac <zkabelac@redhat.com>
---
 man/fsadm.8.in |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/man/fsadm.8.in b/man/fsadm.8.in
index 40e6971..fe3d8d3 100644
--- a/man/fsadm.8.in
+++ b/man/fsadm.8.in
@@ -37,6 +37,12 @@ It tries to use the same API for \fBext2/ext3/ext4\fR,
 or an absolute size using a suffix (in powers of 1024).
 If new_size is not supplied, the whole device is used.
 
+.SH "DIAGNOSTIC"
+Exit status is normally 0. If an error occurs, exit status is 1.
+If a user break occurs, exit status is 2. For check operation requested 
+for mounted filesystem which does not support online filesystem check, 
+exit status is 3.
+
 .SH "EXAMPLES"
 "fsadm \-e \-y resize /dev/vg/test 1000M" tries to resize the filesystem
 on logical volume /dev/vg/test. If /dev/vg/test contains ext2/ext3/ext4
-- 
1.7.3.2



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] Handle new return code from fsadm check
  2010-11-01 12:53 [PATCH 0/3] Resize online Zdenek Kabelac
  2010-11-01 12:53 ` [PATCH 1/3] Return different error value for check of mounted fs Zdenek Kabelac
  2010-11-01 12:53 ` [PATCH 2/3] Document fsadm script return codes Zdenek Kabelac
@ 2010-11-01 12:53 ` Zdenek Kabelac
  2 siblings, 0 replies; 4+ messages in thread
From: Zdenek Kabelac @ 2010-11-01 12:53 UTC (permalink / raw)
  To: lvm-devel

Patch updated  exec_cmd and adds 3rd parameter with pointer for
status value, so caller might examine returned status from exec.
If the passed arguments is NULL, behavior is unmodified.

Signed-off-by: Zdenek Kabelac <zkabelac@redhat.com>
---
 lib/activate/activate.c |    2 +-
 lib/misc/lvm-exec.c     |   14 ++++++++++++--
 lib/misc/lvm-exec.h     |    4 ++--
 tools/lvresize.c        |   20 +++++++++++++-------
 4 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 40c0fde..474b70b 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -425,7 +425,7 @@ int module_present(struct cmd_context *cmd, const char *target_name)
 	argv[1] = module;
 	argv[2] = NULL;
 
-	ret = exec_cmd(cmd, argv);
+	ret = exec_cmd(cmd, argv, NULL);
 #endif
 	return ret;
 }
diff --git a/lib/misc/lvm-exec.c b/lib/misc/lvm-exec.c
index d332aaa..5cad79e 100644
--- a/lib/misc/lvm-exec.c
+++ b/lib/misc/lvm-exec.c
@@ -46,7 +46,7 @@ static char *_verbose_args(const char *const argv[], char *buf, size_t sz)
 /*
  * Execute and wait for external command
  */
-int exec_cmd(struct cmd_context *cmd, const char *const argv[])
+int exec_cmd(struct cmd_context *cmd, const char *const argv[], int *rstatus)
 {
 	pid_t pid;
 	int status;
@@ -71,6 +71,9 @@ int exec_cmd(struct cmd_context *cmd, const char *const argv[])
 		_exit(errno);
 	}
 
+	if (rstatus)
+		*rstatus = -1;
+
 	/* Parent */
 	if (wait4(pid, &status, 0, NULL) != pid) {
 		log_error("wait4 child process %u failed: %s", pid,
@@ -84,9 +87,16 @@ int exec_cmd(struct cmd_context *cmd, const char *const argv[])
 	}
 
 	if (WEXITSTATUS(status)) {
-		log_error("%s failed: %u", argv[0], WEXITSTATUS(status));
+		if (rstatus) {
+			*rstatus = WEXITSTATUS(status);
+			log_verbose("%s failed: %u", argv[0], *rstatus);
+		} else
+			log_error("%s failed: %u", argv[0], WEXITSTATUS(status));
 		return 0;
 	}
 
+	if (rstatus)
+		*rstatus = 0;
+
 	return 1;
 }
diff --git a/lib/misc/lvm-exec.h b/lib/misc/lvm-exec.h
index 6afc3a7..6d984f8 100644
--- a/lib/misc/lvm-exec.h
+++ b/lib/misc/lvm-exec.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.  
- * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2010 Red Hat, Inc. All rights reserved.
  *
  * This file is part of LVM2.
  *
@@ -19,6 +19,6 @@
 #include "lib.h"
 
 struct cmd_context;
-int exec_cmd(struct cmd_context *cmd, const char *const argv[]);
+int exec_cmd(struct cmd_context *cmd, const char *const argv[], int *rstatus);
 
 #endif
diff --git a/tools/lvresize.c b/tools/lvresize.c
index 018dfc2..ca707f4 100644
--- a/tools/lvresize.c
+++ b/tools/lvresize.c
@@ -129,6 +129,7 @@ static int _request_confirmation(struct cmd_context *cmd,
 enum fsadm_cmd_e { FSADM_CMD_CHECK, FSADM_CMD_RESIZE };
 #define FSADM_CMD "fsadm"
 #define FSADM_CMD_MAX_ARGS 6
+#define FSADM_CHECK_FAILS_FOR_MOUNTED 3 /* shell exist status code */
 
 /*
  * FSADM_CMD --dry-run --verbose --force check lv_path
@@ -137,7 +138,8 @@ enum fsadm_cmd_e { FSADM_CMD_CHECK, FSADM_CMD_RESIZE };
 static int _fsadm_cmd(struct cmd_context *cmd,
 		      const struct volume_group *vg,
 		      const struct lvresize_params *lp,
-		      enum fsadm_cmd_e fcmd)
+		      enum fsadm_cmd_e fcmd,
+		      int *status)
 {
 	char lv_path[PATH_MAX];
 	char size_buf[SIZE_BUF];
@@ -177,7 +179,7 @@ static int _fsadm_cmd(struct cmd_context *cmd,
 
 	argv[i] = NULL;
 
-	return exec_cmd(cmd, argv);
+	return exec_cmd(cmd, argv, status);
 }
 
 static int _lvresize_params(struct cmd_context *cmd, int argc, char **argv,
@@ -321,6 +323,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	struct lv_segment *seg, *uninitialized_var(mirr_seg);
 	uint32_t seg_extents;
 	uint32_t sz, str;
+	int status;
 	struct dm_list *pvh = NULL;
 	int use_policy = arg_count(cmd, use_policies_ARG);
 
@@ -637,13 +640,16 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 
 	if (lp->resizefs) {
 		if (!lp->nofsck &&
-		    !_fsadm_cmd(cmd, vg, lp, FSADM_CMD_CHECK)) {
-			stack;
-			return ECMD_FAILED;
+		    !_fsadm_cmd(cmd, vg, lp, FSADM_CMD_CHECK, &status)) {
+			if (status != FSADM_CHECK_FAILS_FOR_MOUNTED) {
+				stack;
+				return ECMD_FAILED;
+			}
+                        /* some filesystems supports online resize */
 		}
 
 		if ((lp->resize == LV_REDUCE) &&
-		    !_fsadm_cmd(cmd, vg, lp, FSADM_CMD_RESIZE)) {
+		    !_fsadm_cmd(cmd, vg, lp, FSADM_CMD_RESIZE, NULL)) {
 			stack;
 			return ECMD_FAILED;
 		}
@@ -711,7 +717,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	log_print("Logical volume %s successfully resized", lp->lv_name);
 
 	if (lp->resizefs && (lp->resize == LV_EXTEND) &&
-	    !_fsadm_cmd(cmd, vg, lp, FSADM_CMD_RESIZE)) {
+	    !_fsadm_cmd(cmd, vg, lp, FSADM_CMD_RESIZE, NULL)) {
 		stack;
 		return ECMD_FAILED;
 	}
-- 
1.7.3.2



^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-11-01 12:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-11-01 12:53 [PATCH 0/3] Resize online Zdenek Kabelac
2010-11-01 12:53 ` [PATCH 1/3] Return different error value for check of mounted fs Zdenek Kabelac
2010-11-01 12:53 ` [PATCH 2/3] Document fsadm script return codes Zdenek Kabelac
2010-11-01 12:53 ` [PATCH 3/3] Handle new return code from fsadm check Zdenek Kabelac

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.