Whamcloud - gitweb
LU-541 Fix liblustreapi.c usage of errno and rc.
authorBobi Jam <bobijam@whamcloud.com>
Thu, 28 Jul 2011 10:11:54 +0000 (18:11 +0800)
committerOleg Drokin <green@whamcloud.com>
Mon, 8 Aug 2011 16:57:33 +0000 (12:57 -0400)
* fix liblustreapi.c usage of errno and rc, llapi_xxx() functions should
  return negative value on error.
* enable sanity subtest 65.

Change-Id: I30d172c49b60f6f77ea57c3082d0c68f4c141dea
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Reviewed-on: http://review.whamcloud.com/1155
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: hongchao.zhang <hongchao.zhang@whamcloud.com>
Tested-by: hongchao.zhang <hongchao.zhang@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/lustre/liblustreapi.h
lustre/tests/ll_dirstripe_verify.c
lustre/tests/sanity.sh
lustre/utils/lfs.c
lustre/utils/liblustreapi.c

index 29931f1..bf61daf 100644 (file)
@@ -30,6 +30,9 @@
  * Use is subject to license terms.
  */
 /*
+ * Copyright (c) 2011 Whamcloud, Inc.
+ */
+/*
  * This file is part of Lustre, http://www.lustre.org/
  * Lustre is a trademark of Sun Microsystems, Inc.
  */
@@ -70,7 +73,9 @@ enum llapi_message_level {
 
 /* liblustreapi.c */
 extern void llapi_msg_set_level(int level);
-extern void llapi_err(int level, char *fmt, ...);
+extern void llapi_error(int level, int rc, char *fmt, ...);
+#define llapi_err_noerrno(level, fmt, a...)                             \
+       llapi_error((level) | LLAPI_MSG_NO_ERRNO, 0, fmt, ## a)
 extern void llapi_printf(int level, char *fmt, ...);
 extern int llapi_file_create(const char *name, unsigned long long stripe_size,
                              int stripe_offset, int stripe_count,
index 95071e8..af7d20e 100644 (file)
@@ -30,6 +30,9 @@
  * Use is subject to license terms.
  */
 /*
+ * Copyright (c) 2011 Whamcloud, Inc.
+ */
+/*
  * This file is part of Lustre, http://www.lustre.org/
  * Lustre is a trademark of Sun Microsystems, Inc.
  *
@@ -80,18 +83,19 @@ int read_proc_entry(char *proc_path, char *buf, int len)
 
         fd = open(proc_path, O_RDONLY);
         if (fd == -1) {
-                llapi_err(LLAPI_MSG_ERROR, "open('%s') failed: %s\n",
-                          proc_path);
+                llapi_error(LLAPI_MSG_ERROR, -errno, "open('%s') failed: %s\n",
+                            proc_path);
                 return -2;
         }
 
         rc = read(fd, buf, len - 1);
         if (rc < 0) {
-                llapi_err(LLAPI_MSG_ERROR, "read('%s') failed: %s\n",proc_path);
+                llapi_error(LLAPI_MSG_ERROR, -errno,
+                            "read('%s') failed: %s\n", proc_path);
                 rc = -3;
         } else if (rc == 0) {
-                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                          "read('%s') zero bytes\n", proc_path);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "read('%s') zero bytes\n", proc_path);
                 rc = -4;
         } else if (/* rc > 0 && */ buf[rc - 1] == '\n') {
                 buf[rc - 1] = '\0'; /* Remove trailing newline */
@@ -116,13 +120,13 @@ int compare(struct lov_user_md *lum_dir, struct lov_user_md *lum_file1,
 
         fp = popen("\\ls -d  /proc/fs/lustre/lov/*clilov* | head -1", "r");
         if (!fp) {
-                llapi_err(LLAPI_MSG_ERROR,
-                          "open(lustre/lov/*clilov*) failed: %s\n");
+                llapi_error(LLAPI_MSG_ERROR, -errno,
+                            "open(lustre/lov/*clilov*) failed: %s\n");
                 return 2;
         }
         if (fscanf(fp, "%s", lov_path) < 1) {
-                llapi_err(LLAPI_MSG_ERROR,
-                          "read(lustre/lov/*clilov*) failed: %s\n");
+                llapi_error(LLAPI_MSG_ERROR, -EINVAL,
+                            "read(lustre/lov/*clilov*) failed: %s\n");
                 pclose(fp);
                 return 3;
         }
@@ -163,15 +167,17 @@ int compare(struct lov_user_md *lum_dir, struct lov_user_md *lum_file1,
 
         if (lum_file1->lmm_stripe_count != stripe_count ||
             lum_file1->lmm_stripe_count < min_stripe_count) {
-                llapi_err(LLAPI_MSG_ERROR, "file1 stripe count %d != dir %d\n",
-                          lum_file1->lmm_stripe_count, stripe_count);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "file1 stripe count %d != dir %d\n",
+                                  lum_file1->lmm_stripe_count, stripe_count);
                 return 7;
         }
 
         if (lum_file1->lmm_stripe_count < stripe_count)
-                llapi_err(LLAPI_MSG_WARN, "warning: file1 used fewer stripes"
-                          " %d < dir %d (likely due to bug 4900)\n",
-                          lum_file1->lmm_stripe_count, stripe_count);
+                llapi_err_noerrno(LLAPI_MSG_WARN,
+                                  "warning: file1 used fewer stripes"
+                                  " %d < dir %d (likely due to bug 4900)\n",
+                                  lum_file1->lmm_stripe_count, stripe_count);
 
         if (lum_dir != NULL)
                 stripe_size = (int)lum_dir->lmm_stripe_size;
@@ -185,8 +191,9 @@ int compare(struct lov_user_md *lum_dir, struct lov_user_md *lum_file1,
         }
 
         if (lum_file1->lmm_stripe_size != stripe_size) {
-                llapi_err(LLAPI_MSG_ERROR, "file1 stripe size %d != dir %d\n",
-                          lum_file1->lmm_stripe_size, stripe_size);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "file1 stripe size %d != dir %d\n",
+                                  lum_file1->lmm_stripe_size, stripe_size);
                 return 8;
         }
 
@@ -196,7 +203,7 @@ int compare(struct lov_user_md *lum_dir, struct lov_user_md *lum_file1,
                 for (i = 0; i < stripe_count; i++)
                         if (lum_file1->lmm_objects[i].l_ost_idx !=
                             (stripe_offset + i) % ost_count) {
-                                llapi_err(LLAPI_MSG_WARN,
+                                llapi_err_noerrno(LLAPI_MSG_WARN,
                                           "warning: file1 non-sequential "
                                           "stripe[%d] %d != %d\n", i,
                                           lum_file1->lmm_objects[i].l_ost_idx,
@@ -208,7 +215,8 @@ int compare(struct lov_user_md *lum_dir, struct lov_user_md *lum_file1,
                        ost_count;
                 idx = lum_file2->lmm_objects[0].l_ost_idx;
                 if (idx != next) {
-                        llapi_err(LLAPI_MSG_WARN, "warning: non-sequential "
+                        llapi_err_noerrno(LLAPI_MSG_WARN,
+                                  "warning: non-sequential "
                                   "file1 stripe[%d] %d != file2 stripe[0] %d\n",
                                   stripe, lum_file1->lmm_objects[stripe].l_ost_idx,
                                   idx);
@@ -226,37 +234,37 @@ int main(int argc, char **argv)
         int lum_size;
 
         if (argc < 3) {
-                llapi_err(LLAPI_MSG_ERROR,
-                          "Usage: %s <dirname> <filename1> [filename2]\n",
-                          argv[0]);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                "Usage: %s <dirname> <filename1> [filename2]\n",
+                                argv[0]);
                 return 1;
         }
 
         dir = opendir(argv[1]);
         if (dir == NULL) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR,
-                          "error: %s opendir failed\n", argv[1]);
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "error: %s opendir failed\n", argv[1]);
                 return rc;
         }
 
         lum_size = lov_mds_md_size(MAX_LOV_UUID_COUNT, LOV_MAGIC);
         if ((lum_dir = (struct lov_user_md *)malloc(lum_size)) == NULL) {
-                rc = ENOMEM;
-                llapi_err(LLAPI_MSG_ERROR, "error: can't allocate %d bytes "
-                          "for dir EA", lum_size);
+                rc = -ENOMEM;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "error: can't allocate %d bytes "
+                            "for dir EA", lum_size);
                 goto cleanup;
         }
 
         rc = llapi_file_get_stripe(argv[1], lum_dir);
         if (rc) {
-                if (errno == ENODATA) {
+                if (rc == -ENODATA) {
                         free(lum_dir);
                         lum_dir = NULL;
                 } else {
-                        rc = errno;
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "error: can't get EA for %s\n", argv[1]);
+                        llapi_error(LLAPI_MSG_ERROR, rc,
+                                    "error: can't get EA for %s\n", argv[1]);
                         goto cleanup;
                 }
         }
@@ -264,41 +272,41 @@ int main(int argc, char **argv)
         /* XXX should be llapi_lov_getname() */
         rc = llapi_file_get_lov_uuid(argv[1], &lov_uuid);
         if (rc) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR, "error: can't get lov name for %s\n",
-                          argv[1]);
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "error: can't get lov name for %s\n",
+                            argv[1]);
                 return rc;
         }
 
         if ((lum_file1 = (struct lov_user_md *)malloc(lum_size)) == NULL) {
-                rc = ENOMEM;
-                llapi_err(LLAPI_MSG_ERROR,
-                          "error: can't allocate %d bytes for EA\n", lum_size);
+                rc = -ENOMEM;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "error: can't allocate %d bytes for EA\n",
+                            lum_size);
                 goto cleanup;
         }
 
         rc = llapi_file_get_stripe(argv[2], lum_file1);
         if (rc) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR,
-                          "error: unable to get EA for %s\n", argv[2]);
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "error: unable to get EA for %s\n", argv[2]);
                 goto cleanup;
         }
 
         if (argc == 4) {
                 lum_file2 = (struct lov_user_md *)malloc(lum_size);
                 if (lum_file2 == NULL) {
-                        rc = ENOMEM;
-                        llapi_err(LLAPI_MSG_ERROR, "error: can't allocate %d "
-                                  "bytes for file2 EA\n", lum_size);
+                        rc = -ENOMEM;
+                        llapi_error(LLAPI_MSG_ERROR, rc,
+                                    "error: can't allocate %d "
+                                    "bytes for file2 EA\n", lum_size);
                         goto cleanup;
                 }
 
                 rc = llapi_file_get_stripe(argv[3], lum_file2);
                 if (rc) {
-                        rc = errno;
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "error: can't get EA for %s\n", argv[3]);
+                        llapi_error(LLAPI_MSG_ERROR, rc,
+                                    "error: can't get EA for %s\n", argv[3]);
                         goto cleanup;
                 }
         }
