GOTO(out, rc = -EPROTO);
}
- lmv_size = md->body->mbo_eadatasize;
- if (lmv_size == 0) {
- CDEBUG(D_INFO, "OBD_MD_FLDIREA is set, "
- "but eadatasize 0\n");
- RETURN(-EPROTO);
- }
-
if (md->body->mbo_valid & OBD_MD_MEA) {
+ lmv_size = md->body->mbo_eadatasize;
+ if (lmv_size == 0) {
+ CDEBUG(D_INFO, "OBD_MD_FLDIREA is set, "
+ "but eadatasize 0\n");
+ RETURN(-EPROTO);
+ }
+
lmv = req_capsule_server_sized_get(pill, &RMF_MDT_MD,
lmv_size);
if (lmv == NULL)
if (rc < 0)
GOTO(out, rc);
- if (rc < (typeof(rc))sizeof(*md->lmv)) {
- struct lmv_foreign_md *lfm = md->lfm;
+ if (rc < (int)sizeof(*md->lmv)) {
+ struct lmv_foreign_md *lfm = md->lfm;
/* short (< sizeof(struct lmv_stripe_md))
* foreign LMV case
*/
if (lfm->lfm_magic != LMV_MAGIC_FOREIGN) {
CDEBUG(D_INFO,
- "size too small: rc < sizeof(*md->lmv) (%d < %d)\n",
+ "lmv size too small: %d < %d\n",
rc, (int)sizeof(*md->lmv));
GOTO(out, rc = -EPROTO);
}
}
}
- }
+
+ /* since 2.12.58 intent_getattr fetches default LMV */
+ if (md->body->mbo_valid & OBD_MD_DEFAULT_MEA) {
+ lmv_size = sizeof(struct lmv_user_md);
+ lmv = req_capsule_server_sized_get(pill,
+ &RMF_DEFAULT_MDT_MD,
+ lmv_size);
+ if (!lmv)
+ GOTO(out, rc = -EPROTO);
+
+ rc = md_unpackmd(md_exp, &md->default_lmv, lmv,
+ lmv_size);
+ if (rc < 0)
+ GOTO(out, rc);
+
+ if (rc < (int)sizeof(*md->default_lmv)) {
+ CDEBUG(D_INFO,
+ "default lmv size too small: %d < %d\n",
+ rc, (int)sizeof(*md->default_lmv));
+ GOTO(out, rc = -EPROTO);
+ }
+ }
+ }
rc = 0;
if (md->body->mbo_valid & OBD_MD_FLACL) {