X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fobdclass%2Fllog_test.c;h=037e0a7af9772ea316394b59c58bc6c0d007d58c;hp=afbe9736551673c2736b231c3c1466653f3e1789;hb=801469af8c31afad1bd8aaa23b01bfc42abe45eb;hpb=e5aaafa574796db0b8ff0a09666821a3bb7a1f6a diff --git a/lustre/obdclass/llog_test.c b/lustre/obdclass/llog_test.c index afbe973..037e0a7 100644 --- a/lustre/obdclass/llog_test.c +++ b/lustre/obdclass/llog_test.c @@ -1,38 +1,48 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: +/* + * GPL HEADER START * - * Copyright (C) 2003 Cluster File Systems, Inc. - * Author: Phil Schwan + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * This file is part of Lustre, http://www.lustre.org/ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * 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. + * This program 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * 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 + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * 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. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * - * A kernel module which tests the llog API from the OBD setup function. + * GPL HEADER END + */ +/* + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/obdclass/llog_test.c + * + * Author: Phil Schwan */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_CLASS #include #include -#include -#include -#include /* for LUSTRE_MDC_NAME */ +#include +#include static int llog_test_rand; static struct obd_uuid uuid = { .uuid = "test_uuid" }; @@ -81,28 +91,29 @@ static int verify_handle(char *test, struct llog_handle *llh, int num_recs) static int llog_test_1(struct obd_device *obd, char *name) { struct llog_handle *llh; - struct llog_ctxt *ctxt; + struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT); int rc; int rc2; ENTRY; CWARN("1a: create a log with name: %s\n", name); - ctxt = llog_get_context(&obd->obd_llogs, LLOG_TEST_ORIG_CTXT); LASSERT(ctxt); - rc = llog_open(ctxt, &llh, NULL, name, OBD_LLOG_FL_CREATE); + rc = llog_open_create(NULL, ctxt, &llh, NULL, name); if (rc) { - CERROR("1a: llog_open with name %s failed: %d\n", name, rc); + CERROR("1a: llog_create with name %s failed: %d\n", name, rc); + llog_ctxt_put(ctxt); RETURN(rc); } - llog_init_handle(llh, LLOG_F_IS_PLAIN, &uuid); + llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, &uuid); if ((rc = verify_handle("1", llh, 1))) GOTO(out, rc); out: CWARN("1b: close newly-created log\n"); - rc2 = llog_close(llh); + rc2 = llog_close(NULL, llh); + llog_ctxt_put(ctxt); if (rc2) { CERROR("1b: close log %s failed: %d\n", name, rc2); if (rc == 0) @@ -115,39 +126,36 @@ static int llog_test_1(struct obd_device *obd, char *name) static int llog_test_2(struct obd_device *obd, char *name, struct llog_handle **llh) { - struct llog_handle *loghandle; - struct llog_logid logid; + struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT); int rc; - struct llog_ctxt *ctxt; ENTRY; - ctxt = llog_get_context(&obd->obd_llogs, LLOG_TEST_ORIG_CTXT); CWARN("2a: re-open a log with name: %s\n", name); - rc = llog_open(ctxt, llh, NULL, name, 0); + rc = llog_open(NULL, ctxt, llh, NULL, name, LLOG_OPEN_EXISTS); if (rc) { CERROR("2a: re-open log with name %s failed: %d\n", name, rc); - RETURN(rc); + GOTO(out, rc); } - llog_init_handle(*llh, LLOG_F_IS_PLAIN, &uuid); + llog_init_handle(NULL, *llh, LLOG_F_IS_PLAIN, &uuid); if ((rc = verify_handle("2", *llh, 1))) - RETURN(rc); - + GOTO(out, rc); +#if 0 CWARN("2b: create a log without specified NAME & LOGID\n"); - rc = llog_open(ctxt, &loghandle, NULL, NULL, OBD_LLOG_FL_CREATE); + rc = llog_create(ctxt, &loghandle, NULL, NULL); if (rc) { CERROR("2b: create log failed\n"); - RETURN(rc); + GOTO(out, rc); } llog_init_handle(loghandle, LLOG_F_IS_PLAIN, &uuid); logid = loghandle->lgh_id; llog_close(loghandle); CWARN("2b: re-open the log by LOGID\n"); - rc = llog_open(ctxt, &loghandle, &logid, NULL, 0); + rc = llog_create(ctxt, &loghandle, &logid, NULL); if (rc) { CERROR("2b: re-open log by LOGID failed\n"); - RETURN(rc); + GOTO(out, rc); } llog_init_handle(loghandle, LLOG_F_IS_PLAIN, &uuid); @@ -155,9 +163,12 @@ static int llog_test_2(struct obd_device *obd, char *name, rc = llog_destroy(loghandle); if (rc) { CERROR("2b: destroy log failed\n"); - RETURN(rc); + GOTO(out, rc); } llog_free_handle(loghandle); +#endif +out: + llog_ctxt_put(ctxt); RETURN(rc); } @@ -174,7 +185,7 @@ static int llog_test_3(struct obd_device *obd, struct llog_handle *llh) lcr.lcr_hdr.lrh_type = OST_SZ_REC; CWARN("3a: write one create_rec\n"); - rc = llog_write_rec(llh, &lcr.lcr_hdr, NULL, 0, NULL, -1); + rc = llog_write_rec(NULL, llh, &lcr.lcr_hdr, NULL, 0, NULL, -1); num_recs++; if (rc) { CERROR("3a: write one log record failed: %d\n", rc); @@ -191,7 +202,7 @@ static int llog_test_3(struct obd_device *obd, struct llog_handle *llh) hdr.lrh_len = 8; hdr.lrh_type = OBD_CFG_REC; memset(buf, 0, sizeof buf); - rc = llog_write_rec(llh, &hdr, NULL, 0, buf, -1); + rc = llog_write_rec(NULL, llh, &hdr, NULL, 0, buf, -1); if (rc) { CERROR("3b: write 10 records failed at #%d: %d\n", i + 1, rc); @@ -207,7 +218,8 @@ static int llog_test_3(struct obd_device *obd, struct llog_handle *llh) CWARN("3c: write 1000 more log records\n"); for (i = 0; i < 1000; i++) { - rc = llog_write_rec(llh, &lcr.lcr_hdr, NULL, 0, NULL, -1); + rc = llog_write_rec(NULL, llh, &lcr.lcr_hdr, NULL, 0, NULL, + -1); if (rc) { CERROR("3c: write 1000 records failed at #%d: %d\n", i + 1, rc); @@ -221,6 +233,43 @@ static int llog_test_3(struct obd_device *obd, struct llog_handle *llh) if ((rc = verify_handle("3c", llh, num_recs))) RETURN(rc); + CWARN("3d: write log more than BITMAP_SIZE, return -ENOSPC\n"); + for (i = 0; i < LLOG_BITMAP_SIZE(llh->lgh_hdr) + 1; i++) { + struct llog_rec_hdr hdr; + char buf_even[24]; + char buf_odd[32]; + + memset(buf_odd, 0, sizeof buf_odd); + memset(buf_even, 0, sizeof buf_even); + if ((i % 2) == 0) { + hdr.lrh_len = 24; + hdr.lrh_type = OBD_CFG_REC; + rc = llog_write_rec(NULL, llh, &hdr, NULL, 0, buf_even, + -1); + } else { + hdr.lrh_len = 32; + hdr.lrh_type = OBD_CFG_REC; + rc = llog_write_rec(NULL, llh, &hdr, NULL, 0, buf_odd, + -1); + } + if (rc) { + if (rc == -ENOSPC) { + break; + } else { + CERROR("3c: write recs failed at #%d: %d\n", + i + 1, rc); + RETURN(rc); + } + } + num_recs++; + } + if (rc != -ENOSPC) { + CWARN("3d: write record more than BITMAP size!\n"); + RETURN(-EINVAL); + } + if ((rc = verify_handle("3d", llh, num_recs))) + RETURN(rc); + RETURN(rc); } @@ -231,43 +280,43 @@ static int llog_test_4(struct obd_device *obd) char name[10]; int rc, i, buflen; struct llog_mini_rec lmr; - struct llog_cookie cookie={0}; - struct llog_ctxt *ctxt; + struct llog_cookie cookie; + struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT); int num_recs = 0; char *buf; struct llog_rec_hdr rec; + ENTRY; - - ctxt = llog_get_context(&obd->obd_llogs, LLOG_TEST_ORIG_CTXT); + lmr.lmr_hdr.lrh_len = lmr.lmr_tail.lrt_len = LLOG_MIN_REC_SIZE; lmr.lmr_hdr.lrh_type = 0xf00f00; sprintf(name, "%x", llog_test_rand+1); CWARN("4a: create a catalog log with name: %s\n", name); - rc = llog_open(ctxt, &cath, NULL, name, OBD_LLOG_FL_CREATE); + rc = llog_open_create(NULL, ctxt, &cath, NULL, name); if (rc) { - CERROR("1a: llog_open with name %s failed: %d\n", name, rc); + CERROR("1a: llog_create with name %s failed: %d\n", name, rc); GOTO(out, rc); } - llog_init_handle(cath, LLOG_F_IS_CAT, &uuid); + llog_init_handle(NULL, cath, LLOG_F_IS_CAT, &uuid); num_recs++; cat_logid = cath->lgh_id; CWARN("4b: write 1 record into the catalog\n"); - rc = llog_cat_add_rec(cath, &lmr.lmr_hdr, &cookie, NULL, NULL, NULL); + rc = llog_cat_add_rec(NULL, cath, &lmr.lmr_hdr, &cookie, NULL); if (rc != 1) { CERROR("4b: write 1 catalog record failed at: %d\n", rc); GOTO(out, rc); } num_recs++; if ((rc = verify_handle("4b", cath, 2))) - RETURN(rc); + GOTO(ctxt_release, rc); if ((rc = verify_handle("4b", cath->u.chd.chd_current_log, num_recs))) - RETURN(rc); + GOTO(ctxt_release, rc); CWARN("4c: cancel 1 log record\n"); - rc = llog_cat_cancel_records(cath, 1, &cookie); + rc = llog_cat_cancel_records(NULL, cath, 1, &cookie); if (rc) { CERROR("4c: cancel 1 catalog based record failed: %d\n", rc); GOTO(out, rc); @@ -275,11 +324,11 @@ static int llog_test_4(struct obd_device *obd) num_recs--; if ((rc = verify_handle("4c", cath->u.chd.chd_current_log, num_recs))) - RETURN(rc); + GOTO(ctxt_release, rc); CWARN("4d: write 40,000 more log records\n"); for (i = 0; i < 40000; i++) { - rc = llog_cat_add_rec(cath, &lmr.lmr_hdr, NULL, NULL, NULL, NULL); + rc = llog_cat_add_rec(NULL, cath, &lmr.lmr_hdr, NULL, NULL); if (rc) { CERROR("4d: write 40000 records failed at #%d: %d\n", i + 1, rc); @@ -297,7 +346,7 @@ static int llog_test_4(struct obd_device *obd) for (i = 0; i < 5; i++) { rec.lrh_len = buflen; rec.lrh_type = OBD_CFG_REC; - rc = llog_cat_add_rec(cath, &rec, NULL, buf, NULL, NULL); + rc = llog_cat_add_rec(NULL, cath, &rec, NULL, buf); if (rc) { CERROR("4e: write 5 records failed at #%d: %d\n", i + 1, rc); @@ -310,14 +359,16 @@ static int llog_test_4(struct obd_device *obd) out: CWARN("4f: put newly-created catalog\n"); - rc = llog_cat_put(cath); + rc = llog_cat_close(NULL, cath); +ctxt_release: + llog_ctxt_put(ctxt); if (rc) CERROR("1b: close log %s failed: %d\n", name, rc); RETURN(rc); } -static int cat_print_cb(struct llog_handle *llh, struct llog_rec_hdr *rec, - void *data) +static int cat_print_cb(const struct lu_env *env, struct llog_handle *llh, + struct llog_rec_hdr *rec, void *data) { struct llog_logid_rec *lir = (struct llog_logid_rec *)rec; @@ -332,8 +383,8 @@ static int cat_print_cb(struct llog_handle *llh, struct llog_rec_hdr *rec, RETURN(0); } -static int plain_print_cb(struct llog_handle *llh, struct llog_rec_hdr *rec, - void *data) +static int plain_print_cb(const struct lu_env *env, struct llog_handle *llh, + struct llog_rec_hdr *rec, void *data) { if (!(llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN)) { CERROR("log is not plain\n"); @@ -345,8 +396,9 @@ static int plain_print_cb(struct llog_handle *llh, struct llog_rec_hdr *rec, RETURN(0); } -static int llog_cancel_rec_cb(struct llog_handle *llh, struct llog_rec_hdr *rec, - void *data) +static int llog_cancel_rec_cb(const struct lu_env *env, + struct llog_handle *llh, + struct llog_rec_hdr *rec, void *data) { struct llog_cookie cookie; static int i = 0; @@ -359,7 +411,7 @@ static int llog_cancel_rec_cb(struct llog_handle *llh, struct llog_rec_hdr *rec, cookie.lgc_lgl = llh->lgh_id; cookie.lgc_index = rec->lrh_index; - llog_cat_cancel_records(llh->u.phd.phd_cat_handle, 1, &cookie); + llog_cat_cancel_records(NULL, llh->u.phd.phd_cat_handle, 1, &cookie); i++; if (i == 40000) RETURN(-4711); @@ -373,37 +425,37 @@ static int llog_test_5(struct obd_device *obd) char name[10]; int rc; struct llog_mini_rec lmr; - struct llog_ctxt *ctxt; + struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT); + ENTRY; - ctxt = llog_get_context(&obd->obd_llogs, LLOG_TEST_ORIG_CTXT); lmr.lmr_hdr.lrh_len = lmr.lmr_tail.lrt_len = LLOG_MIN_REC_SIZE; lmr.lmr_hdr.lrh_type = 0xf00f00; CWARN("5a: re-open catalog by id\n"); - rc = llog_open(ctxt, &llh, &cat_logid, NULL, 0); + rc = llog_open(NULL, ctxt, &llh, &cat_logid, NULL, LLOG_OPEN_EXISTS); if (rc) { - CERROR("5a: llog_open with logid failed: %d\n", rc); + CERROR("5a: llog_create with logid failed: %d\n", rc); GOTO(out, rc); } - llog_init_handle(llh, LLOG_F_IS_CAT, &uuid); + llog_init_handle(NULL, llh, LLOG_F_IS_CAT, &uuid); CWARN("5b: print the catalog entries.. we expect 2\n"); - rc = llog_process(llh, (llog_cb_t)cat_print_cb, "test 5", NULL); + rc = llog_process(NULL, llh, cat_print_cb, "test 5", NULL); if (rc) { CERROR("5b: process with cat_print_cb failed: %d\n", rc); GOTO(out, rc); } CWARN("5c: Cancel 40000 records, see one log zapped\n"); - rc = llog_cat_process(llh, llog_cancel_rec_cb, "foobar"); + rc = llog_cat_process(NULL, llh, llog_cancel_rec_cb, "foobar", 0, 0); if (rc != -4711) { CERROR("5c: process with cat_cancel_cb failed: %d\n", rc); GOTO(out, rc); } CWARN("5d: add 1 record to the log with many canceled empty pages\n"); - rc = llog_cat_add_rec(llh, &lmr.lmr_hdr, NULL, NULL, NULL, NULL); + rc = llog_cat_add_rec(NULL, llh, &lmr.lmr_hdr, NULL, NULL); if (rc) { CERROR("5d: add record to the log with many canceled empty\ pages failed\n"); @@ -411,133 +463,134 @@ static int llog_test_5(struct obd_device *obd) } CWARN("5b: print the catalog entries.. we expect 1\n"); - rc = llog_process(llh, (llog_cb_t)cat_print_cb, "test 5", NULL); + rc = llog_process(NULL, llh, cat_print_cb, "test 5", NULL); if (rc) { CERROR("5b: process with cat_print_cb failed: %d\n", rc); GOTO(out, rc); } CWARN("5e: print plain log entries.. expect 6\n"); - rc = llog_cat_process(llh, plain_print_cb, "foobar"); + rc = llog_cat_process(NULL, llh, plain_print_cb, "foobar", 0, 0); if (rc) { CERROR("5e: process with plain_print_cb failed: %d\n", rc); GOTO(out, rc); } CWARN("5f: print plain log entries reversely.. expect 6\n"); - rc = llog_cat_reverse_process(llh, plain_print_cb, "foobar"); + rc = llog_cat_reverse_process(NULL, llh, plain_print_cb, "foobar"); if (rc) { - CERROR("5f: reversely process with plain_print_cb failed: %d\n", - rc); + CERROR("5f: reversely process with plain_print_cb failed: %d\n", rc); GOTO(out, rc); } out: CWARN("5: close re-opened catalog\n"); if (llh) - rc = llog_cat_put(llh); + rc = llog_cat_close(NULL, llh); if (rc) CERROR("1b: close log %s failed: %d\n", name, rc); + llog_ctxt_put(ctxt); + RETURN(rc); } /* Test client api; open log by name and process */ static int llog_test_6(struct obd_device *obd, char *name) { - struct obd_device *mdc_obd; - struct llog_ctxt *ctxt; - struct obd_uuid *mds_uuid; - struct lustre_handle exph = {0, }; + struct obd_device *mgc_obd; + struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT); + struct obd_uuid *mgs_uuid = &ctxt->loc_exp->exp_obd->obd_uuid; struct obd_export *exp; struct obd_uuid uuid = {"LLOG_TEST6_UUID"}; struct llog_handle *llh = NULL; struct llog_ctxt *nctxt; int rc; - ctxt = llog_get_context(&obd->obd_llogs, LLOG_TEST_ORIG_CTXT); - mds_uuid = &ctxt->loc_exp->exp_obd->obd_uuid; - CWARN("6a: re-open log %s using client API\n", name); - mdc_obd = class_find_client_obd(mds_uuid, OBD_MDC_DEVICENAME, NULL); - if (mdc_obd == NULL) { - CERROR("6: no MDC devices connected to %s found.\n", - mds_uuid->uuid); - RETURN(-ENOENT); - } - - rc = obd_connect(&exph, mdc_obd, &uuid, NULL, 0); - if (rc) { - CERROR("6: failed to connect to MDC: %s\n", mdc_obd->obd_name); - RETURN(rc); + mgc_obd = class_find_client_obd(mgs_uuid, LUSTRE_MGC_NAME, NULL); + if (mgc_obd == NULL) { + CERROR("6: no MGC devices connected to %s found.\n", + mgs_uuid->uuid); + GOTO(ctxt_release, rc = -ENOENT); + } + + rc = obd_connect(NULL, &exp, mgc_obd, &uuid, + NULL /* obd_connect_data */, NULL); + if (rc != -EALREADY) { + CERROR("6: connect on connected MDC (%s) failed to return" + " -EALREADY", mgc_obd->obd_name); + if (rc == 0) + obd_disconnect(exp); + GOTO(ctxt_release, rc = -EINVAL); } - exp = class_conn2export(&exph); - nctxt = llog_get_context(&mdc_obd->obd_llogs, LLOG_CONFIG_REPL_CTXT); - rc = llog_open(nctxt, &llh, NULL, name, 0); + nctxt = llog_get_context(mgc_obd, LLOG_CONFIG_REPL_CTXT); + rc = llog_open(NULL, nctxt, &llh, NULL, name, LLOG_OPEN_EXISTS); if (rc) { - CERROR("6: llog_open failed %d\n", rc); - RETURN(rc); + CERROR("6: llog_create failed %d\n", rc); + llog_ctxt_put(nctxt); + GOTO(ctxt_release, rc); } - rc = llog_init_handle(llh, LLOG_F_IS_PLAIN, NULL); + rc = llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, NULL); if (rc) { CERROR("6: llog_init_handle failed %d\n", rc); GOTO(parse_out, rc); } - rc = llog_process(llh, (llog_cb_t)plain_print_cb, NULL, NULL); + rc = llog_process(NULL, llh, plain_print_cb, NULL, NULL); if (rc) CERROR("6: llog_process failed %d\n", rc); - rc = llog_reverse_process(llh, (llog_cb_t)plain_print_cb, NULL, NULL); + rc = llog_reverse_process(NULL, llh, plain_print_cb, NULL, NULL); if (rc) CERROR("6: llog_reverse_process failed %d\n", rc); parse_out: - rc = llog_close(llh); + rc = llog_close(NULL, llh); + llog_ctxt_put(nctxt); if (rc) { CERROR("6: llog_close failed: rc = %d\n", rc); } - - rc = obd_disconnect(exp, 0); - +ctxt_release: + llog_ctxt_put(ctxt); RETURN(rc); } static int llog_test_7(struct obd_device *obd) { - struct llog_ctxt *ctxt; + struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT); struct llog_handle *llh; struct llog_create_rec lcr; char name[10]; int rc; ENTRY; - ctxt = llog_get_context(&obd->obd_llogs, LLOG_TEST_ORIG_CTXT); sprintf(name, "%x", llog_test_rand+2); CWARN("7: create a log with name: %s\n", name); LASSERT(ctxt); - rc = llog_open(ctxt, &llh, NULL, name, OBD_LLOG_FL_CREATE); + rc = llog_open_create(NULL, ctxt, &llh, NULL, name); if (rc) { - CERROR("7: llog_open with name %s failed: %d\n", name, rc); - RETURN(rc); + CERROR("7: llog_create with name %s failed: %d\n", name, rc); + GOTO(ctxt_release, rc); } - llog_init_handle(llh, LLOG_F_IS_PLAIN, &uuid); + llog_init_handle(NULL, llh, LLOG_F_IS_PLAIN, &uuid); - lcr.lcr_hdr.lrh_len = lcr.lcr_tail.lrt_len = cpu_to_le32(sizeof(lcr)); - lcr.lcr_hdr.lrh_type = cpu_to_le32(OST_SZ_REC); - rc = llog_write_rec(llh, &lcr.lcr_hdr, NULL, 0, NULL, -1); + lcr.lcr_hdr.lrh_len = lcr.lcr_tail.lrt_len = sizeof(lcr); + lcr.lcr_hdr.lrh_type = OST_SZ_REC; + rc = llog_write_rec(NULL, llh, &lcr.lcr_hdr, NULL, 0, NULL, -1); if (rc) { CERROR("7: write one log record failed: %d\n", rc); - RETURN(rc); + GOTO(ctxt_release, rc); } - rc = llog_destroy(llh); - if (rc) + rc = llog_destroy(NULL, llh); + if (rc) CERROR("7: llog_destroy failed: %d\n", rc); - else - llog_free_handle(llh); + llog_close(NULL, llh); +ctxt_release: + llog_ctxt_put(ctxt); RETURN(rc); } @@ -546,14 +599,13 @@ static int llog_test_7(struct obd_device *obd) * ------------------------------------------------------------------------- */ static int llog_run_tests(struct obd_device *obd) { - struct llog_ctxt *ctxt; struct llog_handle *llh; struct lvfs_run_ctxt saved; + struct llog_ctxt *ctxt = llog_get_context(obd, LLOG_TEST_ORIG_CTXT); int rc, err, cleanup_phase = 0; char name[10]; ENTRY; - ctxt = llog_get_context(&obd->obd_llogs, LLOG_TEST_ORIG_CTXT); sprintf(name, "%x", llog_test_rand); push_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL); @@ -589,7 +641,7 @@ static int llog_run_tests(struct obd_device *obd) cleanup: switch (cleanup_phase) { case 1: - err = llog_close(llh); + err = llog_close(NULL, llh); if (err) CERROR("cleanup: llog_close failed: %d\n", err); if (!rc) @@ -597,54 +649,69 @@ static int llog_run_tests(struct obd_device *obd) case 0: pop_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL); } - + llog_ctxt_put(ctxt); return rc; } - -static int llog_test_llog_init(struct obd_device *obd, struct obd_llogs *llogs, - struct obd_device *tgt, int count, - struct llog_catid *logid) +static int llog_test_llog_init(struct obd_device *obd, + struct obd_llog_group *olg, + struct obd_device *tgt, int *index) { int rc; ENTRY; - rc = obd_llog_setup(obd, llogs, LLOG_TEST_ORIG_CTXT, tgt, 0, NULL, - &llog_lvfs_ops); + rc = llog_setup(obd, &obd->obd_olg, LLOG_TEST_ORIG_CTXT, tgt, 0, NULL, + &llog_lvfs_ops); RETURN(rc); } -static int llog_test_llog_finish(struct obd_device *obd, - struct obd_llogs *llogs, int count) +static int llog_test_llog_finish(struct obd_device *obd, int count) { int rc; ENTRY; - rc = obd_llog_cleanup(llog_get_context(llogs, LLOG_TEST_ORIG_CTXT)); + rc = llog_cleanup(llog_get_context(obd, LLOG_TEST_ORIG_CTXT)); RETURN(rc); } +#ifdef LPROCFS +static struct lprocfs_vars lprocfs_llog_test_obd_vars[] = { {0} }; +static struct lprocfs_vars lprocfs_llog_test_module_vars[] = { {0} }; +static void lprocfs_llog_test_init_vars(struct lprocfs_static_vars *lvars) +{ + lvars->module_vars = lprocfs_llog_test_module_vars; + lvars->obd_vars = lprocfs_llog_test_obd_vars; +} +#endif -static int llog_test_cleanup(struct obd_device *obd, int flags) +static int llog_test_cleanup(struct obd_device *obd) { - int rc = obd_llog_finish(obd, &obd->obd_llogs, 0); + int rc = obd_llog_finish(obd, 0); if (rc) CERROR("failed to llog_test_llog_finish: %d\n", rc); + lprocfs_obd_cleanup(obd); + return rc; } -static int llog_test_setup(struct obd_device *obd, obd_count len, void *buf) +static int llog_test_setup(struct obd_device *obd, struct lustre_cfg *lcfg) { - struct lustre_cfg *lcfg = buf; + struct lprocfs_static_vars lvars; struct obd_device *tgt; int rc; ENTRY; - if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1) { + if (lcfg->lcfg_bufcount < 2) { CERROR("requires a TARGET OBD name\n"); RETURN(-EINVAL); } + if (lcfg->lcfg_buflens[1] < 1) { + CERROR("requires a TARGET OBD name\n"); + RETURN(-EINVAL); + } + + /* disk obd */ tgt = class_name2obd(lustre_cfg_string(lcfg, 1)); if (!tgt || !tgt->obd_attached || !tgt->obd_set_up) { CERROR("target device not attached or not set up (%s)\n", @@ -652,55 +719,37 @@ static int llog_test_setup(struct obd_device *obd, obd_count len, void *buf) RETURN(-EINVAL); } - rc = obd_llog_init(obd, &obd->obd_llogs, tgt, 0, NULL); + rc = obd_llog_init(obd, NULL, tgt, NULL); if (rc) RETURN(rc); - llog_test_rand = ll_insecure_random_int(); + llog_test_rand = cfs_rand(); rc = llog_run_tests(obd); if (rc) - llog_test_cleanup(obd, 0); + llog_test_cleanup(obd); - RETURN(rc); -} + lprocfs_llog_test_init_vars(&lvars); + lprocfs_obd_setup(obd, lvars.obd_vars); -static int llog_test_attach(struct obd_device *dev, obd_count len, void *data) -{ - struct lprocfs_static_vars lvars; - - lprocfs_init_vars(llog_test, &lvars); - return lprocfs_obd_attach(dev, lvars.obd_vars); -} - -static int llog_test_detach(struct obd_device *dev) -{ - return lprocfs_obd_detach(dev); + RETURN(rc); } static struct obd_ops llog_obd_ops = { .o_owner = THIS_MODULE, - .o_attach = llog_test_attach, - .o_detach = llog_test_detach, .o_setup = llog_test_setup, - .o_cleanup = llog_test_cleanup, + .o_cleanup = llog_test_cleanup, .o_llog_init = llog_test_llog_init, .o_llog_finish = llog_test_llog_finish, }; -static struct lprocfs_vars lprocfs_obd_vars[] = { {0} }; -static struct lprocfs_vars lprocfs_module_vars[] = { {0} }; -LPROCFS_INIT_VARS(llog_test, lprocfs_module_vars, lprocfs_obd_vars) - static int __init llog_test_init(void) { struct lprocfs_static_vars lvars; - lprocfs_init_vars(llog_test, &lvars); - - return class_register_type(&llog_obd_ops, NULL, - lvars.module_vars, - "llog_test"); + lprocfs_llog_test_init_vars(&lvars); + return class_register_type(&llog_obd_ops, NULL, + lvars.module_vars,"llog_test", NULL); } static void __exit llog_test_exit(void) @@ -708,7 +757,7 @@ static void __exit llog_test_exit(void) class_unregister_type("llog_test"); } -MODULE_AUTHOR("Cluster File Systems, Inc. "); +MODULE_AUTHOR("Sun Microsystems, Inc. "); MODULE_DESCRIPTION("llog test module"); MODULE_LICENSE("GPL");