index e5ed50d..750a825 100644 (file)
@@ -9,10 +9,8 @@
 set -e
 
 ONLY=${ONLY:-"$*"}
-# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742
-ALWAYS_EXCEPT="                27u   42a  42b  42c  42d  45   51d   65a   65e   68b  $SANITY_EXCEPT"
-# bug number for skipped test: 2108 9789 3637 9789 3561 5188/5749 1443
-#ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27m 42a 42b 42c 42d 45 68 76"}
+# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 5188
+ALWAYS_EXCEPT="                27u   42a  42b  42c  42d  45   51d   68b  $SANITY_EXCEPT"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
 # Tests that fail on uml
index 39ab666..6010105 100644 (file)
@@ -1307,7 +1307,7 @@ static int lfs_quotacheck(int argc, char **argv)
 
         rc = llapi_quotacheck(mnt, check_type);
         if (rc) {
-                fprintf(stderr, "quotacheck failed: %s\n", strerror(errno));
+                fprintf(stderr, "quotacheck failed: %s\n", strerror(-rc));
                 return rc;
         }
 
@@ -1316,7 +1316,7 @@ static int lfs_quotacheck(int argc, char **argv)
                 if (*obd_type)
                         fprintf(stderr, "%s %s ", obd_type,
                                 obd_uuid2str(&qchk.obd_uuid));
-                fprintf(stderr, "quota check failed: %s\n", strerror(errno));
+                fprintf(stderr, "quota check failed: %s\n", strerror(-rc));
                 return rc;
         }
 
@@ -1324,12 +1324,12 @@ static int lfs_quotacheck(int argc, char **argv)
         qctl.qc_cmd = LUSTRE_Q_QUOTAON;
         qctl.qc_type = check_type;
         rc = llapi_quotactl(mnt, &qctl);
-        if (rc && errno != EALREADY) {
+        if (rc && rc != -EALREADY) {
                 if (*obd_type)
                         fprintf(stderr, "%s %s ", (char *)qctl.obd_type,
                                 obd_uuid2str(&qctl.obd_uuid));
                 fprintf(stderr, "%s turn on quota failed: %s\n",
-                        argv[0], strerror(errno));
+                        argv[0], strerror(-rc));
                 return rc;
         }
 
@@ -1378,9 +1378,9 @@ static int lfs_quotaon(int argc, char **argv)
 
         rc = llapi_quotactl(mnt, &qctl);
         if (rc) {
-                if (errno == EALREADY) {
+                if (rc == -EALREADY) {
                         rc = 0;
-                } else if (errno == ENOENT) {
+                } else if (rc == -ENOENT) {
                         fprintf(stderr, "error: cannot find quota database, "
                                         "make sure you have run quotacheck\n");
                 } else {
@@ -1388,7 +1388,7 @@ static int lfs_quotaon(int argc, char **argv)
                                 fprintf(stderr, "%s %s ", obd_type,
                                         obd_uuid2str(&qctl.obd_uuid));
                         fprintf(stderr, "%s failed: %s\n", argv[0],
-                                strerror(errno));
+                                strerror(-rc));
                 }
         }
 
@@ -1434,14 +1434,14 @@ static int lfs_quotaoff(int argc, char **argv)
 
         rc = llapi_quotactl(mnt, &qctl);
         if (rc) {
-                if (errno == EALREADY) {
+                if (rc == -EALREADY) {
                         rc = 0;
                 } else {
                         if (*obd_type)
                                 fprintf(stderr, "%s %s ", obd_type,
                                         obd_uuid2str(&qctl.obd_uuid));
                         fprintf(stderr, "quotaoff failed: %s\n",
-                                strerror(errno));
+                                strerror(-rc));
                 }
         }
 
@@ -1489,7 +1489,7 @@ static int lfs_quotainv(int argc, char **argv)
 
         rc = llapi_quotactl(mnt, &qctl);
         if (rc) {
-                fprintf(stderr, "quotainv failed: %s\n", strerror(errno));
+                fprintf(stderr, "quotainv failed: %s\n", strerror(-rc));
                 return rc;
         }
 
@@ -1660,7 +1660,7 @@ int lfs_setquota_times(int argc, char **argv)
                 if (*obd_type)
                         fprintf(stderr, "%s %s ", obd_type,
                                 obd_uuid2str(&qctl.obd_uuid));
-                fprintf(stderr, "setquota failed: %s\n", strerror(errno));
+                fprintf(stderr, "setquota failed: %s\n", strerror(-rc));
                 return rc;
         }
 
@@ -1772,7 +1772,7 @@ int lfs_setquota(int argc, char **argv)
                 if (rc < 0) {
                         fprintf(stderr, "error: setquota failed while retrieving"
                                         " current quota settings (%s)\n",
-                                        strerror(errno));
+                                        strerror(-rc));
                         return rc;
                 }
 
@@ -1805,7 +1805,7 @@ int lfs_setquota(int argc, char **argv)
                 if (*obd_type)
                         fprintf(stderr, "%s %s ", obd_type,
                                 obd_uuid2str(&qctl.obd_uuid));
-                fprintf(stderr, "setquota failed: %s\n", strerror(errno));
+                fprintf(stderr, "setquota failed: %s\n", strerror(-rc));
                 return rc;
         }
 
@@ -1936,7 +1936,7 @@ static void print_quota(char *mnt, struct if_quotactl *qctl, int type, int rc)
 
                         if (bover)
                                 diff2str(dqb->dqb_btime, timebuf, now);
-                        if (rc == -1 && errno == EREMOTEIO)
+                        if (rc == -EREMOTEIO)
                                 sprintf(numbuf[0], LPU64"*",
                                         toqb(dqb->dqb_curspace));
                         else
@@ -1997,7 +1997,7 @@ static int print_obd_quota(char *mnt, struct if_quotactl *qctl, int is_mdt)
         rc = llapi_get_obd_count(mnt, &count, is_mdt);
         if (rc) {
                 fprintf(stderr, "can not get %s count: %s\n",
-                        is_mdt ? "mdt": "ost", strerror(errno));
+                        is_mdt ? "mdt": "ost", strerror(-rc));
                 return rc;
         }
 
