From 103f65a545ca190ab803e2bd035800bc59858205 Mon Sep 17 00:00:00 2001 From: ericm Date: Thu, 13 Nov 2003 07:54:51 +0000 Subject: [PATCH] again merge b_devel to b_eq 20031113 yesterday's merge brought in some nasty bugs. --- lnet/libcfs/debug.c | 4 +- lnet/libcfs/module.c | 2 +- lnet/utils/debug.c | 1 + lustre/conf/modules.conf | 6 + lustre/portals/libcfs/debug.c | 4 +- lustre/portals/libcfs/module.c | 2 +- lustre/portals/utils/debug.c | 1 + lustre/ptlrpc/llog_client.c | 213 +++++++++++++++++++++++++++++++++ lustre/ptlrpc/llog_server.c | 239 ++++++++++++++++++++++++++++++++++++++ lustre/tests/replay-ost-upcall.sh | 38 ++++++ lustre/utils/liblustreapi.c | 2 +- 11 files changed, 505 insertions(+), 7 deletions(-) create mode 100644 lustre/conf/modules.conf create mode 100644 lustre/ptlrpc/llog_client.c create mode 100644 lustre/ptlrpc/llog_server.c create mode 100755 lustre/tests/replay-ost-upcall.sh diff --git a/lnet/libcfs/debug.c b/lnet/libcfs/debug.c index ca1c079..f27924e 100644 --- a/lnet/libcfs/debug.c +++ b/lnet/libcfs/debug.c @@ -816,8 +816,8 @@ portals_debug_msg(int subsys, int mask, char *file, const char *fn, current->thread.mode.tt.extern_pid, file, line, fn); #else msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, - ":(%s:%d:%s()) ", - file, line, fn); + "%d:(%s:%d:%s()) ", + current->pid, file, line, fn); #endif va_start(ap, format); diff --git a/lnet/libcfs/module.c b/lnet/libcfs/module.c index a01dfe2..6432070 100644 --- a/lnet/libcfs/module.c +++ b/lnet/libcfs/module.c @@ -243,7 +243,7 @@ kportal_router_cmd(struct portals_cfg *pcfg, void * private) pcfg->pcfg_flags ? "Enabling" : "Disabling", (time_t)pcfg->pcfg_nid3); - err = kportal_notify_router (pcfg->pcfg_nal, pcfg->pcfg_nid, + err = kportal_notify_router (pcfg->pcfg_gw_nal, pcfg->pcfg_nid, pcfg->pcfg_flags, (time_t)pcfg->pcfg_nid3); break; diff --git a/lnet/utils/debug.c b/lnet/utils/debug.c index c898aef..3f3e69c 100644 --- a/lnet/utils/debug.c +++ b/lnet/utils/debug.c @@ -538,6 +538,7 @@ int jt_dbg_modules(int argc, char **argv) } *mp, mod_paths[] = { {"portals", "lustre/portals/libcfs"}, {"ksocknal", "lustre/portals/knals/socknal"}, + {"kptlrouter", "lustre/portals/router"}, {"lvfs", "lustre/lvfs"}, {"obdclass", "lustre/obdclass"}, {"llog_test", "lustre/obdclass"}, diff --git a/lustre/conf/modules.conf b/lustre/conf/modules.conf new file mode 100644 index 0000000..0fb0a35 --- /dev/null +++ b/lustre/conf/modules.conf @@ -0,0 +1,6 @@ +# sample modules.conf for autoloading lustre modules on zeroconf clients + +add below kptlrouter portals +add below ptlrpc ksocknal +add below llite lov osc +alias lustre llite diff --git a/lustre/portals/libcfs/debug.c b/lustre/portals/libcfs/debug.c index ca1c079..f27924e 100644 --- a/lustre/portals/libcfs/debug.c +++ b/lustre/portals/libcfs/debug.c @@ -816,8 +816,8 @@ portals_debug_msg(int subsys, int mask, char *file, const char *fn, current->thread.mode.tt.extern_pid, file, line, fn); #else msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, - ":(%s:%d:%s()) ", - file, line, fn); + "%d:(%s:%d:%s()) ", + current->pid, file, line, fn); #endif va_start(ap, format); diff --git a/lustre/portals/libcfs/module.c b/lustre/portals/libcfs/module.c index a01dfe2..6432070 100644 --- a/lustre/portals/libcfs/module.c +++ b/lustre/portals/libcfs/module.c @@ -243,7 +243,7 @@ kportal_router_cmd(struct portals_cfg *pcfg, void * private) pcfg->pcfg_flags ? "Enabling" : "Disabling", (time_t)pcfg->pcfg_nid3); - err = kportal_notify_router (pcfg->pcfg_nal, pcfg->pcfg_nid, + err = kportal_notify_router (pcfg->pcfg_gw_nal, pcfg->pcfg_nid, pcfg->pcfg_flags, (time_t)pcfg->pcfg_nid3); break; diff --git a/lustre/portals/utils/debug.c b/lustre/portals/utils/debug.c index c898aef..3f3e69c 100644 --- a/lustre/portals/utils/debug.c +++ b/lustre/portals/utils/debug.c @@ -538,6 +538,7 @@ int jt_dbg_modules(int argc, char **argv) } *mp, mod_paths[] = { {"portals", "lustre/portals/libcfs"}, {"ksocknal", "lustre/portals/knals/socknal"}, + {"kptlrouter", "lustre/portals/router"}, {"lvfs", "lustre/lvfs"}, {"obdclass", "lustre/obdclass"}, {"llog_test", "lustre/obdclass"}, diff --git a/lustre/ptlrpc/llog_client.c b/lustre/ptlrpc/llog_client.c new file mode 100644 index 0000000..996dca8 --- /dev/null +++ b/lustre/ptlrpc/llog_client.c @@ -0,0 +1,213 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2001-2003 Cluster File Systems, Inc. + * Author: Andreas Dilger + * + * 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. + * + * remote api for llog - client side + * + */ + +#define DEBUG_SUBSYSTEM S_LOG + +#ifndef EXPORT_SYMTAB +#define EXPORT_SYMTAB +#endif + +#include +#include +#include +#include +#include + +/* This is a callback from the llog_* functions. + * Assumes caller has already pushed us into the kernel context. */ +static int llog_client_create(struct llog_ctxt *ctxt, struct llog_handle **res, + struct llog_logid *logid, char *name) +{ + struct obd_import *imp; + struct llogd_body req_body; + struct llogd_body *body; + struct llog_handle *handle; + struct ptlrpc_request *req = NULL; + int size[2] = {sizeof(req_body)}; + char *tmp[2] = {(char*) &req_body}; + int bufcount = 1; + int repsize[] = {sizeof (req_body)}; + int rc; + ENTRY; + + LASSERT(ctxt->loc_imp); + imp = ctxt->loc_imp; + + handle = llog_alloc_handle(); + if (handle == NULL) + RETURN(-ENOMEM); + *res = handle; + + memset(&req_body, 0, sizeof(req_body)); + if (logid) + req_body.lgd_logid = *logid; + req_body.lgd_ctxt_idx = ctxt->loc_idx - 1; + + if (name) { + size[bufcount] = strlen(name) + 1; + tmp[bufcount] = name; + bufcount++; + } + + req = ptlrpc_prep_req(imp, LLOG_ORIGIN_HANDLE_CREATE, bufcount, size, tmp); + if (!req) + GOTO(err_free, rc = -ENOMEM); + + req->rq_replen = lustre_msg_size(1, repsize); + rc = ptlrpc_queue_wait(req); + if (rc) + GOTO(err_free, rc); + + body = lustre_swab_repbuf(req, 0, sizeof(*body), + lustre_swab_llogd_body); + if (body == NULL) { + CERROR ("Can't unpack llogd_body\n"); + GOTO(err_free, rc =-EFAULT); + } + + handle->lgh_id = body->lgd_logid; + handle->lgh_ctxt = ctxt; + +out: + if (req) + ptlrpc_req_finished(req); + RETURN(rc); + +err_free: + llog_free_handle(handle); + goto out; +} + + +static int llog_client_next_block(struct llog_handle *loghandle, + int *cur_idx, int next_idx, + __u64 *cur_offset, void *buf, int len) +{ + struct obd_import *imp = loghandle->lgh_ctxt->loc_imp; + struct ptlrpc_request *req = NULL; + struct llogd_body *body; + void * ptr; + int size = sizeof(*body); + int repsize[2] = {sizeof (*body)}; + int rc; + ENTRY; + + req = ptlrpc_prep_req(imp, LLOG_ORIGIN_HANDLE_NEXT_BLOCK, 1, &size, NULL); + if (!req) + GOTO(out, rc = -ENOMEM); + + body = lustre_msg_buf(req->rq_reqmsg, 0, sizeof (*body)); + body->lgd_logid = loghandle->lgh_id; + body->lgd_ctxt_idx = loghandle->lgh_ctxt->loc_idx - 1; + body->lgd_llh_flags = loghandle->lgh_hdr->llh_flags; + body->lgd_cur_offset = *cur_offset; + body->lgd_index = next_idx; + body->lgd_saved_index = *cur_idx; + body->lgd_len = len; + repsize[1] = len; + + req->rq_replen = lustre_msg_size(2, repsize); + rc = ptlrpc_queue_wait(req); + if (rc) + GOTO(out, rc); + + body = lustre_swab_repbuf(req, 0, sizeof(*body), + lustre_swab_llogd_body); + if (body == NULL) { + CERROR ("Can't unpack llogd_body\n"); + GOTO(out, rc =-EFAULT); + } + + ptr = lustre_msg_buf(req->rq_repmsg, 1, len); + if (ptr == NULL) { + CERROR ("Can't unpack bitmap\n"); + GOTO(out, rc =-EFAULT); + } + + *cur_idx = body->lgd_saved_index; + *cur_offset = body->lgd_cur_offset; + + memcpy(buf, ptr, len); + +out: + if (req) + ptlrpc_req_finished(req); + RETURN(rc); +} + + +static int llog_client_read_header(struct llog_handle *handle) +{ + struct obd_import *imp = handle->lgh_ctxt->loc_imp; + struct ptlrpc_request *req = NULL; + struct llogd_body *body; + struct llog_log_hdr *hdr; + int size = sizeof(*body); + int repsize = sizeof (*hdr); + int rc; + ENTRY; + + req = ptlrpc_prep_req(imp, LLOG_ORIGIN_HANDLE_READ_HEADER, 1, &size, NULL); + if (!req) + GOTO(out, rc = -ENOMEM); + + body = lustre_msg_buf(req->rq_reqmsg, 0, sizeof (*body)); + body->lgd_logid = handle->lgh_id; + body->lgd_ctxt_idx = handle->lgh_ctxt->loc_idx - 1; + body->lgd_llh_flags = handle->lgh_hdr->llh_flags; + + req->rq_replen = lustre_msg_size(1, &repsize); + rc = ptlrpc_queue_wait(req); + if (rc) + GOTO(out, rc); + + hdr = lustre_swab_repbuf(req, 0, sizeof(*hdr), + lustre_swab_llog_hdr); + if (hdr == NULL) { + CERROR ("Can't unpack llog_hdr\n"); + GOTO(out, rc =-EFAULT); + } + memcpy(handle->lgh_hdr, hdr, sizeof (*hdr)); + +out: + if (req) + ptlrpc_req_finished(req); + RETURN(rc); +} + +static int llog_client_close(struct llog_handle *handle) +{ + int rc = 0; + + RETURN(rc); +} + + +struct llog_operations llog_client_ops = { + lop_next_block: llog_client_next_block, + lop_read_header: llog_client_read_header, + lop_create: llog_client_create, + lop_close: llog_client_close, +}; diff --git a/lustre/ptlrpc/llog_server.c b/lustre/ptlrpc/llog_server.c new file mode 100644 index 0000000..aeddb5b --- /dev/null +++ b/lustre/ptlrpc/llog_server.c @@ -0,0 +1,239 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2001-2003 Cluster File Systems, Inc. + * Author: Andreas Dilger + * + * 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. + * + * remote api for llog - server side + * + */ + +#define DEBUG_SUBSYSTEM S_LOG + +#ifndef EXPORT_SYMTAB +#define EXPORT_SYMTAB +#endif + +#include +#include +#include +#include +#include + +int llog_origin_handle_create(struct ptlrpc_request *req) +{ + struct obd_export *exp = req->rq_export; + struct obd_device *obd = exp->exp_obd; + struct obd_device *disk_obd; + struct llog_handle *loghandle; + struct llogd_body *body; + struct obd_run_ctxt saved; + struct llog_logid *logid = NULL; + struct llog_ctxt *ctxt; + char * name = NULL; + int size = sizeof (*body); + int rc, rc2; + ENTRY; + + body = lustre_swab_reqbuf(req, 0, sizeof(*body), + lustre_swab_llogd_body); + if (body == NULL) { + CERROR ("Can't unpack llogd_body\n"); + GOTO(out, rc =-EFAULT); + } + + if (body->lgd_logid.lgl_oid > 0) + logid = &body->lgd_logid; + + if (req->rq_reqmsg->bufcount > 1) { + name = lustre_msg_string(req->rq_reqmsg, 1, 0); + if (name == NULL) { + CERROR("Can't unpack name\n"); + GOTO(out, rc = -EFAULT); + } + } + + ctxt = llog_get_context(obd, body->lgd_ctxt_idx); + LASSERT(ctxt != NULL); + disk_obd = ctxt->loc_exp->exp_obd; + push_ctxt(&saved, &disk_obd->obd_ctxt, NULL); + + rc = llog_create(ctxt, &loghandle, logid, name); + if (rc) + GOTO(out_pop, rc); + + rc = lustre_pack_reply(req, 1, &size, NULL); + if (rc) + GOTO(out_close, rc = -ENOMEM); + + body = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*body)); + body->lgd_logid = loghandle->lgh_id; + +out_close: + rc2 = llog_close(loghandle); + if (!rc) + rc = rc2; +out_pop: + pop_ctxt(&saved, &disk_obd->obd_ctxt, NULL); +out: + RETURN(rc); +} + +int llog_origin_handle_next_block(struct ptlrpc_request *req) +{ + struct obd_export *exp = req->rq_export; + struct obd_device *obd = exp->exp_obd; + struct obd_device *disk_obd; + struct llog_handle *loghandle; + struct llogd_body *body; + struct obd_run_ctxt saved; + struct llog_ctxt *ctxt; + __u32 flags; + __u8 *buf; + void * ptr; + int size[] = {sizeof (*body), + LLOG_CHUNK_SIZE}; + int rc, rc2; + ENTRY; + + body = lustre_swab_reqbuf(req, 0, sizeof(*body), + lustre_swab_llogd_body); + if (body == NULL) { + CERROR ("Can't unpack llogd_body\n"); + GOTO(out, rc =-EFAULT); + } + + OBD_ALLOC(buf, LLOG_CHUNK_SIZE); + if (!buf) + GOTO(out, rc = -ENOMEM); + + ctxt = llog_get_context(obd, body->lgd_ctxt_idx); + LASSERT(ctxt != NULL); + disk_obd = ctxt->loc_exp->exp_obd; + push_ctxt(&saved, &disk_obd->obd_ctxt, NULL); + + rc = llog_create(ctxt, &loghandle, &body->lgd_logid, NULL); + if (rc) + GOTO(out_pop, rc); + + flags = body->lgd_llh_flags; + rc = llog_init_handle(loghandle, flags, NULL); + if (rc) + GOTO(out_close, rc); + + memset(buf, 0, LLOG_CHUNK_SIZE); + rc = llog_next_block(loghandle, &body->lgd_saved_index, + body->lgd_index, + &body->lgd_cur_offset, buf, LLOG_CHUNK_SIZE); + if (rc) + GOTO(out_close, rc); + + + rc = lustre_pack_reply(req, 2, size, NULL); + if (rc) + GOTO(out_close, rc = -ENOMEM); + + ptr = lustre_msg_buf(req->rq_repmsg, 0, sizeof (body)); + memcpy(ptr, body, sizeof(*body)); + + ptr = lustre_msg_buf(req->rq_repmsg, 1, LLOG_CHUNK_SIZE); + memcpy(ptr, buf, LLOG_CHUNK_SIZE); + +out_close: + rc2 = llog_close(loghandle); + if (!rc) + rc = rc2; + +out_pop: + pop_ctxt(&saved, &disk_obd->obd_ctxt, NULL); + OBD_FREE(buf, LLOG_CHUNK_SIZE); +out: + RETURN(rc); +} + +int llog_origin_handle_read_header(struct ptlrpc_request *req) +{ + struct obd_export *exp = req->rq_export; + struct obd_device *obd = exp->exp_obd; + struct obd_device *disk_obd; + struct llog_handle *loghandle; + struct llogd_body *body; + struct llog_log_hdr *hdr; + struct obd_run_ctxt saved; + struct llog_ctxt *ctxt; + __u32 flags; + __u8 *buf; + int size[] = {sizeof (*hdr)}; + int rc, rc2; + ENTRY; + + body = lustre_swab_reqbuf(req, 0, sizeof(*body), + lustre_swab_llogd_body); + if (body == NULL) { + CERROR ("Can't unpack llogd_body\n"); + GOTO(out, rc =-EFAULT); + } + + OBD_ALLOC(buf, LLOG_CHUNK_SIZE); + if (!buf) + GOTO(out, rc = -ENOMEM); + + ctxt = llog_get_context(obd, body->lgd_ctxt_idx); + LASSERT(ctxt != NULL); + disk_obd = ctxt->loc_exp->exp_obd; + push_ctxt(&saved, &disk_obd->obd_ctxt, NULL); + + rc = llog_create(ctxt, &loghandle, &body->lgd_logid, NULL); + if (rc) + GOTO(out_pop, rc); + + /* init_handle reads the header */ + flags = body->lgd_llh_flags; + rc = llog_init_handle(loghandle, flags, NULL); + if (rc) + GOTO(out_close, rc); + + + rc = lustre_pack_reply(req, 1, size, NULL); + if (rc) + GOTO(out_close, rc = -ENOMEM); + + hdr = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*hdr)); + memcpy(hdr, loghandle->lgh_hdr, sizeof(*hdr)); + +out_close: + rc2 = llog_close(loghandle); + if (!rc) + rc = rc2; + +out_pop: + pop_ctxt(&saved, &disk_obd->obd_ctxt, NULL); + OBD_FREE(buf, LLOG_CHUNK_SIZE); + +out: + RETURN(rc); +} + +int llog_origin_handle_close(struct ptlrpc_request *req) +{ + int rc; + + rc = 0; + + RETURN(rc); +} diff --git a/lustre/tests/replay-ost-upcall.sh b/lustre/tests/replay-ost-upcall.sh new file mode 100755 index 0000000..9f9efbf --- /dev/null +++ b/lustre/tests/replay-ost-upcall.sh @@ -0,0 +1,38 @@ +#!/bin/sh + + +TESTDIR=`dirname $0` +LUSTRE=$TESTDIR/.. + +exec >> $TESTDIR/recovery-`hostname`.log +exec 2>&1 + +set -xv + +failed_import() { +# $LUSTRE/utils/lctl --device %$3 recover || +# logger -p kern.info recovery failed: $@ + + if [ -f $LUSTRE/tests/ostactive ] ; then + source $LUSTRE/tests/ostactive + else + ostactive=ost + fi + + $LUSTRE/utils/lconf --verbose --recover --node client_facet \ + --select ost1=${ostactive}_facet\ + --tgt_uuid $2 --client_uuid $3 --conn_uuid $4 $TESTDIR/replay-ost-single.xml + +} + +recovery_over() { + logger -p kern.info upcall: $@ +} + + +case "$1" in +FAILED_IMPORT) failed_import $@ + ;; +RECOVERY_OVER) recovery_over $@ + ;; +esac diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index 78091ef..2ae9eb8 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -259,7 +259,7 @@ void lov_dump_user_lmm_v1(struct lov_user_md_v1 *lum, char *dname, char *fname, int idx = lum->lmm_objects[i].l_ost_idx; oid = lum->lmm_objects[i].l_object_id; printf("\t%6u\t%14llu\t%#13llx\t%14lld%s\n", idx, oid, - oid, lum->lmm_objects[i].l_object_gr, + oid, (long long)lum->lmm_objects[i].l_object_gr, obdindex == idx ? " *" : ""); } printf("\n"); -- 1.8.3.1