X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fliblustreapi_layout.c;h=557765d8c41b8f3f8f1cf6d25da94cdf9f289387;hp=6136cff667391c71a8aa470b03c233b1e854309f;hb=2270ad3c85802d5fcd3cfcbd8bd109991d8d686f;hpb=7107e54983b0a701c5c02a1e3c521302e8f79810 diff --git a/lustre/utils/liblustreapi_layout.c b/lustre/utils/liblustreapi_layout.c index 6136cff..557765d 100644 --- a/lustre/utils/liblustreapi_layout.c +++ b/lustre/utils/liblustreapi_layout.c @@ -560,6 +560,7 @@ llapi_layout_to_lum(const struct llapi_layout *layout) goto error; } else { lum = blob; + comp_v1 = (struct lov_comp_md_v1 *)lum; blob = (struct lov_user_md *)((char *)lum + lum_size); lum_size += blob_size; } @@ -611,7 +612,7 @@ llapi_layout_to_lum(const struct llapi_layout *layout) lmm_objects[i].l_ost_idx = comp->llc_objects[i].l_ost_idx; - if (comp_v1 != NULL) { + if (layout->llot_is_composite) { ent = &comp_v1->lcm_entries[ent_idx]; ent->lcme_id = comp->llc_id; ent->lcme_flags = comp->llc_flags; @@ -647,10 +648,12 @@ static void get_parent_dir(const char *path, char *buf, size_t size) strncpy(buf, path, size); p = strrchr(buf, '/'); - if (p != NULL) + if (p != NULL) { *p = '\0'; - else if (size >= 2) + } else if (size >= 2) { strncpy(buf, ".", 2); + buf[size - 1] = '\0'; + } } /** @@ -1717,6 +1720,9 @@ int llapi_layout_comp_add(struct llapi_layout *layout) /* Inherit some attributes from existing component */ new->llc_stripe_size = comp->llc_stripe_size; new->llc_stripe_count = comp->llc_stripe_count; + if (comp->llc_pool_name[0] != '\0') + strncpy(new->llc_pool_name, comp->llc_pool_name, + sizeof(comp->llc_pool_name)); if (new->llc_extent.e_end <= last->llc_extent.e_end) { __llapi_comp_free(new); errno = EINVAL; @@ -1734,7 +1740,7 @@ int llapi_layout_comp_add(struct llapi_layout *layout) /** * Deletes current component from the composite layout. The component * to be deleted must be the tail of components list, and it can't be - * the last component in the layout. + * the only component in the layout. * * \param[in] layout composite layout * @@ -1754,22 +1760,22 @@ int llapi_layout_comp_del(struct llapi_layout *layout) return -1; } - /* It must be the tail of the list */ + /* It must be the tail of the list (for PFL, can be relaxed + * once we get mirrored components) */ if (comp->llc_list.next != &layout->llot_comp_list) { errno = EINVAL; return -1; } - /* It can't be the last one on the list */ + /* It can't be the only one on the list */ if (comp->llc_list.prev == &layout->llot_comp_list) { errno = EINVAL; return -1; } + layout->llot_cur_comp = + list_entry(comp->llc_list.prev, typeof(*comp), llc_list); list_del_init(&comp->llc_list); __llapi_comp_free(comp); - layout->llot_cur_comp = - list_entry(comp->llc_list.prev, typeof(*comp), - llc_list); return 0; } @@ -1784,26 +1790,26 @@ int llapi_layout_comp_del(struct llapi_layout *layout) * \retval =0 : moved successfully * \retval <0 if error occurs */ -int llapi_layout_comp_move_at(struct llapi_layout *layout, uint32_t id) +int llapi_layout_comp_use_id(struct llapi_layout *layout, uint32_t comp_id) { struct llapi_layout_comp *comp; comp = __llapi_layout_cur_comp(layout); if (comp == NULL) - return -1; + return -1; /* use previously set errno */ if (!layout->llot_is_composite) { errno = EINVAL; return -1; } - if (id == 0) { + if (comp_id == LCME_ID_INVAL) { errno = EINVAL; return -1; } list_for_each_entry(comp, &layout->llot_comp_list, llc_list) { - if (comp->llc_id == id) { + if (comp->llc_id == comp_id) { layout->llot_cur_comp = comp; return 0; } @@ -1817,15 +1823,17 @@ int llapi_layout_comp_move_at(struct llapi_layout *layout, uint32_t id) * * \param[in] layout composite layout * \param[in] pos the position to be moved, it can be: - * LLAPI_LAYOUT_COMP_POS_FIRST: move to head - * LLAPI_LAYOUT_COMP_POS_LAST: move to tail - * LLAPI_LAYOUT_COMP_POS_NEXT: move to next + * LLAPI_LAYOUT_COMP_USE_FIRST: use first component + * LLAPI_LAYOUT_COMP_USE_LAST: use last component + * LLAPI_LAYOUT_COMP_USE_NEXT: use component after current + * LLAPI_LAYOUT_COMP_USE_PREV: use component before current * * \retval =0 : moved successfully - * \retval =1 : already at the tail when move to the next + * \retval =1 : at last component with NEXT, at first component with PREV * \retval <0 if error occurs */ -int llapi_layout_comp_move(struct llapi_layout *layout, uint32_t pos) +int llapi_layout_comp_use(struct llapi_layout *layout, + enum llapi_layout_comp_use pos) { struct llapi_layout_comp *comp, *head, *tail; @@ -1838,21 +1846,32 @@ int llapi_layout_comp_move(struct llapi_layout *layout, uint32_t pos) return -1; } - head = list_entry(layout->llot_comp_list.next, typeof(*head), - llc_list); - tail = list_entry(layout->llot_comp_list.prev, typeof(*tail), - llc_list); - - if (pos == LLAPI_LAYOUT_COMP_POS_NEXT) { - if (comp == tail) + head = list_entry(layout->llot_comp_list.next, typeof(*head), llc_list); + tail = list_entry(layout->llot_comp_list.prev, typeof(*tail), llc_list); + switch (pos) { + case LLAPI_LAYOUT_COMP_USE_FIRST: + layout->llot_cur_comp = head; + break; + case LLAPI_LAYOUT_COMP_USE_NEXT: + if (comp == tail) { + errno = ENOENT; return 1; + } layout->llot_cur_comp = list_entry(comp->llc_list.next, typeof(*comp), llc_list); - } else if (pos == LLAPI_LAYOUT_COMP_POS_FIRST) { - layout->llot_cur_comp = head; - } else if (pos == LLAPI_LAYOUT_COMP_POS_LAST) { + break; + case LLAPI_LAYOUT_COMP_USE_LAST: layout->llot_cur_comp = tail; - } else { + break; + case LLAPI_LAYOUT_COMP_USE_PREV: + if (comp == head) { + errno = ENOENT; + return 1; + } + layout->llot_cur_comp = list_entry(comp->llc_list.prev, + typeof(*comp), llc_list); + break; + default: errno = EINVAL; return -1; } @@ -1911,35 +1930,67 @@ out: } /** - * Delete component(s) by the specified component id (accepting lcme_id - * wildcards also) from an existing file. + * Delete component(s) by the specified component id or component flags + * from an existing file. * * \param[in] path path name of the file - * \param[in] id unique component ID or an lcme_id - * (LCME_ID_NONE | LCME_FL_* ) + * \param[in] id unique component ID + * \param[in] flags flags: LCME_FL_* or; + * negative flags: (LCME_FL_NEG|LCME_FL_*) */ -int llapi_layout_file_comp_del(const char *path, uint32_t id) +int llapi_layout_file_comp_del(const char *path, uint32_t id, uint32_t flags) { - int rc, fd; + int rc, fd, lum_size; + struct llapi_layout *layout; + struct llapi_layout_comp *comp; + struct lov_user_md *lum; - if (path == NULL || id == 0) { + if (path == NULL || id > LCME_ID_MAX || (flags & ~LCME_KNOWN_FLAGS)) { errno = EINVAL; return -1; } - fd = open(path, O_RDWR); - if (fd < 0) + /* Can only specify ID or flags, not both. */ + if (id != 0 && flags != 0) { + errno = EINVAL; return -1; + } - rc = fsetxattr(fd, XATTR_LUSTRE_LOV".del", &id, sizeof(id), 0); + layout = llapi_layout_alloc(); + if (layout == NULL) + return -1; + + llapi_layout_comp_extent_set(layout, 0, LUSTRE_EOF); + comp = __llapi_layout_cur_comp(layout); + comp->llc_id = id; + comp->llc_flags = flags; + + lum = llapi_layout_to_lum(layout); + if (lum == NULL) { + llapi_layout_free(layout); + return -1; + } + lum_size = ((struct lov_comp_md_v1 *)lum)->lcm_size; + + fd = open(path, O_RDWR); + if (fd < 0) { + rc = -1; + goto out; + } + + rc = fsetxattr(fd, XATTR_LUSTRE_LOV".del", lum, lum_size, 0); if (rc < 0) { int tmp_errno = errno; close(fd); errno = tmp_errno; - return -1; + rc = -1; + goto out; } close(fd); - return 0; +out: + free(lum); + llapi_layout_free(layout); + return rc; } /**