@@ -2006,7 +2006,7 @@ static int print_obd_quota(char *mnt, struct if_quotactl *qctl, int is_mdt)
                 rc = llapi_quotactl(mnt, qctl);
                 if (rc) {
                         /* It is remote client case. */
-                        if (errno == EOPNOTSUPP) {
+                        if (-rc == EOPNOTSUPP) {
                                 rc = 0;
                                 goto out;
                         }
@@ -2130,20 +2130,20 @@ ug_output:
         mnt = argv[optind];
 
         rc1 = llapi_quotactl(mnt, &qctl);
-        if (rc1 == -1) {
-                switch (errno) {
-                case ESRCH:
+        if (rc1 < 0) {
+                switch (rc1) {
+                case -ESRCH:
                         fprintf(stderr, "%s quotas are not enabled.\n",
                                 qctl.qc_type == USRQUOTA ? "user" : "group");
                         goto out;
-                case EPERM:
+                case -EPERM:
                         fprintf(stderr, "Permission denied.\n");
-                case ENOENT:
+                case -ENOENT:
                         /* We already got a "No such file..." message. */
                         goto out;
                 default:
                         fprintf(stderr, "Unexpected quotactl error: %s\n",
-                                strerror(errno));
+                                strerror(-rc1));
                 }
         }
 
index dc989a7..8625d4b 100644 (file)
@@ -30,6 +30,9 @@
  * Use is subject to license terms.
  */
 /*
+ * Copyright (c) 2011 Whamcloud, Inc.
+ */
+/*
  * This file is part of Lustre, http://www.lustre.org/
  * Lustre is a trademark of Sun Microsystems, Inc.
  *
@@ -129,10 +132,13 @@ void llapi_msg_set_level(int level)
                 llapi_msg_level = level;
 }
 
-void llapi_err(int level, char *fmt, ...)
+/* llapi_error will preserve errno */
+void llapi_error(int level, int _rc, char *fmt, ...)
 {
         va_list args;
-        int tmp_errno = abs(errno);
+        int tmp_errno = errno;
+        /* to protect using errno as _rc argument */
+        int rc = abs(_rc);
 
         if ((level & LLAPI_MSG_MASK) > llapi_msg_level)
                 return;
@@ -144,15 +150,15 @@ void llapi_err(int level, char *fmt, ...)
         if (level & LLAPI_MSG_NO_ERRNO)
                 fprintf(stderr, "\n");
         else
-                fprintf(stderr, ": %s (%d)\n", strerror(tmp_errno), tmp_errno);
+                fprintf(stderr, ": %s (%d)\n", strerror(rc), rc);
+        errno = tmp_errno;
 }
 
-#define llapi_err_noerrno(level, fmt, a...)                             \
-        llapi_err((level) | LLAPI_MSG_NO_ERRNO, fmt, ## a)
-
+/* llapi_printf will preserve errno */
 void llapi_printf(int level, char *fmt, ...)
 {
         va_list args;
+        int tmp_errno = errno;
 
         if ((level & LLAPI_MSG_MASK) > llapi_msg_level)
                 return;
@@ -160,6 +166,7 @@ void llapi_printf(int level, char *fmt, ...)
         va_start(args, fmt);
         vfprintf(stdout, fmt, args);
         va_end(args);
+        errno = tmp_errno;
 }
 
 /**
@@ -219,10 +226,12 @@ int parse_size(char *optarg, unsigned long long *size,
         return 0;
 }
 
+/* XXX: llapi_xxx() functions return negative values upon failure */
+
 int llapi_stripe_limit_check(unsigned long long stripe_size, int stripe_offset,
                              int stripe_count, int stripe_pattern)
 {
-        int page_size;
+        int page_size, rc;
 
         /* 64 KB is the largest common page size I'm aware of (on ia64), but
          * check the local page size just in case. */
@@ -235,28 +244,30 @@ int llapi_stripe_limit_check(unsigned long long stripe_size, int stripe_offset,
                                   LOV_MIN_STRIPE_SIZE);
         }
         if (stripe_size < 0 || (stripe_size & (LOV_MIN_STRIPE_SIZE - 1))) {
-                llapi_err(LLAPI_MSG_ERROR, "error: bad stripe_size %lu, "
-                          "must be an even multiple of %d bytes",
-                          stripe_size, page_size);
-                return -EINVAL;
+                rc = -EINVAL;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: bad stripe_size %lu, "
+                            "must be an even multiple of %d bytes",
+                            stripe_size, page_size);
+                return rc;
         }
         if (stripe_offset < -1 || stripe_offset > MAX_OBD_DEVICES) {
-                errno = -EINVAL;
-                llapi_err(LLAPI_MSG_ERROR, "error: bad stripe offset %d",
-                          stripe_offset);
-                return -EINVAL;
+                rc = -EINVAL;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: bad stripe offset %d",
+                            stripe_offset);
+                return rc;
         }
         if (stripe_count < -1 || stripe_count > LOV_MAX_STRIPE_COUNT) {
-                errno = -EINVAL;
-                llapi_err(LLAPI_MSG_ERROR, "error: bad stripe count %d",
-                          stripe_count);
-                return -EINVAL;
+                rc = -EINVAL;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: bad stripe count %d",
+                            stripe_count);
+                return rc;
         }
         if (stripe_size >= (1ULL << 32)){
-                errno = -EINVAL;
-                llapi_err(LLAPI_MSG_ERROR, "warning: stripe size larger than 4G"
-                          " is not currently supported and would wrap");
-                return -EINVAL;
+                rc = -EINVAL;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "warning: stripe size larger than 4G "
+                            "is not currently supported and would wrap");
+                return rc;
         }
         return 0;
 }
@@ -326,8 +337,9 @@ int llapi_search_ost(char *fsname, char *poolname, char *ostname)
         if (rc)
                 return rc;
 
-        if ((fd = fopen(buffer, "r")) == NULL)
-                return -EINVAL;
+        fd = fopen(buffer, "r");
+        if (fd == NULL)
+                return -errno;
 
         while (fgets(buffer, sizeof(buffer), fd) != NULL) {
                 if (poolname == NULL) {
@@ -366,10 +378,12 @@ int llapi_file_open_pool(const char *name, int flags, int mode,
         if (pool_name != NULL) {
                 char fsname[MAX_OBD_NAME + 1], *ptr;
 
-                if (llapi_search_fsname(name, fsname)) {
-                    llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                              "'%s' is not on a Lustre filesystem", name);
-                    return -EINVAL;
+                rc = llapi_search_fsname(name, fsname);
+                if (rc) {
+                        llapi_error(LLAPI_MSG_ERROR, rc,
+                                    "'%s' is not on a Lustre filesystem",
+                                    name);
+                        return rc;
                 }
 
                 /* in case user gives the full pool name <fsname>.<poolname>,
@@ -379,19 +393,20 @@ int llapi_file_open_pool(const char *name, int flags, int mode,
                         *ptr = '\0';
                         if (strcmp(pool_name, fsname) != 0) {
                                 *ptr = '.';
-                                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                                   "Pool '%s' is not on filesystem '%s'",
-                                   pool_name, fsname);
+                                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                          "Pool '%s' is not on filesystem '%s'",
+                                          pool_name, fsname);
                                 return -EINVAL;
                         }
                         pool_name = ptr + 1;
                 }
 
                 /* Make sure the pool exists and is non-empty */
-                if ((rc = llapi_search_ost(fsname, pool_name, NULL)) < 1) {
-                        llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                                  "pool '%s.%s' %s", fsname, pool_name,
-                                  rc == 0 ? "has no OSTs" : "does not exist");
+                rc = llapi_search_ost(fsname, pool_name, NULL);
+                if (rc < 1) {
+                        llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                          "pool '%s.%s' %s", fsname, pool_name,
+                                          rc == 0 ? "has no OSTs" : "does not exist");
                         return -EINVAL;
                 }
         }
@@ -404,15 +419,14 @@ int llapi_file_open_pool(const char *name, int flags, int mode,
 
         if (fd < 0) {
                 rc = -errno;
-                llapi_err(LLAPI_MSG_ERROR, "unable to open '%s'", name);
+                llapi_error(LLAPI_MSG_ERROR, rc, "unable to open '%s'", name);
                 return rc;
         }
 
-        if ((rc = llapi_stripe_limit_check(stripe_size, stripe_offset,
-                                           stripe_count, stripe_pattern)) != 0){
-                errno = rc;
+        rc = llapi_stripe_limit_check(stripe_size, stripe_offset, stripe_count,
+                                      stripe_pattern);
+        if (rc != 0)
                 goto out;
-        }
 
         /*  Initialize IOCTL striping pattern structure */
         lum.lmm_magic = LOV_USER_MAGIC_V3;
@@ -508,10 +522,10 @@ static int get_root_path(int want, char *fsname, int *outfd, char *path,
         /* get the mount point */
         fp = setmntent(MOUNTED, "r");
         if (fp == NULL) {
-                 llapi_err(LLAPI_MSG_ERROR,
-                           "setmntent(%s) failed: %s:", MOUNTED,
-                           strerror (errno));
-                 return -EIO;
+                rc = -EIO;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "setmntent(%s) failed", MOUNTED);
+                return rc;
         }
         while (1) {
                 if (getmntent_r(fp, &mnt, buf, sizeof(buf)) == NULL)
@@ -562,16 +576,18 @@ static int get_root_path(int want, char *fsname, int *outfd, char *path,
                 if (want & WANT_FD) {
                         fd = open(mntdir, O_RDONLY | O_DIRECTORY | O_NONBLOCK);
                         if (fd < 0) {
-                                perror("open");
                                 rc = -errno;
+                                llapi_error(LLAPI_MSG_ERROR, rc,
+                                            "error opening '%s'", mntdir);
+
                         } else {
                                 *outfd = fd;
                         }
                 }
         } else if (want & WANT_ERROR)
-                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                          "can't find fs root for '%s': %d",
-                          (want & WANT_PATH) ? fsname : path, rc);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "can't find fs root for '%s': %d",
+                                  (want & WANT_PATH) ? fsname : path, rc);
         return rc;
 }
 
@@ -632,10 +648,11 @@ int llapi_search_fsname(const char *pathname, char *fsname)
                         *ptr = '\0';
                         path = realpath(buf, NULL);
                         if (path == NULL) {
-                                llapi_err(LLAPI_MSG_ERROR,
-                                          "pathname '%s' cannot expand",
-                                          pathname);
-                                return -errno;
+                                rc = -errno;
+                                llapi_error(LLAPI_MSG_ERROR, rc,
+                                            "pathname '%s' cannot expand",
+                                            pathname);
+                                return rc;
                         }
                 }
         }
