X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fliblustreapi.c;h=ca5debe6f3bfeb0d840eca9d6ad0d47bce68dd3d;hb=9b0b7264a8d7a6a2abe681d15fefc88c27d20c1e;hp=03dbfad9bfc9447cec10887d2c5d8f81bbc2c670;hpb=b57c88fe4b70392ca915c18e51d50ce90256ba69;p=fs%2Flustre-release.git diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index 03dbfad..ca5debe 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -776,6 +776,18 @@ retry_open: return fd; } +int llapi_file_is_encrypted(int fd) +{ + unsigned long flags; + int rc; + + rc = ioctl(fd, FS_IOC_GETFLAGS, &flags); + if (rc == -1) + return -errno; + + return !!(flags & LUSTRE_ENCRYPT_FL); +} + int llapi_file_open_pool(const char *name, int flags, int mode, unsigned long long stripe_size, int stripe_offset, int stripe_count, int stripe_pattern, char *pool_name) @@ -1699,6 +1711,34 @@ free_path: /* wrapper for lfs.c and obd.c */ int llapi_poollist(const char *name) { + int poolcount, rc, i; + char *buf, **pools; + + rc = llapi_get_poolbuf(name, &buf, &pools, &poolcount); + if (rc) + return rc; + + for (i = 0; i < poolcount; i++) + llapi_printf(LLAPI_MSG_NORMAL, "%s\n", pools[i]); + free(buf); + + return 0; +} + +/** + * Get buffer that holds uuids and the list of pools in a filesystem. + * + * \param name filesystem name or path + * \param buf bufffer that has to be freed if function returns 0 + * \param pools pointer to the list of pools in buffer + * \param poolcount number of pools + * + * \return 0 when found at least 1 pool, i.e. poolcount > 0 + * \retval -error failure + */ +int llapi_get_poolbuf(const char *name, char **buf, + char ***pools, int *poolcount) +{ /* * list of pool names (assume that pool count is smaller * than OST count) @@ -1706,7 +1746,7 @@ int llapi_poollist(const char *name) char **list, *buffer = NULL, *fsname = (char *)name; char *poolname = NULL, *tmp = NULL, data[16]; enum param_filter type = FILTER_BY_PATH; - int obdcount, bufsize, rc, nb, i; + int obdcount, bufsize, rc, nb; if (name == NULL) return -EINVAL; @@ -1758,11 +1798,15 @@ retry_get_pools: goto retry_get_pools; } - for (i = 0; i < nb; i++) - llapi_printf(LLAPI_MSG_NORMAL, "%s\n", list[i]); rc = (nb < 0 ? nb : 0); + if (!rc) { + *buf = buffer; + *pools = list; + *poolcount = nb; + } err: - if (buffer) + /* Don't free buffer, it will be used later */ + if (rc && buffer) free(buffer); if (fsname != NULL && type == FILTER_BY_FS_NAME) free(fsname); @@ -1774,6 +1818,11 @@ typedef int (semantic_func_t)(char *path, int p, int *d, #define OBD_NOT_FOUND (-1) +static bool lmv_is_foreign(__u32 magic) +{ + return magic == LMV_MAGIC_FOREIGN; +} + static void find_param_fini(struct find_param *param) { if (param->fp_migrate) @@ -1871,6 +1920,8 @@ static int cb_get_dirstripe(char *path, int *d, struct find_param *param) int ret; bool did_nofollow = false; + if (!d || *d < 0) + return -ENOTDIR; again: param->fp_lmv_md->lum_stripe_count = param->fp_lmv_stripe_count; if (param->fp_get_default_lmv) @@ -1913,7 +1964,7 @@ again: int lmv_size; /* if foreign LMV case, fake stripes number */ - if (param->fp_lmv_md->lum_magic == LMV_MAGIC_FOREIGN) { + if (lmv_is_foreign(param->fp_lmv_md->lum_magic)) { struct lmv_foreign_md *lfm; lfm = (struct lmv_foreign_md *)param->fp_lmv_md; @@ -1949,6 +2000,7 @@ again: } goto again; } + return ret; } @@ -3279,6 +3331,11 @@ void lmv_dump_user_lmm(struct lmv_user_md *lum, char *pool_name, llapi_printf(LLAPI_MSG_NORMAL, ",bad_type"); if (flags & LMV_HASH_FLAG_LOST_LMV) llapi_printf(LLAPI_MSG_NORMAL, ",lost_lmv"); + if (flags & LMV_HASH_FLAG_FIXED) + llapi_printf(LLAPI_MSG_NORMAL, ",fixed"); + if (flags & ~LMV_HASH_FLAG_KNOWN) + llapi_printf(LLAPI_MSG_NORMAL, ",unknown_%04x", + flags & ~LMV_HASH_FLAG_KNOWN); if (verbose & VERBOSE_HASH_TYPE && !yaml) separator = " "; @@ -3613,7 +3670,7 @@ static inline void lov_v1v3_pool_name(struct lov_user_md *v1, char *pool_name) { if (v1->lmm_magic == LOV_USER_MAGIC_V3) - snprintf(pool_name, LOV_MAXPOOLNAME, "%s", + snprintf(pool_name, LOV_MAXPOOLNAME + 1, "%s", ((struct lov_user_md_v3 *)v1)->lmm_pool_name); else pool_name[0] = '\0'; @@ -4625,7 +4682,7 @@ static int find_check_foreign(struct find_param *param) struct lmv_foreign_md *lfm; lfm = (void *)param->fp_lmv_md; - if (lfm->lfm_magic != LMV_MAGIC_FOREIGN) { + if (lmv_is_foreign(lfm->lfm_magic)) { if (param->fp_foreign_type == LU_FOREIGN_TYPE_UNKNOWN) return param->fp_exclude_foreign ? 1 : -1; return -1; @@ -4831,6 +4888,35 @@ static int fget_projid(int fd, int *projid) return 0; } +/* + * Check that the file's permissions in *st matches the one in find_param + */ +static int check_file_permissions(const struct find_param *param, + mode_t mode) +{ + int decision = 0; + + mode &= 07777; + + switch (param->fp_perm_sign) { + case LFS_FIND_PERM_EXACT: + decision = (mode == param->fp_perm); + break; + case LFS_FIND_PERM_ALL: + decision = ((mode & param->fp_perm) == param->fp_perm); + break; + case LFS_FIND_PERM_ANY: + decision = ((mode & param->fp_perm) != 0); + break; + } + + if ((param->fp_exclude_perm && decision) + || (!param->fp_exclude_perm && !decision)) + return -1; + else + return 1; +} + static int cb_find_init(char *path, int p, int *dp, void *data, struct dirent64 *de) { @@ -4860,16 +4946,21 @@ static int cb_find_init(char *path, int p, int *dp, } /* See if we can check the file type from the dirent. */ - if (param->fp_type != 0 && de != NULL && de->d_type != DT_UNKNOWN) { - checked_type = 1; + if (de != NULL && de->d_type != DT_UNKNOWN) { + if (param->fp_type != 0) { + checked_type = 1; - if (DTTOIF(de->d_type) == param->fp_type) { - if (param->fp_exclude_type) - goto decided; - } else { - if (!param->fp_exclude_type) - goto decided; + if (DTTOIF(de->d_type) == param->fp_type) { + if (param->fp_exclude_type) + goto decided; + } else { + if (!param->fp_exclude_type) + goto decided; + } } + if ((param->fp_check_mdt_count || param->fp_hash_type || + param->fp_check_hash_flag) && de->d_type != DT_DIR) + goto decided; } ret = 0; @@ -4885,30 +4976,73 @@ static int cb_find_init(char *path, int p, int *dp, param->fp_check_size || param->fp_check_blocks || find_check_lmm_info(param) || param->fp_check_mdt_count || param->fp_hash_type || - param->fp_check_hash_flag) + param->fp_check_hash_flag || param->fp_perm_sign) decision = 0; if (param->fp_type != 0 && checked_type == 0) decision = 0; if (decision == 0) { - if (d != -1 && (param->fp_check_mdt_count || - param->fp_hash_type || param->fp_check_foreign || - param->fp_check_hash_flag)) { + if (d != -1 && + (param->fp_check_mdt_count || param->fp_hash_type || + param->fp_check_hash_flag || param->fp_check_foreign)) { param->fp_get_lmv = 1; ret = cb_get_dirstripe(path, &d, param); if (ret != 0) { - /* - * XXX this works to decide for foreign - * criterion only - */ - if (errno == ENODATA && - param->fp_check_foreign) { - if (param->fp_exclude_foreign) - goto foreign; - goto decided; + if (errno == ENODATA) { + ret = 0; + if (param->fp_check_mdt_count || + param->fp_hash_type || + param->fp_check_hash_flag) { + param->fp_lmv_md->lum_stripe_count = 0; + param->fp_lmv_md->lum_hash_type = 0; + } + if (param->fp_check_foreign) { + if (param->fp_exclude_foreign) + goto print; + goto decided; + } + } else { + return ret; } - return ret; + } + + if (param->fp_check_mdt_count) { + if (lmv_is_foreign(param->fp_lmv_md->lum_magic)) + goto decided; + + decision = find_value_cmp(param->fp_lmv_md->lum_stripe_count, + param->fp_mdt_count, + param->fp_mdt_count_sign, + param->fp_exclude_mdt_count, 1, 0); + if (decision == -1) + goto decided; + } + + if (param->fp_hash_type) { + __u32 found; + __u32 type = param->fp_lmv_md->lum_hash_type & + LMV_HASH_TYPE_MASK; + + if (lmv_is_foreign(param->fp_lmv_md->lum_magic)) + goto decided; + + found = (1 << type) & param->fp_hash_type; + if ((found && param->fp_exclude_hash_type) || + (!found && !param->fp_exclude_hash_type)) + goto decided; + } + + if (param->fp_check_hash_flag) { + __u32 flags = param->fp_lmv_md->lum_hash_type & + ~LMV_HASH_TYPE_MASK; + + if (lmv_is_foreign(param->fp_lmv_md->lum_magic)) + goto decided; + + if (!(flags & param->fp_hash_inflags) || + (flags & param->fp_hash_exflags)) + goto decided; } } @@ -4973,7 +5107,18 @@ static int cb_find_init(char *path, int p, int *dp, } } + /* Check the file permissions from the stat info */ + if (param->fp_perm_sign) { + decision = check_file_permissions(param, lmd->lmd_stx.stx_mode); + if (decision == -1) + goto decided; + } + if (param->fp_type && !checked_type) { + if ((param->fp_check_mdt_count || param->fp_check_hash_flag || + param->fp_hash_type) && !S_ISDIR(lmd->lmd_stx.stx_mode)) + goto decided; + if ((lmd->lmd_stx.stx_mode & S_IFMT) == param->fp_type) { if (param->fp_exclude_type) goto decided; @@ -5037,61 +5182,12 @@ static int cb_find_init(char *path, int p, int *dp, goto decided; } - if (param->fp_check_mdt_count) { - if (param->fp_lmv_md->lum_magic == LMV_MAGIC_FOREIGN) { - decision = -1; - goto decided; - } - - decision = find_value_cmp( - param->fp_lmv_md->lum_stripe_count, - param->fp_mdt_count, - param->fp_mdt_count_sign, - param->fp_exclude_mdt_count, 1, 0); - if (decision == -1) - goto decided; - } - if (param->fp_check_layout) { decision = find_check_layout(param); if (decision == -1) goto decided; } - if (param->fp_hash_type) { - __u32 found; - __u32 type = param->fp_lmv_md->lum_hash_type & - LMV_HASH_TYPE_MASK; - - if (param->fp_lmv_md->lum_magic == LMV_MAGIC_FOREIGN) { - decision = -1; - goto decided; - } - - found = (1 << type) & param->fp_hash_type; - if ((found && param->fp_exclude_hash_type) || - (!found && !param->fp_exclude_hash_type)) { - decision = -1; - goto decided; - } - } - - if (param->fp_check_hash_flag) { - __u32 flags = param->fp_lmv_md->lum_hash_type & - ~LMV_HASH_TYPE_MASK; - - if (param->fp_lmv_md->lum_magic == LMV_MAGIC_FOREIGN) { - decision = -1; - goto decided; - } - - if (!(flags & param->fp_hash_inflags) || - (flags & param->fp_hash_exflags)) { - decision = -1; - 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)) @@ -5318,12 +5414,9 @@ obd_matches: goto decided; } -foreign: - llapi_printf(LLAPI_MSG_NORMAL, "%s", path); - if (param->fp_zero_end) - llapi_printf(LLAPI_MSG_NORMAL, "%c", '\0'); - else - llapi_printf(LLAPI_MSG_NORMAL, "\n"); +print: + llapi_printf(LLAPI_MSG_NORMAL, "%s%c", path, + param->fp_zero_end ? '\0' : '\n'); decided: ret = 0; @@ -5381,6 +5474,9 @@ static int cb_migrate_mdt_init(char *path, int p, int *dp, data.ioc_inlbuf2 = (char *)lmu; data.ioc_inllen2 = lmv_user_md_size(lmu->lum_stripe_count, lmu->lum_magic); + /* reach bottom? */ + if (param->fp_depth == param->fp_max_depth) + data.ioc_type = MDS_MIGRATE_NSONLY; ret = llapi_ioctl_pack(&data, &rawbuf, sizeof(raw)); if (ret != 0) { llapi_error(LLAPI_MSG_ERROR, ret, @@ -5422,6 +5518,11 @@ migrate: } out: + /* Do not get down anymore? */ + if (param->fp_depth == param->fp_max_depth) + ret = 1; + param->fp_depth++; + if (dp != NULL) { /* * If the directory is being migration, we need