From c8e9b796ff28a107c2f65e6857bf0a48266ed18f Mon Sep 17 00:00:00 2001 From: Hongchao Zhang Date: Sat, 10 May 2014 00:53:14 +0800 Subject: [PATCH 1/1] LU-5100 llite: set dir LOV xattr length variable the LOV xattr of directory could be either lov_user_md_v1 (size is 32) or lov_user_md_v3 (size is 48), then the actual size of the LOV xattr should be return. this patch also changes lod_verify_stripe to make it to accept lov stripe from user and it's "pattern" is "LOV_PATTERN_RAID0". Change-Id: I1ccba6da19aef0b7464c43b1b50871df44ce0eb7 Signed-off-by: Hongchao Zhang Reviewed-on: http://review.whamcloud.com/10453 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Alex Zhuravlev Reviewed-by: jacques-Charles Lafoucriere Reviewed-by: Oleg Drokin --- lustre/llite/xattr.c | 6 ------ lustre/lod/lod_internal.h | 3 ++- lustre/lod/lod_lov.c | 22 +++++++++++++--------- lustre/lod/lod_object.c | 2 +- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/lustre/llite/xattr.c b/lustre/llite/xattr.c index 509d9c8..effdd01 100644 --- a/lustre/llite/xattr.c +++ b/lustre/llite/xattr.c @@ -477,12 +477,6 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name, if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) return -ENODATA; - if (size == 0 && S_ISDIR(inode->i_mode)) { - /* XXX directory EA is fix for now, optimize to save - * RPC transfer */ - GOTO(out, rc = sizeof(struct lov_user_md)); - } - lsm = ccc_inode_lsm_get(inode); if (lsm == NULL) { if (S_ISDIR(inode->i_mode)) { diff --git a/lustre/lod/lod_internal.h b/lustre/lod/lod_internal.h index d4928c79..af1457c 100644 --- a/lustre/lod/lod_internal.h +++ b/lustre/lod/lod_internal.h @@ -414,7 +414,8 @@ int lod_initialize_objects(const struct lu_env *env, struct lod_object *mo, struct lov_ost_data_v1 *objs); int lod_store_def_striping(const struct lu_env *env, struct dt_object *dt, struct thandle *th); -int lod_verify_striping(struct lod_device *d, const struct lu_buf *buf, int specific); +int lod_verify_striping(struct lod_device *d, const struct lu_buf *buf, + bool is_from_disk); int lod_generate_and_set_lovea(const struct lu_env *env, struct lod_object *mo, struct thandle *th); int lod_ea_store_resize(struct lod_thread_info *info, int size); diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index 57138e5..1a8f09a 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -902,8 +902,9 @@ int lod_load_striping(const struct lu_env *env, struct lod_object *lo) return rc; } +/* verify the striping information for directory */ int lod_verify_striping(struct lod_device *d, const struct lu_buf *buf, - int specific) + bool is_from_disk) { struct lov_user_md_v1 *lum; struct lov_user_md_v3 *lum3; @@ -935,8 +936,11 @@ int lod_verify_striping(struct lod_device *d, const struct lu_buf *buf, GOTO(out, rc = -EINVAL); } - if ((specific && le32_to_cpu(lum->lmm_pattern) != LOV_PATTERN_RAID0) || - (!specific && lum->lmm_pattern != 0)) { + /* the user uses "0" for default stripe pattern normally. */ + if (!is_from_disk && lum->lmm_pattern == 0) + lum->lmm_pattern = cpu_to_le32(LOV_PATTERN_RAID0); + + if (le32_to_cpu(lum->lmm_pattern) != LOV_PATTERN_RAID0) { CDEBUG(D_IOCTL, "bad userland stripe pattern: %#x\n", le32_to_cpu(lum->lmm_pattern)); GOTO(out, rc = -EINVAL); @@ -969,17 +973,17 @@ int lod_verify_striping(struct lod_device *d, const struct lu_buf *buf, } } - stripe_count = le16_to_cpu(lum->lmm_stripe_count); if (magic == LOV_USER_MAGIC_V1 || magic == LOV_MAGIC_V1_DEF) lum_size = offsetof(struct lov_user_md_v1, - lmm_objects[stripe_count]); + lmm_objects[0]); else if (magic == LOV_USER_MAGIC_V3 || magic == LOV_MAGIC_V3_DEF) lum_size = offsetof(struct lov_user_md_v3, - lmm_objects[stripe_count]); + lmm_objects[0]); else - LBUG(); + GOTO(out, rc = -EINVAL); - if (specific && buf->lb_len != lum_size) { + stripe_count = le16_to_cpu(lum->lmm_stripe_count); + if (buf->lb_len != lum_size) { CDEBUG(D_IOCTL, "invalid buf len %zd for lov_user_md with " "magic %#x and stripe_count %u\n", buf->lb_len, magic, stripe_count); @@ -1009,7 +1013,7 @@ int lod_verify_striping(struct lod_device *d, const struct lu_buf *buf, GOTO(out, rc = -EINVAL); } - if (specific && stripe_count > pool_tgt_count(pool)) { + if (is_from_disk && stripe_count > pool_tgt_count(pool)) { CDEBUG(D_IOCTL, "stripe count %u > # OSTs %u in the pool\n", stripe_count, pool_tgt_count(pool)); diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index 6f7cd46..5674a36 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -1768,7 +1768,7 @@ static int lod_xattr_set_lov_on_dir(const struct lu_env *env, LASSERT(buf != NULL && buf->lb_buf != NULL); lum = buf->lb_buf; - rc = lod_verify_striping(d, buf, 0); + rc = lod_verify_striping(d, buf, false); if (rc) RETURN(rc); -- 1.8.3.1