lov_request.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 1,640 行 · 第 1/4 页

C
1,640
字号
{        struct {                obd_count       index;                obd_count       count;                obd_count       off;        } *info = NULL;        struct lov_request_set *set;        struct lov_oinfo *loi = NULL;        struct lov_obd *lov = &exp->exp_obd->u.lov;        int rc = 0, i, shift;        ENTRY;        OBD_ALLOC(set, sizeof(*set));        if (set == NULL)                RETURN(-ENOMEM);        lov_init_set(set);        set->set_exp = exp;        set->set_oti = oti;        set->set_oi = oinfo;        set->set_oabufs = oa_bufs;        OBD_ALLOC(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);        if (!info)                GOTO(out, rc = -ENOMEM);        /* calculate the page count for each stripe */        for (i = 0; i < oa_bufs; i++) {                int stripe = lov_stripe_number(oinfo->oi_md, pga[i].off);                info[stripe].count++;        }        /* alloc and initialize lov request */        shift = 0;        for (i = 0 ; i < oinfo->oi_md->lsm_stripe_count; i++){                struct lov_request *req;                if (info[i].count == 0)                        continue;                loi = oinfo->oi_md->lsm_oinfo[i];                if (!lov->lov_tgts[loi->loi_ost_idx] ||                     !lov->lov_tgts[loi->loi_ost_idx]->ltd_active) {                        CDEBUG(D_HA, "lov idx %d inactive\n", loi->loi_ost_idx);                        GOTO(out, rc = -EIO);                }                OBD_ALLOC(req, sizeof(*req));                if (req == NULL)                        GOTO(out, rc = -ENOMEM);                OBDO_ALLOC(req->rq_oi.oi_oa);                if (req->rq_oi.oi_oa == NULL) {                        OBD_FREE(req, sizeof(*req));                        GOTO(out, rc = -ENOMEM);                }                if (oinfo->oi_oa) {                        memcpy(req->rq_oi.oi_oa, oinfo->oi_oa,                               sizeof(*req->rq_oi.oi_oa));                }                req->rq_oi.oi_oa->o_id = loi->loi_id;                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);                if (req->rq_oi.oi_md == NULL) {                        OBDO_FREE(req->rq_oi.oi_oa);                        OBD_FREE(req, sizeof(*req));                        GOTO(out, rc = -ENOMEM);                }                req->rq_idx = loi->loi_ost_idx;                req->rq_stripe = i;                /* XXX LOV STACKING */                req->rq_oi.oi_md->lsm_object_id = loi->loi_id;                req->rq_oi.oi_md->lsm_object_gr = oinfo->oi_md->lsm_object_gr;                req->rq_oabufs = info[i].count;                req->rq_pgaidx = shift;                shift += req->rq_oabufs;                /* remember the index for sort brw_page array */                info[i].index = req->rq_pgaidx;                lov_set_add_req(req, set);        }        if (!set->set_count)                GOTO(out, rc = -EIO);        /* rotate & sort the brw_page array */        for (i = 0; i < oa_bufs; i++) {                int stripe = lov_stripe_number(oinfo->oi_md, pga[i].off);                shift = info[stripe].index + info[stripe].off;                LASSERT(shift < oa_bufs);                set->set_pga[shift] = pga[i];                lov_stripe_offset(oinfo->oi_md, pga[i].off, stripe,                                  &set->set_pga[shift].off);                info[stripe].off++;        }out:        if (info)                OBD_FREE(info, sizeof(*info) * oinfo->oi_md->lsm_stripe_count);        if (rc == 0)                *reqset = set;        else                lov_fini_brw_set(set);        RETURN(rc);}int lov_fini_getattr_set(struct lov_request_set *set){        int rc = 0;        ENTRY;        if (set == NULL)                RETURN(0);        LASSERT(set->set_exp);        if (set->set_completes)                rc = common_attr_done(set);        if (atomic_dec_and_test(&set->set_refcount))                lov_finish_set(set);        RETURN(rc);}/* The callback for osc_getattr_async that finilizes a request info when a * response is recieved. */static int cb_getattr_update(struct obd_info *oinfo, int rc){        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_getattr_set(struct obd_export *exp, struct obd_info *oinfo,                         struct lov_request_set **reqset){        struct lov_request_set *set;        struct lov_oinfo *loi = NULL;        struct lov_obd *lov = &exp->exp_obd->u.lov;        int rc = 0, i;        ENTRY;        OBD_ALLOC(set, sizeof(*set));        if (set == NULL)                RETURN(-ENOMEM);        lov_init_set(set);        set->set_exp = exp;        set->set_oi = oinfo;        for (i = 0; i < oinfo->oi_md->lsm_stripe_count; i++) {                struct lov_request *req;                loi = oinfo->oi_md->lsm_oinfo[i];                if (!lov->lov_tgts[loi->loi_ost_idx] ||                    !lov->lov_tgts[loi->loi_ost_idx]->ltd_active) {                        CDEBUG(D_HA, "lov idx %d inactive\n", loi->loi_ost_idx);                        continue;                }                OBD_ALLOC(req, sizeof(*req));                if (req == NULL)                        GOTO(out_set, rc = -ENOMEM);                req->rq_stripe = i;                req->rq_idx = loi->loi_ost_idx;                OBDO_ALLOC(req->rq_oi.oi_oa);                if (req->rq_oi.oi_oa == NULL) {                        OBD_FREE(req, sizeof(*req));                        GOTO(out_set, rc = -ENOMEM);                }                memcpy(req->rq_oi.oi_oa, oinfo->oi_oa,                       sizeof(*req->rq_oi.oi_oa));                req->rq_oi.oi_oa->o_id = loi->loi_id;                req->rq_oi.oi_cb_up = cb_getattr_update;                lov_set_add_req(req, set);        }        if (!set->set_count)                GOTO(out_set, rc = -EIO);        *reqset = set;        RETURN(rc);out_set:        lov_fini_getattr_set(set);        RETURN(rc);}int lov_fini_destroy_set(struct lov_request_set *set){        ENTRY;        if (set == NULL)                RETURN(0);        LASSERT(set->set_exp);        if (set->set_completes) {                /* FIXME update qos data here */        }        if (atomic_dec_and_test(&set->set_refcount))                lov_finish_set(set);        RETURN(0);}int lov_prep_destroy_set(struct obd_export *exp, struct obd_info *oinfo,                         struct obdo *src_oa, struct lov_stripe_md *lsm,                         struct obd_trans_info *oti,                         struct lov_request_set **reqset){        struct lov_request_set *set;        struct lov_oinfo *loi = NULL;        struct lov_obd *lov = &exp->exp_obd->u.lov;        int rc = 0, i;        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 = lsm;        set->set_oi->oi_oa = src_oa;        set->set_oti = oti;        if (oti != NULL && src_oa->o_valid & OBD_MD_FLCOOKIE)                set->set_cookies = oti->oti_logcookies;        for (i = 0; i < lsm->lsm_stripe_count; i++) {                struct lov_request *req;                loi = lsm->lsm_oinfo[i];                if (!lov->lov_tgts[loi->loi_ost_idx] ||                     !lov->lov_tgts[loi->loi_ost_idx]->ltd_active) {                        CDEBUG(D_HA, "lov idx %d inactive\n", loi->loi_ost_idx);                        continue;                }                OBD_ALLOC(req, sizeof(*req));                if (req == NULL)                        GOTO(out_set, rc = -ENOMEM);                req->rq_stripe = i;                req->rq_idx = loi->loi_ost_idx;                OBDO_ALLOC(req->rq_oi.oi_oa);                if (req->rq_oi.oi_oa == NULL) {                        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->o_id = loi->loi_id;                lov_set_add_req(req, set);        }        if (!set->set_count)                GOTO(out_set, rc = -EIO);        *reqset = set;        RETURN(rc);out_set:        lov_fini_destroy_set(set);        RETURN(rc);}int lov_fini_setattr_set(struct lov_request_set *set){        int rc = 0;        ENTRY;        if (set == NULL)                RETURN(0);        LASSERT(set->set_exp);        if (set->set_completes) {                rc = common_attr_done(set);                /* FIXME update qos data here */        }        if (atomic_dec_and_test(&set->set_refcount))                lov_finish_set(set);        RETURN(rc);}int lov_update_setattr_set(struct lov_request_set *set,                           struct lov_request *req, int rc){        struct lov_obd *lov = &req->rq_rqset->set_exp->exp_obd->u.lov;        struct lov_stripe_md *lsm = req->rq_rqset->set_oi->oi_md;        ENTRY;        lov_update_set(set, req, rc);        /* grace error on inactive ost */        if (rc && !(lov->lov_tgts[req->rq_idx] &&                     lov->lov_tgts[req->rq_idx]->ltd_active))                rc = 0;        if (rc == 0) {                if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLCTIME)                        lsm->lsm_oinfo[req->rq_stripe]->loi_lvb.lvb_ctime =                                req->rq_oi.oi_oa->o_ctime;                if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLMTIME)                        lsm->lsm_oinfo[req->rq_stripe]->loi_lvb.lvb_mtime =                                req->rq_oi.oi_oa->o_mtime;                if (req->rq_oi.oi_oa->o_valid & OBD_MD_FLATIME)                        lsm->lsm_oinfo[req->rq_stripe]->loi_lvb.lvb_atime =                                req->rq_oi.oi_oa->o_atime;        }        RETURN(rc);}/* The callback for osc_setattr_async that finilizes a request info when a * response is recieved. */static int cb_setattr_update(struct obd_info *oinfo, int rc){        struct lov_request *lovreq;        lovreq = container_of(oinfo, struct lov_request, rq_oi);        return lov_update_setattr_set(lovreq->rq_rqset, lovreq, rc);}int lov_prep_setattr_set(struct obd_export *exp, struct obd_info *oinfo,                         struct obd_trans_info *oti,                         struct lov_request_set **reqset){        struct lov_request_set *set;        struct lov_oinfo *loi = NULL;        struct lov_obd *lov = &exp->exp_obd->u.lov;        int rc = 0, i;        ENTRY;        OBD_ALLOC(set, sizeof(*set));        if (set == NULL)                RETURN(-ENOMEM);        lov_init_set(set);        set->set_exp = exp;        set->set_oti = oti;        set->set_oi = oinfo;        if (oti != NULL && oinfo->oi_oa->o_valid & OBD_MD_FLCOOKIE)                set->set_cookies = oti->oti_logcookies;        for (i = 0; i < oinfo->oi_md->lsm_stripe_count; i++) {                struct lov_request *req;                loi = oinfo->oi_md->lsm_oinfo[i];                if (!lov->lov_tgts[loi->loi_ost_idx] ||                    !lov->lov_tgts[loi->loi_ost_idx]->ltd_active) {                        CDEBUG(D_HA, "lov idx %d inactive\n", loi->loi_ost_idx);                        continue;                }                OBD_ALLOC(req, sizeof(*req));                if (req == NULL)                        GOTO(out_set, rc = -ENOMEM);                req->rq_stripe = i;                req->rq_idx = loi->loi_ost_idx;                OBDO_ALLOC(req->rq_oi.oi_oa);                if (req->rq_oi.oi_oa == NULL) {                        OBD_FREE(req, sizeof(*req));                        GOTO(out_set, rc = -ENOMEM);                }                memcpy(req->rq_oi.oi_oa, oinfo->oi_oa,                       sizeof(*req->rq_oi.oi_oa));                req->rq_oi.oi_oa->o_id = loi->loi_id;                req->rq_oi.oi_oa->o_stripe_idx = i;                req->rq_oi.oi_cb_up = cb_setattr_update;                req->rq_rqset = set;                if (oinfo->oi_oa->o_valid & OBD_MD_FLSIZE) {                        int off = lov_stripe_offset(oinfo->oi_md,                                                    oinfo->oi_oa->o_size, i,                                                    &req->rq_oi.oi_oa->o_size);                        if (off < 0 && req->rq_oi.oi_oa->o_size)                                req->rq_oi.oi_oa->o_size--;                        CDEBUG(D_INODE, "stripe %d has size "LPU64"/"LPU64"\n",                               i, req->rq_oi.oi_oa->o_size,                               oinfo->oi_oa->o_size);                }                lov_set_add_req(req, set);        }        if (!set->set_count)                GOTO(out_set, rc = -EIO);        *reqset = set;        RETURN(rc);out_set:        lov_fini_setattr_set(set);        RETURN(rc);}int lov_fini_punch_set(struct lov_request_set *set){        int rc = 0;        ENTRY;        if (set == NULL)                RETURN(0);        LASSERT(set->set_exp);        if (set->set_completes) {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?