+ CDEBUG(D_RPCTRACE, "object already removed, send cookie\n");
+ llog_cancel(ctxt, NULL, 1, cookie, 0);
+ RETURN(0);
+ }
+
+ if (rc == 0)
+ CDEBUG(D_RPCTRACE, "object "LPU64" is destroyed\n", oid);
+
+ RETURN(rc);
+}
+
+/* Callback for processing the setattr log record received from MDS by
+ * llog_client_api. */
+static int filter_recov_log_setattr_cb(struct llog_ctxt *ctxt,
+ struct llog_rec_hdr *rec,
+ struct llog_cookie *cookie)
+{
+ struct obd_device *obd = ctxt->loc_obd;
+ struct obd_export *exp = obd->obd_self_export;
+ struct llog_setattr_rec *lsr;
+ struct obd_info oinfo = { { { 0 } } };
+ obd_id oid;
+ int rc = 0;
+ ENTRY;
+
+ lsr = (struct llog_setattr_rec *)rec;
+ OBDO_ALLOC(oinfo.oi_oa);
+ if (oinfo.oi_oa == NULL)
+ RETURN(-ENOMEM);
+
+ oinfo.oi_oa->o_valid |= (OBD_MD_FLID | OBD_MD_FLUID | OBD_MD_FLGID |
+ OBD_MD_FLCOOKIE);
+ oinfo.oi_oa->o_id = lsr->lsr_oid;
+ oinfo.oi_oa->o_gr = lsr->lsr_ogen;
+ oinfo.oi_oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP;
+ oinfo.oi_oa->o_uid = lsr->lsr_uid;
+ oinfo.oi_oa->o_gid = lsr->lsr_gid;
+ memcpy(obdo_logcookie(oinfo.oi_oa), cookie, sizeof(*cookie));
+ oid = oinfo.oi_oa->o_id;
+
+ rc = filter_setattr(exp, &oinfo, NULL);
+ OBDO_FREE(oinfo.oi_oa);
+
+ if (rc == -ENOENT) {
+ CDEBUG(D_RPCTRACE, "object already removed, send cookie\n");
+ llog_cancel(ctxt, NULL, 1, cookie, 0);