[lvm-devel] [PATCH 1/2] Update errno codes for vg_read() and lvm2app lvm_vg_open().
Dave Wysochanski
wysochanski at pobox.com
Tue Nov 23 05:01:09 UTC 2010
Update errno codes for vg_read error paths:
- EINVAL: invalid vg_name
- ENOLCK: lock_vol fails
- ENODEV: VG 'vgname' does not exist
- EPROTOTYPE: VG is clustered but locking not clustered
- EROFS: VG is read-only
- EUCLEAN: VG is inconsistent
Signed-off-by: Dave Wysochanski <wysochanski at pobox.com>
---
lib/metadata/metadata.c | 23 ++++++++++++++---------
liblvm/lvm2app.h | 8 ++++++++
2 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 61b4600..18917f9 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -3532,7 +3532,8 @@ static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
if ((status & CLUSTERED) &&
(vg_is_clustered(vg)) && !locking_is_clustered()) {
- log_error("Skipping clustered volume group %s", vg->name);
+ log_errno(EPROTOTYPE,
+ "Skipping clustered volume group %s", vg->name);
/* Return because other flags are considered undefined. */
return FAILED_CLUSTERED;
}
@@ -3545,7 +3546,7 @@ static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
if ((status & LVM_WRITE) &&
!(vg->status & LVM_WRITE)) {
- log_error("Volume group %s is read-only", vg->name);
+ log_errno(EROFS, "Volume group %s is read-only", vg->name);
failure |= FAILED_READ_ONLY;
}
@@ -3617,7 +3618,7 @@ static struct volume_group *_vg_lock_and_read(struct cmd_context *cmd, const cha
consistent = 0;
if (!validate_name(vg_name) && !is_orphan_vg(vg_name)) {
- log_error("Volume group name %s has invalid characters",
+ log_errno(EINVAL, "Volume group name %s has invalid characters",
vg_name);
return NULL;
}
@@ -3626,7 +3627,7 @@ static struct volume_group *_vg_lock_and_read(struct cmd_context *cmd, const cha
if (!already_locked && !(misc_flags & READ_WITHOUT_LOCK) &&
!lock_vol(cmd, vg_name, lock_flags)) {
- log_error("Can't get lock for %s", vg_name);
+ log_errno(ENOLCK, "Can't get lock for %s", vg_name);
return _vg_make_handle(cmd, vg, FAILED_LOCKING);
}
@@ -3638,19 +3639,21 @@ static struct volume_group *_vg_lock_and_read(struct cmd_context *cmd, const cha
/* If consistent == 1, we get NULL here if correction fails. */
if (!(vg = vg_read_internal(cmd, vg_name, vgid, &consistent))) {
if (consistent_in && !consistent) {
- log_error("Volume group \"%s\" inconsistent.", vg_name);
+ log_errno(EUCLEAN,
+ "Volume group \"%s\" inconsistent.", vg_name);
failure |= FAILED_INCONSISTENT;
goto_bad;
}
- log_error("Volume group \"%s\" not found", vg_name);
+ log_errno(ENODEV, "Volume group \"%s\" not found", vg_name);
failure |= FAILED_NOTFOUND;
goto_bad;
}
if (vg_is_clustered(vg) && !locking_is_clustered()) {
- log_error("Skipping clustered volume group %s", vg->name);
+ log_errno(EPROTOTYPE,
+ "Skipping clustered volume group %s", vg->name);
failure |= FAILED_CLUSTERED;
goto_bad;
}
@@ -3659,7 +3662,8 @@ static struct volume_group *_vg_lock_and_read(struct cmd_context *cmd, const cha
if (!consistent && !failure) {
vg_release(vg);
if (!(vg = _recover_vg(cmd, vg_name, vgid))) {
- log_error("Recovery of volume group \"%s\" failed.",
+ log_errno(EUCLEAN,
+ "Recovery of volume group \"%s\" failed.",
vg_name);
failure |= FAILED_INCONSISTENT;
goto_bad;
@@ -3681,7 +3685,8 @@ static struct volume_group *_vg_lock_and_read(struct cmd_context *cmd, const cha
if (!cmd->handles_unknown_segments && vg_has_unknown_segments(vg) &&
lock_flags == LCK_VG_WRITE) {
- log_error("Cannot change VG %s with unknown segments in it!",
+ log_errno(EUCLEAN,
+ "Cannot change VG %s with unknown segments in it!",
vg->name);
failure |= FAILED_INCONSISTENT; /* FIXME new failure code here? */
goto_bad;
diff --git a/liblvm/lvm2app.h b/liblvm/lvm2app.h
index d6378ac..86fd6c6 100644
--- a/liblvm/lvm2app.h
+++ b/liblvm/lvm2app.h
@@ -466,6 +466,14 @@ const char *lvm_vgname_from_device(lvm_t libh, const char *device);
* Open flags - currently ignored.
*
* \return non-NULL VG handle (success) or NULL (failure).
+ * In the case of a failure, lvm_errno() may be used to retrieve the specific
+ * error. The errno codes for various errors are as follows:
+ * EINVAL: Invalid characters in 'vgname' or 'mode'.
+ * ENOLCK: Unable to obtain VG lock.
+ * ENODEV: Unable to find 'vgname' on system.
+ * EPROTOTYPE: Volume group 'vgname' is clustered but locking not clustered.
+ * EROFS: Volume group 'vgname' is read-only
+ * EUCLEAN: Volume group 'vgname' inconsistent
*/
vg_t lvm_vg_open(lvm_t libh, const char *vgname, const char *mode,
uint32_t flags);
--
1.7.2.2
More information about the lvm-devel
mailing list