@@ -730,17 +747,19 @@ int llapi_get_poolmembers(const char *poolname, char **members,
 
         rc = poolpath(fsname, NULL, pathname);
         if (rc != 0) {
-                errno = -rc;
-                llapi_err(LLAPI_MSG_ERROR, "Lustre filesystem '%s' not found",
-                          fsname);
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "Lustre filesystem '%s' not found",
+                            fsname);
                 return rc;
         }
 
         llapi_printf(LLAPI_MSG_NORMAL, "Pool: %s.%s\n", fsname, pool);
         sprintf(path, "%s/%s", pathname, pool);
-        if ((fd = fopen(path, "r")) == NULL) {
-                llapi_err(LLAPI_MSG_ERROR, "Cannot open %s", path);
-                return -EINVAL;
+        fd = fopen(path, "r");
+        if (fd == NULL) {
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "Cannot open %s", path);
+                return rc;
         }
 
         rc = 0;
@@ -750,7 +769,8 @@ int llapi_get_poolmembers(const char *poolname, char **members,
                         break;
                 }
                 /* remove '\n' */
-                if ((tmp = strchr(buf, '\n')) != NULL)
+                tmp = strchr(buf, '\n');
+                if (tmp != NULL)
                         *tmp='\0';
                 if (used + strlen(buf) + 1 > buffer_size) {
                         rc = -EOVERFLOW;
@@ -802,17 +822,18 @@ int llapi_get_poollist(const char *name, char **poollist, int list_size,
                 /* only absolute pathname is supported */
                 if (*name != '/')
                         return -EINVAL;
+
                 if (!realpath(name, rname)) {
                         rc = -errno;
-                        llapi_err(LLAPI_MSG_ERROR, "invalid path '%s'", name);
+                        llapi_error(LLAPI_MSG_ERROR, rc, "invalid path '%s'",
+                                    name);
                         return rc;
                 }
 
                 rc = poolpath(NULL, rname, pathname);
                 if (rc != 0) {
-                        errno = -rc;
-                        llapi_err(LLAPI_MSG_ERROR, "'%s' is not"
-                                  " a Lustre filesystem", name);
+                        llapi_error(LLAPI_MSG_ERROR, rc, "'%s' is not"
+                                    " a Lustre filesystem", name);
                         return rc;
                 }
                 strcpy(fsname, rname);
@@ -822,29 +843,33 @@ int llapi_get_poollist(const char *name, char **poollist, int list_size,
                 rc = poolpath(fsname, NULL, pathname);
         }
         if (rc != 0) {
-                errno = -rc;
-                llapi_err(LLAPI_MSG_ERROR, "Lustre filesystem '%s' not found",
-                          name);
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "Lustre filesystem '%s' not found", name);
                 return rc;
         }
 
         llapi_printf(LLAPI_MSG_NORMAL, "Pools from %s:\n", fsname);
-        if ((dir = opendir(pathname)) == NULL) {
-                llapi_err(LLAPI_MSG_ERROR, "Could not open pool list for '%s'",
-                          name);
-                return -errno;
+        dir = opendir(pathname);
+        if (dir == NULL) {
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "Could not open pool list for '%s'",
+                            name);
+                return rc;
         }
 
         while(1) {
                 rc = readdir_r(dir, &pool, &cookie);
 
                 if (rc != 0) {
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "Error reading pool list for '%s'", name);
-                        return -errno;
-                } else if ((rc == 0) && (cookie == NULL))
+                        rc = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, rc,
+                                    "Error reading pool list for '%s'", name);
+                        return rc;
+                } else if ((rc == 0) && (cookie == NULL)) {
                         /* end of directory */
                         break;
+                }
 
                 /* ignore . and .. */
                 if (!strcmp(pool.d_name, ".") || !strcmp(pool.d_name, ".."))
@@ -910,10 +935,11 @@ typedef int (semantic_func_t)(char *path, DIR *parent, DIR *d,
 static int common_param_init(struct find_param *param)
 {
         param->lumlen = lov_mds_md_size(MAX_LOV_UUID_COUNT, LOV_MAGIC_V3);
-        if ((param->lmd = malloc(sizeof(lstat_t) + param->lumlen)) == NULL) {
-                llapi_err(LLAPI_MSG_ERROR,
-                          "error: allocation of %d bytes for ioctl",
-                          sizeof(lstat_t) + param->lumlen);
+        param->lmd = malloc(sizeof(lstat_t) + param->lumlen);
+        if (param->lmd == NULL) {
+                llapi_error(LLAPI_MSG_ERROR, -ENOMEM,
+                            "error: allocation of %d bytes for ioctl",
+                            sizeof(lstat_t) + param->lumlen);
                 return -ENOMEM;
         }
 
@@ -940,6 +966,7 @@ static int cb_common_fini(char *path, DIR *parent, DIR *d, void *data,
         return 0;
 }
 
+/* set errno upon failure */
 static DIR *opendir_parent(char *path)
 {
         DIR *parent;
@@ -979,20 +1006,23 @@ int llapi_mds_getfileinfo(char *path, DIR *parent,
                          * Do the regular lstat(2) instead. */
                         ret = lstat_f(path, st);
                         if (ret) {
-                                llapi_err(LLAPI_MSG_ERROR,
-                                          "error: %s: lstat failed for %s",
-                                          __func__, path);
+                                ret = -errno;
+                                llapi_error(LLAPI_MSG_ERROR, ret,
+                                            "error: %s: lstat failed for %s",
+                                            __func__, path);
                                 return ret;
                         }
                 } else if (errno == ENOENT) {
-                        llapi_err(LLAPI_MSG_WARN,
-                                  "warning: %s: %s does not exist",
-                                  __func__, path);
-                        return -ENOENT;
+                        ret = -errno;
+                        llapi_error(LLAPI_MSG_WARN, ret,
+                                    "warning: %s: %s does not exist",
+                                    __func__, path);
+                        return ret;
                 } else {
-                        llapi_err(LLAPI_MSG_ERROR,
-                                 "error: %s: IOC_MDC_GETFILEINFO failed for %s",
-                                 __func__, path);
+                        ret = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, ret,
+                                   "error: %s: IOC_MDC_GETFILEINFO failed for %s",
+                                   __func__, path);
                         return ret;
                 }
         }
@@ -1014,14 +1044,15 @@ static int llapi_semantic_traverse(char *path, int size, DIR *parent,
 
         d = opendir(path);
         if (!d && errno != ENOTDIR) {
-                llapi_err(LLAPI_MSG_ERROR, "%s: Failed to open '%s'",
-                          __func__, path);
-                return -EINVAL;
+                ret = -errno;
+                llapi_error(LLAPI_MSG_ERROR, ret, "%s: Failed to open '%s'",
+                            __func__, path);
+                return ret;
         } else if (!d && !parent) {
                 /* ENOTDIR. Open the parent dir. */
                 p = opendir_parent(path);
                 if (!p)
-                        GOTO(out, ret = -EINVAL);
+                        GOTO(out, ret = -errno);
         }
 
         if (sem_init && (ret = sem_init(path, parent ?: p, d, data, de)))
@@ -1042,9 +1073,9 @@ static int llapi_semantic_traverse(char *path, int size, DIR *parent,
 
                 path[len] = 0;
                 if ((len + dent->d_reclen + 2) > size) {
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "error: %s: string buffer is too small",
-                                  __func__);
+                        llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                          "error: %s: string buffer is too small",
+                                          __func__);
                         break;
                 }
                 strcat(path, "/");
@@ -1067,9 +1098,9 @@ static int llapi_semantic_traverse(char *path, int size, DIR *parent,
 
                 switch (dent->d_type) {
                 case DT_UNKNOWN:
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "error: %s: '%s' is UNKNOWN type %d",
-                                  __func__, dent->d_name, dent->d_type);
+                        llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                          "error: %s: '%s' is UNKNOWN type %d",
+                                          __func__, dent->d_name, dent->d_type);
                         break;
                 case DT_DIR:
                         ret = llapi_semantic_traverse(path, size, d, sem_init,
@@ -1109,8 +1140,10 @@ static int param_callback(char *path, semantic_func_t sem_init,
         char *buf;
 
         if (len > PATH_MAX) {
-                llapi_err(LLAPI_MSG_ERROR, "Path name '%s' is too long", path);
-                return -EINVAL;
+                ret = -EINVAL;
+                llapi_error(LLAPI_MSG_ERROR, ret,
+                            "Path name '%s' is too long", path);
+                return ret;
         }
 
         buf = (char *)malloc(PATH_MAX + 1);
@@ -1135,8 +1168,8 @@ int llapi_file_fget_lov_uuid(int fd, struct obd_uuid *lov_name)
 {
         int rc = ioctl(fd, OBD_IOC_GETNAME, lov_name);
         if (rc) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR, "error: can't get lov name.");
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: can't get lov name.");
         }
         return rc;
 }
@@ -1147,15 +1180,14 @@ int llapi_file_get_lov_uuid(const char *path, struct obd_uuid *lov_uuid)
 
         fd = open(path, O_RDONLY);
         if (fd < 0) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR, "error opening %s", path);
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error opening %s", path);
                 return rc;
         }
 
         rc = llapi_file_fget_lov_uuid(fd, lov_uuid);
 
         close(fd);
