X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fliblustre%2Fllite_lib.c;h=c12695beb1dd6d6bb251d1cb2a64240545b57211;hb=526e9c54f2113da0c1484e70791167f7d16cbf00;hp=bda17667482759b13b52ea3e4ce3c13ed2ceae4f;hpb=113303973ec9f8484eb2355a1a6ef3c4c7fd6a56;p=fs%2Flustre-release.git diff --git a/lustre/liblustre/llite_lib.c b/lustre/liblustre/llite_lib.c index bda1766..c12695b 100644 --- a/lustre/liblustre/llite_lib.c +++ b/lustre/liblustre/llite_lib.c @@ -1,24 +1,41 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * Lustre Light common routines + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * 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. * - * Copyright (c) 2002-2004 Cluster File Systems, Inc. + * 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). * - * This file is part of Lustre, http://www.lustre.org. + * 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 * - * 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. + * 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. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 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. + * lustre/liblustre/llite_lib.c * - * 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. + * Lustre Light common routines */ #include @@ -29,10 +46,10 @@ #include #include +#include #ifdef HAVE_XTIO_H #include #endif -#include #include #include #include @@ -40,15 +57,14 @@ #include #endif -/* both sys/queue.h (libsysio require it) and portals/lists.h have definition - * of 'LIST_HEAD'. undef it to suppress warnings - */ -#undef LIST_HEAD +#include #include /* needed for parse_dump */ #include "lutil.h" #include "llite_lib.h" +int slp_global_init(void); + static int lllib_init(void) { if (liblustre_init_current("liblustre") || @@ -56,9 +72,11 @@ static int lllib_init(void) init_obdclass() || ptlrpc_init() || mgc_init() || + lmv_init() || mdc_init() || lov_init() || - osc_init()) + osc_init() || + slp_global_init()) return -1; return _sysio_fssw_register("lustre", &llu_fssw_ops); @@ -72,7 +90,6 @@ int liblustre_process_log(struct config_llog_instance *cfg, struct lustre_cfg *lcfg; char *peer = "MGS_UUID"; struct obd_device *obd; - struct lustre_handle mgc_conn = {0, }; struct obd_export *exp; char *name = "mgc_dev"; class_uuid_t uuid; @@ -84,7 +101,7 @@ int liblustre_process_log(struct config_llog_instance *cfg, struct obd_connect_data *ocd = NULL; ENTRY; - generate_random_uuid(uuid); + ll_generate_random_uuid(uuid); class_uuid_unparse(uuid, &mgc_uuid); nid = libcfs_str2nid(mgsnid); @@ -155,21 +172,25 @@ int liblustre_process_log(struct config_llog_instance *cfg, if (ocd == NULL) GOTO(out_cleanup, rc = -ENOMEM); - ocd->ocd_connect_flags = OBD_CONNECT_VERSION; + ocd->ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_FID | + OBD_CONNECT_AT | OBD_CONNECT_VBR | + OBD_CONNECT_FULL20; +#ifdef LIBLUSTRE_POSIX_ACL + ocd->ocd_connect_flags |= OBD_CONNECT_ACL; +#endif ocd->ocd_version = LUSTRE_VERSION_CODE; - rc = obd_connect(&mgc_conn, obd, &mgc_uuid, ocd); + rc = obd_connect(NULL, &exp, obd, &mgc_uuid, ocd, NULL); if (rc) { CERROR("cannot connect to %s at %s: rc = %d\n", LUSTRE_MGS_OBDNAME, mgsnid, rc); GOTO(out_cleanup, rc); } - exp = class_conn2export(&mgc_conn); - - ctxt = exp->exp_obd->obd_llog_ctxt[LLOG_CONFIG_REPL_CTXT]; + ctxt = llog_get_context(exp->exp_obd, LLOG_CONFIG_REPL_CTXT); cfg->cfg_flags |= CFG_F_COMPAT146; rc = class_config_parse_llog(ctxt, profile, cfg); + llog_ctxt_put(ctxt); if (rc) { CERROR("class_config_parse_llog failed: rc = %d\n", rc); } @@ -189,7 +210,7 @@ out_cleanup: err = class_process_config(lcfg); lustre_cfg_free(lcfg); if (err) - CERROR("mdc_cleanup failed: rc = %d\n", err); + CERROR("md_cleanup failed: rc = %d\n", err); out_detach: lustre_cfg_bufs_reset(&bufs, name); @@ -197,7 +218,7 @@ out_detach: err = class_process_config(lcfg); lustre_cfg_free(lcfg); if (err) - CERROR("mdc_detach failed: rc = %d\n", err); + CERROR("md_detach failed: rc = %d\n", err); out_del_uuid: lustre_cfg_bufs_reset(&bufs, name); @@ -265,7 +286,7 @@ int ll_parse_mount_target(const char *target, char **mgsnid, int _sysio_lustre_init(void) { int err; - char *timeout = NULL; + char *envstr; #ifndef INIT_SYSIO extern void __liblustre_cleanup_(void); #endif @@ -277,13 +298,23 @@ int _sysio_lustre_init(void) perror("init llite driver"); return err; } - timeout = getenv("LIBLUSTRE_TIMEOUT"); - if (timeout) { - obd_timeout = (unsigned int) strtol(timeout, NULL, 0); - printf("LibLustre: set obd timeout as %u seconds\n", + + envstr = getenv("LIBLUSTRE_TIMEOUT"); + if (envstr != NULL) { + obd_timeout = (unsigned int)strtol(envstr, NULL, 0); + printf("LibLustre: obd timeout=%u seconds\n", obd_timeout); } + /* debug peer on timeout? */ + envstr = getenv("LIBLUSTRE_DEBUG_PEER_ON_TIMEOUT"); + if (envstr != NULL) { + obd_debug_peer_on_timeout = + (unsigned int)strtol(envstr, NULL, 0); + printf("LibLustre: debug peer on timeout=%d\n", + obd_debug_peer_on_timeout ? 0 : 1); + } + #ifndef INIT_SYSIO (void)atexit(__liblustre_cleanup_); #endif @@ -291,24 +322,30 @@ int _sysio_lustre_init(void) } extern int _sysio_native_init(); -extern unsigned int obd_timeout; + +static int mnt_retry = 0; char *lustre_path = NULL; void __liblustre_setup_(void) { char *target = NULL; - char *root_driver = "native"; char *lustre_driver = "lustre"; - char *root_path = "/"; unsigned mntflgs = 0; - int err; + int err, count; lustre_path = getenv("LIBLUSTRE_MOUNT_POINT"); if (!lustre_path) { lustre_path = "/mnt/lustre"; } + target = getenv("LIBLUSTRE_MOUNT_RETRY"); + if (target) { + mnt_retry = atoi(target); + if (mnt_retry < 0) + mnt_retry = 0; + } + /* mount target */ target = getenv("LIBLUSTRE_MOUNT_TARGET"); if (!target) { @@ -327,7 +364,7 @@ void __liblustre_setup_(void) } _sysio_native_init(); - err = _sysio_mount_root(root_path, root_driver, mntflgs, NULL); + err = _sysio_mount_root("/", "native", mntflgs, NULL); if (err) { fprintf(stderr, "sysio mount failed: %s\n", strerror(errno)); exit(1); @@ -337,7 +374,16 @@ void __liblustre_setup_(void) exit(1); #endif /* INIT_SYSIO */ - err = mount(target, lustre_path, lustre_driver, mntflgs, NULL); + count = mnt_retry; + do { + err = mount(target, lustre_path, lustre_driver, mntflgs, NULL); + if (err && mnt_retry && (-- count)) { + fprintf(stderr, "Lustre mount failed: %s. " + "Will retry %d more times\n", + strerror(errno), mnt_retry - count ); + sleep(2); + } + } while (err && count > 0); if (err) { fprintf(stderr, "Lustre mount failed: %s\n", strerror(errno)); exit(1); @@ -360,7 +406,7 @@ void __liblustre_cleanup_(void) * but it can't fix the situation that liblustre is mounted * at "/". */ - chdir("/"); + if (!chdir("/")) {} #if 0 umount(lustre_path); #endif