cdt_mti = lu_context_key_get(&cdt->cdt_env.le_ctx, &mdt_thread_key);
mutex_lock(&cdt->cdt_restore_lock);
- list_for_each_entry_safe(crh, tmp3, &cdt->cdt_restore_hdl, crh_list) {
+ list_for_each_entry_safe(crh, tmp3, &cdt->cdt_restore_handle_list,
+ crh_list) {
list_del(&crh->crh_list);
/* give back layout lock */
mdt_object_unlock(cdt_mti, NULL, &crh->crh_lh, 1);
RETURN(rc);
}
+int cdt_restore_handle_add(struct mdt_thread_info *mti, struct coordinator *cdt,
+ const struct lu_fid *fid,
+ const struct hsm_extent *he)
+{
+ struct cdt_restore_handle *crh;
+ struct mdt_object *obj;
+ int rc;
+ ENTRY;
+
+ OBD_SLAB_ALLOC_PTR(crh, mdt_hsm_cdt_kmem);
+ if (crh == NULL)
+ RETURN(-ENOMEM);
+
+ crh->crh_fid = *fid;
+ /* in V1 all file is restored
+ * crh->extent.start = he->offset;
+ * crh->extent.end = he->offset + he->length;
+ */
+ crh->crh_extent.start = 0;
+ crh->crh_extent.end = he->length;
+ /* get the layout lock */
+ mdt_lock_reg_init(&crh->crh_lh, LCK_EX);
+ obj = mdt_object_find_lock(mti, &crh->crh_fid, &crh->crh_lh,
+ MDS_INODELOCK_LAYOUT);
+ if (IS_ERR(obj))
+ GOTO(out_crh, rc = PTR_ERR(obj));
+
+ /* We do not keep a reference on the object during the restore
+ * which can be very long. */
+ mdt_object_put(mti->mti_env, obj);
+
+ mutex_lock(&cdt->cdt_restore_lock);
+ if (unlikely(cdt->cdt_state == CDT_STOPPED ||
+ cdt->cdt_state == CDT_STOPPING)) {
+ mutex_unlock(&cdt->cdt_restore_lock);
+ GOTO(out_lh, rc = -EAGAIN);
+ }
+
+ list_add_tail(&crh->crh_list, &cdt->cdt_restore_handle_list);
+ mutex_unlock(&cdt->cdt_restore_lock);
+
+ RETURN(0);
+out_lh:
+ mdt_object_unlock(mti, NULL, &crh->crh_lh, 1);
+out_crh:
+ OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
+
+ return rc;
+}
+
/**
* lookup a restore handle by FID
* caller needs to hold cdt_restore_lock
* \retval cdt_restore_handle found
* \retval NULL not found
*/
-struct cdt_restore_handle *mdt_hsm_restore_hdl_find(struct coordinator *cdt,
- const struct lu_fid *fid)
+struct cdt_restore_handle *cdt_restore_handle_find(struct coordinator *cdt,
+ const struct lu_fid *fid)
{
- struct cdt_restore_handle *crh;
+ struct cdt_restore_handle *crh;
ENTRY;
- list_for_each_entry(crh, &cdt->cdt_restore_hdl, crh_list) {
+ list_for_each_entry(crh, &cdt->cdt_restore_handle_list, crh_list) {
if (lu_fid_eq(&crh->crh_fid, fid))
RETURN(crh);
}
+
RETURN(NULL);
}
+void cdt_restore_handle_del(struct mdt_thread_info *mti,
+ struct coordinator *cdt, const struct lu_fid *fid)
+{
+ struct cdt_restore_handle *crh;
+
+ /* give back layout lock */
+ mutex_lock(&cdt->cdt_restore_lock);
+ crh = cdt_restore_handle_find(cdt, fid);
+ if (crh != NULL)
+ list_del(&crh->crh_list);
+ mutex_unlock(&cdt->cdt_restore_lock);
+
+ if (crh == NULL)
+ return;
+
+ /* XXX We pass a NULL object since the restore handle does not
+ * keep a reference on the object being restored. */
+ mdt_object_unlock(mti, NULL, &crh->crh_lh, 1);
+ OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
+}
+
/**
* data passed to llog_cat_process() callback
* to scan requests and take actions
{
struct llog_agent_req_rec *larr;
struct hsm_restore_data *hrd;
- struct cdt_restore_handle *crh;
struct hsm_action_item *hai;
struct mdt_thread_info *mti;
struct coordinator *cdt;
- struct mdt_object *child;
int rc;
ENTRY;
GOTO(out, rc);
}
- OBD_SLAB_ALLOC_PTR(crh, mdt_hsm_cdt_kmem);
- if (crh == NULL)
- RETURN(-ENOMEM);
-
- crh->crh_fid = hai->hai_fid;
- /* in V1 all file is restored
- crh->extent.start = hai->hai_extent.offset;
- crh->extent.end = hai->hai_extent.offset + hai->hai_extent.length;
- */
- crh->crh_extent.start = 0;
- crh->crh_extent.end = hai->hai_extent.length;
- /* get the layout lock */
- mdt_lock_reg_init(&crh->crh_lh, LCK_EX);
- child = mdt_object_find_lock(mti, &crh->crh_fid, &crh->crh_lh,
- MDS_INODELOCK_LAYOUT);
- if (IS_ERR(child))
- GOTO(out, rc = PTR_ERR(child));
-
- rc = 0;
- /* we choose to not keep a reference
- * on the object during the restore time which can be very long */
- mdt_object_put(mti->mti_env, child);
-
- mutex_lock(&cdt->cdt_restore_lock);
- list_add_tail(&crh->crh_list, &cdt->cdt_restore_hdl);
- mutex_unlock(&cdt->cdt_restore_lock);
-
+ rc = cdt_restore_handle_add(mti, cdt, &hai->hai_fid, &hai->hai_extent);
out:
RETURN(rc);
}
INIT_LIST_HEAD(&cdt->cdt_request_list);
INIT_LIST_HEAD(&cdt->cdt_agents);
- INIT_LIST_HEAD(&cdt->cdt_restore_hdl);
+ INIT_LIST_HEAD(&cdt->cdt_restore_handle_list);
cdt->cdt_request_cookie_hash = cfs_hash_create("REQUEST_COOKIE_HASH",
CFS_HASH_BITS_MIN,
* if no retry will be attempted and if object is still alive,
* in other cases we just unlock the object */
if (car->car_hai->hai_action == HSMA_RESTORE) {
- struct cdt_restore_handle *crh;
-
/* restore in data FID done, we swap the layouts
* only if restore is successful */
if (pgs->hpk_errval == 0 && !IS_ERR(obj)) {
&car->car_hai->hai_fid);
need_changelog = false;
- /* give back layout lock */
- mutex_lock(&cdt->cdt_restore_lock);
- 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);
- /* Just give back layout lock, we keep the reference
- * which is given back later with the lock for HSM
- * flags.
- * XXX obj may be invalid so we do not pass it. */
- if (crh != NULL)
- mdt_object_unlock(mti, NULL, &crh->crh_lh, 1);
-
- if (crh != NULL)
- OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
+ cdt_restore_handle_del(mti, cdt, &car->car_hai->hai_fid);
}
GOTO(out, rc);
/* if restore, take an exclusive lock on layout */
if (hai->hai_action == HSMA_RESTORE) {
- struct cdt_restore_handle *crh;
-
/* in V1 only whole file is supported. */
if (hai->hai_extent.offset != 0)
GOTO(out, rc = -EPROTO);
- OBD_SLAB_ALLOC_PTR(crh, mdt_hsm_cdt_kmem);
- if (crh == NULL)
- GOTO(out, rc = -ENOMEM);
-
- crh->crh_fid = hai->hai_fid;
- /* in V1 only whole file is supported. However the
- * restore may be due to truncate. */
- crh->crh_extent.start = 0;
- crh->crh_extent.end = hai->hai_extent.length;
-
- mdt_lock_reg_init(&crh->crh_lh, LCK_EX);
- obj = mdt_object_find_lock(mti, &crh->crh_fid,
- &crh->crh_lh,
- MDS_INODELOCK_LAYOUT);
- if (IS_ERR(obj)) {
- rc = PTR_ERR(obj);
- CERROR("%s: cannot take layout lock for "
- DFID": rc = %d\n", mdt_obd_name(mdt),
- PFID(&crh->crh_fid), rc);
- OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
+ rc = cdt_restore_handle_add(mti, cdt, &hai->hai_fid,
+ &hai->hai_extent);
+ if (rc < 0)
GOTO(out, rc);
- }
-
- /* we choose to not keep a keep a reference
- * on the object during the restore time which can be
- * very long */
- mdt_object_put(mti->mti_env, obj);
-
- mutex_lock(&cdt->cdt_restore_lock);
- if (unlikely((cdt->cdt_state == CDT_STOPPED) ||
- (cdt->cdt_state == CDT_STOPPING))) {
- mutex_unlock(&cdt->cdt_restore_lock);
- mdt_object_unlock(mti, NULL, &crh->crh_lh, 1);
- OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
- GOTO(out, rc = -EAGAIN);
- }
- list_add_tail(&crh->crh_list, &cdt->cdt_restore_hdl);
- mutex_unlock(&cdt->cdt_restore_lock);
}
record:
/*
bool mdt_hsm_restore_is_running(struct mdt_thread_info *mti,
const struct lu_fid *fid)
{
- struct mdt_device *mdt = mti->mti_mdt;
- struct coordinator *cdt = &mdt->mdt_coordinator;
- struct cdt_restore_handle *crh;
- bool rc = false;
+ struct coordinator *cdt = &mti->mti_mdt->mdt_coordinator;
+ bool is_running;
ENTRY;
- if (!fid_is_sane(fid))
- RETURN(rc);
-
mutex_lock(&cdt->cdt_restore_lock);
- list_for_each_entry(crh, &cdt->cdt_restore_hdl, crh_list) {
- if (lu_fid_eq(&crh->crh_fid, fid)) {
- rc = true;
- break;
- }
- }
+ is_running = (cdt_restore_handle_find(cdt, fid) != NULL);
mutex_unlock(&cdt->cdt_restore_lock);
- RETURN(rc);
+
+ RETURN(is_running);
}
/**