X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Fllog_obd.c;h=6cf90d11339cf7b377f9d190f94d6543d7bfcc98;hb=18f19045904ae09104a3f9bcbe9e99f345e421b4;hp=80894ce96db3115c471e6e0072ab08c1063d80b6;hpb=e44e9b278432a1df83482b1cd83b2081fabe94dc;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/llog_obd.c b/lustre/obdclass/llog_obd.c index 80894ce..6cf90d1 100644 --- a/lustre/obdclass/llog_obd.c +++ b/lustre/obdclass/llog_obd.c @@ -1,10 +1,25 @@ - /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * 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. + * Copyright (C) 2005 Cluster File Systems, Inc. + * + * This file is part of the Lustre file system, http://www.lustre.org + * Lustre is a trademark of Cluster File Systems, Inc. + * + * 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. + * + * 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. + * + * 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. */ #define DEBUG_SUBSYSTEM S_LOG @@ -13,84 +28,135 @@ #define EXPORT_SYMTAB #endif -#ifdef __KERNEL__ -#include -#else +#ifndef __KERNEL__ #include #endif -#include -#include -#include +#include +#include +#include +#include "llog_internal.h" /* helper functions for calling the llog obd methods */ -int obd_llog_setup(struct obd_device *obd, struct obd_llogs *llogs, - int index, struct obd_device *disk_obd, int count, - struct llog_logid *logid, struct llog_operations *op) +int llog_cleanup(struct llog_ctxt *ctxt) { int rc = 0; - struct llog_ctxt *ctxt; ENTRY; - LASSERT(llogs); + if (!ctxt) { + CERROR("No ctxt\n"); + RETURN(-ENODEV); + } + + if (CTXTP(ctxt, cleanup)) + rc = CTXTP(ctxt, cleanup)(ctxt); + + ctxt->loc_obd->obd_llog_ctxt[ctxt->loc_idx] = NULL; + if (ctxt->loc_exp) + class_export_put(ctxt->loc_exp); + OBD_FREE(ctxt, sizeof(*ctxt)); + + RETURN(rc); +} +EXPORT_SYMBOL(llog_cleanup); + +int llog_setup(struct obd_device *obd, int index, struct obd_device *disk_obd, + int count, struct llog_logid *logid, struct llog_operations *op) +{ + int rc = 0; + struct llog_ctxt *ctxt; + ENTRY; if (index < 0 || index >= LLOG_MAX_CTXTS) RETURN(-EFAULT); + if (obd->obd_llog_ctxt[index]) { + /* mds_lov_update_mds might call here multiple times. So if the + llog is already set up then don't to do it again. */ + CDEBUG(D_CONFIG, "obd %s ctxt %d already set up\n", + obd->obd_name, index); + ctxt = obd->obd_llog_ctxt[index]; + LASSERT(ctxt->loc_obd == obd); + LASSERT(ctxt->loc_exp == disk_obd->obd_self_export); + LASSERT(ctxt->loc_logops == op); + GOTO(out, rc = 0); + } + OBD_ALLOC(ctxt, sizeof(*ctxt)); if (!ctxt) - RETURN(-ENOMEM); + GOTO(out, rc = -ENOMEM); - llogs->llog_ctxt[index] = ctxt; obd->obd_llog_ctxt[index] = ctxt; - ctxt->loc_logops = op; ctxt->loc_obd = obd; - ctxt->loc_llogs = llogs; - ctxt->loc_idx = index; - ctxt->loc_alone = 0; ctxt->loc_exp = class_export_get(disk_obd->obd_self_export); + ctxt->loc_idx = index; + ctxt->loc_logops = op; sema_init(&ctxt->loc_sem, 1); - if (op->lop_close == llog_lvfs_ops.lop_close) { - ctxt->loc_fsops = disk_obd->obd_fsops; - ctxt->loc_lvfs_ctxt = &disk_obd->obd_lvfs_ctxt; - if (!strcmp(disk_obd->obd_type->typ_name, LUSTRE_MDS_NAME)) { - struct mds_obd *mds = &disk_obd->u.mds; - ctxt->loc_objects_dir = mds->mds_objects_dir; - ctxt->loc_logs_dir = mds->mds_logs_dir; - } - } - if (op->lop_setup) - rc = op->lop_setup(obd, llogs, index, disk_obd, count, logid); - if (ctxt && rc) { + rc = op->lop_setup(obd, index, disk_obd, count, logid); + + if (rc) { obd->obd_llog_ctxt[index] = NULL; + class_export_put(ctxt->loc_exp); OBD_FREE(ctxt, sizeof(*ctxt)); } - + +out: RETURN(rc); } -EXPORT_SYMBOL(obd_llog_setup); +EXPORT_SYMBOL(llog_setup); -int obd_llog_cleanup(struct llog_ctxt *ctxt) +int llog_sync(struct llog_ctxt *ctxt, struct obd_export *exp) { int rc = 0; ENTRY; - LASSERT(ctxt); + if (!ctxt) + RETURN(0); - if (CTXTP(ctxt, cleanup)) - rc = CTXTP(ctxt, cleanup)(ctxt); - - ctxt->loc_obd->obd_llog_ctxt[ctxt->loc_idx] = NULL; - ctxt->loc_llogs->llog_ctxt[ctxt->loc_idx] = NULL; - class_export_put(ctxt->loc_exp); - ctxt->loc_exp = NULL; - OBD_FREE(ctxt, sizeof(*ctxt)); + if (CTXTP(ctxt, sync)) + rc = CTXTP(ctxt, sync)(ctxt, exp); + + RETURN(rc); +} +EXPORT_SYMBOL(llog_sync); + +int llog_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec, + struct lov_stripe_md *lsm, struct llog_cookie *logcookies, + int numcookies) +{ + int rc; + ENTRY; + + if (!ctxt) { + CERROR("No ctxt\n"); + RETURN(-ENODEV); + } + + CTXT_CHECK_OP(ctxt, add, -EOPNOTSUPP); + rc = CTXTP(ctxt, add)(ctxt, rec, lsm, logcookies, numcookies); RETURN(rc); } -EXPORT_SYMBOL(obd_llog_cleanup); +EXPORT_SYMBOL(llog_add); + +int llog_cancel(struct llog_ctxt *ctxt, struct lov_stripe_md *lsm, + int count, struct llog_cookie *cookies, int flags) +{ + int rc; + ENTRY; + + if (!ctxt) { + CERROR("No ctxt\n"); + RETURN(-ENODEV); + } + + CTXT_CHECK_OP(ctxt, cancel, -EOPNOTSUPP); + rc = CTXTP(ctxt, cancel)(ctxt, lsm, count, cookies, flags); + RETURN(rc); +} +EXPORT_SYMBOL(llog_cancel); /* callback func for llog_process in llog_obd_origin_setup */ static int cat_cancel_cb(struct llog_handle *cathandle, @@ -106,8 +172,8 @@ static int cat_cancel_cb(struct llog_handle *cathandle, CERROR("invalid record in catalog\n"); RETURN(-EINVAL); } - CWARN("processing log "LPX64":%x at index %u of catalog "LPX64"\n", - lir->lid_id.lgl_oid, lir->lid_id.lgl_ogen, + CDEBUG(D_HA, "processing log "LPX64":%x at index %u of catalog " + LPX64"\n", lir->lid_id.lgl_oid, lir->lid_id.lgl_ogen, rec->lrh_index, cathandle->lgh_id.lgl_oid); rc = llog_cat_id2handle(cathandle, &loghandle, &lir->lid_id); @@ -123,7 +189,6 @@ static int cat_cancel_cb(struct llog_handle *cathandle, rc = llog_destroy(loghandle); if (rc) CERROR("failure destroying log in postsetup: %d\n", rc); - LASSERT(rc == 0); index = loghandle->u.phd.phd_cookie.lgc_index; llog_free_handle(loghandle); @@ -132,10 +197,10 @@ static int cat_cancel_cb(struct llog_handle *cathandle, llog_cat_set_first_idx(cathandle, index); rc = llog_cancel_rec(cathandle, index); if (rc == 0) - CWARN("cancel log "LPX64":%x at index %u of catalog " - LPX64"\n", lir->lid_id.lgl_oid, - lir->lid_id.lgl_ogen, rec->lrh_index, - cathandle->lgh_id.lgl_oid); + CDEBUG(D_HA, "cancel log "LPX64":%x at index %u of " + "catalog "LPX64"\n", lir->lid_id.lgl_oid, + lir->lid_id.lgl_ogen, rec->lrh_index, + cathandle->lgh_id.lgl_oid); } RETURN(rc); @@ -143,8 +208,8 @@ static int cat_cancel_cb(struct llog_handle *cathandle, /* lop_setup method for filter/osc */ // XXX how to set exports -int llog_obd_origin_setup(struct obd_device *obd, struct obd_llogs *llogs, - int index, struct obd_device *disk_obd, int count, +int llog_obd_origin_setup(struct obd_device *obd, int index, + struct obd_device *disk_obd, int count, struct llog_logid *logid) { struct llog_ctxt *ctxt; @@ -158,7 +223,7 @@ int llog_obd_origin_setup(struct obd_device *obd, struct obd_llogs *llogs, LASSERT(count == 1); - ctxt = llog_get_context(llogs, index); + ctxt = llog_get_context(obd, index); LASSERT(ctxt); llog_gen_init(ctxt); @@ -170,23 +235,19 @@ int llog_obd_origin_setup(struct obd_device *obd, struct obd_llogs *llogs, *logid = handle->lgh_id; } if (rc) - RETURN(rc); + GOTO(out, rc); ctxt->loc_handle = handle; push_ctxt(&saved, &disk_obd->obd_lvfs_ctxt, NULL); rc = llog_init_handle(handle, LLOG_F_IS_CAT, NULL); pop_ctxt(&saved, &disk_obd->obd_lvfs_ctxt, NULL); if (rc) - RETURN(rc); + GOTO(out, rc); rc = llog_process(handle, (llog_cb_t)cat_cancel_cb, NULL, NULL); if (rc) CERROR("llog_process with cat_cancel_cb failed: %d\n", rc); - - if (ctxt && rc) { - llogs->llog_ctxt[index] = NULL; - OBD_FREE(ctxt, sizeof(*ctxt)); - } + out: RETURN(rc); } EXPORT_SYMBOL(llog_obd_origin_setup); @@ -199,7 +260,7 @@ int llog_obd_origin_cleanup(struct llog_ctxt *ctxt) ENTRY; if (!ctxt) - return 0; + RETURN(0); cathandle = ctxt->loc_handle; if (cathandle) { @@ -214,7 +275,6 @@ int llog_obd_origin_cleanup(struct llog_ctxt *ctxt) if (rc) CERROR("failure destroying log during " "cleanup: %d\n", rc); - LASSERT(rc == 0); index = loghandle->u.phd.phd_cookie.lgc_index; llog_free_handle(loghandle); @@ -230,7 +290,7 @@ int llog_obd_origin_cleanup(struct llog_ctxt *ctxt) } llog_cat_put(ctxt->loc_handle); } - return 0; + RETURN(0); } EXPORT_SYMBOL(llog_obd_origin_cleanup); @@ -252,33 +312,32 @@ int llog_obd_origin_add(struct llog_ctxt *ctxt, } EXPORT_SYMBOL(llog_obd_origin_add); -int obd_llog_cat_initialize(struct obd_device *obd, struct obd_llogs *llogs, - int count, char *name) +int llog_cat_initialize(struct obd_device *obd, int count, + struct obd_uuid *uuid) { + char name[32] = CATLIST; struct llog_catid *idarray; int size = sizeof(*idarray) * count; int rc; ENTRY; OBD_ALLOC(idarray, size); - if (!idarray) + if (!idarray) RETURN(-ENOMEM); - rc = llog_get_cat_list(&obd->obd_lvfs_ctxt, obd->obd_fsops, - name, count, idarray); + rc = llog_get_cat_list(obd, obd, name, count, idarray); if (rc) { CERROR("rc: %d\n", rc); GOTO(out, rc); } - rc = obd_llog_init(obd, llogs, obd, count, idarray); + rc = obd_llog_init(obd, obd, count, idarray, uuid); if (rc) { CERROR("rc: %d\n", rc); GOTO(out, rc); } - rc = llog_put_cat_list(&obd->obd_lvfs_ctxt, obd->obd_fsops, - name, count, idarray); + rc = llog_put_cat_list(obd, obd, name, count, idarray); if (rc) { CERROR("rc: %d\n", rc); GOTO(out, rc); @@ -288,30 +347,29 @@ int obd_llog_cat_initialize(struct obd_device *obd, struct obd_llogs *llogs, OBD_FREE(idarray, size); RETURN(rc); } -EXPORT_SYMBOL(obd_llog_cat_initialize); +EXPORT_SYMBOL(llog_cat_initialize); -int obd_llog_init(struct obd_device *obd, struct obd_llogs *llogs, - struct obd_device *disk_obd, int count, - struct llog_catid *logid) +int obd_llog_init(struct obd_device *obd, struct obd_device *disk_obd, + int count, struct llog_catid *logid, struct obd_uuid *uuid) { int rc; ENTRY; OBD_CHECK_OP(obd, llog_init, 0); OBD_COUNTER_INCREMENT(obd, llog_init); - rc = OBP(obd, llog_init)(obd, llogs, disk_obd, count, logid); + rc = OBP(obd, llog_init)(obd, disk_obd, count, logid, uuid); RETURN(rc); } EXPORT_SYMBOL(obd_llog_init); -int obd_llog_finish(struct obd_device *obd, struct obd_llogs *llogs, int count) +int obd_llog_finish(struct obd_device *obd, int count) { int rc; ENTRY; OBD_CHECK_OP(obd, llog_finish, 0); OBD_COUNTER_INCREMENT(obd, llog_finish); - rc = OBP(obd, llog_finish)(obd, llogs, count); + rc = OBP(obd, llog_finish)(obd, count); RETURN(rc); } EXPORT_SYMBOL(obd_llog_finish);