X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fliblustreapi.c;h=843574f506b9ebceed8ecbd6b39301cd7d482087;hp=15cea80071177caf98fca29cc1caf9df3bf0a02d;hb=442548d59faf72f89337fdd3a420bfd6ed2b2526;hpb=8b8b7b3c4c1060e0a48be38ca7859d229a6dfca7 diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index 15cea80..843574f 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -130,41 +130,90 @@ void llapi_msg_set_level(int level) llapi_msg_level = level; } -/* llapi_error will preserve errno */ -void llapi_error(int level, int _rc, char *fmt, ...) +static void error_callback_default(enum llapi_message_level level, int err, + const char *fmt, va_list ap) { - va_list args; - int tmp_errno = errno; - /* to protect using errno as _rc argument */ - int rc = abs(_rc); + vfprintf(stderr, fmt, ap); + if (level & LLAPI_MSG_NO_ERRNO) + fprintf(stderr, "\n"); + else + fprintf(stderr, ": %s (%d)\n", strerror(err), err); +} - if ((level & LLAPI_MSG_MASK) > llapi_msg_level) - return; +static void info_callback_default(enum llapi_message_level level, int err, + const char *fmt, va_list ap) +{ + vfprintf(stdout, fmt, ap); +} - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); +static llapi_log_callback_t llapi_error_callback = error_callback_default; +static llapi_log_callback_t llapi_info_callback = info_callback_default; - if (level & LLAPI_MSG_NO_ERRNO) - fprintf(stderr, "\n"); - else - fprintf(stderr, ": %s (%d)\n", strerror(rc), rc); - errno = tmp_errno; + +/* llapi_error will preserve errno */ +void llapi_error(enum llapi_message_level level, int err, const char *fmt, ...) +{ + va_list args; + int tmp_errno = errno; + + if ((level & LLAPI_MSG_MASK) > llapi_msg_level) + return; + + va_start(args, fmt); + llapi_error_callback(level, abs(err), fmt, args); + va_end(args); + errno = tmp_errno; } /* llapi_printf will preserve errno */ -void llapi_printf(int level, char *fmt, ...) +void llapi_printf(enum llapi_message_level level, const char *fmt, ...) { - va_list args; - int tmp_errno = errno; + va_list args; + int tmp_errno = errno; - if ((level & LLAPI_MSG_MASK) > llapi_msg_level) - return; + if ((level & LLAPI_MSG_MASK) > llapi_msg_level) + return; - va_start(args, fmt); - vfprintf(stdout, fmt, args); - va_end(args); - errno = tmp_errno; + va_start(args, fmt); + llapi_info_callback(level, 0, fmt, args); + va_end(args); + errno = tmp_errno; +} + +/** + * Set a custom error logging function. Passing in NULL will reset the logging + * callback to its default value. + * + * This function returns the value of the old callback. + */ +llapi_log_callback_t llapi_error_callback_set(llapi_log_callback_t cb) +{ + llapi_log_callback_t old = llapi_error_callback; + + if (cb != NULL) + llapi_error_callback = cb; + else + llapi_error_callback = error_callback_default; + + return old; +} + +/** + * Set a custom info logging function. Passing in NULL will reset the logging + * callback to its default value. + * + * This function returns the value of the old callback. + */ +llapi_log_callback_t llapi_info_callback_set(llapi_log_callback_t cb) +{ + llapi_log_callback_t old = llapi_info_callback; + + if (cb != NULL) + llapi_info_callback = cb; + else + llapi_info_callback = info_callback_default; + + return old; } /** @@ -241,9 +290,9 @@ int llapi_stripe_limit_check(unsigned long long stripe_size, int stripe_offset, "larger than expected (%u)", page_size, LOV_MIN_STRIPE_SIZE); } - if (stripe_size < 0 || (stripe_size & (LOV_MIN_STRIPE_SIZE - 1))) { + if ((stripe_size & (LOV_MIN_STRIPE_SIZE - 1))) { rc = -EINVAL; - llapi_error(LLAPI_MSG_ERROR, rc, "error: bad stripe_size %lu, " + llapi_error(LLAPI_MSG_ERROR, rc, "error: bad stripe_size %llu, " "must be an even multiple of %d bytes", stripe_size, page_size); return rc; @@ -416,7 +465,12 @@ static int get_param_obdvar(const char *fsname, const char *file_path, return rc; } } else if (fsname) { - strcpy(fs, fsname); + if (strlen(fsname) > sizeof(fs)-1) { + if (fp != NULL) + fclose(fp); + return -E2BIG; + } + strncpy(fs, fsname, sizeof(fs)); } if (fp == NULL) { @@ -436,9 +490,14 @@ static int get_param_obdvar(const char *fsname, const char *file_path, tmp += strlen(obd_type) + 1; if (strcmp(tmp, fs)) continue; - strcpy(dev, tmp); + if (strlen(tmp) > sizeof(dev)-1) { + fclose(fp); + return -E2BIG; + } + strncpy(dev, tmp, sizeof(dev)); tmp = strchr(dev, ' '); - *tmp = '\0'; + if (tmp != NULL) + *tmp = '\0'; break; } } @@ -557,10 +616,14 @@ int llapi_search_ost(char *fsname, char *poolname, char *ostname) if (ostname != NULL) len = strlen(ostname); - if (poolname == NULL) - rc = find_target_obdpath(fsname, buffer); - else + if (poolname == NULL) { + if (len == 0) + rc = -EINVAL; + else + rc = find_target_obdpath(fsname, buffer); + } else { rc = find_poolpath(fsname, poolname, buffer); + } if (rc) return rc; @@ -759,7 +822,8 @@ int llapi_dir_create_pool(const char *name, int flags, int stripe_offset, llapi_err_noerrno(LLAPI_MSG_ERROR, "error LL_IOC_LMV_SETSTRIPE '%s' : too large" "pool name: %s", name, pool_name); - GOTO(out, rc = -E2BIG); + rc = -E2BIG; + goto out; } memcpy(lmu.lum_pool_name, pool_name, strlen(pool_name)); } @@ -777,14 +841,14 @@ int llapi_dir_create_pool(const char *name, int flags, int stripe_offset, llapi_error(LLAPI_MSG_ERROR, rc, "error: LL_IOC_LMV_SETSTRIPE pack failed '%s'.", name); - GOTO(out, rc); + goto out; } fd = open(dir, O_DIRECTORY | O_RDONLY); if (fd < 0) { rc = -errno; llapi_error(LLAPI_MSG_ERROR, rc, "unable to open '%s'", name); - GOTO(out, rc); + goto out; } if (ioctl(fd, LL_IOC_LMV_SETSTRIPE, buf)) { @@ -827,7 +891,7 @@ int llapi_direntry_remove(char *dname) rc = -errno; llapi_error(LLAPI_MSG_ERROR, rc, "unable to open '%s'", filename); - GOTO(out, rc); + goto out; } if (ioctl(fd, LL_IOC_REMOVE_ENTRY, filename)) { @@ -1187,10 +1251,14 @@ int llapi_get_poollist(const char *name, char **poollist, int list_size, " a Lustre filesystem", name); return rc; } - strcpy(fsname, rname); + if (strlen(rname) > sizeof(fsname)-1) + return -E2BIG; + strncpy(fsname, rname, sizeof(fsname)); } else { /* name is FSNAME */ - strcpy(fsname, name); + if (strlen(name) > sizeof(fsname)-1) + return -E2BIG; + strncpy(fsname, name, sizeof(fsname)); rc = poolpath(fsname, NULL, pathname); } if (rc != 0) { @@ -1329,7 +1397,7 @@ static int common_param_init(struct find_param *param, char *path) 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", + "error: allocation of %zu bytes for ioctl", sizeof(lstat_t) + param->lumlen); return -ENOMEM; } @@ -1417,8 +1485,6 @@ static int get_lmd_info(char *path, DIR *parent, DIR *dir, /* retrieve needed file info */ strncpy((char *)lmd, fname, lumlen); ret = ioctl(dirfd(parent), IOC_MDC_GETFILEINFO, (void *)lmd); - } else { - return ret; } if (ret) { @@ -1475,15 +1541,19 @@ static int llapi_semantic_traverse(char *path, int size, DIR *parent, } else if (!d && !parent) { /* ENOTDIR. Open the parent dir. */ p = opendir_parent(path); - if (!p) - GOTO(out, ret = -errno); + if (!p) { + ret = -errno; + goto out; + } } if (sem_init && (ret = sem_init(path, parent ?: p, d, data, de))) goto err; - if (!d || (param->get_lmv && !param->recursive)) - GOTO(out, ret = 0); + if (!d || (param->get_lmv && !param->recursive)) { + ret = 0; + goto out; + } while ((dent = readdir64(d)) != NULL) { param->have_fileinfo = 0; @@ -1824,7 +1894,8 @@ static int setup_indexes(DIR *dir, char *path, struct obd_uuid *obduuids, int num_obds, int **obdindexes, int *obdindex, enum tgt_type type) { - int ret, obdcount, obd_valid = 0, obdnum, i; + int ret, obdcount, obd_valid = 0, obdnum; + long i; struct obd_uuid *uuids = NULL; char buf[16]; int *indexes; @@ -2115,7 +2186,7 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path, int raw, char *pool_name) { char *prefix = is_dir ? "" : "lmm_"; - char nl = is_dir ? ' ' : '\n'; + char *seperator = ""; int rc; if (is_dir && lmm_oi_seq(&lum->lmm_oi) == FID_SEQ_LOV_DEFAULT) { @@ -2147,25 +2218,27 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path, &scount, NULL, NULL); if (rc == 0) - llapi_printf(LLAPI_MSG_NORMAL, "%d%c", - scount, nl); + llapi_printf(LLAPI_MSG_NORMAL, "%d", + scount); else llapi_error(LLAPI_MSG_ERROR, rc, "Cannot determine default" " stripe count."); } else { - llapi_printf(LLAPI_MSG_NORMAL, "%d%c", + llapi_printf(LLAPI_MSG_NORMAL, "%d", lum->lmm_stripe_count == (typeof(lum->lmm_stripe_count))(-1) - ? -1 : lum->lmm_stripe_count, nl); + ? -1 : lum->lmm_stripe_count); } } else { - llapi_printf(LLAPI_MSG_NORMAL, "%hd%c", - (__s16)lum->lmm_stripe_count, nl); + llapi_printf(LLAPI_MSG_NORMAL, "%hd", + (__s16)lum->lmm_stripe_count); } + seperator = is_dir ? " " : "\n"; } if (verbose & VERBOSE_SIZE) { + llapi_printf(LLAPI_MSG_NORMAL, "%s", seperator); if (verbose & ~VERBOSE_SIZE) llapi_printf(LLAPI_MSG_NORMAL, "%sstripe_size: ", prefix); @@ -2174,55 +2247,62 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path, rc = sattr_cache_get_defaults(NULL, path, NULL, &ssize, NULL); if (rc == 0) - llapi_printf(LLAPI_MSG_NORMAL, "%u%c", ssize, - nl); + llapi_printf(LLAPI_MSG_NORMAL, "%u", ssize); else llapi_error(LLAPI_MSG_ERROR, rc, "Cannot determine default" " stripe size."); } else { - llapi_printf(LLAPI_MSG_NORMAL, "%u%c", - lum->lmm_stripe_size, nl); + llapi_printf(LLAPI_MSG_NORMAL, "%u", + lum->lmm_stripe_size); } + seperator = is_dir ? " " : "\n"; } if ((verbose & VERBOSE_LAYOUT) && !is_dir) { + llapi_printf(LLAPI_MSG_NORMAL, "%s", seperator); if (verbose & ~VERBOSE_LAYOUT) llapi_printf(LLAPI_MSG_NORMAL, "%spattern: ", prefix); - llapi_printf(LLAPI_MSG_NORMAL, "%.x%c", lum->lmm_pattern, nl); + llapi_printf(LLAPI_MSG_NORMAL, "%.x", lum->lmm_pattern); + seperator = "\n"; } if ((verbose & VERBOSE_GENERATION) && !is_dir) { + llapi_printf(LLAPI_MSG_NORMAL, "%s", seperator); if (verbose & ~VERBOSE_GENERATION) llapi_printf(LLAPI_MSG_NORMAL, "%slayout_gen: ", prefix); - llapi_printf(LLAPI_MSG_NORMAL, "%u%c", - (int)lum->lmm_layout_gen, nl); + llapi_printf(LLAPI_MSG_NORMAL, "%u", + (int)lum->lmm_layout_gen); + seperator = "\n"; } if (verbose & VERBOSE_OFFSET) { + llapi_printf(LLAPI_MSG_NORMAL, "%s", seperator); if (verbose & ~VERBOSE_OFFSET) llapi_printf(LLAPI_MSG_NORMAL, "%sstripe_offset: ", prefix); if (is_dir) - llapi_printf(LLAPI_MSG_NORMAL, "%d%c", + llapi_printf(LLAPI_MSG_NORMAL, "%d", lum->lmm_stripe_offset == (typeof(lum->lmm_stripe_offset))(-1) ? -1 : - lum->lmm_stripe_offset, nl); + lum->lmm_stripe_offset); else - llapi_printf(LLAPI_MSG_NORMAL, "%u%c", - objects[0].l_ost_idx, nl); + llapi_printf(LLAPI_MSG_NORMAL, "%u", + objects[0].l_ost_idx); + seperator = is_dir ? " " : "\n"; } if ((verbose & VERBOSE_POOL) && (pool_name != NULL)) { + llapi_printf(LLAPI_MSG_NORMAL, "%s", seperator); if (verbose & ~VERBOSE_POOL) llapi_printf(LLAPI_MSG_NORMAL, "%spool: ", prefix); - llapi_printf(LLAPI_MSG_NORMAL, "%s%c", pool_name, nl); + llapi_printf(LLAPI_MSG_NORMAL, "%s", pool_name); } - if (is_dir && (verbose != VERBOSE_OBJID)) + if (!is_dir || (is_dir && (verbose != VERBOSE_OBJID))) llapi_printf(LLAPI_MSG_NORMAL, "\n"); } @@ -2624,12 +2704,10 @@ static int check_mdt_match(struct find_param *param) return 0; /* FIXME: For striped dir, we should get stripe information and check */ - for (i = 0; i < param->num_mdts; i++) { - if (param->mdtindexes[i] == param->file_mdtindex) - if (param->exclude_mdt) - return 0; - return 1; - } + for (i = 0; i < param->num_mdts; i++) { + if (param->mdtindexes[i] == param->file_mdtindex) + return !param->exclude_mdt; + } if (param->exclude_mdt) return 1; @@ -3788,7 +3866,8 @@ int root_ioctl(const char *mdtname, int opc, void *data, int *mdtidxp, { char fsname[20]; char *ptr; - int fd, index, rc; + int fd, rc; + long index; /* Take path, fsname, or MDTname. Assume MDT0000 in the former cases. Open root and parse mdt index. */ @@ -3882,7 +3961,7 @@ int llapi_changelog_start(void **priv, int flags, const char *device, startrec, flags); /* Only the kernel reference keeps the write side open */ close(cp->kuc.lk_wfd); - cp->kuc.lk_wfd = 0; + cp->kuc.lk_wfd = LK_NOFD; if (rc < 0) { /* frees and clears priv */ llapi_changelog_fini(priv); @@ -3937,24 +4016,24 @@ static inline int changelog_extend_rec(struct changelog_ext_rec *ext) */ int llapi_changelog_recv(void *priv, struct changelog_ext_rec **rech) { - struct changelog_private *cp = (struct changelog_private *)priv; - struct kuc_hdr *kuch; - int rc = 0; + struct changelog_private *cp = (struct changelog_private *)priv; + struct kuc_hdr *kuch; + int rc = 0; - if (!cp || (cp->magic != CHANGELOG_PRIV_MAGIC)) - return -EINVAL; - if (rech == NULL) - return -EINVAL; - kuch = malloc(CR_MAXSIZE + sizeof(*kuch)); - if (kuch == NULL) - return -ENOMEM; + if (!cp || (cp->magic != CHANGELOG_PRIV_MAGIC)) + return -EINVAL; + if (rech == NULL) + return -EINVAL; + kuch = malloc(KUC_CHANGELOG_MSG_MAXSIZE); + if (kuch == NULL) + return -ENOMEM; repeat: - rc = libcfs_ukuc_msg_get(&cp->kuc, (char *)kuch, - CR_MAXSIZE + sizeof(*kuch), - KUC_TRANSPORT_CHANGELOG); - if (rc < 0) - goto out_free; + rc = libcfs_ukuc_msg_get(&cp->kuc, (char *)kuch, + KUC_CHANGELOG_MSG_MAXSIZE, + KUC_TRANSPORT_CHANGELOG); + if (rc < 0) + goto out_free; if ((kuch->kuc_transport != KUC_TRANSPORT_CHANGELOG) || ((kuch->kuc_msgtype != CL_RECORD) && @@ -4008,7 +4087,7 @@ int llapi_changelog_free(struct changelog_ext_rec **rech) int llapi_changelog_clear(const char *mdtname, const char *idstr, long long endrec) { - int id; + long id; if (endrec < 0) { llapi_err_noerrno(LLAPI_MSG_ERROR, @@ -4177,9 +4256,12 @@ int llapi_get_version(char *buffer, int buffer_size, * this value to verify if file data was modified. This only checks the file * data, not metadata. * - * \param flags If set to LL_DV_NOFLUSH, the data version will be read - * directly from OST without regard to possible dirty cache on - * client nodes. + * \param flags 0: no flush pages, usually used it the process has already + * taken locks; + * LL_DV_RD_FLUSH: OSTs will take LCK_PR to flush dirty pages + * from clients; + * LL_DV_WR_FLUSH: OSTs will take LCK_PW to flush all caching + * pages from clients. * * \retval 0 on success. * \retval -errno on error. @@ -4231,7 +4313,7 @@ int llapi_create_volatile_idx(char *directory, int idx, int mode) close(fd); if (rc < sizeof(random)) { llapi_error(LLAPI_MSG_ERROR, errno, - "Cannot read %d bytes from /dev/urandom\n", + "cannot read %zu bytes from /dev/urandom", sizeof(random)); return -errno; }