* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
{
int want = WANT_PATH, idx = -1;
- if (!pathname) {
+ if (!pathname || pathname[0] == '\0') {
want |= WANT_INDEX;
idx = index;
} else
/* Given a path, find the corresponding Lustre fsname */
int llapi_search_fsname(const char *pathname, char *fsname)
{
- char *path = (char*)pathname, buf[PATH_MAX + 1];
+ char *path;
+ int rc;
- if (pathname[0] != '/') { /* Need a absolute path */
- memset(buf, '\0', sizeof(buf));
- if (realpath(pathname, buf) == NULL) {
- llapi_err(LLAPI_MSG_ERROR, "pathname '%s' cannot expand",
- pathname);
- return -EINVAL;
+ path = realpath(pathname, NULL);
+ if (path == NULL) {
+ char buf[PATH_MAX + 1], *ptr;
+
+ buf[0] = 0;
+ if (pathname[0] != '/') {
+ /* Need an absolute path, but realpath() only works for
+ * pathnames that actually exist. We go through the
+ * extra hurdle of dirname(getcwd() + pathname) in
+ * case the relative pathname contains ".." in it. */
+ if (getcwd(buf, sizeof(buf) - 1) == NULL)
+ return -errno;
+ strcat(buf, "/");
+ }
+ strncat(buf, pathname, sizeof(buf) - strlen(buf));
+ path = realpath(buf, NULL);
+ if (path == NULL) {
+ ptr = strrchr(buf, '/');
+ if (ptr == NULL)
+ return -ENOENT;
+ *ptr = '\0';
+ path = realpath(buf, NULL);
+ if (path == NULL) {
+ llapi_err(LLAPI_MSG_ERROR,
+ "pathname '%s' cannot expand",
+ pathname);
+ return -errno;
+ }
}
- path = buf;
}
- return get_root_path(WANT_FSNAME | WANT_ERROR, fsname, NULL,
- path, -1);
+ rc = get_root_path(WANT_FSNAME | WANT_ERROR, fsname, NULL, path, -1);
+ free(path);
+ return rc;
}
/* return the first file matching this pattern */
return ret;
}
-static int cb_ostlist(char *path, DIR *parent, DIR *d, void *data,
- struct dirent64 *de)
+int llapi_ostlist(char *path, struct find_param *param)
{
- struct find_param *param = (struct find_param *)data;
+ DIR *dir;
+ int ret;
- LASSERT(parent != NULL || d != NULL);
+ dir = opendir(path);
+ if (dir == NULL)
+ return -errno;
- /* Prepare odb. */
- return setup_obd_uuid(d ? d : parent, path, param);
-}
+ ret = setup_obd_uuid(dir, path, param);
+ closedir(dir);
-int llapi_ostlist(char *path, struct find_param *param)
-{
- return param_callback(path, cb_ostlist, cb_common_fini, param);
+ return ret;
}
static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
+ struct lov_user_ost_data_v1 *objects,
int is_dir, int verbose, int depth,
char *pool_name)
{
char *prefix = is_dir ? "" : "lmm_";
char nl = is_dir ? ' ' : '\n';
- if (is_dir && lum->lmm_object_gr == LOV_OBJECT_GROUP_DEFAULT) {
- lum->lmm_object_gr = LOV_OBJECT_GROUP_CLEAR;
+ if (is_dir && lum->lmm_object_seq == LOV_OBJECT_GROUP_DEFAULT) {
+ lum->lmm_object_seq = LOV_OBJECT_GROUP_CLEAR;
if (verbose & VERBOSE_DETAIL)
llapi_printf(LLAPI_MSG_NORMAL, "(Default) ");
}
if ((verbose & VERBOSE_DETAIL) && !is_dir) {
llapi_printf(LLAPI_MSG_NORMAL, "lmm_magic: 0x%08X\n",
lum->lmm_magic);
- llapi_printf(LLAPI_MSG_NORMAL, "lmm_object_gr: "LPX64"\n",
- lum->lmm_object_gr);
+ llapi_printf(LLAPI_MSG_NORMAL, "lmm_seq: "LPX64"\n",
+ lum->lmm_object_seq);
llapi_printf(LLAPI_MSG_NORMAL, "lmm_object_id: "LPX64"\n",
lum->lmm_object_id);
}
if (verbose & ~VERBOSE_COUNT)
llapi_printf(LLAPI_MSG_NORMAL, "%sstripe_count: ",
prefix);
- llapi_printf(LLAPI_MSG_NORMAL, "%hd%c",
- (__s16)lum->lmm_stripe_count, nl);
+ if (is_dir)
+ llapi_printf(LLAPI_MSG_NORMAL, "%d%c",
+ lum->lmm_stripe_count ==
+ (typeof(lum->lmm_stripe_count))(-1) ? -1 :
+ lum->lmm_stripe_count, nl);
+ else
+ llapi_printf(LLAPI_MSG_NORMAL, "%hd%c",
+ (__s16)lum->lmm_stripe_count, nl);
}
if (verbose & VERBOSE_SIZE) {
if (verbose & ~VERBOSE_OFFSET)
llapi_printf(LLAPI_MSG_NORMAL, "%sstripe_offset: ",
prefix);
- llapi_printf(LLAPI_MSG_NORMAL, "%u%c",
- lum->lmm_objects[0].l_ost_idx, nl);
+ if (is_dir)
+ llapi_printf(LLAPI_MSG_NORMAL, "%d%c",
+ lum->lmm_stripe_offset ==
+ (typeof(lum->lmm_stripe_offset))(-1) ? -1 :
+ lum->lmm_stripe_offset, nl);
+ else
+ llapi_printf(LLAPI_MSG_NORMAL, "%u%c",
+ objects[0].l_ost_idx, nl);
}
if ((verbose & VERBOSE_POOL) && (pool_name != NULL)) {
- llapi_printf(LLAPI_MSG_NORMAL, "pool: %s", pool_name);
- is_dir = 1;
+ if (verbose & ~VERBOSE_POOL)
+ llapi_printf(LLAPI_MSG_NORMAL, "%spool: ",
+ prefix);
+ llapi_printf(LLAPI_MSG_NORMAL, "%s%c", pool_name, nl);
}
if (is_dir && (verbose != VERBOSE_OBJID))
}
if (obdstripe == 1)
- lov_dump_user_lmm_header(lum, path, is_dir, header, depth,
+ lov_dump_user_lmm_header(lum, path, objects, is_dir, header, depth,
pool_name);
if (!is_dir && (header & VERBOSE_OBJID)) {
for (i = 0; i < lum->lmm_stripe_count; i++) {
int idx = objects[i].l_ost_idx;
long long oid = objects[i].l_object_id;
- long long gr = objects[i].l_object_gr;
+ long long gr = objects[i].l_object_seq;
if ((obdindex == OBD_NOT_FOUND) || (obdindex == idx))
llapi_printf(LLAPI_MSG_NORMAL,
"\t%6u\t%14llu\t%#13llx\t%14llu%s\n",
* Note: 5th actually means that the value is within the interval
* (limit - margin, limit]. */
static int find_value_cmp(unsigned int file, unsigned int limit, int sign,
- unsigned long long margin, int mds)
+ int negopt, unsigned long long margin, int mds)
{
+ int ret = -1;
+
if (sign > 0) {
- if (file < limit)
- return mds ? 0 : 1;
- }
-
- if (sign == 0) {
- if (file <= limit && file + margin > limit)
- return mds ? 0 : 1;
- if (file + margin <= limit)
- return mds ? 0 : -1;
- }
-
- if (sign < 0) {
- if (file > limit)
- return 1;
- if (mds)
- return 0;
+ if (file <= limit)
+ ret = mds ? 0 : 1;
+ } else if (sign == 0) {
+ if (file <= limit && file + margin >= limit)
+ ret = mds ? 0 : 1;
+ else if (file + margin <= limit)
+ ret = mds ? 0 : -1;
+ } else if (sign < 0) {
+ if (file >= limit)
+ ret = 1;
+ else if (mds)
+ ret = 0;
}
- return -1;
+ return negopt ? ~ret + 1 : ret;
}
/* Check if the file time matches all the given criteria (e.g. --atime +/-N).
/* Check if file is accepted. */
if (param->atime) {
ret = find_value_cmp(st->st_atime, param->atime,
- param->asign, 24 * 60 * 60, mds);
+ param->asign, param->exclude_atime,
+ 24 * 60 * 60, mds);
if (ret < 0)
return ret;
rc = ret;
if (param->mtime) {
ret = find_value_cmp(st->st_mtime, param->mtime,
- param->msign, 24 * 60 * 60, mds);
+ param->msign, param->exclude_mtime,
+ 24 * 60 * 60, mds);
if (ret < 0)
return ret;
if (param->ctime) {
ret = find_value_cmp(st->st_ctime, param->ctime,
- param->csign, 24 * 60 * 60, mds);
+ param->csign, param->exclude_ctime,
+ 24 * 60 * 60, mds);
if (ret < 0)
return ret;
/* If a time or OST should be checked, the decision is not taken yet. */
if (param->atime || param->ctime || param->mtime || param->obduuid ||
- param->size)
+ param->check_size)
decision = 0;
ret = 0;
'glimpse-size-ioctl'. */
if (!decision && S_ISREG(st->st_mode) &&
param->lmd->lmd_lmm.lmm_stripe_count &&
- (param->size ||param->atime || param->mtime || param->ctime)) {
+ (param->check_size ||param->atime || param->mtime || param->ctime)) {
if (param->obdindex != OBD_NOT_FOUND) {
/* Check whether the obd is active or not, if it is
* not active, just print the object affected by this
goto decided;
}
- if (param->size)
+ if (param->check_size)
decision = find_value_cmp(st->st_size, param->size,
- param->size_sign, param->size_units,
- 0);
+ param->size_sign, param->exclude_size,
+ param->size_units, 0);
print_path:
if (decision != -1) {
*mdtidxp = index;
rc = ioctl(fd, opc, data);
+ if (rc == -1)
+ rc = -errno;
+ else
+ rc = 0;
if (rc && want_error)
llapi_err(LLAPI_MSG_ERROR, "ioctl %d err %d", opc, rc);
int magic;
int flags;
lustre_kernelcomm kuc;
- char *buf;
};
/** Start reading from a changelog
int rc;
/* Set up the receiver control struct */
- cp = malloc(sizeof(*cp));
+ cp = calloc(1, sizeof(*cp));
if (cp == NULL)
return -ENOMEM;
- cp->buf = malloc(CR_MAXSIZE);
- if (cp->buf == NULL) {
- rc = -ENOMEM;
- goto out_free;
- }
-
cp->magic = CHANGELOG_PRIV_MAGIC;
cp->flags = flags;
return 0;
out_free:
- if (cp->buf)
- free(cp->buf);
free(cp);
return rc;
}
return -EINVAL;
libcfs_ukuc_stop(&cp->kuc);
- free(cp->buf);
free(cp);
*priv = NULL;
return 0;
return -EINVAL;
if (rech == NULL)
return -EINVAL;
+ kuch = malloc(CR_MAXSIZE + sizeof(*kuch));
+ if (kuch == NULL)
+ return -ENOMEM;
repeat:
- rc = libcfs_ukuc_msg_get(&cp->kuc, cp->buf, CR_MAXSIZE,
+ rc = libcfs_ukuc_msg_get(&cp->kuc, (char *)kuch,
+ CR_MAXSIZE + sizeof(*kuch),
KUC_TRANSPORT_CHANGELOG);
if (rc < 0)
- return rc;
+ goto out_free;
- kuch = (struct kuc_hdr *)cp->buf;
if ((kuch->kuc_transport != KUC_TRANSPORT_CHANGELOG) ||
((kuch->kuc_msgtype != CL_RECORD) &&
(kuch->kuc_msgtype != CL_EOF))) {
}
}
- /* Our message is a changelog_rec */
+ /* Our message is a changelog_rec. Use pointer math to skip
+ * kuch_hdr and point directly to the message payload.
+ */
*rech = (struct changelog_rec *)(kuch + 1);
return 0;
out_free:
*rech = NULL;
+ free(kuch);
return rc;
}
/** Release the changelog record when done with it. */
int llapi_changelog_free(struct changelog_rec **rech)
{
+ if (*rech) {
+ /* We allocated memory starting at the kuc_hdr, but passed
+ * the consumer a pointer to the payload.
+ * Use pointer math to get back to the header.
+ */
+ struct kuc_hdr *kuch = (struct kuc_hdr *)*rech - 1;
+ free(kuch);
+ }
*rech = NULL;
return 0;
}
int llapi_fid2path(const char *device, const char *fidstr, char *buf,
int buflen, long long *recno, int *linkno)
{
- char path[PATH_MAX];
struct lu_fid fid;
struct getinfo_fid2path *gf;
- int fd, rc;
+ int rc;
while (*fidstr == '[')
fidstr++;
return -EINVAL;
}
- /* Take path or fsname */
- if (device[0] == '/') {
- strcpy(path, device);
- } else {
- rc = get_root_path(WANT_PATH | WANT_ERROR, (char *)device,
- NULL, path, -1);
- if (rc < 0)
- return rc;
- }
- sprintf(path, "%s/%s/fid/%s", path, dot_lustre_name, fidstr);
- fd = open(path, O_RDONLY | O_NONBLOCK);
- if (fd < 0)
- return -errno;
-
gf = malloc(sizeof(*gf) + buflen);
+ if (gf == NULL)
+ return -ENOMEM;
gf->gf_fid = fid;
gf->gf_recno = *recno;
gf->gf_linkno = *linkno;
gf->gf_pathlen = buflen;
- rc = ioctl(fd, OBD_IOC_FID2PATH, gf);
+
+ /* Take path or fsname */
+ rc = root_ioctl(device, OBD_IOC_FID2PATH, gf, NULL, 0);
if (rc) {
- llapi_err(LLAPI_MSG_ERROR, "ioctl err %d", rc);
+ if (rc != -ENOENT)
+ llapi_err(LLAPI_MSG_ERROR, "ioctl err %d", rc);
} else {
memcpy(buf, gf->gf_path, gf->gf_pathlen);
*recno = gf->gf_recno;
}
free(gf);
- close(fd);
return rc;
}
#define CT_PRIV_MAGIC 0xC0BE2001
struct copytool_private {
int magic;
- char *buf;
char *fsname;
lustre_kernelcomm kuc;
__u32 archives;
return -EINVAL;
}
- ct = malloc(sizeof(*ct));
+ ct = calloc(1, sizeof(*ct));
if (ct == NULL)
return -ENOMEM;
- ct->buf = malloc(HAL_MAXSIZE);
ct->fsname = malloc(strlen(fsname) + 1);
- if (ct->buf == NULL || ct->fsname == NULL) {
+ if (ct->fsname == NULL) {
rc = -ENOMEM;
goto out_err;
}
return 0;
out_err:
- if (ct->buf)
- free(ct->buf);
if (ct->fsname)
free(ct->fsname);
free(ct);
/* Shut down the kernelcomms */
libcfs_ukuc_stop(&ct->kuc);
- free(ct->buf);
free(ct->fsname);
free(ct);
*priv = NULL;
if (halh == NULL || msgsize == NULL)
return -EINVAL;
- rc = libcfs_ukuc_msg_get(&ct->kuc, ct->buf, HAL_MAXSIZE,
+ kuch = malloc(HAL_MAXSIZE + sizeof(*kuch));
+ if (kuch == NULL)
+ return -ENOMEM;
+
+ rc = libcfs_ukuc_msg_get(&ct->kuc, (char *)kuch,
+ HAL_MAXSIZE + sizeof(*kuch),
KUC_TRANSPORT_HSM);
if (rc < 0)
- return rc;
+ goto out_free;
/* Handle generic messages */
- kuch = (struct kuc_hdr *)ct->buf;
if (kuch->kuc_transport == KUC_TRANSPORT_GENERIC &&
kuch->kuc_msgtype == KUC_MSG_SHUTDOWN) {
rc = -ESHUTDOWN;
goto out_free;
}
- /* Our message is an hsm_action_list */
-
+ /* Our message is a hsm_action_list. Use pointer math to skip
+ * kuch_hdr and point directly to the message payload.
+ */
hal = (struct hsm_action_list *)(kuch + 1);
/* Check that we have registered for this archive # */
out_free:
*halh = NULL;
*msgsize = 0;
+ free(kuch);
return rc;
}
/** Release the action list when done with it. */
int llapi_copytool_free(struct hsm_action_list **hal)
{
- *hal = NULL;
- return 0;
+ /* Reuse the llapi_changelog_free function */
+ return llapi_changelog_free((struct changelog_rec **)hal);
}
int llapi_get_connect_flags(const char *mnt, __u64 *flags)
"ioctl on %s for getting connect flags failed", mnt);
return rc;
}
+
+int llapi_get_version(char *buffer, int buffer_size,
+ char **version)
+{
+ int rc;
+ int fd;
+ struct obd_ioctl_data *data = (struct obd_ioctl_data *)buffer;
+
+ fd = open(OBD_DEV_PATH, O_RDONLY);
+ if (fd == -1)
+ return -errno;
+
+ memset(buffer, 0, buffer_size);
+ data->ioc_version = OBD_IOCTL_VERSION;
+ data->ioc_inllen1 = buffer_size - cfs_size_round(sizeof(*data));
+ data->ioc_inlbuf1 = buffer + cfs_size_round(sizeof(*data));
+ data->ioc_len = obd_ioctl_packlen(data);
+
+ rc = ioctl(fd, OBD_GET_VERSION, buffer);
+ if (rc == -1) {
+ rc = errno;
+ close(fd);
+ return -rc;
+ }
+ close(fd);
+ *version = data->ioc_bulk;
+ return 0;
+}