* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#endif
#include <poll.h>
+#include <libcfs/util/string.h>
#include <libcfs/libcfs.h>
#include <lnet/lnetctl.h>
#include <lustre/lustreapi.h>
* the value of the index will be ignored. The pathname will return data if
* the pathname is located on a lustre mount. Index is used to pick which
* mount point you want in the case of multiple mounted lustre file systems.
- * See function lfs_osts in lfs.c for a example of the index use.
+ * See function lfs_osts in lfs.c for an example of the index use.
*/
int llapi_search_mounts(const char *pathname, int index, char *mntdir,
char *fsname)
static int common_param_init(struct find_param *param, char *path)
{
- int lumlen = get_mds_md_size(path);
+ int lum_size = get_mds_md_size(path);
- if (lumlen < PATH_MAX + 1)
- lumlen = PATH_MAX + 1;
+ if (lum_size < PATH_MAX + 1)
+ lum_size = PATH_MAX + 1;
- param->lumlen = lumlen;
- param->lmd = malloc(sizeof(lstat_t) + param->lumlen);
- if (param->lmd == NULL) {
+ param->fp_lum_size = lum_size;
+ param->fp_lmd = malloc(sizeof(lstat_t) + param->fp_lum_size);
+ if (param->fp_lmd == NULL) {
llapi_error(LLAPI_MSG_ERROR, -ENOMEM,
"error: allocation of %zu bytes for ioctl",
- sizeof(lstat_t) + param->lumlen);
+ sizeof(lstat_t) + param->fp_lum_size);
return -ENOMEM;
}
- param->fp_lmv_count = 256;
- param->fp_lmv_md = malloc(lmv_user_md_size(256, LMV_MAGIC_V1));
+ param->fp_lmv_stripe_count = 256;
+ param->fp_lmv_md = malloc(lmv_user_md_size(param->fp_lmv_stripe_count,
+ LMV_MAGIC_V1));
if (param->fp_lmv_md == NULL) {
llapi_error(LLAPI_MSG_ERROR, -ENOMEM,
"error: allocation of %d bytes for ioctl",
- lmv_user_md_size(256, LMV_MAGIC_V1));
+ lmv_user_md_size(param->fp_lmv_stripe_count,
+ LMV_MAGIC_V1));
return -ENOMEM;
}
- param->got_uuids = 0;
- param->obdindexes = NULL;
- param->obdindex = OBD_NOT_FOUND;
- if (!param->migrate)
- param->mdtindex = OBD_NOT_FOUND;
+ param->fp_got_uuids = 0;
+ param->fp_obd_indexes = NULL;
+ param->fp_obd_index = OBD_NOT_FOUND;
+ if (!param->fp_migrate)
+ param->fp_mdt_index = OBD_NOT_FOUND;
return 0;
}
static void find_param_fini(struct find_param *param)
{
- if (param->obdindexes)
- free(param->obdindexes);
+ if (param->fp_obd_indexes)
+ free(param->fp_obd_indexes);
- if (param->lmd)
- free(param->lmd);
+ if (param->fp_lmd)
+ free(param->fp_lmd);
if (param->fp_lmv_md)
free(param->fp_lmv_md);
static int cb_get_dirstripe(char *path, DIR *d, struct find_param *param)
{
- struct lmv_user_md *lmv = (struct lmv_user_md *)param->fp_lmv_md;
- int ret = 0;
-
- lmv->lum_stripe_count = param->fp_lmv_count;
- if (param->get_default_lmv)
- lmv->lum_magic = LMV_USER_MAGIC;
+ param->fp_lmv_md->lum_stripe_count = param->fp_lmv_stripe_count;
+ if (param->fp_get_default_lmv)
+ param->fp_lmv_md->lum_magic = LMV_USER_MAGIC;
else
- lmv->lum_magic = LMV_MAGIC_V1;
- ret = ioctl(dirfd(d), LL_IOC_LMV_GETSTRIPE, lmv);
+ param->fp_lmv_md->lum_magic = LMV_MAGIC_V1;
- return ret;
+ return ioctl(dirfd(d), LL_IOC_LMV_GETSTRIPE, param->fp_lmv_md);
}
static int get_lmd_info(char *path, DIR *parent, DIR *dir,
if (dir) {
ret = ioctl(dirfd(dir), LL_IOC_MDC_GETINFO, (void *)lmd);
} else if (parent) {
- char *fname = strrchr(path, '/');
+ char *fname = strrchr(path, '/');
- fname = (fname == NULL ? path : fname + 1);
- /* retrieve needed file info */
+ /* To avoid opening, locking, and closing each file on the
+ * client if that is not needed. The GETFILEINFO ioctl can
+ * be done on the patent dir with a single open for all
+ * files in that directory, and it also doesn't pollute the
+ * client dcache with millions of dentries when traversing
+ * a large filesystem. */
+ fname = (fname == NULL ? path : fname + 1);
+ /* retrieve needed file info */
strlcpy((char *)lmd, fname, lumlen);
- ret = ioctl(dirfd(parent), IOC_MDC_GETFILEINFO, (void *)lmd);
+ ret = ioctl(dirfd(parent), IOC_MDC_GETFILEINFO, (void *)lmd);
}
if (ret) {
while ((dent = readdir64(d)) != NULL) {
int rc;
- param->have_fileinfo = 0;
-
if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
continue;
strcat(path, dent->d_name);
if (dent->d_type == DT_UNKNOWN) {
- lstat_t *st = ¶m->lmd->lmd_st;
+ lstat_t *st = ¶m->fp_lmd->lmd_st;
- rc = get_lmd_info(path, d, NULL, param->lmd,
- param->lumlen);
+ rc = get_lmd_info(path, d, NULL, param->fp_lmd,
+ param->fp_lum_size);
if (rc == 0)
dent->d_type = IFTODT(st->st_mode);
else if (ret == 0)
/*
* If uuidp is NULL, return the number of available obd uuids.
* If uuidp is non-NULL, then it will return the uuids of the obds. If
- * there are more OSTs then allocated to uuidp, then an error is returned with
+ * there are more OSTs than allocated to uuidp, then an error is returned with
* the ost_count set to number of available obd uuids.
*/
static int llapi_get_target_uuids(int fd, struct obd_uuid *uuidp,
return (strncmp(search_uuid, real_uuid, cmplen) == 0);
}
-/* Here, param->obduuid points to a single obduuid, the index of which is
- * returned in param->obdindex */
+/* 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)
{
struct obd_uuid obd_uuid;
FILE *fp;
int rc = 0;
- if (param->got_uuids)
+ if (param->fp_got_uuids)
return rc;
/* Get the lov/lmv name */
- if (param->get_lmv)
+ if (param->fp_get_lmv)
rc = llapi_file_fget_lmv_uuid(dirfd(dir), &obd_uuid);
else
rc = llapi_file_fget_lov_uuid(dirfd(dir), &obd_uuid);
return rc;
}
- param->got_uuids = 1;
+ param->fp_got_uuids = 1;
- /* Now get the ost uuids from /proc */
- snprintf(buf, sizeof(buf), "/proc/fs/lustre/%s/%s/target_obd",
- param->get_lmv ? "lmv" : "lov", obd_uuid.uuid);
+ /* Now get the ost uuids from /proc */
+ snprintf(buf, sizeof(buf), "/proc/fs/lustre/%s/%s/target_obd",
+ param->fp_get_lmv ? "lmv" : "lov", obd_uuid.uuid);
fp = fopen(buf, "r");
if (fp == NULL) {
rc = -errno;
return rc;
}
- if (!param->obduuid && !param->quiet && !param->obds_printed)
- llapi_printf(LLAPI_MSG_NORMAL, "%s:\n",
- param->get_lmv ? "MDTS" : "OBDS:");
+ if (!param->fp_obd_uuid && !param->fp_quiet && !param->fp_obds_printed)
+ llapi_printf(LLAPI_MSG_NORMAL, "%s:\n",
+ param->fp_get_lmv ? "MDTS" : "OBDS:");
snprintf(format, sizeof(format),
"%%d: %%%zus", sizeof(obd_uuid.uuid) - 1);
if (sscanf(buf, format, &index, obd_uuid.uuid) < 2)
break;
- if (param->obduuid) {
+ if (param->fp_obd_uuid) {
if (llapi_uuid_match(obd_uuid.uuid,
- param->obduuid->uuid)) {
- param->obdindex = index;
- break;
- }
- } else if (!param->quiet && !param->obds_printed) {
- /* Print everything */
- llapi_printf(LLAPI_MSG_NORMAL, "%s", buf);
- }
- }
- param->obds_printed = 1;
+ param->fp_obd_uuid->uuid)) {
+ param->fp_obd_index = index;
+ break;
+ }
+ } else if (!param->fp_quiet && !param->fp_obds_printed) {
+ /* Print everything */
+ llapi_printf(LLAPI_MSG_NORMAL, "%s", buf);
+ }
+ }
+ param->fp_obds_printed = 1;
fclose(fp);
- if (param->obduuid && (param->obdindex == OBD_NOT_FOUND)) {
- llapi_err_noerrno(LLAPI_MSG_ERROR,
- "error: %s: unknown obduuid: %s",
- __func__, param->obduuid->uuid);
- rc = -EINVAL;
- }
+ if (param->fp_obd_uuid && (param->fp_obd_index == OBD_NOT_FOUND)) {
+ llapi_err_noerrno(LLAPI_MSG_ERROR,
+ "error: %s: unknown obduuid: %s",
+ __func__, param->fp_obd_uuid->uuid);
+ rc = -EINVAL;
+ }
return (rc);
}
-/* In this case, param->obduuid will be an array of obduuids and
+/* In this case, param->fp_obd_uuid will be an array of obduuids and
* obd index for all these obduuids will be returned in
- * param->obdindexes */
+ * param->fp_obd_indexes */
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 = 0;
- if (param->mdtuuid) {
- ret = setup_indexes(dir, path, param->mdtuuid, param->num_mdts,
- ¶m->mdtindexes, ¶m->mdtindex, LMV_TYPE);
- if (ret)
- return ret;
- }
- if (param->obduuid) {
- ret = setup_indexes(dir, path, param->obduuid, param->num_obds,
- ¶m->obdindexes, ¶m->obdindex, LOV_TYPE);
- if (ret)
- return ret;
- }
- param->got_uuids = 1;
- return ret;
+ if (param->fp_mdt_uuid) {
+ ret = setup_indexes(dir, path, param->fp_mdt_uuid,
+ param->fp_num_mdts,
+ ¶m->fp_mdt_indexes,
+ ¶m->fp_mdt_index, LMV_TYPE);
+ if (ret)
+ return ret;
+ }
+
+ if (param->fp_obd_uuid) {
+ ret = setup_indexes(dir, path, param->fp_obd_uuid,
+ param->fp_num_obds,
+ ¶m->fp_obd_indexes,
+ ¶m->fp_obd_index, LOV_TYPE);
+ if (ret)
+ return ret;
+ }
+
+ param->fp_got_uuids = 1;
+
+ return ret;
}
int llapi_ostlist(char *path, struct find_param *param)
{
__u32 magic;
- if (param->get_lmv || param->get_default_lmv)
+ if (param->fp_get_lmv || param->fp_get_default_lmv)
magic = (__u32)param->fp_lmv_md->lum_magic;
else
- magic = *(__u32 *)¶m->lmd->lmd_lmm; /* lum->lmm_magic */
+ magic = *(__u32 *)¶m->fp_lmd->lmd_lmm; /* lum->lmm_magic */
switch (magic) {
case LOV_USER_MAGIC_V1:
- lov_dump_user_lmm_v1v3(¶m->lmd->lmd_lmm, NULL,
- param->lmd->lmd_lmm.lmm_objects,
- path, is_dir,
- param->obdindex, param->fp_max_depth,
- param->verbose, param->raw);
+ lov_dump_user_lmm_v1v3(¶m->fp_lmd->lmd_lmm, NULL,
+ param->fp_lmd->lmd_lmm.lmm_objects,
+ path, is_dir,
+ param->fp_obd_index, param->fp_max_depth,
+ param->fp_verbose, param->fp_raw);
break;
case LOV_USER_MAGIC_V3: {
char pool_name[LOV_MAXPOOLNAME + 1];
struct lov_user_ost_data_v1 *objects;
- struct lov_user_md_v3 *lmmv3 = (void *)¶m->lmd->lmd_lmm;
+ struct lov_user_md_v3 *lmmv3 = (void *)¶m->fp_lmd->lmd_lmm;
strlcpy(pool_name, lmmv3->lmm_pool_name, sizeof(pool_name));
- objects = lmmv3->lmm_objects;
- lov_dump_user_lmm_v1v3(¶m->lmd->lmd_lmm, pool_name,
- objects, path, is_dir,
- param->obdindex, param->fp_max_depth,
- param->verbose, param->raw);
+ objects = lmmv3->lmm_objects;
+ lov_dump_user_lmm_v1v3(¶m->fp_lmd->lmd_lmm, pool_name,
+ objects, path, is_dir,
+ param->fp_obd_index, param->fp_max_depth,
+ param->fp_verbose, param->fp_raw);
break;
}
case LMV_MAGIC_V1:
lum = (struct lmv_user_md *)param->fp_lmv_md;
strlcpy(pool_name, lum->lum_pool_name, sizeof(pool_name));
lmv_dump_user_lmm(lum, pool_name, path,
- param->obdindex, param->fp_max_depth,
- param->verbose);
+ param->fp_obd_index, param->fp_max_depth,
+ param->fp_verbose);
break;
}
default:
llapi_printf(LLAPI_MSG_NORMAL, "unknown lmm_magic: %#x "
"(expecting one of %#x %#x %#x %#x)\n",
- *(__u32 *)¶m->lmd->lmd_lmm,
+ *(__u32 *)¶m->fp_lmd->lmd_lmm,
LOV_USER_MAGIC_V1, LOV_USER_MAGIC_V3,
LMV_USER_MAGIC, LMV_MAGIC_V1);
return;
*/
static int check_obd_match(struct find_param *param)
{
- lstat_t *st = ¶m->lmd->lmd_st;
- struct lov_user_ost_data_v1 *lmm_objects;
- int i, j;
+ lstat_t *st = ¶m->fp_lmd->lmd_st;
+ struct lov_user_ost_data_v1 *lmm_objects;
+ int i, j;
- if (param->obduuid && param->obdindex == OBD_NOT_FOUND)
- return 0;
+ if (param->fp_obd_uuid && param->fp_obd_index == OBD_NOT_FOUND)
+ return 0;
- if (!S_ISREG(st->st_mode))
- return 0;
+ if (!S_ISREG(st->st_mode))
+ return 0;
- /* Only those files should be accepted, which have a
- * stripe on the specified OST. */
- if (!param->lmd->lmd_lmm.lmm_stripe_count)
- return 0;
+ /* Only those files should be accepted, which have a
+ * stripe on the specified OST. */
+ if (!param->fp_lmd->lmd_lmm.lmm_stripe_count)
+ return 0;
- if (param->lmd->lmd_lmm.lmm_magic ==
- LOV_USER_MAGIC_V3) {
- struct lov_user_md_v3 *lmmv3 = (void *)¶m->lmd->lmd_lmm;
+ if (param->fp_lmd->lmd_lmm.lmm_magic ==
+ LOV_USER_MAGIC_V3) {
+ struct lov_user_md_v3 *lmmv3 = (void *)¶m->fp_lmd->lmd_lmm;
- lmm_objects = lmmv3->lmm_objects;
- } else if (param->lmd->lmd_lmm.lmm_magic == LOV_USER_MAGIC_V1) {
- lmm_objects = param->lmd->lmd_lmm.lmm_objects;
- } else {
- llapi_err_noerrno(LLAPI_MSG_ERROR, "%s:Unknown magic: 0x%08X\n",
- __func__, param->lmd->lmd_lmm.lmm_magic);
- return -EINVAL;
- }
+ lmm_objects = lmmv3->lmm_objects;
+ } else if (param->fp_lmd->lmd_lmm.lmm_magic == LOV_USER_MAGIC_V1) {
+ lmm_objects = param->fp_lmd->lmd_lmm.lmm_objects;
+ } else {
+ llapi_err_noerrno(LLAPI_MSG_ERROR, "%s:Unknown magic: 0x%08X\n",
+ __func__, param->fp_lmd->lmd_lmm.lmm_magic);
+ return -EINVAL;
+ }
- for (i = 0; i < param->lmd->lmd_lmm.lmm_stripe_count; i++) {
- for (j = 0; j < param->num_obds; j++) {
- if (param->obdindexes[j] ==
- lmm_objects[i].l_ost_idx) {
- if (param->exclude_obd)
- return 0;
- return 1;
- }
- }
- }
+ for (i = 0; i < param->fp_lmd->lmd_lmm.lmm_stripe_count; i++) {
+ for (j = 0; j < param->fp_num_obds; j++) {
+ if (param->fp_obd_indexes[j] ==
+ lmm_objects[i].l_ost_idx) {
+ if (param->fp_exclude_obd)
+ return 0;
+ return 1;
+ }
+ }
+ }
- if (param->exclude_obd)
+ if (param->fp_exclude_obd)
return 1;
- return 0;
+
+ return 0;
}
static int check_mdt_match(struct find_param *param)
{
- int i;
+ int i;
- if (param->mdtuuid && param->mdtindex == OBD_NOT_FOUND)
- return 0;
+ if (param->fp_mdt_uuid && param->fp_mdt_index == OBD_NOT_FOUND)
+ 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)
- return !param->exclude_mdt;
+ /* FIXME: For striped dir, we should get stripe information and check */
+ for (i = 0; i < param->fp_num_mdts; i++) {
+ if (param->fp_mdt_indexes[i] == param->fp_file_mdt_index)
+ return !param->fp_exclude_mdt;
}
- if (param->exclude_mdt)
- return 1;
- return 0;
+ if (param->fp_exclude_mdt)
+ return 1;
+
+ return 0;
}
/**
memset(&stat_buf, 0, sizeof(struct obd_statfs));
memset(&uuid_buf, 0, sizeof(struct obd_uuid));
- ret = llapi_obd_statfs(path, type,
- param->obdindex, &stat_buf,
- &uuid_buf);
- if (ret) {
- llapi_printf(LLAPI_MSG_NORMAL,
- "obd_uuid: %s failed %s ",
- param->obduuid->uuid,
- strerror(errno));
- }
- return ret;
+ ret = llapi_obd_statfs(path, type,
+ param->fp_obd_index, &stat_buf,
+ &uuid_buf);
+ if (ret) {
+ llapi_printf(LLAPI_MSG_NORMAL,
+ "obd_uuid: %s failed %s ",
+ param->fp_obd_uuid->uuid,
+ strerror(errno));
+ }
+
+ return ret;
}
static int cb_find_init(char *path, DIR *parent, DIR **dirp,
struct find_param *param = (struct find_param *)data;
DIR *dir = dirp == NULL ? NULL : *dirp;
int decision = 1; /* 1 is accepted; -1 is rejected. */
- lstat_t *st = ¶m->lmd->lmd_st;
+ lstat_t *st = ¶m->fp_lmd->lmd_st;
int lustre_fs = 1;
int checked_type = 0;
int ret = 0;
LASSERT(parent != NULL || dir != NULL);
- if (param->have_fileinfo == 0)
- param->lmd->lmd_lmm.lmm_stripe_count = 0;
+ param->fp_lmd->lmd_lmm.lmm_stripe_count = 0;
- /* If a regular expression is presented, make the initial decision */
- if (param->pattern != NULL) {
- char *fname = strrchr(path, '/');
- fname = (fname == NULL ? path : fname + 1);
- ret = fnmatch(param->pattern, fname, 0);
- if ((ret == FNM_NOMATCH && !param->exclude_pattern) ||
- (ret == 0 && param->exclude_pattern))
- goto decided;
- }
+ /* If a regular expression is presented, make the initial decision */
+ if (param->fp_pattern != NULL) {
+ char *fname = strrchr(path, '/');
+ fname = (fname == NULL ? path : fname + 1);
+ ret = fnmatch(param->fp_pattern, fname, 0);
+ if ((ret == FNM_NOMATCH && !param->fp_exclude_pattern) ||
+ (ret == 0 && param->fp_exclude_pattern))
+ goto decided;
+ }
/* See if we can check the file type from the dirent. */
if (param->fp_type != 0 && de != NULL && de->d_type != DT_UNKNOWN) {
}
}
- ret = 0;
+ ret = 0;
- /* Request MDS for the stat info if some of these parameters need
- * to be compared. */
- if (param->obduuid || param->mdtuuid ||
+ /* Request MDS for the stat info if some of these parameters need
+ * to be compared. */
+ if (param->fp_obd_uuid || param->fp_mdt_uuid ||
param->fp_check_uid || param->fp_check_gid ||
param->fp_atime || param->fp_mtime || param->fp_ctime ||
- param->check_pool || param->check_size ||
- param->check_stripecount || param->check_stripesize ||
- param->check_layout)
+ param->fp_check_pool || param->fp_check_size ||
+ param->fp_check_stripe_count || param->fp_check_stripe_size ||
+ param->fp_check_layout)
decision = 0;
if (param->fp_type != 0 && checked_type == 0)
decision = 0;
- if (param->have_fileinfo == 0 && decision == 0) {
- ret = get_lmd_info(path, parent, dir, param->lmd,
- param->lumlen);
- if (ret == 0) {
- if (dir) {
- ret = llapi_file_fget_mdtidx(dirfd(dir),
- ¶m->file_mdtindex);
- } else {
- int fd;
- lstat_t tmp_st;
-
- ret = lstat_f(path, &tmp_st);
- if (ret) {
- ret = -errno;
- llapi_error(LLAPI_MSG_ERROR, ret,
- "error: %s: lstat failed"
- "for %s", __func__, path);
- return ret;
- }
- if (S_ISREG(tmp_st.st_mode)) {
- fd = open(path, O_RDONLY);
- if (fd > 0) {
- ret = llapi_file_fget_mdtidx(fd,
- ¶m->file_mdtindex);
- close(fd);
- } else {
- ret = fd;
- }
- } else {
- /* For special inode, it assumes to
- * reside on the same MDT with the
- * parent */
- fd = dirfd(parent);
- ret = llapi_file_fget_mdtidx(fd,
- ¶m->file_mdtindex);
- }
- }
- }
- if (ret) {
- if (ret == -ENOTTY)
- lustre_fs = 0;
- if (ret == -ENOENT)
- goto decided;
- return ret;
- }
- }
+ if (decision == 0) {
+ ret = get_lmd_info(path, parent, dir, param->fp_lmd,
+ param->fp_lum_size);
+ if (ret == 0 && param->fp_mdt_uuid != NULL) {
+ if (dir != NULL) {
+ ret = llapi_file_fget_mdtidx(dirfd(dir),
+ ¶m->fp_file_mdt_index);
+ } else if (S_ISREG(st->st_mode)) {
+ int fd;
+
+ /* FIXME: we could get the MDT index from the
+ * file's FID in lmd->lmd_lmm.lmm_oi without
+ * opening the file, once we are sure that
+ * LFSCK2 (2.6) has fixed up pre-2.0 LOV EAs.
+ * That would still be an ioctl() to map the
+ * FID to the MDT, but not an open RPC. */
+ fd = open(path, O_RDONLY);
+ if (fd > 0) {
+ ret = llapi_file_fget_mdtidx(fd,
+ ¶m->fp_file_mdt_index);
+ close(fd);
+ } else {
+ ret = -errno;
+ }
+ } else {
+ /* For a special file, we assume it resides on
+ * the same MDT as the parent directory. */
+ ret = llapi_file_fget_mdtidx(dirfd(parent),
+ ¶m->fp_file_mdt_index);
+ }
+ }
+ if (ret != 0) {
+ if (ret == -ENOTTY)
+ lustre_fs = 0;
+ if (ret == -ENOENT)
+ goto decided;
+
+ return ret;
+ }
+ }
if (param->fp_type && !checked_type) {
if ((st->st_mode & S_IFMT) == param->fp_type) {
}
/* Prepare odb. */
- if (param->obduuid || param->mdtuuid) {
- if (lustre_fs && param->got_uuids &&
+ if (param->fp_obd_uuid || param->fp_mdt_uuid) {
+ if (lustre_fs && param->fp_got_uuids &&
param->fp_dev != st->st_dev) {
- /* A lustre/lustre mount point is crossed. */
- param->got_uuids = 0;
- param->obds_printed = 0;
- param->obdindex = param->mdtindex = OBD_NOT_FOUND;
- }
+ /* A lustre/lustre mount point is crossed. */
+ param->fp_got_uuids = 0;
+ param->fp_obds_printed = 0;
+ param->fp_mdt_index = OBD_NOT_FOUND;
+ param->fp_obd_index = OBD_NOT_FOUND;
+ }
- if (lustre_fs && !param->got_uuids) {
- ret = setup_target_indexes(dir ? dir : parent, path,
- param);
- if (ret)
- return ret;
+ if (lustre_fs && !param->fp_got_uuids) {
+ ret = setup_target_indexes(dir ? dir : parent, path,
+ param);
+ if (ret)
+ return ret;
param->fp_dev = st->st_dev;
- } else if (!lustre_fs && param->got_uuids) {
- /* A lustre/non-lustre mount point is crossed. */
- param->got_uuids = 0;
- param->obdindex = param->mdtindex = OBD_NOT_FOUND;
+ } else if (!lustre_fs && param->fp_got_uuids) {
+ /* A lustre/non-lustre mount point is crossed. */
+ param->fp_got_uuids = 0;
+ param->fp_mdt_index = OBD_NOT_FOUND;
+ param->fp_obd_index = OBD_NOT_FOUND;
}
}
- if (param->check_stripesize) {
- decision = find_value_cmp(param->lmd->lmd_lmm.lmm_stripe_size,
- param->stripesize,
- param->stripesize_sign,
- param->exclude_stripesize,
- param->stripesize_units, 0);
- if (decision == -1)
- goto decided;
- }
+ if (param->fp_check_stripe_size) {
+ decision = find_value_cmp(
+ param->fp_lmd->lmd_lmm.lmm_stripe_size,
+ param->fp_stripe_size,
+ param->fp_stripe_size_sign,
+ param->fp_exclude_stripe_size,
+ param->fp_stripe_size_units, 0);
+ if (decision == -1)
+ goto decided;
+ }
- if (param->check_stripecount) {
- decision = find_value_cmp(param->lmd->lmd_lmm.lmm_stripe_count,
- param->stripecount,
- param->stripecount_sign,
- param->exclude_stripecount, 1, 0);
- if (decision == -1)
- goto decided;
+ if (param->fp_check_stripe_count) {
+ decision = find_value_cmp(
+ param->fp_lmd->lmd_lmm.lmm_stripe_count,
+ param->fp_stripe_count,
+ param->fp_stripe_count_sign,
+ param->fp_exclude_stripe_count, 1, 0);
+ if (decision == -1)
+ goto decided;
}
- if (param->check_layout) {
+ if (param->fp_check_layout) {
__u32 found;
- found = (param->lmd->lmd_lmm.lmm_pattern & param->layout);
- if ((param->lmd->lmd_lmm.lmm_pattern == 0xFFFFFFFF) ||
- (found && param->exclude_layout) ||
- (!found && !param->exclude_layout)) {
+ found = (param->fp_lmd->lmd_lmm.lmm_pattern & param->fp_layout);
+ if ((param->fp_lmd->lmd_lmm.lmm_pattern == 0xFFFFFFFF) ||
+ (found && param->fp_exclude_layout) ||
+ (!found && !param->fp_exclude_layout)) {
decision = -1;
goto decided;
}
}
- /* If an OBD UUID is specified but none matches, skip this file. */
- if ((param->obduuid && param->obdindex == OBD_NOT_FOUND) ||
- (param->mdtuuid && param->mdtindex == OBD_NOT_FOUND))
- goto decided;
-
- /* If a OST or MDT UUID is given, and some OST matches,
- * check it here. */
- if (param->obdindex != OBD_NOT_FOUND ||
- param->mdtindex != OBD_NOT_FOUND) {
- if (param->obduuid) {
- if (check_obd_match(param)) {
- /* If no mdtuuid is given, we are done.
- * Otherwise, fall through to the mdtuuid
- * check below. */
- if (!param->mdtuuid)
- goto obd_matches;
- } else {
- goto decided;
- }
- }
- if (param->mdtuuid) {
- if (check_mdt_match(param))
- goto obd_matches;
- goto decided;
- }
- }
+ /* If an OBD UUID is specified but none matches, skip this file. */
+ if ((param->fp_obd_uuid && param->fp_obd_index == OBD_NOT_FOUND) ||
+ (param->fp_mdt_uuid && param->fp_mdt_index == OBD_NOT_FOUND))
+ goto decided;
+
+ /* If an OST or MDT UUID is given, and some OST matches,
+ * check it here. */
+ if (param->fp_obd_index != OBD_NOT_FOUND ||
+ param->fp_mdt_index != OBD_NOT_FOUND) {
+ if (param->fp_obd_uuid) {
+ if (check_obd_match(param)) {
+ /* If no mdtuuid is given, we are done.
+ * Otherwise, fall through to the mdtuuid
+ * check below. */
+ if (!param->fp_mdt_uuid)
+ goto obd_matches;
+ } else {
+ goto decided;
+ }
+ }
+
+ if (param->fp_mdt_uuid) {
+ if (check_mdt_match(param))
+ goto obd_matches;
+ goto decided;
+ }
+ }
+
obd_matches:
if (param->fp_check_uid) {
if (st->st_uid == param->fp_uid) {
if (param->fp_exclude_uid)
goto decided;
- } else {
+ } else {
if (!param->fp_exclude_uid)
goto decided;
- }
- }
+ }
+ }
if (param->fp_check_gid) {
if (st->st_gid == param->fp_gid) {
}
}
- if (param->check_pool) {
- struct lov_user_md_v3 *lmmv3 = (void *)¶m->lmd->lmd_lmm;
-
- /* empty requested pool is taken as no pool search => V1 */
- if (((param->lmd->lmd_lmm.lmm_magic == LOV_USER_MAGIC_V1) &&
- (param->poolname[0] == '\0')) ||
- ((param->lmd->lmd_lmm.lmm_magic == LOV_USER_MAGIC_V3) &&
- (strncmp(lmmv3->lmm_pool_name,
- param->poolname, LOV_MAXPOOLNAME) == 0)) ||
- ((param->lmd->lmd_lmm.lmm_magic == LOV_USER_MAGIC_V3) &&
- (strcmp(param->poolname, "*") == 0))) {
- if (param->exclude_pool)
- goto decided;
- } else {
- if (!param->exclude_pool)
- goto decided;
- }
- }
+ if (param->fp_check_pool) {
+ struct lov_user_md_v3 *lmmv3 = (void *)¶m->fp_lmd->lmd_lmm;
+
+ /* empty requested pool is taken as no pool search => V1 */
+ if (((param->fp_lmd->lmd_lmm.lmm_magic == LOV_USER_MAGIC_V1) &&
+ (param->fp_poolname[0] == '\0')) ||
+ ((param->fp_lmd->lmd_lmm.lmm_magic == LOV_USER_MAGIC_V3) &&
+ (strncmp(lmmv3->lmm_pool_name,
+ param->fp_poolname, LOV_MAXPOOLNAME) == 0)) ||
+ ((param->fp_lmd->lmd_lmm.lmm_magic == LOV_USER_MAGIC_V3) &&
+ (strcmp(param->fp_poolname, "*") == 0))) {
+ if (param->fp_exclude_pool)
+ goto decided;
+ } else {
+ if (!param->fp_exclude_pool)
+ goto decided;
+ }
+ }
/* Check the time on mds. */
decision = 1;
if (param->fp_atime || param->fp_mtime || param->fp_ctime) {
int for_mds;
- for_mds = lustre_fs ? (S_ISREG(st->st_mode) &&
- param->lmd->lmd_lmm.lmm_stripe_count)
- : 0;
+ for_mds = lustre_fs ? (S_ISREG(st->st_mode) &&
+ param->fp_lmd->lmd_lmm.lmm_stripe_count)
+ : 0;
decision = find_time_check(st, param, for_mds);
if (decision == -1)
goto decided;
The regular stat is almost of the same speed as some new
'glimpse-size-ioctl'. */
- if (param->check_size && S_ISREG(st->st_mode) &&
- param->lmd->lmd_lmm.lmm_stripe_count)
+ if (param->fp_check_size && S_ISREG(st->st_mode) &&
+ param->fp_lmd->lmd_lmm.lmm_stripe_count)
decision = 0;
- while (!decision) {
+ if (param->fp_check_size && S_ISDIR(st->st_mode))
+ decision = 0;
+
+ if (!decision) {
/* For regular files with the stripe the decision may have not
* been taken yet if *time or size is to be checked. */
- LASSERT((S_ISREG(st->st_mode) &&
- param->lmd->lmd_lmm.lmm_stripe_count) ||
- param->mdtindex != OBD_NOT_FOUND);
-
- if (param->obdindex != OBD_NOT_FOUND)
+ if (param->fp_obd_index != OBD_NOT_FOUND)
print_failed_tgt(param, path, LL_STATFS_LOV);
- if (param->mdtindex != OBD_NOT_FOUND)
+ if (param->fp_mdt_index != OBD_NOT_FOUND)
print_failed_tgt(param, path, LL_STATFS_LMV);
- if (dir) {
- ret = ioctl(dirfd(dir), IOC_LOV_GETINFO,
- (void *)param->lmd);
- } else if (parent) {
- ret = ioctl(dirfd(parent), IOC_LOV_GETINFO,
- (void *)param->lmd);
- }
+ if (dir != NULL)
+ ret = fstat_f(dirfd(dir), st);
+ else if (de != NULL)
+ ret = fstatat_f(dirfd(parent), de->d_name, st,
+ AT_SYMLINK_NOFOLLOW);
+ else
+ ret = lstat_f(path, st);
if (ret) {
if (errno == ENOENT) {
decision = find_time_check(st, param, 0);
if (decision == -1)
goto decided;
-
- break;
}
- if (param->check_size)
- decision = find_value_cmp(st->st_size, param->size,
- param->size_sign, param->exclude_size,
- param->size_units, 0);
+ if (param->fp_check_size)
+ decision = find_value_cmp(st->st_size, param->fp_size,
+ param->fp_size_sign,
+ param->fp_exclude_size,
+ param->fp_size_units, 0);
if (decision != -1) {
llapi_printf(LLAPI_MSG_NORMAL, "%s", path);
- if (param->zeroend)
+ if (param->fp_zero_end)
llapi_printf(LLAPI_MSG_NORMAL, "%c", '\0');
else
llapi_printf(LLAPI_MSG_NORMAL, "\n");
filename = basename(path);
data.ioc_inlbuf1 = (char *)filename;
data.ioc_inllen1 = strlen(filename) + 1;
- data.ioc_inlbuf2 = (char *)¶m->mdtindex;
- data.ioc_inllen2 = sizeof(param->mdtindex);
+ data.ioc_inlbuf2 = (char *)¶m->fp_mdt_index;
+ data.ioc_inllen2 = sizeof(param->fp_mdt_index);
ret = obd_ioctl_pack(&data, &rawbuf, sizeof(raw));
if (ret != 0) {
llapi_error(LLAPI_MSG_ERROR, ret,
ret = -errno;
fprintf(stderr, "%s migrate failed %d\n", path, ret);
goto out;
- } else if (param->verbose & VERBOSE_DETAIL) {
- fprintf(stdout, "migrate %s to MDT%d\n", path, param->mdtindex);
+ } else if (param->fp_verbose & VERBOSE_DETAIL) {
+ fprintf(stdout, "migrate %s to MDT%d\n",
+ path, param->fp_mdt_index);
}
out:
static int cb_get_mdt_index(char *path, DIR *parent, DIR **dirp, void *data,
struct dirent64 *de)
{
- struct find_param *param = (struct find_param *)data;
+ struct find_param *param = (struct find_param *)data;
DIR *d = dirp == NULL ? NULL : *dirp;
- int ret = 0;
- int mdtidx;
+ int ret;
+ int mdtidx;
- LASSERT(parent != NULL || d != NULL);
+ LASSERT(parent != NULL || d != NULL);
- if (d) {
- ret = llapi_file_fget_mdtidx(dirfd(d), &mdtidx);
- } else if (parent) {
- int fd;
+ if (d != NULL) {
+ ret = llapi_file_fget_mdtidx(dirfd(d), &mdtidx);
+ } else /* if (parent) */ {
+ int fd;
- fd = open(path, O_RDONLY);
- if (fd > 0) {
- ret = llapi_file_fget_mdtidx(fd, &mdtidx);
- close(fd);
- } else {
- ret = -errno;
- }
- }
+ fd = open(path, O_RDONLY | O_NOCTTY);
+ if (fd > 0) {
+ ret = llapi_file_fget_mdtidx(fd, &mdtidx);
+ close(fd);
+ } else {
+ ret = -errno;
+ }
+ }
- if (ret) {
- if (ret == -ENODATA) {
- if (!param->obduuid)
- llapi_printf(LLAPI_MSG_NORMAL,
- "%s has no stripe info\n", path);
- goto out;
- } 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_error(LLAPI_MSG_ERROR, ret,
- "error: %s: LL_IOC_GET_MDTIDX failed for %s",
- __func__, path);
- }
- return ret;
- }
+ if (ret != 0) {
+ if (ret == -ENODATA) {
+ if (!param->fp_obd_uuid)
+ llapi_printf(LLAPI_MSG_NORMAL,
+ "'%s' has no stripe info\n", path);
+ goto out;
+ } 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_error(LLAPI_MSG_ERROR, ret,
+ "error: %s: '%s' failed get_mdtidx",
+ __func__, path);
+ }
+ return ret;
+ }
- /* The 'LASSERT(parent != NULL || d != NULL);' guarantees
- * that either 'd' or 'parent' is not null.
- * So in all cases llapi_file_fget_mdtidx() is called,
- * thus initializing 'mdtidx'. */
- if (param->quiet || !(param->verbose & VERBOSE_DETAIL))
- /* coverity[uninit_use_in_call] */
- llapi_printf(LLAPI_MSG_NORMAL, "%d\n", mdtidx);
- else
- /* coverity[uninit_use_in_call] */
- llapi_printf(LLAPI_MSG_NORMAL, "%s\nmdt_index:\t%d\n",
- path, mdtidx);
+ if (param->fp_quiet || !(param->fp_verbose & VERBOSE_DETAIL))
+ llapi_printf(LLAPI_MSG_NORMAL, "%d\n", mdtidx);
+ else
+ llapi_printf(LLAPI_MSG_NORMAL, "%s\nmdt_index:\t%d\n",
+ path, mdtidx);
out:
- /* Do not get down anymore? */
+ /* Do not go down anymore? */
if (param->fp_depth == param->fp_max_depth)
return 1;
LASSERT(parent != NULL || d != NULL);
- if (param->obduuid) {
- param->quiet = 1;
+ if (param->fp_obd_uuid) {
+ param->fp_quiet = 1;
ret = setup_obd_uuid(d ? d : parent, path, param);
if (ret)
return ret;
}
if (d) {
- if (param->get_lmv || param->get_default_lmv) {
+ if (param->fp_get_lmv || param->fp_get_default_lmv) {
ret = cb_get_dirstripe(path, d, param);
} else {
ret = ioctl(dirfd(d), LL_IOC_LOV_GETSTRIPE,
- (void *)¶m->lmd->lmd_lmm);
+ (void *)¶m->fp_lmd->lmd_lmm);
}
- } else if (parent && !param->get_lmv && !param->get_default_lmv) {
+ } else if (parent && !param->fp_get_lmv && !param->fp_get_default_lmv) {
char *fname = strrchr(path, '/');
fname = (fname == NULL ? path : fname + 1);
- strlcpy((char *)¶m->lmd->lmd_lmm, fname, param->lumlen);
+ strlcpy((char *)¶m->fp_lmd->lmd_lmm, fname,
+ param->fp_lum_size);
ret = ioctl(dirfd(parent), IOC_MDC_GETFILESTRIPE,
- (void *)¶m->lmd->lmd_lmm);
+ (void *)¶m->fp_lmd->lmd_lmm);
} else {
return 0;
}
* a check later on in the code path.
* The object_seq needs to be set for the "(Default)"
* prefix to be displayed. */
- if (param->get_default_lmv) {
+ if (param->fp_get_default_lmv) {
struct lmv_user_md *lum = param->fp_lmv_md;
lum->lum_magic = LMV_USER_MAGIC;
lum->lum_stripe_count = 0;
lum->lum_stripe_offset = -1;
goto dump;
- } else if (param->get_lmv) {
+ } else if (param->fp_get_lmv) {
struct lmv_user_md *lum = param->fp_lmv_md;
int mdtidx;
lum->lum_stripe_offset = mdtidx;
goto dump;
} else {
- struct lov_user_md *lmm = ¶m->lmd->lmd_lmm;
+ struct lov_user_md *lmm =
+ ¶m->fp_lmd->lmd_lmm;
+
lmm->lmm_magic = LOV_USER_MAGIC_V1;
- if (!param->raw)
+ if (!param->fp_raw)
ostid_set_seq(&lmm->lmm_oi,
FID_SEQ_LOV_DEFAULT);
lmm->lmm_stripe_count = 0;
goto dump;
}
} else if (errno == ENODATA && parent != NULL) {
- if (!param->obduuid && !param->mdtuuid)
+ if (!param->fp_obd_uuid && !param->fp_mdt_uuid)
llapi_printf(LLAPI_MSG_NORMAL,
"%s has no stripe info\n", path);
goto out;
}
dump:
- if (!(param->verbose & VERBOSE_MDTINDEX))
+ if (!(param->fp_verbose & VERBOSE_MDTINDEX))
llapi_lov_dump_user_lmm(param, path, d ? 1 : 0);
out:
int llapi_getstripe(char *path, struct find_param *param)
{
- return param_callback(path, (param->verbose & VERBOSE_MDTINDEX) ?
+ return param_callback(path, (param->fp_verbose & VERBOSE_MDTINDEX) ?
cb_get_mdt_index : cb_getstripe,
cb_common_fini, param);
}
LASSERT(parent != NULL || d != NULL);
- rc = get_lmd_info(path, parent, d, param->lmd, param->lumlen);
+ rc = get_lmd_info(path, parent, d, param->fp_lmd, param->fp_lum_size);
if (rc) {
if (rc == -ENODATA) {
- if (!param->obduuid && !param->quiet)
+ if (!param->fp_obd_uuid && !param->fp_quiet)
llapi_error(LLAPI_MSG_ERROR, -ENODATA,
"%s has no stripe info", path);
rc = 0;
return rc;
}
- st = ¶m->lmd->lmd_st;
+ st = ¶m->fp_lmd->lmd_st;
/* libc chown() will do extra check, and if the real owner is
* the same as the ones to set, it won't fall into kernel, so
struct find_param param;
memset(¶m, 0, sizeof(param));
- param.recursive = 1;
- param.verbose = 0;
- param.quiet = 1;
+ param.fp_recursive = 1;
+ param.fp_verbose = 0;
+ param.fp_quiet = 1;
return param_callback(path, cb_quotachown, NULL, ¶m);
}
if (gp == NULL)
return -ENOMEM;
- memset(gp, 0, sizeof(*gp) + name_size);
gp->gp_linkno = linkno;
gp->gp_name_size = name_size;
goto err_free;
}
- if (gp->gp_name_size > name_size) {
- rc = -EOVERFLOW;
- goto err_free;
- }
-
*parent_fid = gp->gp_fid;
+
strncpy(name, gp->gp_name, name_size);
name[name_size - 1] = '\0';
char file_path[PATH_MAX];
char filename[PATH_MAX];
int fd;
- int random;
+ int rnumber;
int rc;
- fd = open("/dev/urandom", O_RDONLY);
- if (fd < 0) {
- llapi_error(LLAPI_MSG_ERROR, errno,
- "Cannot open /dev/urandom");
- return -errno;
- }
- rc = read(fd, &random, sizeof(random));
- close(fd);
- if (rc < sizeof(random)) {
- llapi_error(LLAPI_MSG_ERROR, errno,
- "cannot read %zu bytes from /dev/urandom",
- sizeof(random));
- return -errno;
- }
+ rnumber = random();
if (idx == -1)
snprintf(filename, sizeof(filename),
- LUSTRE_VOLATILE_HDR"::%.4X", random);
+ LUSTRE_VOLATILE_HDR"::%.4X", rnumber);
else
snprintf(filename, sizeof(filename),
- LUSTRE_VOLATILE_HDR":%.4X:%.4X", idx, random);
+ LUSTRE_VOLATILE_HDR":%.4X:%.4X", idx, rnumber);
rc = snprintf(file_path, sizeof(file_path),
"%s/%s", directory, filename);
*/
int llapi_fswap_layouts(int fd1, int fd2, __u64 dv1, __u64 dv2, __u64 flags)
{
- struct lustre_swap_layouts lsl;
- int rc;
+ struct lustre_swap_layouts lsl;
+ int rc;
- srandom(time(NULL));
lsl.sl_fd = fd2;
lsl.sl_flags = flags;
- lsl.sl_gid = random();
+
+ do
+ lsl.sl_gid = random();
+ while (lsl.sl_gid == 0);
+
lsl.sl_dv1 = dv1;
lsl.sl_dv2 = dv2;
rc = ioctl(fd1, LL_IOC_LOV_SWAP_LAYOUTS, &lsl);