+static int mdd_osc_setattr_async(struct obd_device *obd, __u32 uid, __u32 gid,
+ struct lov_mds_md *lmm, int lmm_size,
+ struct llog_cookie *logcookies, __u64 id, __u32 gen,
+ struct obd_capa *oc)
+{
+ struct mds_obd *mds = &obd->u.mds;
+ struct obd_trans_info oti = { 0 };
+ struct obd_info oinfo = { { { 0 } } };
+ int rc;
+ ENTRY;
+
+ if (OBD_FAIL_CHECK(OBD_FAIL_MDS_OST_SETATTR))
+ RETURN(0);
+
+ /* first get memory EA */
+ OBDO_ALLOC(oinfo.oi_oa);
+ if (!oinfo.oi_oa)
+ RETURN(-ENOMEM);
+
+ LASSERT(lmm);
+
+ rc = obd_unpackmd(mds->mds_osc_exp, &oinfo.oi_md, lmm, lmm_size);
+ if (rc < 0) {
+ CERROR("Error unpack md %p for inode "LPU64"\n", lmm, id);
+ GOTO(out, rc);
+ }
+
+ rc = obd_checkmd(mds->mds_osc_exp, obd->obd_self_export, oinfo.oi_md);
+ if (rc) {
+ CERROR("Error revalidate lsm %p \n", oinfo.oi_md);
+ GOTO(out, rc);
+ }
+
+ /* then fill oa */
+ oinfo.oi_oa->o_uid = uid;
+ oinfo.oi_oa->o_gid = gid;
+ oinfo.oi_oa->o_id = oinfo.oi_md->lsm_object_id;
+ oinfo.oi_oa->o_gr = oinfo.oi_md->lsm_object_gr;
+ oinfo.oi_oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP |
+ OBD_MD_FLUID | OBD_MD_FLGID;
+ if (logcookies) {
+ oinfo.oi_oa->o_valid |= OBD_MD_FLCOOKIE;
+ oti.oti_logcookies = logcookies;
+ }
+
+ oinfo.oi_oa->o_fid = id;
+ oinfo.oi_oa->o_generation = gen;
+ oinfo.oi_oa->o_valid |= OBD_MD_FLFID | OBD_MD_FLGENER;
+ oinfo.oi_capa = oc;
+
+ /* do async setattr from mds to ost not waiting for responses. */
+ rc = obd_setattr_async(mds->mds_osc_exp, &oinfo, &oti, NULL);
+ if (rc)
+ CDEBUG(D_INODE, "mds to ost setattr objid 0x"LPX64
+ " on ost error %d\n", oinfo.oi_md->lsm_object_id, rc);
+out:
+ if (oinfo.oi_md)
+ obd_free_memmd(mds->mds_osc_exp, &oinfo.oi_md);
+ OBDO_FREE(oinfo.oi_oa);
+ RETURN(rc);
+}
+