lov_fini_cancel_set(set);
RETURN(rc);
}
-
-static int lov_update_create_set(struct lov_request_set *set,
- struct lov_request *req, int rc)
-{
- struct obd_trans_info *oti = set->set_oti;
- struct lov_stripe_md *lsm = set->set_oi->oi_md;
- struct lov_oinfo *loi;
- struct lov_obd *lov = &set->set_exp->exp_obd->u.lov;
- ENTRY;
-
- if (rc && lov->lov_tgts[req->rq_idx] &&
- lov->lov_tgts[req->rq_idx]->ltd_active) {
- /* Pre-creating objects may timeout via -ETIMEDOUT or
- * -ENOTCONN both are always non-critical events. */
- CDEBUG(rc == -ETIMEDOUT || rc == -ENOTCONN ? D_HA : D_ERROR,
- "error creating fid "LPX64" sub-object "
- "on OST idx %d/%d: rc = %d\n",
- set->set_oi->oi_oa->o_id, req->rq_idx,
- lsm->lsm_stripe_count, rc);
- if (rc > 0) {
- CERROR("obd_create returned invalid err %d\n", rc);
- rc = -EIO;
- }
- }
-
- cfs_spin_lock(&set->set_lock);
- req->rq_stripe = cfs_atomic_read(&set->set_success);
- loi = lsm->lsm_oinfo[req->rq_stripe];
-
-
- if (rc) {
- lov_update_set(set, req, rc);
- cfs_spin_unlock(&set->set_lock);
- RETURN(rc);
- }
-
- loi->loi_id = req->rq_oi.oi_oa->o_id;
- loi->loi_seq = req->rq_oi.oi_oa->o_seq;
- loi->loi_ost_idx = req->rq_idx;
- loi_init(loi);
-
- if (oti && set->set_cookies)
- ++oti->oti_logcookies;
- if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLCOOKIE)
- set->set_cookie_sent++;
-
- lov_update_set(set, req, rc);
- cfs_spin_unlock(&set->set_lock);
-
- CDEBUG(D_INODE, "objid "LPX64" has subobj "LPX64"/"LPU64" at idx %d\n",
- lsm->lsm_object_id, loi->loi_id, loi->loi_id, req->rq_idx);
- RETURN(rc);
-}
-
-static int create_done(struct obd_export *exp, struct lov_request_set *set,
- struct lov_stripe_md **lsmp)
-{
- struct lov_obd *lov = &exp->exp_obd->u.lov;
- struct obd_trans_info *oti = set->set_oti;
- struct obdo *src_oa = set->set_oi->oi_oa;
- struct lov_request *req;
- struct obdo *ret_oa = NULL;
- int success, attrset = 0, rc = 0;
- ENTRY;
-
- LASSERT(cfs_atomic_read(&set->set_completes));
-
- /* try alloc objects on other osts if osc_create fails for
- * exceptions: RPC failure, ENOSPC, etc */
- if (set->set_count != cfs_atomic_read(&set->set_success)) {
- cfs_list_for_each_entry (req, &set->set_list, rq_link) {
- if (req->rq_rc == 0)
- continue;
-
- cfs_atomic_dec(&set->set_completes);
- req->rq_complete = 0;
-
- rc = qos_remedy_create(set, req);
- lov_update_create_set(set, req, rc);
- }
- }
-
- success = cfs_atomic_read(&set->set_success);
- /* no successful creates */
- if (success == 0)
- GOTO(cleanup, rc);
-
- if (set->set_count != success) {
- set->set_count = success;
- qos_shrink_lsm(set);
- }
-
- OBDO_ALLOC(ret_oa);
- if (ret_oa == NULL)
- GOTO(cleanup, rc = -ENOMEM);
-
- cfs_list_for_each_entry(req, &set->set_list, rq_link) {
- if (!req->rq_complete || req->rq_rc)
- continue;
- lov_merge_attrs(ret_oa, req->rq_oi.oi_oa,
- req->rq_oi.oi_oa->o_valid, set->set_oi->oi_md,
- req->rq_stripe, &attrset);
- }
- if (src_oa->o_valid & OBD_MD_FLSIZE &&
- ret_oa->o_size != src_oa->o_size) {
- CERROR("original size "LPU64" isn't new object size "LPU64"\n",
- src_oa->o_size, ret_oa->o_size);
- LBUG();
- }
- ret_oa->o_id = src_oa->o_id;
- ret_oa->o_seq = src_oa->o_seq;
- ret_oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
- memcpy(src_oa, ret_oa, sizeof(*src_oa));
- OBDO_FREE(ret_oa);
-
- *lsmp = set->set_oi->oi_md;
- GOTO(done, rc = 0);
-
-cleanup:
- cfs_list_for_each_entry(req, &set->set_list, rq_link) {
- struct obd_export *sub_exp;
- int err = 0;
-
- if (!req->rq_complete || req->rq_rc)
- continue;
-
- sub_exp = lov->lov_tgts[req->rq_idx]->ltd_exp;
- err = obd_destroy(NULL, sub_exp, req->rq_oi.oi_oa, NULL, oti,
- NULL, NULL);
- if (err)
- CERROR("Failed to uncreate objid "LPX64" subobj "
- LPX64" on OST idx %d: rc = %d\n",
- src_oa->o_id, req->rq_oi.oi_oa->o_id,
- req->rq_idx, rc);
- }
- if (*lsmp == NULL)
- obd_free_memmd(exp, &set->set_oi->oi_md);
-done:
- if (oti && set->set_cookies) {
- oti->oti_logcookies = set->set_cookies;
- if (!set->set_cookie_sent) {
- oti_free_cookies(oti);
- src_oa->o_valid &= ~OBD_MD_FLCOOKIE;
- } else {
- src_oa->o_valid |= OBD_MD_FLCOOKIE;
- }
- }
- RETURN(rc);
-}
-
-int lov_fini_create_set(struct lov_request_set *set,struct lov_stripe_md **lsmp)
-{
- int rc = 0;
- ENTRY;
-
- if (set == NULL)
- RETURN(0);
- LASSERT(set->set_exp);
- if (cfs_atomic_read(&set->set_completes))
- rc = create_done(set->set_exp, set, lsmp);
-
- lov_put_reqset(set);
- RETURN(rc);
-}
-
-int cb_create_update(void *cookie, int rc)
-{
- struct obd_info *oinfo = cookie;
- struct lov_request *lovreq;
-
- lovreq = container_of(oinfo, struct lov_request, rq_oi);
-
- if (CFS_FAIL_CHECK(OBD_FAIL_MDS_OSC_CREATE_FAIL))
- if (lovreq->rq_idx == cfs_fail_val)
- rc = -ENOTCONN;
-
- rc = lov_update_create_set(lovreq->rq_rqset, lovreq, rc);
- if (lov_set_finished(lovreq->rq_rqset, 0))
- lov_put_reqset(lovreq->rq_rqset);
- return rc;
-}
-
-int lov_prep_create_set(struct obd_export *exp, struct obd_info *oinfo,
- struct lov_stripe_md **lsmp, struct obdo *src_oa,
- struct obd_trans_info *oti,
- struct lov_request_set **reqset)
-{
- struct lov_request_set *set;
- int rc = 0;
- ENTRY;
-
- OBD_ALLOC(set, sizeof(*set));
- if (set == NULL)
- RETURN(-ENOMEM);
- lov_init_set(set);
-
- set->set_exp = exp;
- set->set_oi = oinfo;
- set->set_oi->oi_md = *lsmp;
- set->set_oi->oi_oa = src_oa;
- set->set_oti = oti;
- lov_get_reqset(set);
-
- rc = qos_prep_create(exp, set);
- /* qos_shrink_lsm() may have allocated a new lsm */
- *lsmp = oinfo->oi_md;
- if (rc) {
- lov_fini_create_set(set, lsmp);
- lov_put_reqset(set);
- } else {
- *reqset = set;
- }
- RETURN(rc);
-}
-
static int common_attr_done(struct lov_request_set *set)
{
cfs_list_t *pos;
out_update:
lov_update_statfs(osfs, lov_sfs, success);
- qos_update(lov);
obd_putref(lovobd);
out:
lov_set_finished(set, 0)) {
lov_statfs_interpret(NULL, set, set->set_count !=
cfs_atomic_read(&set->set_success));
- if (lov->lov_qos.lq_statfs_in_progress)
- qos_statfs_done(lov);
}
RETURN(0);