Whamcloud - gitweb
LU-11213 ptlrpc: intent_getattr fetches default LMV
[fs/lustre-release.git] / lustre / mdc / mdc_request.c
index bc5ac2f..291bb03 100644 (file)
@@ -584,14 +584,14 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *req,
                        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)
@@ -601,21 +601,43 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *req,
                        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) {