* Peter Braam <braam@clusterfs.com>
* Mike Shaver <shaver@clusterfs.com>
*
- * 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
#endif
#define DEBUG_SUBSYSTEM S_LOV
#ifdef __KERNEL__
-#include <linux/slab.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/pagemap.h>
-#include <asm/div64.h>
-#include <linux/seq_file.h>
+#include <libcfs/libcfs.h>
#else
#include <liblustre.h>
#endif
-#include <linux/obd_support.h>
-#include <linux/lustre_lib.h>
-#include <linux/lustre_net.h>
-#include <linux/lustre_idl.h>
-#include <linux/lustre_dlm.h>
-#include <linux/lustre_mds.h>
-#include <linux/obd_class.h>
-#include <linux/obd_lov.h>
-#include <linux/obd_ost.h>
-#include <linux/lprocfs_status.h>
+#include <obd_support.h>
+#include <lustre_lib.h>
+#include <lustre_net.h>
+#include <lustre/lustre_idl.h>
+#include <lustre_dlm.h>
+#include <lustre_mds.h>
+#include <obd_class.h>
+#include <obd_lov.h>
+#include <obd_ost.h>
+#include <lprocfs_status.h>
#include "lov_internal.h"
* Unset cookies should be all-zero (which will never occur naturally). */
static int lov_llog_origin_add(struct llog_ctxt *ctxt,
struct llog_rec_hdr *rec, struct lov_stripe_md *lsm,
- struct llog_cookie *logcookies, int numcookies,
- llog_fill_rec_cb_t fill_cb)
+ struct llog_cookie *logcookies, int numcookies)
{
struct obd_device *obd = ctxt->loc_obd;
struct lov_obd *lov = &obd->u.lov;
struct lov_oinfo *loi;
- int i, rc = 0;
+ int i, rc = 0, rc1;
ENTRY;
- LASSERT(logcookies && numcookies >= lsm->lsm_stripe_count);
+ 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,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;
+ for (i = 0, loi = lsm->lsm_oinfo; i < lsm->lsm_stripe_count; i++,loi++) {
+ 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);
- struct llog_fill_rec_data data;
/* fill mds unlink/setattr log record */
- data.lfd_id = loi->loi_id;
- data.lfd_ogen = loi->loi_gr;
- fill_cb(rec, &data);
-
- rc += llog_add(cctxt, rec, NULL, logcookies + rc,
- numcookies - rc, fill_cb);
-
+ 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);
+ rc1 = llog_add(cctxt, rec, NULL, logcookies + rc,
+ numcookies - rc);
+ if (rc1 < 0)
+ RETURN(rc1);
+ rc += rc1;
}
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;
- struct lov_tgt_desc *tgt;
- int i, rc = 0;
+ int i, rc = 0, err = 0;
ENTRY;
- LASSERT(lov->desc.ld_tgt_count == count);
- for (i = 0, tgt = lov->tgts; i < lov->desc.ld_tgt_count; i++, tgt++) {
+ lov_getref(obd);
+ for (i = 0; i < count; i++) {
struct obd_device *child;
struct llog_ctxt *cctxt;
- if (!tgt->active)
+ if (!lov->lov_tgts[i] || !lov->lov_tgts[i]->ltd_active)
continue;
- child = tgt->ltd_exp->exp_obd;
- cctxt = llog_get_context(child, ctxt->loc_idx);
- if (uuid && !obd_uuid_equals(uuid, &lov->tgts[i].uuid))
+ 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 */
loi = lsm->lsm_oinfo;
lov = &obd->u.lov;
+ lov_getref(obd);
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 = llog_get_context(child, ctxt->loc_idx);
+ 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;
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);
rc = err;
}
}
+ lov_putref(obd);
RETURN(rc);
}
lop_cancel: lov_llog_repl_cancel
};
-int lov_llog_init(struct obd_device *obd, 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;
- struct lov_tgt_desc *ctgt;
- int i, rc = 0;
+ struct obd_device *child;
+ int i, rc = 0, err = 0;
ENTRY;
- rc = llog_setup(obd, LLOG_MDS_OST_ORIG_CTXT, tgt, 0, NULL,
+ rc = llog_setup(obd, llogs, LLOG_MDS_OST_ORIG_CTXT, tgt, 0, NULL,
&lov_mds_ost_orig_logops);
if (rc)
RETURN(rc);
- rc = llog_setup(obd, LLOG_SIZE_REPL_CTXT, tgt, 0, NULL,
+ rc = llog_setup(obd, llogs, LLOG_SIZE_REPL_CTXT, tgt, 0, NULL,
&lov_size_repl_logops);
if (rc)
RETURN(rc);
- LASSERT(lov->desc.ld_tgt_count == count);
- for (i = 0, ctgt = lov->tgts; i < lov->desc.ld_tgt_count; i++, ctgt++) {
- struct obd_device *child;
- if (!ctgt->active)
+ 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;
- child = ctgt->ltd_exp->exp_obd;
- rc = obd_llog_init(child, tgt, 1, logid + i);
+ 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, int count)