-
         return rc;
 }
 
@@ -1182,8 +1214,8 @@ int llapi_lov_get_uuids(int fd, struct obd_uuid *uuidp, int *ost_count)
                  lov_name.uuid);
         fp = fopen(buf, "r");
         if (fp == NULL) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR, "error: opening '%s'", buf);
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: opening '%s'", buf);
                 return rc;
         }
 
@@ -1201,7 +1233,7 @@ int llapi_lov_get_uuids(int fd, struct obd_uuid *uuidp, int *ost_count)
                 return -EOVERFLOW;
 
         *ost_count = index;
-        return rc;
+        return 0;
 }
 
 int llapi_get_obd_count(char *mnt, int *count, int is_mdt)
@@ -1211,12 +1243,15 @@ int llapi_get_obd_count(char *mnt, int *count, int is_mdt)
 
         root = opendir(mnt);
         if (!root) {
-                llapi_err(LLAPI_MSG_ERROR, "open %s failed", mnt);
-                return -1;
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
+                return rc;
         }
 
         *count = is_mdt;
         rc = ioctl(dirfd(root), LL_IOC_GETOBDCOUNT, count);
+        if (rc < 0)
+                rc = -errno;
 
         closedir(root);
         return rc;
@@ -1261,10 +1296,9 @@ static int setup_obd_uuid(DIR *dir, char *dname, struct find_param *param)
         /* Get the lov name */
         rc = llapi_file_fget_lov_uuid(dirfd(dir), &lov_uuid);
         if (rc) {
-                if (errno != ENOTTY) {
-                        rc = errno;
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "error: can't get lov name: %s", dname);
+                if (rc != -ENOTTY) {
+                        llapi_error(LLAPI_MSG_ERROR, rc,
+                                    "error: can't get lov name: %s", dname);
                 } else {
                         rc = 0;
                 }
@@ -1278,8 +1312,8 @@ static int setup_obd_uuid(DIR *dir, char *dname, struct find_param *param)
                  lov_uuid.uuid);
         fp = fopen(buf, "r");
         if (fp == NULL) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR, "error: opening '%s'", buf);
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: opening '%s'", buf);
                 return rc;
         }
 
@@ -1343,7 +1377,7 @@ retry_get_uuids:
                                 ret = -ENOMEM;
                 }
 
-                llapi_err(LLAPI_MSG_ERROR, "get ost uuid failed");
+                llapi_error(LLAPI_MSG_ERROR, ret, "get ost uuid failed");
                 return ret;
         }
 
