* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2015, Intel Corporation.
+ * Copyright (c) 2011, 2016, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <libcfs/util/string.h>
#include <lnet/lnetctl.h>
#include <lustre/lustreapi.h>
+#include <lustre/lustre_ostid.h>
#include <lustre_ioctl.h>
#include "lustreapi_internal.h"
static int llapi_msg_level = LLAPI_MSG_MAX;
+char *mdt_hash_name[] = { "none",
+ LMV_HASH_NAME_ALL_CHARS,
+ LMV_HASH_NAME_FNV_1A_64 };
+
void llapi_msg_set_level(int level)
{
/* ensure level is in the good range */
int llapi_get_obd_count(char *mnt, int *count, int is_mdt)
{
- DIR *root;
- int rc;
+ int root;
+ int rc;
- root = opendir(mnt);
- if (!root) {
- rc = -errno;
- llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
- return rc;
- }
+ root = open(mnt, O_RDONLY | O_DIRECTORY);
+ if (root < 0) {
+ 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;
+ *count = is_mdt;
+ rc = ioctl(root, LL_IOC_GETOBDCOUNT, count);
+ if (rc < 0)
+ rc = -errno;
- closedir(root);
- return rc;
+ close(root);
+ return rc;
}
/* Check if user specified value matches a real uuid. Ignore _UUID,
/* Here, param->fp_obd_uuid points to a single obduuid, the index of which is
* returned in param->fp_obd_index */
-static int setup_obd_uuid(DIR *dir, char *dname, struct find_param *param)
+static int setup_obd_uuid(int fd, char *dname, struct find_param *param)
{
struct obd_uuid obd_uuid;
char buf[PATH_MAX];
/* Get the lov/lmv name */
if (param->fp_get_lmv)
- rc = llapi_file_fget_lmv_uuid(dirfd(dir), &obd_uuid);
+ rc = llapi_file_fget_lmv_uuid(fd, &obd_uuid);
else
- rc = llapi_file_fget_lov_uuid(dirfd(dir), &obd_uuid);
+ rc = llapi_file_fget_lov_uuid(fd, &obd_uuid);
if (rc) {
if (rc != -ENOTTY) {
llapi_error(LLAPI_MSG_ERROR, rc,
int llapi_ostlist(char *path, struct find_param *param)
{
- DIR *dir;
- int ret;
+ int fd;
+ int ret;
- dir = opendir(path);
- if (dir == NULL)
- return -errno;
+ fd = open(path, O_RDONLY | O_DIRECTORY);
+ if (fd < 0)
+ return -errno;
- ret = setup_obd_uuid(dir, path, param);
- closedir(dir);
+ ret = setup_obd_uuid(fd, path, param);
+ close(fd);
- return ret;
+ return ret;
}
/*
/* show all information default */
if (!verbose) {
if (lum->lum_magic == LMV_USER_MAGIC)
- verbose = VERBOSE_POOL | VERBOSE_COUNT | VERBOSE_OFFSET;
+ verbose = VERBOSE_POOL | VERBOSE_COUNT |
+ VERBOSE_OFFSET | VERBOSE_HASH_TYPE;
else
verbose = VERBOSE_OBJID;
}
llapi_printf(LLAPI_MSG_NORMAL, "lmv_stripe_offset: ");
llapi_printf(LLAPI_MSG_NORMAL, "%d",
(int)lum->lum_stripe_offset);
+ if (verbose & VERBOSE_HASH_TYPE)
+ separator = " ";
+ else
+ separator = "\n";
+ }
+
+ if (verbose & VERBOSE_HASH_TYPE) {
+ unsigned int type = lum->lum_hash_type;
+
+ llapi_printf(LLAPI_MSG_NORMAL, "%s", separator);
+ if (verbose & ~VERBOSE_HASH_TYPE)
+ llapi_printf(LLAPI_MSG_NORMAL, "lmv_hash_type: ");
+ if (type < LMV_HASH_TYPE_MAX)
+ llapi_printf(LLAPI_MSG_NORMAL, "%s",
+ mdt_hash_name[type]);
+ else
+ llapi_printf(LLAPI_MSG_NORMAL, "%d",
+ (int)type);
separator = "\n";
}
{
struct obd_statfs stat_buf;
struct obd_uuid uuid_buf;
- int ret;
+ int ret;
- LASSERT(type == LL_STATFS_LOV || type == LL_STATFS_LMV);
+ if (type != LL_STATFS_LOV && type != LL_STATFS_LMV)
+ return -EINVAL;
memset(&stat_buf, 0, sizeof(struct obd_statfs));
memset(&uuid_buf, 0, sizeof(struct obd_uuid));
int checked_type = 0;
int ret = 0;
- LASSERT(parent != NULL || dir != NULL);
+ if (parent == NULL && dir == NULL)
+ return -EINVAL;
param->fp_lmd->lmd_lmm.lmm_stripe_count = 0;
char *filename;
bool retry = false;
- LASSERT(parent != NULL || dirp != NULL);
+ if (parent == NULL && dirp == NULL)
+ return -EINVAL;
+
if (dirp != NULL)
closedir(*dirp);
int llapi_mv(char *path, struct find_param *param)
{
-#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 9, 53, 0)
+#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 9, 59, 0)
static bool printed;
if (!printed) {
int ret;
int mdtidx;
- LASSERT(parent != NULL || d != NULL);
+ if (parent == NULL && d == NULL)
+ return -EINVAL;
if (d != NULL) {
ret = llapi_file_fget_mdtidx(dirfd(d), &mdtidx);
DIR *d = dirp == NULL ? NULL : *dirp;
int ret = 0;
- LASSERT(parent != NULL || d != NULL);
+ if (parent == NULL && d == NULL)
+ return -EINVAL;
if (param->fp_obd_uuid) {
param->fp_quiet = 1;
- ret = setup_obd_uuid(d ? d : parent, path, param);
- if (ret)
- return ret;
- }
+ ret = setup_obd_uuid(d ? dirfd(d) : dirfd(parent), path, param);
+ if (ret)
+ return ret;
+ }
if (d) {
if (param->fp_get_lmv || param->fp_get_default_lmv) {
cb_common_fini, param);
}
-int llapi_obd_statfs(char *path, __u32 type, __u32 index,
- struct obd_statfs *stat_buf,
- struct obd_uuid *uuid_buf)
+int llapi_obd_fstatfs(int fd, __u32 type, __u32 index,
+ struct obd_statfs *stat_buf, struct obd_uuid *uuid_buf)
{
- int fd;
char raw[OBD_MAX_IOCTL_BUFFER] = {'\0'};
char *rawbuf = raw;
struct obd_ioctl_data data = { 0 };
return rc;
}
- fd = open(path, O_RDONLY);
- if (errno == EISDIR)
- fd = open(path, O_DIRECTORY | O_RDONLY);
+ rc = ioctl(fd, IOC_OBD_STATFS, (void *)rawbuf);
+
+ return rc < 0 ? -errno : 0;
+}
+
+int llapi_obd_statfs(char *path, __u32 type, __u32 index,
+ struct obd_statfs *stat_buf, struct obd_uuid *uuid_buf)
+{
+ int fd;
+ int rc;
+ fd = open(path, O_RDONLY);
if (fd < 0) {
- rc = errno ? -errno : -EBADF;
+ rc = -errno;
llapi_error(LLAPI_MSG_ERROR, rc, "error: %s: opening '%s'",
__func__, path);
/* If we can't even open a file on the filesystem (e.g. with
* -ESHUTDOWN), force caller to exit or it will loop forever. */
return -ENODEV;
}
- rc = ioctl(fd, IOC_OBD_STATFS, (void *)rawbuf);
- if (rc)
- rc = errno ? -errno : -EINVAL;
+
+ rc = llapi_obd_fstatfs(fd, type, index, stat_buf, uuid_buf);
close(fd);
+
return rc;
}
int llapi_quotactl(char *mnt, struct if_quotactl *qctl)
{
- DIR *root;
- int rc;
+ char fsname[PATH_MAX + 1];
+ int root;
+ int rc;
- root = opendir(mnt);
- if (!root) {
- rc = -errno;
- llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
- return rc;
- }
+ rc = llapi_search_fsname(mnt, fsname);
+ if (rc) {
+ llapi_err_noerrno(LLAPI_MSG_ERROR,
+ "'%s' isn't on Lustre filesystem", mnt);
+ return rc;
+ }
- rc = ioctl(dirfd(root), OBD_IOC_QUOTACTL, qctl);
- if (rc < 0)
- rc = -errno;
+ root = open(mnt, O_RDONLY | O_DIRECTORY);
+ if (root < 0) {
+ rc = -errno;
+ llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
+ return rc;
+ }
- closedir(root);
- return rc;
+ rc = ioctl(root, OBD_IOC_QUOTACTL, qctl);
+ if (rc < 0)
+ rc = -errno;
+
+ close(root);
+ return rc;
}
/* Print mdtname 'name' into 'buf' using 'format'. Add -MDT0000 if needed.
int llapi_get_connect_flags(const char *mnt, __u64 *flags)
{
- DIR *root;
- int rc;
+ int root;
+ int rc;
- root = opendir(mnt);
- if (!root) {
- rc = -errno;
- llapi_error(LLAPI_MSG_ERROR, rc, "open %s failed", mnt);
- return rc;
- }
+ root = open(mnt, O_RDONLY | O_DIRECTORY);
+ if (root < 0) {
+ 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);
- return rc;
+ rc = ioctl(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);
+ }
+ close(root);
+ return rc;
}
/**