X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_log.c;h=90603dbbd975a840db7825c47814be5e61d1b825;hb=e671bcef07002246a2cd5417e7a1c0ddc6c4d196;hp=962fcd9bb7060a761a6316f40341eefdf9e19c93;hpb=090c677210ee2946d99c71412e4ff762bb300f4f;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_log.c b/lustre/lov/lov_log.c index 962fcd9..90603db 100644 --- a/lustre/lov/lov_log.c +++ b/lustre/lov/lov_log.c @@ -6,20 +6,23 @@ * Peter Braam * Mike Shaver * - * This file is part of Lustre, http://www.lustre.org. + * This file is part of the Lustre file system, http://www.lustre.org + * Lustre is a trademark of Cluster File Systems, Inc. * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * You may have signed or agreed to another license before downloading + * this software. If so, you are bound by the terms and conditions + * of that agreement, and the following does not apply to you. See the + * LICENSE file included with this distribution for more information. * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * If you did not agree to a different license, then this copy of Lustre + * is open source software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * In either case, Lustre is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * license text for more details. */ #ifndef EXPORT_SYMTAB @@ -27,27 +30,21 @@ #endif #define DEBUG_SUBSYSTEM S_LOV #ifdef __KERNEL__ -#include -#include -#include -#include -#include -#include -#include +#include #else #include #endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "lov_internal.h" @@ -62,62 +59,79 @@ static int lov_llog_origin_add(struct llog_ctxt *ctxt, { struct obd_device *obd = ctxt->loc_obd; struct lov_obd *lov = &obd->u.lov; - struct lov_oinfo *loi; - struct llog_unlink_rec *lur; - int i, rc = 0; + int i, rc = 0, rc1; ENTRY; - OBD_ALLOC(lur, sizeof(*lur)); - if (!lur) - RETURN(-ENOMEM); - lur->lur_hdr.lrh_len = lur->lur_tail.lrt_len = sizeof(*lur); - lur->lur_hdr.lrh_type = MDS_UNLINK_REC; - - LASSERT(logcookies && numcookies >= lsm->lsm_stripe_count); - - for (i = 0,loi = lsm->lsm_oinfo; i < lsm->lsm_stripe_count; i++,loi++) { - struct obd_device *child = lov->tgts[loi->loi_ost_idx].ltd_exp->exp_obd; - struct llog_ctxt *cctxt; - cctxt = llog_get_context(&child->obd_llogs, ctxt->loc_idx); - lur->lur_oid = loi->loi_id; - lur->lur_ogen = loi->loi_gr; + LASSERTF(logcookies && numcookies >= lsm->lsm_stripe_count, + "logcookies %p, numcookies %d lsm->lsm_stripe_count %d \n", + logcookies, numcookies, lsm->lsm_stripe_count); + + for (i = 0; i < lsm->lsm_stripe_count; i++) { + struct lov_oinfo *loi = lsm->lsm_oinfo[i]; + struct obd_device *child = + lov->lov_tgts[loi->loi_ost_idx]->ltd_exp->exp_obd; + struct llog_ctxt *cctxt = llog_get_context(child, ctxt->loc_idx); + + /* fill mds unlink/setattr log record */ + switch (rec->lrh_type) { + case MDS_UNLINK_REC: { + struct llog_unlink_rec *lur = (struct llog_unlink_rec *)rec; + lur->lur_oid = loi->loi_id; + lur->lur_ogen = loi->loi_gr; + break; + } + case MDS_SETATTR_REC: { + struct llog_setattr_rec *lsr = (struct llog_setattr_rec *)rec; + lsr->lsr_oid = loi->loi_id; + lsr->lsr_ogen = loi->loi_gr; + break; + } + default: + break; + } LASSERT(lsm->lsm_object_gr == loi->loi_gr); - rc += llog_add(cctxt, &lur->lur_hdr, NULL, logcookies + rc, - numcookies - rc); - + rc1 = llog_add(cctxt, rec, NULL, logcookies + rc, + numcookies - rc); + if (rc1 < 0) + RETURN(rc1); + rc += rc1; } - OBD_FREE(lur, sizeof(*lur)); RETURN(rc); } static int lov_llog_origin_connect(struct llog_ctxt *ctxt, int count, - struct llog_logid *logid, + struct llog_logid *logid, struct llog_gen *gen, struct obd_uuid *uuid) { struct obd_device *obd = ctxt->loc_obd; struct lov_obd *lov = &obd->u.lov; - int i, rc = 0; + int i, rc = 0, err = 0; ENTRY; - LASSERT(lov->desc.ld_tgt_count == count); - for (i = 0; i < lov->desc.ld_tgt_count; i++) { - struct obd_device *child = lov->tgts[i].ltd_exp->exp_obd; + lov_getref(obd); + for (i = 0; i < count; i++) { + struct obd_device *child; struct llog_ctxt *cctxt; - - cctxt = llog_get_context(&child->obd_llogs, ctxt->loc_idx); - if (uuid && !obd_uuid_equals(uuid, &lov->tgts[i].uuid)) + + if (!lov->lov_tgts[i] || !lov->lov_tgts[i]->ltd_active) continue; - + if (uuid && !obd_uuid_equals(uuid, &lov->lov_tgts[i]->ltd_uuid)) + continue; + CDEBUG(D_CONFIG, "connect %d/%d\n", i, count); + child = lov->lov_tgts[i]->ltd_exp->exp_obd; + cctxt = llog_get_context(child, ctxt->loc_idx); rc = llog_connect(cctxt, 1, logid, gen, uuid); if (rc) { - CERROR("error osc_llog_connect %d\n", i); - break; + CERROR("error osc_llog_connect tgt %d (%d)\n", i, rc); + if (!err) + err = rc; } } + lov_putref(obd); - RETURN(rc); + RETURN(err); } /* the replicators commit callback */ @@ -126,23 +140,24 @@ static int lov_llog_repl_cancel(struct llog_ctxt *ctxt, struct lov_stripe_md *ls { struct lov_obd *lov; struct obd_device *obd = ctxt->loc_obd; - struct lov_oinfo *loi; int rc = 0, i; ENTRY; LASSERT(lsm != NULL); LASSERT(count == lsm->lsm_stripe_count); - loi = lsm->lsm_oinfo; lov = &obd->u.lov; - for (i = 0; i < count; i++, cookies++, loi++) { - struct obd_device *child = lov->tgts[loi->loi_ost_idx].ltd_exp->exp_obd; - struct llog_ctxt *cctxt; + lov_getref(obd); + for (i = 0; i < count; i++, cookies++) { + struct lov_oinfo *loi = lsm->lsm_oinfo[i]; + struct obd_device *child = + lov->lov_tgts[loi->loi_ost_idx]->ltd_exp->exp_obd; + struct llog_ctxt *cctxt = + llog_get_context(child, ctxt->loc_idx); int err; - cctxt = llog_get_context(&child->obd_llogs, ctxt->loc_idx); err = llog_cancel(cctxt, NULL, 1, cookies, flags); - if (err && lov->tgts[loi->loi_ost_idx].active) { + if (err && lov->lov_tgts[loi->loi_ost_idx]->ltd_active) { CERROR("error: objid "LPX64" subobj "LPX64 " on OST idx %d: rc = %d\n", lsm->lsm_object_id, loi->loi_id, loi->loi_ost_idx, err); @@ -150,10 +165,11 @@ static int lov_llog_repl_cancel(struct llog_ctxt *ctxt, struct lov_stripe_md *ls rc = err; } } + lov_putref(obd); RETURN(rc); } -static struct llog_operations lov_unlink_orig_logops = { +static struct llog_operations lov_mds_ost_orig_logops = { lop_add: lov_llog_origin_add, lop_connect: lov_llog_origin_connect }; @@ -162,16 +178,17 @@ static struct llog_operations lov_size_repl_logops = { lop_cancel: lov_llog_repl_cancel }; - -int lov_llog_init(struct obd_device *obd, struct obd_llogs *llogs, - struct obd_device *tgt, int count, struct llog_catid *logid) +int lov_llog_init(struct obd_device *obd, struct obd_llogs *llogs, + struct obd_device *tgt, int count, struct llog_catid *logid, + struct obd_uuid *uuid) { struct lov_obd *lov = &obd->u.lov; - int i, rc = 0; + struct obd_device *child; + int i, rc = 0, err = 0; ENTRY; - rc = llog_setup(obd, llogs, LLOG_UNLINK_ORIG_CTXT, tgt, 0, NULL, - &lov_unlink_orig_logops); + rc = llog_setup(obd, llogs, LLOG_MDS_OST_ORIG_CTXT, tgt, 0, NULL, + &lov_mds_ost_orig_logops); if (rc) RETURN(rc); @@ -180,40 +197,47 @@ int lov_llog_init(struct obd_device *obd, struct obd_llogs *llogs, if (rc) RETURN(rc); - LASSERT(lov->desc.ld_tgt_count == count); - for (i = 0; i < lov->desc.ld_tgt_count; i++) { - struct obd_device *child = lov->tgts[i].ltd_exp->exp_obd; - rc = obd_llog_init(child, &child->obd_llogs, tgt, 1, logid + i); + lov_getref(obd); + /* count may not match lov->desc.ld_tgt_count during dynamic ost add */ + for (i = 0; i < count; i++) { + if (!lov->lov_tgts[i] || !lov->lov_tgts[i]->ltd_active) + continue; + if (uuid && !obd_uuid_equals(uuid, &lov->lov_tgts[i]->ltd_uuid)) + continue; + CDEBUG(D_CONFIG, "init %d/%d\n", i, count); + LASSERT(lov->lov_tgts[i]->ltd_exp); + child = lov->lov_tgts[i]->ltd_exp->exp_obd; + rc = obd_llog_init(child, llogs, tgt, 1, logid + i, uuid); if (rc) { - CERROR("error osc_llog_init %d\n", i); - break; + CERROR("error osc_llog_init idx %d osc '%s' tgt '%s' " + "(rc=%d)\n", i, child->obd_name, tgt->obd_name, + rc); + if (!err) + err = rc; } } - RETURN(rc); + lov_putref(obd); + RETURN(err); } -int lov_llog_finish(struct obd_device *obd, struct obd_llogs *llogs, int count) +int lov_llog_finish(struct obd_device *obd, int count) { - struct lov_obd *lov = &obd->u.lov; - int i, rc = 0; + struct llog_ctxt *ctxt; + int rc = 0, rc2 = 0; ENTRY; - - rc = llog_cleanup(llog_get_context(llogs, LLOG_UNLINK_ORIG_CTXT)); - if (rc) - RETURN(rc); - rc = llog_cleanup(llog_get_context(llogs, LLOG_SIZE_REPL_CTXT)); - if (rc) - RETURN(rc); + /* cleanup our llogs only if the ctxts have been setup + * (client lov doesn't setup, mds lov does). */ + ctxt = llog_get_context(obd, LLOG_MDS_OST_ORIG_CTXT); + if (ctxt) + rc = llog_cleanup(ctxt); - LASSERT(lov->desc.ld_tgt_count == count); - for (i = 0; i < lov->desc.ld_tgt_count; i++) { - struct obd_device *child = lov->tgts[i].ltd_exp->exp_obd; - rc = obd_llog_finish(child, &child->obd_llogs, 1); - if (rc) { - CERROR("error osc_llog_finish %d\n", i); - break; - } - } + ctxt = llog_get_context(obd, LLOG_SIZE_REPL_CTXT); + if (ctxt) + rc2 = llog_cleanup(ctxt); + if (!rc) + rc = rc2; + + /* lov->tgt llogs are cleaned during osc_cleanup. */ RETURN(rc); }