@@ -1410,7 +1444,8 @@ static int clilovpath(const char *fsname, const char *const pathname,
         char buffer[PATH_MAX + 1];
 
         if (fsname == NULL) {
-                if ((rc = llapi_search_fsname(pathname, buffer)) != 0)
+                rc = llapi_search_fsname(pathname, buffer);
+                if (rc != 0)
                         return rc;
                 fsname = buffer;
         }
@@ -1418,7 +1453,8 @@ static int clilovpath(const char *fsname, const char *const pathname,
         snprintf(pattern, sizeof(pattern), "/proc/fs/lustre/lov/%s-clilov-*",
                  fsname);
 
-        if ((rc = first_match(pattern, buffer)) != 0)
+        rc = first_match(pattern, buffer);
+        if (rc != 0)
                 return rc;
 
         strncpy(clilovpath, buffer, sizeof(buffer));
@@ -1438,15 +1474,17 @@ static int sattr_read_attr(const char *const fpath,
         char line[PATH_MAX + 1];
         int rc = 0;
 
-        if ((f = fopen(fpath, "r")) == NULL) {
-                llapi_err(LLAPI_MSG_ERROR, "Cannot open '%s'", fpath);
-                return errno;
+        f = fopen(fpath, "r");
+        if (f == NULL) {
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "Cannot open '%s'", fpath);
+                return rc;
         }
 
         if (fgets(line, sizeof(line), f) != NULL) {
                 *attr = atoi(line);
         } else {
-                llapi_err(LLAPI_MSG_ERROR, "Cannot read from '%s'", fpath);
+                llapi_error(LLAPI_MSG_ERROR, errno, "Cannot read from '%s'", fpath);
                 rc = 1;
         }
 
@@ -1469,24 +1507,28 @@ static int sattr_get_defaults(const char *const fsname,
         char dpath[PATH_MAX + 1];
         char fpath[PATH_MAX + 1];
 
-        if ((rc = clilovpath(fsname, pathname, dpath)) != 0)
+        rc = clilovpath(fsname, pathname, dpath);
+        if (rc != 0)
                 return rc;
 
         if (scount) {
                 snprintf(fpath, PATH_MAX, "%s/stripecount", dpath);
-                if ((rc = sattr_read_attr(fpath, scount)) != 0)
+                rc = sattr_read_attr(fpath, scount);
+                if (rc != 0)
                         return rc;
         }
 
         if (ssize) {
                 snprintf(fpath, PATH_MAX, "%s/stripesize", dpath);
-                if ((rc = sattr_read_attr(fpath, ssize)) != 0)
+                rc = sattr_read_attr(fpath, ssize);
+                if (rc != 0)
                         return rc;
         }
 
         if (soffset) {
                 snprintf(fpath, PATH_MAX, "%s/stripeoffset", dpath);
-                if ((rc = sattr_read_attr(fpath, soffset)) != 0)
+                rc = sattr_read_attr(fpath, soffset);
+                if (rc != 0)
                         return rc;
         }
 
@@ -1518,10 +1560,13 @@ static int sattr_cache_get_defaults(const char *const fsname,
         char fsname_buf[PATH_MAX + 1];
         unsigned int tmp[3];
 
-        if (fsname == NULL)
-                llapi_search_fsname(pathname, fsname_buf);
-        else
+        if (fsname == NULL) {
+                rc = llapi_search_fsname(pathname, fsname_buf);
+                if (rc)
+                        return rc;
+        } else {
                 strncpy(fsname_buf, fsname, PATH_MAX);
+        }
 
         if (strncmp(fsname_buf, cache.fsname, PATH_MAX) != 0) {
                 /*
@@ -1529,8 +1574,9 @@ static int sattr_cache_get_defaults(const char *const fsname,
                  * successfully retrieved and stored in tmp before writing to
                  * cache.
                  */
-                if ((rc = sattr_get_defaults(fsname_buf, NULL, &tmp[0],
-                                             &tmp[1], &tmp[2])) != 0)
+                rc = sattr_get_defaults(fsname_buf, NULL, &tmp[0], &tmp[1],
+                                        &tmp[2]);
+                if (rc != 0)
                         return rc;
 
                 cache.stripecount = tmp[0];
@@ -1556,6 +1602,7 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
 {
         char *prefix = is_dir ? "" : "lmm_";
         char nl = is_dir ? ' ' : '\n';
+        int rc;
 
         if (is_dir && lum->lmm_object_seq == FID_SEQ_LOV_DEFAULT) {
                 lum->lmm_object_seq = FID_SEQ_OST_MDT0;
@@ -1582,15 +1629,16 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
                 if (is_dir) {
                         if (!raw && lum->lmm_stripe_count == 0) {
                                 unsigned int scount;
-                                if (sattr_cache_get_defaults(NULL, path,
-                                                             &scount, NULL,
-                                                             NULL) == 0)
+                                rc = sattr_cache_get_defaults(NULL, path,
+                                                              &scount, NULL,
+                                                              NULL);
+                                if (rc == 0)
                                         llapi_printf(LLAPI_MSG_NORMAL, "%u%c",
                                                      scount, nl);
                                 else
-                                        llapi_err(LLAPI_MSG_ERROR,
-                                                "Cannot determine default"
-                                                " stripe count.");
+                                        llapi_error(LLAPI_MSG_ERROR, rc,
+                                                    "Cannot determine default"
+                                                    " stripe count.");
                         } else {
                                 llapi_printf(LLAPI_MSG_NORMAL, "%d%c",
                                              lum->lmm_stripe_count ==
@@ -1609,14 +1657,15 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
                                      prefix);
                 if (is_dir && !raw && lum->lmm_stripe_size == 0) {
                         unsigned int ssize;
-                        if (sattr_cache_get_defaults(NULL, path, NULL, &ssize,
-                                                     NULL) == 0)
+                        rc = sattr_cache_get_defaults(NULL, path, NULL, &ssize,
+                                                      NULL);
+                        if (rc == 0)
                                 llapi_printf(LLAPI_MSG_NORMAL, "%u%c", ssize,
                                              nl);
                         else
-                                llapi_err(LLAPI_MSG_ERROR,
-                                          "Cannot determine default"
-                                          " stripe size.");
+                                llapi_error(LLAPI_MSG_ERROR, rc,
+                                            "Cannot determine default"
+                                            " stripe size.");
                 } else {
                         llapi_printf(LLAPI_MSG_NORMAL, "%u%c",
                                      lum->lmm_stripe_size, nl);
@@ -1738,33 +1787,33 @@ int llapi_file_get_stripe(const char *path, struct lov_user_md *lum)
         if (fname == NULL) {
                 dname = (char *)malloc(2);
                 if (dname == NULL)
-                        return ENOMEM;
+                        return -ENOMEM;
                 strcpy(dname, ".");
                 fname = (char *)path;
         } else {
                 dname = (char *)malloc(fname - path + 1);
                 if (dname == NULL)
-                        return ENOMEM;
+                        return -ENOMEM;
                 strncpy(dname, path, fname - path);
                 dname[fname - path] = '\0';
                 fname++;
         }
 
-        if ((fd = open(dname, O_RDONLY)) == -1) {
-                rc = errno;
+        fd = open(dname, O_RDONLY);
+        if (fd == -1) {
+                rc = -errno;
                 free(dname);
                 return rc;
         }
 
         strcpy((char *)lum, fname);
         if (ioctl(fd, IOC_MDC_GETFILESTRIPE, (void *)lum) == -1)
-                rc = errno;
+                rc = -errno;
 
         if (close(fd) == -1 && rc == 0)
-                rc = errno;
+                rc = -errno;
 
         free(dname);
-
         return rc;
 }
 
@@ -1785,13 +1834,16 @@ int llapi_file_lookup(int dirfd, const char *name)
 
         rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf));
         if (rc) {
-                llapi_err(LLAPI_MSG_ERROR,
-                          "error: IOC_MDC_LOOKUP pack failed for '%s': rc %d",
-                          name, rc);
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "error: IOC_MDC_LOOKUP pack failed for '%s': rc %d",
+                            name, rc);
                 return rc;
         }
 
-        return ioctl(dirfd, IOC_MDC_LOOKUP, buf);
+        rc = ioctl(dirfd, IOC_MDC_LOOKUP, buf);
+        if (rc < 0)
+                rc = -errno;
+        return rc;
 }
 
 /* Check if the value matches 1 of the given criteria (e.g. --atime +/-N).
@@ -1817,7 +1869,7 @@ static int find_value_cmp(unsigned int file, unsigned int limit, int sign,
                           int negopt, unsigned long long margin, int mds)
 {
         int ret = -1;
-        
+
         if (sign > 0) {
                 if (file <= limit)
                         ret = mds ? 0 : 1;
@@ -1955,19 +2007,22 @@ static int cb_find_init(char *path, DIR *parent, DIR *dir,
                         lustre_fs = 0;
                         ret = lstat_f(path, st);
                         if (ret) {
-                                llapi_err(LLAPI_MSG_ERROR,
-                                          "error: %s: lstat failed for %s",
-                                          __func__, path);
+                                ret = -errno;
+                                llapi_error(LLAPI_MSG_ERROR, ret,
+                                            "error: %s: lstat failed for %s",
+                                            __func__, path);
                                 return ret;
                         }
                 } else if (errno == ENOENT) {
-                        llapi_err(LLAPI_MSG_WARN,
+                        llapi_error(LLAPI_MSG_WARN, -ENOENT,
                                   "warning: %s: %s does not exist",
                                   __func__, path);
                         goto decided;
                 } else {
-                        llapi_err(LLAPI_MSG_ERROR,"error: %s: %s failed for %s",
-                                  __func__, dir ? "LL_IOC_MDC_GETINFO" :
+                        ret = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, ret,
+                                    "error: %s: %s failed for %s",
+                                    __func__, dir ? "LL_IOC_MDC_GETINFO" :
                                   "IOC_MDC_GETFILEINFO", path);
                         return ret;
                 }
@@ -2123,9 +2178,6 @@ obd_matches:
                                                param->obdindex, &stat_buf,
                                                &uuid_buf);
                         if (ret) {
-                                if (ret == -ENODATA || ret == -ENODEV
-                                    || ret == -EIO)
-                                        errno = EIO;
                                 llapi_printf(LLAPI_MSG_NORMAL,
                                              "obd_uuid: %s failed %s ",
                                              param->obduuid->uuid,
@@ -2143,14 +2195,15 @@ obd_matches:
 
                 if (ret) {
                         if (errno == ENOENT) {
-                                llapi_err(LLAPI_MSG_ERROR,
-                                          "warning: %s: %s does not exist",
-                                          __func__, path);
+                                llapi_error(LLAPI_MSG_ERROR, -ENOENT,
+                                            "warning: %s: %s does not exist",
+                                            __func__, path);
                                 goto decided;
                         } else {
-                                llapi_err(LLAPI_MSG_ERROR,
-                                          "%s: IOC_LOV_GETINFO on %s failed",
-                                          __func__, path);
+                                ret = -errno;
+                                llapi_error(LLAPI_MSG_ERROR, ret,
+                                            "%s: IOC_LOV_GETINFO on %s failed",
+                                            __func__, path);
                                 return ret;
                         }
                 }
@@ -2220,29 +2273,29 @@ static int cb_get_mdt_index(char *path, DIR *parent, DIR *d, void *data,
                         ret = llapi_file_fget_mdtidx(fd, &mdtidx);
                         close(fd);
                 } else {
-                        ret = fd;
+                        ret = -errno;
                 }
         }
 
         if (ret) {
-                if (errno == ENODATA) {
+                if (ret == -ENODATA) {
                         if (!param->obduuid)
                                 llapi_printf(LLAPI_MSG_NORMAL,
                                              "%s has no stripe info\n", path);
                         goto out;
-                } else if (errno == ENOTTY) {
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "%s: '%s' not on a Lustre fs?",
-                                  __func__, path);
-                } else if (errno == ENOENT) {
-                        llapi_err(LLAPI_MSG_WARN,
-                                  "warning: %s: %s does not exist",
-                                  __func__, path);
+                } else if (ret == -ENOENT) {
+                        llapi_error(LLAPI_MSG_WARN, ret,
+                                    "warning: %s: %s does not exist",
+                                    __func__, path);
                         goto out;
+                } else if (ret == -ENOTTY) {
+                        llapi_error(LLAPI_MSG_ERROR, ret,
+                                    "%s: '%s' not on a Lustre fs?",
+                                    __func__, path);
                 } else {
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "error: %s: LL_IOC_GET_MDTIDX failed for %s",
-                                   __func__, path);
+                        llapi_error(LLAPI_MSG_ERROR, ret,
+                                    "error: %s: LL_IOC_GET_MDTIDX failed for %s",
+                                    __func__, path);
                 }
                 return ret;
         }
@@ -2312,20 +2365,22 @@ static int cb_getstripe(char *path, DIR *parent, DIR *d, void *data,
                                 llapi_printf(LLAPI_MSG_NORMAL,
                                              "%s has no stripe info\n", path);
                         goto out;
-                } else if (errno == ENOTTY) {
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "%s: '%s' not on a Lustre fs?",
-                                  __func__, path);
                 } else if (errno == ENOENT) {
-                        llapi_err(LLAPI_MSG_WARN,
-                                  "warning: %s: %s does not exist",
-                                  __func__, path);
+                        llapi_error(LLAPI_MSG_WARN, -ENOENT,
+                                    "warning: %s: %s does not exist",
+                                    __func__, path);
                         goto out;
+                } else if (errno == ENOTTY) {
+                        ret = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, ret,
+                                    "%s: '%s' not on a Lustre fs?",
+                                    __func__, path);
                 } else {
-                        llapi_err(LLAPI_MSG_ERROR,
-                                  "error: %s: %s failed for %s",
-                                   __func__, d ? "LL_IOC_LOV_GETSTRIPE" :
-                                  "IOC_MDC_GETFILESTRIPE", path);
+                        ret = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, ret,
+                                    "error: %s: %s failed for %s",
+                                     __func__, d ? "LL_IOC_LOV_GETSTRIPE" :
+                                    "IOC_MDC_GETFILESTRIPE", path);
                 }
 
                 return ret;
@@ -2370,9 +2425,10 @@ int llapi_obd_statfs(char *path, __u32 type, __u32 index,
         data.ioc_pbuf2 = (char *)uuid_buf;
         data.ioc_plen2 = sizeof(struct obd_uuid);
 
-        if ((rc = obd_ioctl_pack(&data, &rawbuf, sizeof(raw))) != 0) {
-                llapi_err(LLAPI_MSG_ERROR,
-                          "llapi_obd_statfs: error packing ioctl data");
+        rc = obd_ioctl_pack(&data, &rawbuf, sizeof(raw));
+        if (rc != 0) {
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "llapi_obd_statfs: error packing ioctl data");
                 return rc;
         }
 
@@ -2382,8 +2438,8 @@ int llapi_obd_statfs(char *path, __u32 type, __u32 index,
 
         if (fd < 0) {
                 rc = errno ? -errno : -EBADF;
-                llapi_err(LLAPI_MSG_ERROR, "error: %s: opening '%s'",
-                          __func__, path);
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: %s: opening '%s'",
+                            __func__, path);
                 return rc;
         }
         rc = ioctl(fd, IOC_OBD_STATFS, (void *)rawbuf);
@@ -2408,12 +2464,14 @@ int llapi_ping(char *obd_type, char *obd_name)
 
         fd = open(path, O_WRONLY);
         if (fd < 0) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR, "error opening %s", path);
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error opening %s", path);
                 return rc;
         }
 
         rc = write(fd, buf, 1);
+        if (rc < 0)
+                rc = -errno;
         close(fd);
 
         if (rc == 1)
@@ -2421,15 +2479,16 @@ int llapi_ping(char *obd_type, char *obd_name)
         return rc;
 }
 
-int llapi_target_iterate(int type_num, char **obd_type,void *args,llapi_cb_t cb)
+int llapi_target_iterate(int type_num, char **obd_type,
+                         void *args, llapi_cb_t cb)
 {
         char buf[MAX_STRING_SIZE];
         FILE *fp = fopen(DEVICES_LIST, "r");
         int i, rc = 0;
 
         if (fp == NULL) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR, "error: opening "DEVICES_LIST);
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: opening "DEVICES_LIST);
                 return rc;
         }
 
@@ -2463,7 +2522,7 @@ int llapi_target_iterate(int type_num, char **obd_type,void *args,llapi_cb_t cb)
                 }
         }
         fclose(fp);
-        return rc;
+        return 0;
 }
 
 static void do_target_check(char *obd_type_name, char *obd_name,
@@ -2475,7 +2534,7 @@ static void do_target_check(char *obd_type_name, char *obd_name,
         if (rc == ENOTCONN) {
                 llapi_printf(LLAPI_MSG_NORMAL, "%s inactive.\n", obd_name);
         } else if (rc) {
-                llapi_err(LLAPI_MSG_ERROR, "error: check '%s'", obd_name);
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: check '%s'", obd_name);
         } else {
                 llapi_printf(LLAPI_MSG_NORMAL, "%s active.\n", obd_name);
         }
@@ -2515,16 +2574,19 @@ int llapi_catinfo(char *dir, char *keyword, char *node_name)
 
         root = opendir(dir);
         if (root == NULL) {
-                rc = errno;
-                llapi_err(LLAPI_MSG_ERROR, "open %s failed", dir);
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", dir);
                 return rc;
         }
 
         rc = ioctl(dirfd(root), OBD_IOC_LLOG_CATINFO, buf);
-        if (rc)
-                llapi_err(LLAPI_MSG_ERROR, "ioctl OBD_IOC_CATINFO failed");
-        else
+        if (rc) {
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "ioctl OBD_IOC_CATINFO failed");
+        } else {
                 llapi_printf(LLAPI_MSG_NORMAL, "%s", data.ioc_pbuf1);
+        }
 
         closedir(root);
         return rc;
@@ -2550,11 +2612,14 @@ int llapi_quotacheck(char *mnt, int check_type)
 
         root = opendir(mnt);
         if (!root) {
-                llapi_err(LLAPI_MSG_ERROR, "open %s failed", mnt);
-                return -1;
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
+                return rc;
         }
 
         rc = ioctl(dirfd(root), LL_IOC_QUOTACHECK, check_type);
+        if (rc < 0)
+                rc = -errno;
 
         closedir(root);
         return rc;
@@ -2568,8 +2633,9 @@ int llapi_poll_quotacheck(char *mnt, struct if_quotacheck *qchk)
 
         root = opendir(mnt);
         if (!root) {
-                llapi_err(LLAPI_MSG_ERROR, "open %s failed", mnt);
-                return -1;
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
+                return rc;
         }
 
         while (1) {
@@ -2582,7 +2648,7 @@ int llapi_poll_quotacheck(char *mnt, struct if_quotacheck *qchk)
         }
 
         closedir(root);
-        return rc;
+        return 0;
 }
 
 int llapi_quotactl(char *mnt, struct if_quotactl *qctl)
@@ -2592,11 +2658,14 @@ int llapi_quotactl(char *mnt, struct if_quotactl *qctl)
 
         root = opendir(mnt);
         if (!root) {
-                llapi_err(LLAPI_MSG_ERROR, "open %s failed", mnt);
-                return -1;
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
+                return rc;
         }
 
         rc = ioctl(dirfd(root), LL_IOC_QUOTACTL, qctl);
+        if (rc < 0)
+                rc = -errno;
 
         closedir(root);
         return rc;
@@ -2628,19 +2697,19 @@ static int cb_quotachown(char *path, DIR *parent, DIR *d, void *data,
         if (rc) {
                 if (errno == ENODATA) {
                         if (!param->obduuid && !param->quiet)
-                                llapi_err(LLAPI_MSG_ERROR,
+                                llapi_error(LLAPI_MSG_ERROR, -ENODATA,
                                           "%s has no stripe info", path);
                         rc = 0;
                 } else if (errno == ENOENT) {
-                        llapi_err(LLAPI_MSG_ERROR,
+                        llapi_error(LLAPI_MSG_ERROR, -ENOENT,
                                   "warning: %s: %s does not exist",
                                   __func__, path);
                         rc = 0;
                 } else if (errno != EISDIR) {
-                        rc = errno;
-                        llapi_err(LLAPI_MSG_ERROR, "%s ioctl failed for %s.",
-                                  d ? "LL_IOC_MDC_GETINFO" :
-                                  "IOC_MDC_GETFILEINFO", path);
+                        rc = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, rc, "%s ioctl failed for %s.",
+                                    d ? "LL_IOC_MDC_GETINFO" :
+                                    "IOC_MDC_GETFILEINFO", path);
                 }
                 return rc;
         }
@@ -2652,12 +2721,15 @@ static int cb_quotachown(char *path, DIR *parent, DIR *d, void *data,
          * invoke syscall directly. */
         rc = syscall(SYS_chown, path, -1, -1);
         if (rc)
-                llapi_err(LLAPI_MSG_ERROR,"error: chown %s (%u,%u)", path);
+                llapi_error(LLAPI_MSG_ERROR, errno,
+                            "error: chown %s", path);
 
         rc = chmod(path, st->st_mode);
-        if (rc)
-                llapi_err(LLAPI_MSG_ERROR, "error: chmod %s (%hu)",
-                          path, st->st_mode);
+        if (rc) {
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "error: chmod %s (%hu)",
+                            path, st->st_mode);
+        }
 
         return rc;
 }
@@ -2689,8 +2761,10 @@ static int rmtacl_notify(int ops)
 
         fp = setmntent(MOUNTED, "r");
         if (fp == NULL) {
-                perror("setmntent");
-                return -1;
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "error setmntent(%s)", MOUNTED);
+                return rc;
         }
 
         while (1) {
@@ -2703,14 +2777,17 @@ static int rmtacl_notify(int ops)
 
                 fd = open(mnt->mnt_dir, O_RDONLY | O_DIRECTORY);
                 if (fd < 0) {
-                        perror("open");
-                        return -1;
+                        rc = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, rc,
+                                    "Can't open '%s'\n", mnt->mnt_dir);
+                        return rc;
                 }
 
                 rc = ioctl(fd, LL_IOC_RMTACL, ops);
                 if (rc < 0) {
-                        perror("ioctl");
-                return -1;
+                        rc = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, rc, "ioctl %d\n", fd);
+                        return rc;
                 }
 
                 found++;
@@ -2739,14 +2816,16 @@ static int rmtacl_name2id(char *name, int is_user)
         if (is_user) {
                 struct passwd *pw;
 
-                if ((pw = getpwnam(name)) == NULL)
+                pw = getpwnam(name);
+                if (pw == NULL)
                         return INVALID_ID;
                 else
                         return (int)(pw->pw_uid);
         } else {
                 struct group *gr;
 
-                if ((gr = getgrnam(name)) == NULL)
+                gr = getgrnam(name);
+                if (gr == NULL)
                         return INVALID_ID;
                 else
                         return (int)(gr->gr_gid);
@@ -2862,29 +2941,34 @@ static int child_status(int status)
 static int do_rmtacl(int argc, char *argv[], int ops, int (output_func)(char *))
 {
         pid_t pid = 0;
-        int fd[2], status;
+        int fd[2], status, rc;
         FILE *fp;
         char buf[PIPE_BUF];
 
         if (output_func) {
                 if (pipe(fd) < 0) {
-                        perror("pipe");
-                        return -1;
+                        rc = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, rc, "Can't create pipe\n");
+                        return rc;
                 }
 
-                if ((pid = fork()) < 0) {
-                        perror("fork");
+                pid = fork();
+                if (pid < 0) {
+                        rc = -errno;
+                        llapi_error(LLAPI_MSG_ERROR, rc, "Can't fork\n");
                         close(fd[0]);
                         close(fd[1]);
-                        return -1;
+                        return rc;
                 } else if (!pid) {
                         /* child process redirects its output. */
                         close(fd[0]);
                         close(1);
                         if (dup2(fd[1], 1) < 0) {
-                                perror("dup2");
+                                rc = -errno;
+                                llapi_error(LLAPI_MSG_ERROR, rc,
+                                            "Can't dup2 %d\n", fd[1]);
                                 close(fd[1]);
-                                return -1;
+                                return rc;
                         }
                 } else {
                         close(fd[1]);
@@ -2894,17 +2978,19 @@ static int do_rmtacl(int argc, char *argv[], int ops, int (output_func)(char *))
         if (!pid) {
                 status = rmtacl_notify(ops);
                 if (status < 0)
-                        return -1;
+                        return -errno;
 
                 exit(execvp(argv[0], argv));
         }
 
         /* the following is parent process */
-        if ((fp = fdopen(fd[0], "r")) == NULL) {
-                perror("fdopen");
+        fp = fdopen(fd[0], "r");
+        if (fp == NULL) {
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "fdopen %d failed\n", fd[0]);
                 kill(pid, SIGKILL);
                 close(fd[0]);
-                return -1;
+                return rc;
         }
 
         while (fgets(buf, PIPE_BUF, fp) != NULL) {
@@ -2916,8 +3002,9 @@ static int do_rmtacl(int argc, char *argv[], int ops, int (output_func)(char *))
         close(fd[0]);
 
         if (waitpid(pid, &status, 0) < 0) {
-                perror("waitpid");
-                return -1;
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "waitpid %d failed\n", pid);
+                return rc;
         }
 
         return child_status(status);
@@ -2949,7 +3036,7 @@ int llapi_cp(int argc, char *argv[])
 
         rc = rmtacl_notify(RMT_RSETFACL);
         if (rc < 0)
-                return -1;
+                return rc;
 
         exit(execvp(argv[0], argv));
 }
@@ -2960,7 +3047,7 @@ int llapi_ls(int argc, char *argv[])
 
         rc = rmtacl_notify(RMT_LGETFACL);
         if (rc < 0)
-                return -1;
+                return rc;
 
         exit(execvp(argv[0], argv));
 }
@@ -2985,8 +3072,8 @@ static int get_mdtname(char *name, char *format, char *buf)
                         suffix[0] = '\0';
                 } else {
                         /* Not enough room to add suffix */
-                        llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                                  "MDT name too long |%s|", name);
+                        llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                          "MDT name too long |%s|", name);
                         return -EINVAL;
                 }
         }
@@ -3022,8 +3109,8 @@ static int root_ioctl(const char *mdtname, int opc, void *data, int *mdtidxp,
         }
         if (rc < 0) {
                 if (want_error)
-                        llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                                  "Can't open %s: %d\n", mdtname, rc);
+                        llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                          "Can't open %s: %d\n", mdtname, rc);
                 return rc;
         }
 
