hcdcb = data;
/* a compatible request must be WAITING or STARTED
* and not a cancel */
- if (((larr->arr_status != ARS_WAITING) &&
- (larr->arr_status != ARS_STARTED)) ||
- (larr->arr_hai.hai_action == HSMA_CANCEL))
+ if ((larr->arr_status != ARS_WAITING &&
+ larr->arr_status != ARS_STARTED) ||
+ larr->arr_hai.hai_action == HSMA_CANCEL)
RETURN(0);
- hai = hai_zero(hcdcb->hal);
+ hai = hai_first(hcdcb->hal);
for (i = 0; i < hcdcb->hal->hal_count; i++, hai = hai_next(hai)) {
/* if request is a CANCEL:
* if cookie set in the request, there is no need to find a
* if the caller sets the cookie, we assume he also sets the
* arr_archive_id
*/
- if ((hai->hai_action == HSMA_CANCEL) && (hai->hai_cookie != 0))
+ if (hai->hai_action == HSMA_CANCEL && hai->hai_cookie != 0)
continue;
if (!lu_fid_eq(&hai->hai_fid, &larr->arr_hai.hai_fid))
*/
hai->hai_cookie = larr->arr_hai.hai_cookie;
/* we read the archive number from the request we cancel */
- if ((hai->hai_action == HSMA_CANCEL) &&
- (hcdcb->hal->hal_archive_id == 0))
+ if (hai->hai_action == HSMA_CANCEL &&
+ hcdcb->hal->hal_archive_id == 0)
hcdcb->hal->hal_archive_id = larr->arr_archive_id;
}
RETURN(0);
ENTRY;
ok_cnt = 0;
- hai = hai_zero(hal);
+ hai = hai_first(hal);
for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
/* in a cancel request hai_cookie may be set by caller to
* show the request to be canceled
* if not we need to search by FID
*/
- if ((hai->hai_action == HSMA_CANCEL) && (hai->hai_cookie != 0))
+ if (hai->hai_action == HSMA_CANCEL && hai->hai_cookie != 0)
ok_cnt++;
else
hai->hai_cookie = 0;
hsm_flags = hsm->mh_flags;
switch (hai->hai_action) {
case HSMA_ARCHIVE:
- if ((hsm_flags & HS_DIRTY) || !(hsm_flags & HS_ARCHIVED))
+ if (hsm_flags & HS_DIRTY || !(hsm_flags & HS_ARCHIVED))
is_needed = true;
break;
case HSMA_RESTORE:
if (hal->hal_count == 0)
RETURN(false);
- hai = hai_zero(hal);
+ hai = hai_first(hal);
for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
if (!fid_is_sane(&hai->hai_fid))
RETURN(false);
if (!hal_is_sane(hal))
RETURN(-EINVAL);
- *compound_id = cfs_atomic_inc_return(&cdt->cdt_compound_id);
+ *compound_id = atomic_inc_return(&cdt->cdt_compound_id);
/* search for compatible request, if found hai_cookie is set
* to the request cookie
if (rc)
GOTO(out, rc);
- hai = hai_zero(hal);
+ hai = hai_first(hal);
for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
int archive_id;
__u64 flags;
* do not record
*/
/* redundant case */
- if ((hai->hai_action != HSMA_CANCEL) && (hai->hai_cookie != 0))
+ if (hai->hai_action != HSMA_CANCEL && hai->hai_cookie != 0)
continue;
/* cancel nothing case */
- if ((hai->hai_action == HSMA_CANCEL) && (hai->hai_cookie == 0))
+ if (hai->hai_action == HSMA_CANCEL && hai->hai_cookie == 0)
continue;
/* new request or cancel request
/* get HSM attributes */
obj = mdt_hsm_get_md_hsm(mti, &hai->hai_fid, &mh);
- if (IS_ERR(obj)) {
+ if (IS_ERR(obj) || obj == NULL) {
/* in case of archive remove, Lustre file
* is not mandatory */
if (hai->hai_action == HSMA_REMOVE)
goto record;
+ if (obj == NULL)
+ GOTO(out, rc = -ENOENT);
GOTO(out, rc = PTR_ERR(obj));
}
mdt_object_put(mti->mti_env, obj);
/* 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);
- cfs_list_add_tail(&crh->crh_list,
- &cdt->cdt_restore_hdl);
+ list_add_tail(&crh->crh_list, &cdt->cdt_restore_hdl);
mutex_unlock(&cdt->cdt_restore_lock);
}
record:
GOTO(out, rc);
out:
/* if work has been added, wake up coordinator */
- if ((rc == 0) || (rc == -ENODATA))
+ if (rc == 0 || rc == -ENODATA)
mdt_hsm_cdt_wakeup(mdt);
return rc;
int i;
ENTRY;
- hai = hai_zero(hal);
+ hai = hai_first(hal);
for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
struct cdt_agent_req *car;
{
struct mdt_device *mdt = mti->mti_mdt;
struct coordinator *cdt = &mdt->mdt_coordinator;
- cfs_list_t *pos, *tmp;
struct cdt_restore_handle *crh;
bool rc = false;
ENTRY;
RETURN(rc);
mutex_lock(&cdt->cdt_restore_lock);
- cfs_list_for_each_safe(pos, tmp, &cdt->cdt_restore_hdl) {
- crh = cfs_list_entry(pos, struct cdt_restore_handle, crh_list);
+ list_for_each_entry(crh, &cdt->cdt_restore_hdl, crh_list) {
if (lu_fid_eq(&crh->crh_fid, fid)) {
rc = true;
break;
int i, rc;
ENTRY;
- hai = hai_zero(hal);
+ hai = hai_first(hal);
for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
hai->hai_action = HSMA_NONE;
if (!fid_is_sane(&hai->hai_fid))
* we may want do give back dynamic informations on the
* running request
*/
- hai = hai_zero(hal);
+ hai = hai_first(hal);
for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
struct cdt_agent_req *car;