From 2c48f68b8d616691b0cd762eab5c3dc42f8e8355 Mon Sep 17 00:00:00 2001 From: braam Date: Sun, 5 Oct 2003 03:56:06 +0000 Subject: [PATCH] - adapt Andreas lov logging api to new framework --- lustre/lov/lov_internal.h | 11 +++ lustre/lov/lov_log.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 lustre/lov/lov_log.c diff --git a/lustre/lov/lov_internal.h b/lustre/lov/lov_internal.h index f9b629e..bd303b6 100644 --- a/lustre/lov/lov_internal.h +++ b/lustre/lov/lov_internal.h @@ -12,6 +12,17 @@ int lov_get_stripecnt(struct lov_obd *lov, int stripe_count); int lov_alloc_memmd(struct lov_stripe_md **lsmp, int stripe_count); void lov_free_memmd(struct lov_stripe_md **lsmp); +/* lov_log.c */ +int lov_get_catalogs(struct lov_obd *lov, struct llog_handle *cathandle); +#if 0 +int lov_log_add(struct obd_export *exp, + struct llog_handle *cathandle, + struct llog_rec_hdr *rec, struct lov_stripe_md *lsm, + struct llog_cookie *logcookies, int numcookies); +int lov_log_cancel(struct obd_export *exp, struct lov_stripe_md *lsm, + int count, struct llog_cookie *cookies, int flags); +#endif + /* lov_pack.c */ int lov_packmd(struct obd_export *exp, struct lov_mds_md **lmm, struct lov_stripe_md *lsm); diff --git a/lustre/lov/lov_log.c b/lustre/lov/lov_log.c new file mode 100644 index 0000000..6a91d80 --- /dev/null +++ b/lustre/lov/lov_log.c @@ -0,0 +1,172 @@ + /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2002, 2003 Cluster File Systems, Inc. + * Author: Phil Schwan + * Peter Braam + * Mike Shaver + * + * This file is part of Lustre, http://www.lustre.org. + * + * 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. + * + * 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. + * + * 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. + */ + +#ifndef EXPORT_SYMTAB +# define EXPORT_SYMTAB +#endif +#define DEBUG_SUBSYSTEM S_LOV +#ifdef __KERNEL__ +#include +#include +#include +#include +#include +#include +#else +#include +#endif + +#include +#include +#include +#include +#include /* for LL_IOC_LOV_[GS]ETSTRIPE */ +#include +#include +#include +#include +#include +#include +#include + +#include "lov_internal.h" + +/* For LOV catalogs, we "nest" catalogs from the parent catalog. What this + * means is that the parent catalog has a bunch of log cookies that are + * pointing at one catalog for each OSC. The OSC catalogs in turn hold + * cookies for actual log files. */ +int lov_llog_open(struct obd_device *obd, struct obd_device *disk_obd, + int index, int named, int flags, struct obd_uuid *log_uuid) + +{ + struct lov_obd *lov = &obd->u.lov; + int i, rc; + + ENTRY; + for (i = 0; i < lov->desc.ld_tgt_count; i++) { + struct obd_device *child = lov->tgts[i].ltd_exp->exp_obd; + rc = obd_llog_open(child, disk_obd, + index, named, flags, log_uuid); + CERROR("error lov_llog_open %d\n", i); + if (rc) + break; + } + RETURN(rc); +} + +int lov_get_catalogs(struct lov_obd *lov, struct llog_handle *cathandle) +{ + struct obd_device *obd = cathandle->lgh_obd; + struct lustre_handle conn; + struct obd_export *exp; + struct obd_uuid cluuid = { "MDS_OSC_UUID" }; + int rc = 0, i; + ENTRY; + + for (i = 0; i < lov->desc.ld_active_tgt_count; i ++) { + rc = class_connect(&conn, obd, &cluuid); + if (rc) { + CERROR("failed %d: \n", rc); + GOTO(out, rc); + } + exp = class_conn2export(&conn); + lov->tgts[i].ltd_exp->exp_obd->obd_log_exp = exp; + lov->tgts[i].ltd_cathandle = cathandle; + } + + lov->lo_catalog_loaded = 1; + RETURN(rc); + +out: + while (--i > 0) { + class_disconnect(lov->tgts[i].ltd_exp->exp_obd->obd_log_exp, 0); + lov->tgts[i].ltd_cathandle = cathandle; + } + RETURN(rc); +} + +/* Add log records for each OSC that this object is striped over, and return + * cookies for each one. We _would_ have nice abstraction here, except that + * we need to keep cookies in stripe order, even if some are NULL, so that + * the right cookies are passed back to the right OSTs at the client side. + * Unset cookies should be all-zero (which will never occur naturally). */ +int lov_log_add(struct obd_export *exp, + struct llog_handle *cathandle, + struct llog_rec_hdr *rec, struct lov_stripe_md *lsm, + struct llog_cookie *logcookies, int numcookies) +{ + struct obd_device *obd = class_exp2obd(exp); + struct lov_obd *lov = &obd->u.lov; + struct lov_oinfo *loi; + int i, rc = 0; + ENTRY; + + LASSERT(logcookies && numcookies >= lsm->lsm_stripe_count); + + if (unlikely(!lov->lo_catalog_loaded)) + lov_get_catalogs(lov, cathandle); + + for (i = 0,loi = lsm->lsm_oinfo; i < lsm->lsm_stripe_count; i++,loi++) { + rc += obd_log_add(lov->tgts[loi->loi_ost_idx].ltd_exp, + lov->tgts[loi->loi_ost_idx].ltd_cathandle, + rec, NULL, logcookies + rc, numcookies - rc); + } + + RETURN(rc); +} + +int lov_log_cancel(struct obd_export *exp, struct lov_stripe_md *lsm, + int count, struct llog_cookie *cookies, int flags) +{ + struct lov_obd *lov; + struct lov_oinfo *loi; + int rc = 0, i; + ENTRY; + + LASSERT(lsm != NULL); + if (exp == NULL || exp->exp_obd == NULL) + RETURN(-ENODEV); + + LASSERT(count == lsm->lsm_stripe_count); + + loi = lsm->lsm_oinfo; + lov = &exp->exp_obd->u.lov; + for (i = 0; i < count; i++, cookies++, loi++) { + int err; + + err = obd_log_cancel(lov->tgts[loi->loi_ost_idx].ltd_exp, + lov->tgts[loi->loi_ost_idx].ltd_cathandle, + NULL, 1, cookies, flags); + + if (err && lov->tgts[loi->loi_ost_idx].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); + if (!rc) + rc = err; + } + } + RETURN(rc); +} + -- 1.8.3.1