@@ -3036,7 +3123,7 @@ static int root_ioctl(const char *mdtname, int opc, void *data, int *mdtidxp,
         else
                 rc = 0;
         if (rc && want_error)
-                llapi_err(LLAPI_MSG_ERROR, "ioctl %d err %d", opc, rc);
+                llapi_error(LLAPI_MSG_ERROR, rc, "ioctl %d err %d", opc, rc);
 
         close(fd);
         return rc;
@@ -3157,9 +3244,9 @@ repeat:
         if ((kuch->kuc_transport != KUC_TRANSPORT_CHANGELOG) ||
             ((kuch->kuc_msgtype != CL_RECORD) &&
              (kuch->kuc_msgtype != CL_EOF))) {
-                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                          "Unknown changelog message type %d:%d\n",
-                          kuch->kuc_transport, kuch->kuc_msgtype);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "Unknown changelog message type %d:%d\n",
+                                  kuch->kuc_transport, kuch->kuc_msgtype);
                 rc = -EPROTO;
                 goto out_free;
         }
@@ -3208,17 +3295,18 @@ int llapi_changelog_clear(const char *mdtname, const char *idstr,
         int id;
 
         if (endrec < 0) {
-                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                          "can't purge negative records\n");
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "can't purge negative records\n");
                 return -EINVAL;
         }
 
         id = strtol(idstr + strlen(CHANGELOG_USER_PREFIX), NULL, 10);
         if ((id == 0) || (strncmp(idstr, CHANGELOG_USER_PREFIX,
                                   strlen(CHANGELOG_USER_PREFIX)) != 0)) {
-                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                          "expecting id of the form '"CHANGELOG_USER_PREFIX
-                          "<num>'; got '%s'\n", idstr);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "expecting id of the form '"
+                                  CHANGELOG_USER_PREFIX
+                                  "<num>'; got '%s'\n", idstr);
                 return -EINVAL;
         }
 
