Whamcloud - gitweb
LU-5100 llite: set dir LOV xattr length variable 53/10453/4
authorHongchao Zhang <hongchao.zhang@intel.com>
Fri, 9 May 2014 16:53:14 +0000 (00:53 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 3 Jun 2014 15:58:36 +0000 (15:58 +0000)
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 <hongchao.zhang@intel.com>
Reviewed-on: http://review.whamcloud.com/10453
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: James Simmons <uja.ornl@gmail.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: jacques-Charles Lafoucriere <jacques-charles.lafoucriere@cea.fr>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/xattr.c
lustre/lod/lod_internal.h
lustre/lod/lod_lov.c
lustre/lod/lod_object.c

index 509d9c8..effdd01 100644 (file)
@@ -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)) {
index d4928c7..af1457c 100644 (file)
@@ -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);
index 57138e5..1a8f09a 100644 (file)
@@ -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));
index 6f7cd46..5674a36 100644 (file)
@@ -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);