rc = mo_xattr_get(info->mti_env, next, buf, name);
if (rc > 0) {
+
+got:
if (strcmp(name, XATTR_NAME_LOV) == 0) {
- ma->ma_lmm_size = rc;
- ma->ma_valid |= MA_LOV;
+ if (info->mti_big_lmm_used)
+ ma->ma_lmm = info->mti_big_lmm;
+
+ /* NOT return LOV EA with hole to old client. */
+ if (unlikely(le32_to_cpu(ma->ma_lmm->lmm_pattern) &
+ LOV_PATTERN_F_HOLE) &&
+ !(exp_connect_flags(info->mti_exp) &
+ OBD_CONNECT_LFSCK)) {
+ return -EIO;
+ } else {
+ ma->ma_lmm_size = rc;
+ ma->ma_valid |= MA_LOV;
+ }
} else if (strcmp(name, XATTR_NAME_LMV) == 0) {
+ if (info->mti_big_lmm_used)
+ ma->ma_lmv = info->mti_big_lmm;
+
ma->ma_lmv_size = rc;
ma->ma_valid |= MA_LMV;
} else if (strcmp(name, XATTR_NAME_DEFAULT_LMV) == 0) {
ma->ma_valid |= MA_LMV_DEF;
}
+ /* Update mdt_max_mdsize so all clients will be aware that */
+ if (info->mti_mdt->mdt_max_mdsize < rc)
+ info->mti_mdt->mdt_max_mdsize = rc;
+
rc = 0;
} else if (rc == -ENODATA) {
/* no LOV EA */
rc = mdt_big_xattr_get(info, o, name);
if (rc > 0) {
info->mti_big_lmm_used = 1;
- if (!strcmp(name, XATTR_NAME_LOV)) {
- ma->ma_valid |= MA_LOV;
- ma->ma_lmm = info->mti_big_lmm;
- ma->ma_lmm_size = rc;
- } else if (!strcmp(name, XATTR_NAME_LMV)) {
- ma->ma_valid |= MA_LMV;
- ma->ma_lmv = info->mti_big_lmm;
- ma->ma_lmv_size = rc;
- } else {
- return -EINVAL;
- }
-
- /* update mdt_max_mdsize so all clients
- * will be aware about that */
- if (info->mti_mdt->mdt_max_mdsize < rc)
- info->mti_mdt->mdt_max_mdsize = rc;
- rc = 0;
+ goto got;
}
}