From 893b677180ae0ee36008522540c3ce743bade48d Mon Sep 17 00:00:00 2001 From: James Nunez Date: Thu, 15 May 2014 13:46:59 -0600 Subject: [PATCH] LU-4694 hsm: Cleanup codes about return value errno migh be zero when llapi_hsm_action_get_fd() returns a failure. ct_archive() does not handle it correctly, which might cause HSM take the operation as successful even if it actually fails. The patch also cleanup other codes about return value. Signed-off-by: Li Xi Signed-off-by: James Nunez Change-Id: I625da68836f98346b104533a556c72f06232e3ef Reviewed-on: http://review.whamcloud.com/9455 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Faccini Bruno Reviewed-by: Robert Read Reviewed-by: Oleg Drokin --- lustre/utils/lhsmtool_posix.c | 9 +++++++-- lustre/utils/liblustreapi_hsm.c | 25 ++++++++++++++++--------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/lustre/utils/lhsmtool_posix.c b/lustre/utils/lhsmtool_posix.c index 31e5486..2e18351 100644 --- a/lustre/utils/lhsmtool_posix.c +++ b/lustre/utils/lhsmtool_posix.c @@ -488,8 +488,8 @@ static int ct_restore_stripe(const char *src, const char *dst, int dst_fd, rc = fsetxattr(dst_fd, XATTR_LUSTRE_LOV, lovea, lovea_size, XATTR_CREATE); if (rc < 0) { - CT_ERROR(errno, "cannot set lov EA on '%s'", dst); rc = -errno; + CT_ERROR(rc, "cannot set lov EA on '%s'", dst); } return rc; @@ -880,7 +880,7 @@ static int ct_archive(const struct hsm_action_item *hai, const long hal_flags) src_fd = llapi_hsm_action_get_fd(hcp); if (src_fd < 0) { - rc = -errno; + rc = src_fd; CT_ERROR(rc, "cannot open '%s' for read", src); goto fini_major; } @@ -1139,6 +1139,11 @@ static int ct_restore(const struct hsm_action_item *hai, const long hal_flags) } dst_fd = llapi_hsm_action_get_fd(hcp); + if (dst_fd < 0) { + rc = dst_fd; + CT_ERROR(rc, "cannot open '%s' for write", dst); + goto fini; + } if (set_lovea) { /* the layout cannot be allocated through .fid so we have to diff --git a/lustre/utils/liblustreapi_hsm.c b/lustre/utils/liblustreapi_hsm.c index 2ca1756..c46435a 100644 --- a/lustre/utils/liblustreapi_hsm.c +++ b/lustre/utils/liblustreapi_hsm.c @@ -922,10 +922,12 @@ static int ct_open_by_fid(const struct hsm_copytool_private *ct, const struct lu_fid *fid, int open_flags) { char fid_name[FID_NOBRACE_LEN + 1]; + int fd; snprintf(fid_name, sizeof(fid_name), DFID_NOBRACE, PFID(fid)); - return openat(ct->open_by_fid_fd, fid_name, open_flags); + fd = openat(ct->open_by_fid_fd, fid_name, open_flags); + return fd < 0 ? -errno : fd; } static int ct_stat_by_fid(const struct hsm_copytool_private *ct, @@ -933,10 +935,12 @@ static int ct_stat_by_fid(const struct hsm_copytool_private *ct, struct stat *buf) { char fid_name[FID_NOBRACE_LEN + 1]; + int rc; snprintf(fid_name, sizeof(fid_name), DFID_NOBRACE, PFID(fid)); - return fstatat(ct->open_by_fid_fd, fid_name, buf, 0); + rc = fstatat(ct->open_by_fid_fd, fid_name, buf, 0); + return rc ? -errno : 0; } /** Create the destination volatile file for a restore operation. @@ -1207,17 +1211,20 @@ int llapi_hsm_action_get_dfid(const struct hsm_copyaction_private *hcp, int llapi_hsm_action_get_fd(const struct hsm_copyaction_private *hcp) { const struct hsm_action_item *hai = &hcp->copy.hc_hai; + int fd; if (hcp->magic != CP_PRIV_MAGIC) return -EINVAL; - if (hai->hai_action == HSMA_ARCHIVE) + if (hai->hai_action == HSMA_ARCHIVE) { return ct_open_by_fid(hcp->ct_priv, &hai->hai_dfid, O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NONBLOCK); - else if (hai->hai_action == HSMA_RESTORE) - return dup(hcp->data_fd); - else + } else if (hai->hai_action == HSMA_RESTORE) { + fd = dup(hcp->data_fd); + return fd < 0 ? -errno : fd; + } else { return -EINVAL; + } } /** @@ -1251,9 +1258,9 @@ int llapi_hsm_import(const char *dst, int archive, const struct stat *st, stripe_pattern | LOV_PATTERN_F_RELEASED, pool_name); if (fd < 0) { - llapi_error(LLAPI_MSG_ERROR, -errno, + llapi_error(LLAPI_MSG_ERROR, fd, "cannot create '%s' for import", dst); - return -errno; + return fd; } /* Get the new fid in Lustre. Caller needs to use this fid @@ -1276,8 +1283,8 @@ int llapi_hsm_import(const char *dst, int archive, const struct stat *st, hui.hui_mtime_ns = st->st_mtim.tv_nsec; rc = ioctl(fd, LL_IOC_HSM_IMPORT, &hui); if (rc != 0) { - llapi_error(LLAPI_MSG_ERROR, rc, "cannot import '%s'", dst); rc = -errno; + llapi_error(LLAPI_MSG_ERROR, rc, "cannot import '%s'", dst); goto out_unlink; } -- 1.8.3.1