Add new llapi_layout_get_by_xattr(3) interface to be able to extract
a layout structure from a LOV EA xattr. This can be useful when the
xattr is retrieved from some external source (e.g. tarball, HSM, or
tools that directly access the underlying ldiskfs or ZFS filesystem).
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: I9b405bf6b3119e44097f36d49ac5859ff93ebbe5
Reviewed-on: https://review.whamcloud.com/33230
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Jian Yu <yujian@whamcloud.com>
Reviewed-by: Li Xi <lixi@ddn.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
from an existing file with one of the
.BR llapi_layout_get_by_path (3),
.BR llapi_layout_get_by_fd (3),
from an existing file with one of the
.BR llapi_layout_get_by_path (3),
.BR llapi_layout_get_by_fd (3),
+.BR llapi_layout_get_by_fid (3),
-.BR llapi_layout_get_by_fid (3)
+.BR llapi_layout_get_by_xattr (3)
functions.
.IP \[bu]
To access attribute values from
functions.
.IP \[bu]
To access attribute values from
.BR llapi_layout_get_by_fd (3),
.BR llapi_layout_get_by_fid (3),
.BR llapi_layout_get_by_path (3),
.BR llapi_layout_get_by_fd (3),
.BR llapi_layout_get_by_fid (3),
.BR llapi_layout_get_by_path (3),
+.BR llapi_layout_get_by_xattr (3),
.BR llapi_layout_ost_index_get (3),
.BR llapi_layout_ost_index_set (3),
.BR llapi_layout_pattern_get (3),
.BR llapi_layout_ost_index_get (3),
.BR llapi_layout_ost_index_set (3),
.BR llapi_layout_pattern_get (3),
.nf
.B #include <lustre/lustreapi.h>
.PP
.nf
.B #include <lustre/lustreapi.h>
.PP
+.BI "struct llapi_layout *llapi_layout_get_by_xattr(const void *"lov_xattr ",
+.BI " ssize_t " lov_xattr_size );
.BI "struct llapi_layout *llapi_layout_get_by_fd(int "fd ", uint32_t " flags );
.PP
.BI "struct llapi_layout *llapi_layout_get_by_fid(const char *"lustre_path ,
.BI "struct llapi_layout *llapi_layout_get_by_fd(int "fd ", uint32_t " flags );
.PP
.BI "struct llapi_layout *llapi_layout_get_by_fid(const char *"lustre_path ,
+.BR llapi_layout_get_by_xattr() ,
.BR llapi_layout_get_by_fd() ,
.BR llapi_layout_get_by_fid() ,
and
.BR llapi_layout_get_by_fd() ,
.BR llapi_layout_get_by_fid() ,
and
return a pointer to a newly-allocated
.B struct llapi_layout
containing the layout information for the file referenced by
return a pointer to a newly-allocated
.B struct llapi_layout
containing the layout information for the file referenced by
when it is no longer needed.
.PP
For
when it is no longer needed.
.PP
For
+.BR llapi_layout_get_by_xattr() ,
+.I lov_xattr
+is a Lustre layout extended attribute (LOV EA) from a file or directory in
+a Lustre filesystem.
+.PP
+For
.BR llapi_layout_get_by_fd() ,
.I fd
is a valid open file descriptor for a file or directory in a Lustre
.BR llapi_layout_get_by_fd() ,
.I fd
is a valid open file descriptor for a file or directory in a Lustre
--- /dev/null
+.so man3/llapi_layout_get_by_fd.3
* Convert the data from a lov_user_md to a newly allocated llapi_layout.
* The caller is responsible for freeing the returned pointer.
*
* Convert the data from a lov_user_md to a newly allocated llapi_layout.
* The caller is responsible for freeing the returned pointer.
*
- * \param[in] lum LOV user metadata structure to copy data from
- * \param[in] lum_size size the the lum passed in
+ * \param[in] lov_xattr LOV user metadata xattr to copy data from
+ * \param[in] lov_xattr_size size the lov_xattr_size passed in
*
* \retval valid llapi_layout pointer on success
* \retval NULL if memory allocation fails
*/
*
* \retval valid llapi_layout pointer on success
* \retval NULL if memory allocation fails
*/
-static struct llapi_layout *
-llapi_layout_from_lum(const struct lov_user_md *lum, int lum_size)
+struct llapi_layout *llapi_layout_get_by_xattr(const void *lov_xattr,
+ ssize_t lov_xattr_size)
+ const struct lov_user_md *lum = lov_xattr;
struct lov_comp_md_v1 *comp_v1 = NULL;
struct lov_comp_md_entry_v1 *ent;
struct lov_user_md *v1;
struct lov_comp_md_v1 *comp_v1 = NULL;
struct lov_comp_md_entry_v1 *ent;
struct lov_user_md *v1;
lum->lmm_magic == LOV_MAGIC_V3) {
ent_count = 1;
layout->llot_is_composite = false;
lum->lmm_magic == LOV_MAGIC_V3) {
ent_count = 1;
layout->llot_is_composite = false;
+
+ if (lov_xattr_size <= 0) {
+ errno = EINVAL;
+ goto error;
+ }
+ } else {
+ errno = EOPNOTSUPP;
+ goto error;
ent = &comp_v1->lcm_entries[i];
v1 = (struct lov_user_md *)((char *)comp_v1 +
ent->lcme_offset);
ent = &comp_v1->lcm_entries[i];
v1 = (struct lov_user_md *)((char *)comp_v1 +
ent->lcme_offset);
- lum_size = ent->lcme_size;
+ lov_xattr_size = ent->lcme_size;
- obj_count = llapi_layout_objects_in_lum(v1, lum_size);
+ obj_count = llapi_layout_objects_in_lum(v1, lov_xattr_size);
comp = __llapi_comp_alloc(obj_count);
if (comp == NULL)
goto error;
comp = __llapi_comp_alloc(obj_count);
if (comp == NULL)
goto error;
- layout = llapi_layout_from_lum(lum, bytes_read);
+ layout = llapi_layout_get_by_xattr(lum, bytes_read);
out:
free(lum);
return layout;
out:
free(lum);
return layout;