* \retval cdt_restore_handle found
* \retval NULL not found
*/
-static struct cdt_restore_handle *hsm_restore_hdl_find(struct coordinator *cdt,
+struct cdt_restore_handle *mdt_hsm_restore_hdl_find(struct coordinator *cdt,
const struct lu_fid *fid)
{
struct cdt_restore_handle *crh;
/* restore request not in a final state */
+ /* force replay of restore requests left in started state from previous
+ * CDT context, to be canceled later if finally found to be incompatible
+ * when being re-started */
+ if (larr->arr_status == ARS_STARTED) {
+ larr->arr_status = ARS_WAITING;
+ larr->arr_req_change = cfs_time_current_sec();
+ rc = llog_write(env, llh, hdr, hdr->lrh_index);
+ if (rc != 0)
+ GOTO(out, rc);
+ }
+
OBD_SLAB_ALLOC_PTR(crh, mdt_hsm_cdt_kmem);
if (crh == NULL)
RETURN(-ENOMEM);
/* give back layout lock */
mutex_lock(&cdt->cdt_restore_lock);
- crh = hsm_restore_hdl_find(cdt, &car->car_hai->hai_fid);
+ crh = mdt_hsm_restore_hdl_find(cdt, &car->car_hai->hai_fid);
if (crh != NULL)
list_del(&crh->crh_list);
mutex_unlock(&cdt->cdt_restore_lock);
hai->hai_cookie, rc);
GOTO(out_buf, rc);
}
+
+ /* if restore and record status updated, give
+ * back granted layout lock */
+ if (hai->hai_action == HSMA_RESTORE) {
+ struct cdt_restore_handle *crh = NULL;
+ struct mdt_object *obj = NULL;
+
+ mutex_lock(&cdt->cdt_restore_lock);
+ crh = mdt_hsm_restore_hdl_find(cdt,
+ &hai->hai_fid);
+ if (crh != NULL)
+ list_del(&crh->crh_list);
+ mutex_unlock(&cdt->cdt_restore_lock);
+ obj = mdt_object_find(mti->mti_env,
+ mti->mti_mdt,
+ &hai->hai_fid);
+ if (!IS_ERR(obj) && crh != NULL)
+ mdt_object_unlock(mti, obj,
+ &crh->crh_lh,
+ 1);
+ if (crh != NULL)
+ OBD_SLAB_FREE_PTR(crh,
+ mdt_hsm_cdt_kmem);
+ if (!IS_ERR(obj))
+ mdt_object_put(mti->mti_env,
+ obj);
+ }
}
}
}
/* mdt/mdt_coordinator.c */
void mdt_hsm_dump_hal(int level, const char *prefix,
struct hsm_action_list *hal);
+struct cdt_restore_handle *mdt_hsm_restore_hdl_find(struct coordinator *cdt,
+ const struct lu_fid *fid);
/* coordinator management */
int mdt_hsm_cdt_init(struct mdt_device *mdt);
int mdt_hsm_cdt_start(struct mdt_device *mdt);