X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fliblustreapi.c;h=1e678b691c763536a07e55cc2625a2765248c1e9;hp=ed077636d3032f68c3a60e46db10120675ec0bb8;hb=e83f6e4fc7c3e2681bee744563d80cd45db95a4d;hpb=23b2d47818996a825ab8eadd64ce29089b3d114b diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index ed07763..1e678b6 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -306,22 +306,22 @@ int llapi_ioctl_pack(struct obd_ioctl_data *data, char **pbuf, int max_len) ptr = overlay->ioc_bulk; if (data->ioc_inlbuf1) { memcpy(ptr, data->ioc_inlbuf1, data->ioc_inllen1); - ptr += cfs_size_round(data->ioc_inllen1); + ptr += __ALIGN_KERNEL(data->ioc_inllen1, 8); } if (data->ioc_inlbuf2) { memcpy(ptr, data->ioc_inlbuf2, data->ioc_inllen2); - ptr += cfs_size_round(data->ioc_inllen2); + ptr += __ALIGN_KERNEL(data->ioc_inllen2, 8); } if (data->ioc_inlbuf3) { memcpy(ptr, data->ioc_inlbuf3, data->ioc_inllen3); - ptr += cfs_size_round(data->ioc_inllen3); + ptr += __ALIGN_KERNEL(data->ioc_inllen3, 8); } if (data->ioc_inlbuf4) { memcpy(ptr, data->ioc_inlbuf4, data->ioc_inllen4); - ptr += cfs_size_round(data->ioc_inllen4); + ptr += __ALIGN_KERNEL(data->ioc_inllen4, 8); } return 0; @@ -348,22 +348,22 @@ int llapi_ioctl_unpack(struct obd_ioctl_data *data, char *pbuf, int max_len) ptr = overlay->ioc_bulk; if (data->ioc_inlbuf1) { memcpy(data->ioc_inlbuf1, ptr, data->ioc_inllen1); - ptr += cfs_size_round(data->ioc_inllen1); + ptr += __ALIGN_KERNEL(data->ioc_inllen1, 8); } if (data->ioc_inlbuf2) { memcpy(data->ioc_inlbuf2, ptr, data->ioc_inllen2); - ptr += cfs_size_round(data->ioc_inllen2); + ptr += __ALIGN_KERNEL(data->ioc_inllen2, 8); } if (data->ioc_inlbuf3) { memcpy(data->ioc_inlbuf3, ptr, data->ioc_inllen3); - ptr += cfs_size_round(data->ioc_inllen3); + ptr += __ALIGN_KERNEL(data->ioc_inllen3, 8); } if (data->ioc_inlbuf4) { memcpy(data->ioc_inlbuf4, ptr, data->ioc_inllen4); - ptr += cfs_size_round(data->ioc_inllen4); + ptr += __ALIGN_KERNEL(data->ioc_inllen4, 8); } return 0; @@ -1000,8 +1000,8 @@ int llapi_dir_set_default_lmv_stripe(const char *name, int stripe_offset, * \retval 0 on success * \retval negative errno on failure */ -int llapi_dir_create_param(const char *name, mode_t mode, - const struct llapi_stripe_param *param) +int llapi_dir_create(const char *name, mode_t mode, + const struct llapi_stripe_param *param) { struct lmv_user_md *lmu = NULL; size_t lmu_size = sizeof(*lmu); @@ -1094,7 +1094,7 @@ int llapi_dir_create_pool(const char *name, int mode, int stripe_offset, .lsp_pool = (char *)pool_name }; - return llapi_dir_create_param(name, mode, ¶m); + return llapi_dir_create(name, mode, ¶m); } int llapi_direntry_remove(char *dname) @@ -1274,30 +1274,37 @@ int llapi_search_fsname(const char *pathname, char *fsname) path = realpath(pathname, NULL); if (path == NULL) { - char buf[PATH_MAX], *ptr; + char tmp[PATH_MAX - 1]; + char buf[PATH_MAX]; + char *ptr; + tmp[0] = '\0'; 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) - 2) == NULL) { + char realpath[PATH_MAX - 1]; + + if (getcwd(realpath, sizeof(realpath) - 2) == NULL) { rc = -errno; llapi_error(LLAPI_MSG_ERROR, rc, "cannot get current working directory"); return rc; } - rc = strlcat(buf, "/", sizeof(buf)); - if (rc >= sizeof(buf)) { + + rc = snprintf(tmp, sizeof(tmp), "%s/", realpath); + if (rc >= sizeof(tmp)) { rc = -E2BIG; llapi_error(LLAPI_MSG_ERROR, rc, "invalid parent path '%s'", - buf); + tmp); return rc; } } - rc = strlcat(buf, pathname, sizeof(buf)); + + rc = snprintf(buf, sizeof(buf), "%s%s", tmp, pathname); if (rc >= sizeof(buf)) { rc = -E2BIG; llapi_error(LLAPI_MSG_ERROR, rc, @@ -1385,7 +1392,8 @@ int llapi_get_poolmembers(const char *poolname, char **members, /* name is FSNAME.POOLNAME */ if (strlen(poolname) >= sizeof(fsname)) return -EOVERFLOW; - strlcpy(fsname, poolname, sizeof(fsname)); + + snprintf(fsname, sizeof(fsname), "%s", poolname); pool = strchr(fsname, '.'); if (pool == NULL) return -EINVAL; @@ -1761,7 +1769,7 @@ static int get_lmd_info(char *path, DIR *parent, DIR *dir, * a large filesystem. */ fname = (fname == NULL ? path : fname + 1); /* retrieve needed file info */ - strlcpy((char *)lmd, fname, lumlen); + snprintf((char *)lmd, lumlen, "%s", fname); ret = ioctl(dirfd(parent), IOC_MDC_GETFILEINFO, (void *)lmd); } @@ -1914,7 +1922,7 @@ static int param_callback(char *path, semantic_func_t sem_init, if (!buf) return -ENOMEM; - strlcpy(buf, path, PATH_MAX + 1); + snprintf(buf, PATH_MAX + 1, "%s", path); ret = common_param_init(param, buf); if (ret) goto out; @@ -2381,7 +2389,7 @@ int sattr_cache_get_defaults(const char *const fsname, if (rc) return rc; } else { - strlcpy(fsname_buf, fsname, sizeof(fsname_buf)); + snprintf(fsname_buf, sizeof(fsname_buf), "%s", fsname); } if (strncmp(fsname_buf, cache.fsname, sizeof(fsname_buf) - 1) != 0) { @@ -2397,7 +2405,7 @@ int sattr_cache_get_defaults(const char *const fsname, cache.stripecount = tmp[0]; cache.stripesize = tmp[1]; cache.stripeoffset = tmp[2]; - strlcpy(cache.fsname, fsname_buf, sizeof(cache.fsname)); + snprintf(cache.fsname, sizeof(cache.fsname), "%s", fsname_buf); } if (scount) @@ -2572,7 +2580,7 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path, layout2name(lum->lmm_pattern)); else llapi_printf(LLAPI_MSG_NORMAL, "%x", lum->lmm_pattern); - separator = is_dir ? " " : "\n"; + separator = (!yaml && is_dir) ? " " : "\n"; } if ((verbose & VERBOSE_GENERATION) && !is_dir) { @@ -2581,7 +2589,7 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path, llapi_printf(LLAPI_MSG_NORMAL, "%s%slayout_gen: ", space, prefix); llapi_printf(LLAPI_MSG_NORMAL, "%u", - (int)lum->lmm_layout_gen); + skip_objs ? 0 : (int)lum->lmm_layout_gen); separator = "\n"; } @@ -2840,8 +2848,8 @@ static void lov_dump_comp_v1_header(struct find_param *param, char *path, "mirrored" : ""); else llapi_printf(LLAPI_MSG_NORMAL, - "%2slcm_flags: %s\n", - " ", lcm_flags_string(comp_v1->lcm_flags)); + "%2slcm_flags: %s\n", " ", + llapi_layout_flags_string(comp_v1->lcm_flags)); } if (verbose & VERBOSE_GENERATION) { @@ -3051,8 +3059,8 @@ static inline void lov_v1v3_pool_name(struct lov_user_md *v1, char *pool_name) { if (v1->lmm_magic == LOV_USER_MAGIC_V3) - strlcpy(pool_name, ((struct lov_user_md_v3 *)v1)->lmm_pool_name, - LOV_MAXPOOLNAME); + snprintf(pool_name, LOV_MAXPOOLNAME, "%s", + ((struct lov_user_md_v3 *)v1)->lmm_pool_name); else pool_name[0] = '\0'; } @@ -3371,7 +3379,8 @@ static void lov_dump_plain_user_lmm(struct find_param *param, char *path, struct lov_user_ost_data_v1 *objects; struct lov_user_md_v3 *lmmv3 = (void *)¶m->fp_lmd->lmd_lmm; - strlcpy(pool_name, lmmv3->lmm_pool_name, sizeof(pool_name)); + snprintf(pool_name, sizeof(pool_name), "%s", + lmmv3->lmm_pool_name); objects = lmmv3->lmm_objects; lov_dump_user_lmm_v1v3(¶m->fp_lmd->lmd_lmm, pool_name, objects, path, param->fp_obd_index, @@ -3406,7 +3415,8 @@ static void llapi_lov_dump_user_lmm(struct find_param *param, char *path, struct lmv_user_md *lum; lum = (struct lmv_user_md *)param->fp_lmv_md; - strlcpy(pool_name, lum->lum_pool_name, sizeof(pool_name)); + snprintf(pool_name, sizeof(pool_name), "%s", + lum->lum_pool_name); lmv_dump_user_lmm(lum, pool_name, path, param->fp_obd_index, param->fp_max_depth, param->fp_verbose, flags); @@ -3845,12 +3855,47 @@ out: return ret; } +static int find_check_mirror_options(struct find_param *param) +{ + struct lov_comp_md_v1 *comp_v1; + struct lov_user_md_v1 *v1 = ¶m->fp_lmd->lmd_lmm; + int ret = 0; + + if (v1->lmm_magic != LOV_USER_MAGIC_COMP_V1) + return -1; + + comp_v1 = (struct lov_comp_md_v1 *)v1; + + if (param->fp_check_mirror_count) { + ret = find_value_cmp(comp_v1->lcm_mirror_count + 1, + param->fp_mirror_count, + param->fp_mirror_count_sign, + param->fp_exclude_mirror_count, 1, 0); + if (ret == -1) + return ret; + } + + if (param->fp_check_mirror_state) { + ret = 1; + __u16 file_state = comp_v1->lcm_flags & LCM_FL_FLR_MASK; + + if ((param->fp_mirror_state != 0 && + file_state != param->fp_mirror_state) || + file_state == param->fp_mirror_neg_state) + return -1; + } + + return ret; +} + static bool find_check_lmm_info(struct find_param *param) { return param->fp_check_pool || param->fp_check_stripe_count || param->fp_check_stripe_size || param->fp_check_layout || param->fp_check_comp_count || param->fp_check_comp_end || param->fp_check_comp_start || param->fp_check_comp_flags || + param->fp_check_mirror_count || + param->fp_check_mirror_state || param->fp_check_projid; } @@ -4148,6 +4193,12 @@ obd_matches: goto decided; } + if (param->fp_check_mirror_count || param->fp_check_mirror_state) { + decision = find_check_mirror_options(param); + if (decision == -1) + goto decided; + } + /* Check the time on mds. */ decision = 1; if (param->fp_atime || param->fp_mtime || param->fp_ctime) { @@ -4456,8 +4507,8 @@ static int cb_getstripe(char *path, DIR *parent, DIR **dirp, void *data, char *fname = strrchr(path, '/'); fname = (fname == NULL ? path : fname + 1); - strlcpy((char *)¶m->fp_lmd->lmd_lmm, fname, - param->fp_lum_size); + snprintf((char *)¶m->fp_lmd->lmd_lmm, param->fp_lum_size, + "%s", fname); ret = ioctl(dirfd(parent), IOC_MDC_GETFILESTRIPE, (void *)¶m->fp_lmd->lmd_lmm);