/* for cancel archive number is taken from canceled request
* for other request, we take from lma if not specified,
+ * or we use the default if none found in lma
* this works also for archive because the default value is 0
* /!\ there is a side effect: in case of restore on multiple
* files which are in different backend, the initial compound
* warranty an agent can serve any combinaison of archive
* backend
*/
- if (hai->hai_action != HSMA_CANCEL && archive_id == 0)
- archive_id = mh.mh_arch_id;
+ if (hai->hai_action != HSMA_CANCEL && archive_id == 0) {
+ if (mh.mh_arch_id != 0)
+ archive_id = mh.mh_arch_id;
+ else
+ archive_id = cdt->cdt_archive_id;
+ }
/* if restore, take an exclusive lock on layout */
if (hai->hai_action == HSMA_RESTORE) {
- struct cdt_restore_handle *crh;
- struct mdt_object *child;
+ 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
- crh->extent.start = hai->hai_extent.offset;
- crh->extent.end = hai->hai_extent.offset +
- hai->hai_extent.length;
- */
+ /* in V1 only whole file is supported. However the
+ * restore may be due to truncate. */
crh->crh_extent.start = 0;
- crh->crh_extent.end = OBD_OBJECT_EOF;
+ crh->crh_extent.end = hai->hai_extent.length;
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)) {
- rc = PTR_ERR(child);
+ 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);
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, child);
+ mdt_object_put(mti->mti_env, obj);
mutex_lock(&cdt->cdt_restore_lock);
list_add_tail(&crh->crh_list, &cdt->cdt_restore_hdl);