@@ -3237,9 +3325,9 @@ int llapi_fid2path(const char *device, const char *fidstr, char *buf,
 
         sscanf(fidstr, SFID, RFID(&fid));
         if (!fid_is_sane(&fid)) {
-                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                          "bad FID format [%s], should be "DFID"\n",
-                          fidstr, (__u64)1, 2, 0);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "bad FID format [%s], should be "DFID"\n",
+                                  fidstr, (__u64)1, 2, 0);
                 return -EINVAL;
         }
 
@@ -3255,7 +3343,7 @@ int llapi_fid2path(const char *device, const char *fidstr, char *buf,
         rc = root_ioctl(device, OBD_IOC_FID2PATH, gf, NULL, 0);
         if (rc) {
                 if (rc != -ENOENT)
-                        llapi_err(LLAPI_MSG_ERROR, "ioctl err %d", rc);
+                        llapi_error(LLAPI_MSG_ERROR, rc, "ioctl err %d", rc);
         } else {
                 memcpy(buf, gf->gf_path, gf->gf_pathlen);
                 *recno = gf->gf_recno;
@@ -3325,8 +3413,8 @@ int llapi_copytool_start(void **priv, char *fsname, int flags,
         int rc;
 
         if (archive_count > 0 && archives == NULL) {
-                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                          "NULL archive numbers");
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "NULL archive numbers");
                 return -EINVAL;
         }
 
@@ -3344,9 +3432,9 @@ int llapi_copytool_start(void **priv, char *fsname, int flags,
         ct->archives = 0;
         for (rc = 0; rc < archive_count; rc++) {
                 if (archives[rc] > sizeof(ct->archives)) {
-                        llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                                  "Maximum of %d archives supported",
-                                  sizeof(ct->archives));
+                        llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                          "Maximum of %d archives supported",
+                                          sizeof(ct->archives));
                         goto out_err;
                 }
                 ct->archives |= 1 << archives[rc];
@@ -3438,9 +3526,9 @@ int llapi_copytool_recv(void *priv, struct hsm_action_list **halh, int *msgsize)
 
         if (kuch->kuc_transport != KUC_TRANSPORT_HSM ||
             kuch->kuc_msgtype != HMT_ACTION_LIST) {
-                llapi_err(LLAPI_MSG_ERROR | LLAPI_MSG_NO_ERRNO,
-                          "Unknown HSM message type %d:%d\n",
-                          kuch->kuc_transport, kuch->kuc_msgtype);
+                llapi_err_noerrno(LLAPI_MSG_ERROR,
+                                  "Unknown HSM message type %d:%d\n",
+                                  kuch->kuc_transport, kuch->kuc_msgtype);
                 rc = -EPROTO;
                 goto out_free;
         }
@@ -3452,9 +3540,9 @@ int llapi_copytool_recv(void *priv, struct hsm_action_list **halh, int *msgsize)
 
         /* Check that we have registered for this archive # */
         if (((1 << hal->hal_archive_num) & ct->archives) == 0) {
-                    llapi_err(LLAPI_MSG_INFO | LLAPI_MSG_NO_ERRNO,
-                          "Ignoring request for archive #%d (bitmask %#x)\n",
-                          hal->hal_archive_num, ct->archives);
+                    llapi_err_noerrno(LLAPI_MSG_INFO,
+                             "Ignoring request for archive #%d (bitmask %#x)\n",
+                             hal->hal_archive_num, ct->archives);
                 rc = 0;
                 goto out_free;
         }
@@ -3484,15 +3572,18 @@ int llapi_get_connect_flags(const char *mnt, __u64 *flags)
 
         root = opendir(mnt);
         if (!root) {
-                llapi_err(LLAPI_MSG_ERROR, "open %s failed", mnt);
-                return -1;
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
+                return rc;
         }
 
         rc = ioctl(dirfd(root), LL_IOC_GET_CONNECT_FLAGS, flags);
+        if (rc < 0) {
+                rc = -errno;
+                llapi_error(LLAPI_MSG_ERROR, rc,
+                            "ioctl on %s for getting connect flags failed", mnt);
+        }
         closedir(root);
-        if (rc < 0)
-                llapi_err(LLAPI_MSG_ERROR,
-                          "ioctl on %s for getting connect flags failed", mnt);
         return rc;
 }
 
@@ -3515,9 +3606,9 @@ int llapi_get_version(char *buffer, int buffer_size,
 
         rc = ioctl(fd, OBD_GET_VERSION, buffer);
         if (rc == -1) {
-                rc = errno;
+                rc = -errno;
                 close(fd);
-                return -rc;
+                return rc;
         }
         close(fd);
         *version = data->ioc_bulk;