/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011 Whamcloud, Inc.
+ *
*/
/*
* This file is part of Lustre, http://www.lustre.org/
static void lov_init_set(struct lov_request_set *set)
{
set->set_count = 0;
- set->set_completes = 0;
- set->set_success = 0;
+ cfs_atomic_set(&set->set_completes, 0);
+ cfs_atomic_set(&set->set_success, 0);
set->set_cookies = 0;
CFS_INIT_LIST_HEAD(&set->set_list);
cfs_atomic_set(&set->set_refcount, 1);
if (req->rq_oi.oi_oa)
OBDO_FREE(req->rq_oi.oi_oa);
if (req->rq_oi.oi_md)
- OBD_FREE(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_FREE_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_osfs)
OBD_FREE(req->rq_oi.oi_osfs,
sizeof(*req->rq_oi.oi_osfs));
if (set->set_pga) {
int len = set->set_oabufs * sizeof(*set->set_pga);
- OBD_FREE(set->set_pga, len);
+ OBD_FREE_LARGE(set->set_pga, len);
}
if (set->set_lockh)
lov_llh_put(set->set_lockh);
int lov_finished_set(struct lov_request_set *set)
{
- CDEBUG(D_INFO, "check set %d/%d\n", set->set_completes,
+ int completes = cfs_atomic_read(&set->set_completes);
+
+ CDEBUG(D_INFO, "check set %d/%d\n", completes,
set->set_count);
- return set->set_completes == set->set_count;
+ return completes == set->set_count;
}
void lov_update_set(struct lov_request_set *set,
req->rq_complete = 1;
req->rq_rc = rc;
- set->set_completes++;
+ cfs_atomic_inc(&set->set_completes);
if (rc == 0)
- set->set_success++;
+ cfs_atomic_inc(&set->set_success);
cfs_waitq_signal(&set->set_waitq);
}
{
struct lov_request *req;
struct lov_obd *lov = &set->set_exp->exp_obd->u.lov;
+ int completes = cfs_atomic_read(&set->set_completes);
int rc = 0;
ENTRY;
/* enqueue/match success, just return */
- if (set->set_completes && set->set_completes == set->set_success)
+ if (completes && completes == cfs_atomic_read(&set->set_success))
RETURN(0);
/* cancel enqueued/matched locks */
* succeeded. */
if (!rqset) {
if (rc)
- set->set_completes = 0;
+ cfs_atomic_set(&set->set_completes, 0);
ret = enqueue_done(set, mode);
} else if (set->set_lockh)
lov_llh_put(set->set_lockh);
req->rq_buflen = sizeof(*req->rq_oi.oi_md) +
sizeof(struct lov_oinfo *) +
sizeof(struct lov_oinfo);
- OBD_ALLOC(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_ALLOC_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_md == NULL) {
OBD_FREE(req, sizeof(*req));
GOTO(out_set, rc = -ENOMEM);
RETURN(rc);
}
-int lov_update_match_set(struct lov_request_set *set, struct lov_request *req,
- int rc)
-{
- int ret = rc;
- ENTRY;
-
- if (rc > 0)
- ret = 0;
- else if (rc == 0)
- ret = 1;
- lov_update_set(set, req, ret);
- RETURN(rc);
-}
-
int lov_fini_match_set(struct lov_request_set *set, __u32 mode, int flags)
{
int rc = 0;
RETURN(0);
LASSERT(set->set_exp);
rc = enqueue_done(set, mode);
- if ((set->set_count == set->set_success) &&
+ if ((set->set_count == cfs_atomic_read(&set->set_success)) &&
(flags & LDLM_FL_TEST_LOCK))
lov_llh_put(set->set_lockh);
GOTO(out_set, rc = -ENOMEM);
req->rq_buflen = sizeof(*req->rq_oi.oi_md);
- OBD_ALLOC(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_ALLOC_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_md == NULL) {
OBD_FREE(req, sizeof(*req));
GOTO(out_set, rc = -ENOMEM);
GOTO(out_set, rc = -ENOMEM);
req->rq_buflen = sizeof(*req->rq_oi.oi_md);
- OBD_ALLOC(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_ALLOC_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_md == NULL) {
OBD_FREE(req, sizeof(*req));
GOTO(out_set, rc = -ENOMEM);
}
cfs_spin_lock(&set->set_lock);
- req->rq_stripe = set->set_success;
+ req->rq_stripe = cfs_atomic_read(&set->set_success);
loi = lsm->lsm_oinfo[req->rq_stripe];
struct obdo *src_oa = set->set_oi->oi_oa;
struct lov_request *req;
struct obdo *ret_oa = NULL;
- int attrset = 0, rc = 0;
+ int success, attrset = 0, rc = 0;
ENTRY;
- LASSERT(set->set_completes);
+ 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 != set->set_success) {
+ 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;
- set->set_completes--;
+ cfs_atomic_dec(&set->set_completes);
req->rq_complete = 0;
rc = qos_remedy_create(set, req);
}
}
+ success = cfs_atomic_read(&set->set_success);
/* no successful creates */
- if (set->set_success == 0)
+ if (success == 0)
GOTO(cleanup, rc);
- if (set->set_count != set->set_success) {
- set->set_count = set->set_success;
+ if (set->set_count != success) {
+ set->set_count = success;
qos_shrink_lsm(set);
}
if (set == NULL)
RETURN(0);
LASSERT(set->set_exp);
- if (set->set_completes)
+ if (cfs_atomic_read(&set->set_completes))
rc = create_done(set->set_exp, set, lsmp);
lov_put_reqset(set);
lovreq = container_of(oinfo, struct lov_request, rq_oi);
- if (OBD_FAIL_CHECK(OBD_FAIL_MDS_OSC_CREATE_FAIL))
- if (lovreq->rq_idx == obd_fail_val)
+ 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 (set->set_oi->oi_oa == NULL)
RETURN(0);
- if (!set->set_success)
+ if (!cfs_atomic_read(&set->set_success))
RETURN(-EIO);
OBDO_ALLOC(tmp_oa);
if (set == NULL)
RETURN(0);
LASSERT(set->set_exp);
- if (set->set_completes) {
+ if (cfs_atomic_read(&set->set_completes)) {
rc = brw_done(set);
/* FIXME update qos data here */
}
set->set_oti = oti;
set->set_oi = oinfo;
set->set_oabufs = oa_bufs;
- OBD_ALLOC(set->set_pga, oa_bufs * sizeof(*set->set_pga));
+ OBD_ALLOC_LARGE(set->set_pga, oa_bufs * sizeof(*set->set_pga));
if (!set->set_pga)
GOTO(out, rc = -ENOMEM);
- OBD_ALLOC(info, sizeof(*info) * oinfo->oi_md->lsm_stripe_count);
+ OBD_ALLOC_LARGE(info, sizeof(*info) * oinfo->oi_md->lsm_stripe_count);
if (!info)
GOTO(out, rc = -ENOMEM);
req->rq_oi.oi_oa->o_stripe_idx = i;
req->rq_buflen = sizeof(*req->rq_oi.oi_md);
- OBD_ALLOC(req->rq_oi.oi_md, req->rq_buflen);
+ OBD_ALLOC_LARGE(req->rq_oi.oi_md, req->rq_buflen);
if (req->rq_oi.oi_md == NULL) {
OBDO_FREE(req->rq_oi.oi_oa);
OBD_FREE(req, sizeof(*req));
}
out:
if (info)
- OBD_FREE(info, sizeof(*info) * oinfo->oi_md->lsm_stripe_count);
+ OBD_FREE_LARGE(info,
+ sizeof(*info) * oinfo->oi_md->lsm_stripe_count);
if (rc == 0)
*reqset = set;
if (set == NULL)
RETURN(0);
LASSERT(set->set_exp);
- if (set->set_completes)
+ if (cfs_atomic_read(&set->set_completes))
rc = common_attr_done(set);
lov_put_reqset(set);
if (set == NULL)
RETURN(0);
LASSERT(set->set_exp);
- if (set->set_completes) {
+ if (cfs_atomic_read(&set->set_completes)) {
/* FIXME update qos data here */
}
if (set == NULL)
RETURN(0);
LASSERT(set->set_exp);
- if (set->set_completes) {
+ if (cfs_atomic_read(&set->set_completes)) {
rc = common_attr_done(set);
/* FIXME update qos data here */
}
if (set == NULL)
RETURN(0);
LASSERT(set->set_exp);
- if (set->set_completes) {
+ if (cfs_atomic_read(&set->set_completes)) {
rc = -EIO;
/* FIXME update qos data here */
- if (set->set_success)
+ if (cfs_atomic_read(&set->set_success))
rc = common_attr_done(set);
}
if (set == NULL)
RETURN(0);
LASSERT(set->set_exp);
- if (set->set_completes) {
- if (!set->set_success)
+ if (cfs_atomic_read(&set->set_completes)) {
+ if (!cfs_atomic_read(&set->set_success))
rc = -EIO;
/* FIXME update qos data here */
}
RETURN(rc);
}
+/* The callback for osc_sync that finilizes a request info when a
+ * response is recieved. */
+static int cb_sync_update(void *cookie, int rc)
+{
+ struct obd_info *oinfo = cookie;
+ struct lov_request *lovreq;
+
+ lovreq = container_of(oinfo, struct lov_request, rq_oi);
+ return lov_update_common_set(lovreq->rq_rqset, lovreq, rc);
+}
+
int lov_prep_sync_set(struct obd_export *exp, struct obd_info *oinfo,
- struct obdo *src_oa, struct lov_stripe_md *lsm,
obd_off start, obd_off end,
struct lov_request_set **reqset)
{
int rc = 0, i;
ENTRY;
- OBD_ALLOC(set, sizeof(*set));
+ OBD_ALLOC_PTR(set);
if (set == NULL)
RETURN(-ENOMEM);
lov_init_set(set);
set->set_exp = exp;
set->set_oi = oinfo;
- set->set_oi->oi_md = lsm;
- set->set_oi->oi_oa = src_oa;
- for (i = 0; i < lsm->lsm_stripe_count; i++) {
- struct lov_oinfo *loi = lsm->lsm_oinfo[i];
+ for (i = 0; i < oinfo->oi_md->lsm_stripe_count; i++) {
+ struct lov_oinfo *loi = oinfo->oi_md->lsm_oinfo[i];
struct lov_request *req;
obd_off rs, re;
continue;
}
- if (!lov_stripe_intersects(lsm, i, start, end, &rs, &re))
+ if (!lov_stripe_intersects(oinfo->oi_md, i, start, end, &rs,
+ &re))
continue;
- OBD_ALLOC(req, sizeof(*req));
+ OBD_ALLOC_PTR(req);
if (req == NULL)
GOTO(out_set, rc = -ENOMEM);
req->rq_stripe = i;
OBD_FREE(req, sizeof(*req));
GOTO(out_set, rc = -ENOMEM);
}
- memcpy(req->rq_oi.oi_oa, src_oa, sizeof(*req->rq_oi.oi_oa));
+ *req->rq_oi.oi_oa = *oinfo->oi_oa;
req->rq_oi.oi_oa->o_id = loi->loi_id;
req->rq_oi.oi_oa->o_seq = loi->loi_seq;
req->rq_oi.oi_oa->o_stripe_idx = i;
req->rq_oi.oi_policy.l_extent.start = rs;
req->rq_oi.oi_policy.l_extent.end = re;
req->rq_oi.oi_policy.l_extent.gid = -1;
+ req->rq_oi.oi_cb_up = cb_sync_update;
lov_set_add_req(req, set);
}
ENTRY;
if (success) {
- __u32 expected_stripes = lov_get_stripecnt(&obd->u.lov, 0);
-
+ __u32 expected_stripes = lov_get_stripecnt(&obd->u.lov,
+ LOV_MAGIC, 0);
if (osfs->os_files != LOV_U64_MAX)
do_div(osfs->os_files, expected_stripes);
if (osfs->os_ffree != LOV_U64_MAX)
if (set == NULL)
RETURN(0);
- if (set->set_completes) {
+ if (cfs_atomic_read(&set->set_completes)) {
rc = lov_fini_statfs(set->set_obd, set->set_oi->oi_osfs,
- set->set_success);
+ cfs_atomic_read(&set->set_success));
}
lov_put_reqset(set);
RETURN(rc);
}
-int lov_fini_sync_fs_set(struct lov_request_set *set)
-{
- int rc = 0;
- ENTRY;
-
- if (set == NULL)
- RETURN(rc);
- lov_put_reqset(set);
- RETURN(rc);
-}
-
void lov_update_statfs(struct obd_statfs *osfs, struct obd_statfs *lov_sfs,
int success)
{
{
struct obd_info *oinfo = cookie;
struct lov_request *lovreq;
+ struct lov_request_set *set;
struct obd_statfs *osfs, *lov_sfs;
struct lov_obd *lov;
struct lov_tgt_desc *tgt;
ENTRY;
lovreq = container_of(oinfo, struct lov_request, rq_oi);
- lovobd = lovreq->rq_rqset->set_obd;
+ set = lovreq->rq_rqset;
+ lovobd = set->set_obd;
lov = &lovobd->u.lov;
- osfs = lovreq->rq_rqset->set_oi->oi_osfs;
+ osfs = set->set_oi->oi_osfs;
lov_sfs = oinfo->oi_osfs;
- success = lovreq->rq_rqset->set_success;
+ success = cfs_atomic_read(&set->set_success);
/* XXX: the same is done in lov_update_common_set, however
lovset->set_exp is not initialized. */
- lov_update_set(lovreq->rq_rqset, lovreq, rc);
+ lov_update_set(set, lovreq, rc);
if (rc)
GOTO(out, rc);
obd_putref(lovobd);
out:
- if (lovreq->rq_rqset->set_oi->oi_flags & OBD_STATFS_PTLRPCD &&
- lov_finished_set(lovreq->rq_rqset)) {
- lov_statfs_interpret(NULL, lovreq->rq_rqset,
- lovreq->rq_rqset->set_success !=
- lovreq->rq_rqset->set_count);
- qos_statfs_done(lov);
+ if (set->set_oi->oi_flags & OBD_STATFS_PTLRPCD &&
+ lov_finished_set(set)) {
+ 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);
lov_fini_statfs_set(set);
RETURN(rc);
}
-
-int cb_sync_fs_update(void *cookie, int rc)
-{
- struct obd_info *oinfo = cookie;
- struct lov_request *lovreq;
- ENTRY;
-
- lovreq = container_of(oinfo, struct lov_request, rq_oi);
- lov_update_set(lovreq->rq_rqset, lovreq, rc);
-
- RETURN(rc);
-}
-
-int lov_prep_sync_fs_set(struct obd_export *exp, struct obd_info *oinfo,
- struct lov_request_set **request)
-{
- struct lov_request_set *set;
- struct lov_obd *lov = &exp->exp_obd->u.lov;
- int rc = 0;
- int i;
-
- ENTRY;
-
- OBD_ALLOC(set, sizeof(*set));
- if (set == NULL)
- RETURN(ENOMEM);
- lov_init_set(set);
- set->set_obd = class_exp2obd(exp);
- set->set_oi = oinfo;
-
- for (i = 0; i < lov->desc.ld_tgt_count; i++) {
- struct lov_request *req;
-
- if (!lov->lov_tgts[i] || !lov->lov_tgts[i]->ltd_active ||
- !lov->lov_tgts[i]->ltd_exp) {
- CDEBUG(D_INFO, "lov idx %d inactive or disabled\n", i);
- continue;
- }
-
- OBD_ALLOC(req, sizeof(*req));
- if (req == NULL)
- GOTO(out, rc = ENOMEM);
-
- req->rq_idx = i;
- req->rq_oi.oi_cb_up = cb_sync_fs_update;
-
- lov_set_add_req(req, set);
- }
- if (!set->set_count)
- GOTO(out, rc = -EIO);
- *request = set;
- RETURN(rc);
-out:
- lov_fini_sync_fs_set(set);
- RETURN(rc);
-}