Whamcloud - gitweb
again merge b_devel to b_eq 20031113
authorericm <ericm>
Thu, 13 Nov 2003 07:54:51 +0000 (07:54 +0000)
committerericm <ericm>
Thu, 13 Nov 2003 07:54:51 +0000 (07:54 +0000)
yesterday's merge brought in some nasty bugs.

lnet/libcfs/debug.c
lnet/libcfs/module.c
lnet/utils/debug.c
lustre/conf/modules.conf [new file with mode: 0644]
lustre/portals/libcfs/debug.c
lustre/portals/libcfs/module.c
lustre/portals/utils/debug.c
lustre/ptlrpc/llog_client.c [new file with mode: 0644]
lustre/ptlrpc/llog_server.c [new file with mode: 0644]
lustre/tests/replay-ost-upcall.sh [new file with mode: 0755]
lustre/utils/liblustreapi.c

index ca1c079..f27924e 100644 (file)
@@ -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);
index a01dfe2..6432070 100644 (file)
@@ -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;
index c898aef..3f3e69c 100644 (file)
@@ -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 (file)
index 0000000..0fb0a35
--- /dev/null
@@ -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
index ca1c079..f27924e 100644 (file)
@@ -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);
index a01dfe2..6432070 100644 (file)
@@ -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;
index c898aef..3f3e69c 100644 (file)
@@ -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 (file)
index 0000000..996dca8
--- /dev/null
@@ -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 <adilger@clusterfs.com>
+ *
+ *   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 <linux/fs.h>
+#include <linux/obd_class.h>
+#include <linux/lustre_log.h>
+#include <linux/lustre_net.h>
+#include <portals/list.h>
+
+/* 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 (file)
index 0000000..aeddb5b
--- /dev/null
@@ -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 <adilger@clusterfs.com>
+ *
+ *   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 <linux/fs.h>
+#include <linux/obd_class.h>
+#include <linux/lustre_log.h>
+#include <linux/lustre_net.h>
+#include <portals/list.h>
+
+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 (executable)
index 0000000..9f9efbf
--- /dev/null
@@ -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
index 78091ef..2ae9eb8 100644 (file)
@@ -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");