X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fobdclass%2Fclass_obd.c;h=1e935f43d469984c2e24991c1a94b488dc336941;hp=7d2d3c911bce6500c24219ef8c61fa48ef9a3c8c;hb=6fb209991e80cf71d97ad566d1a757e4a31466e0;hpb=56cc9aeb7151f908ab9cac034ceaf11098bac6a4 diff --git a/lustre/obdclass/class_obd.c b/lustre/obdclass/class_obd.c index 7d2d3c9..1e935f4 100644 --- a/lustre/obdclass/class_obd.c +++ b/lustre/obdclass/class_obd.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -35,9 +35,6 @@ */ #define DEBUG_SUBSYSTEM S_CLASS -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #ifndef __KERNEL__ # include #else @@ -59,8 +56,9 @@ cfs_atomic_t libcfs_kmemory = {0}; #endif struct obd_device *obd_devs[MAX_OBD_DEVICES]; +EXPORT_SYMBOL(obd_devs); cfs_list_t obd_types; -cfs_spinlock_t obd_dev_lock = CFS_SPIN_LOCK_UNLOCKED; +DEFINE_RWLOCK(obd_dev_lock); #ifndef __KERNEL__ __u64 obd_max_pages = 0; @@ -71,31 +69,87 @@ __u64 obd_pages; /* The following are visible and mutable through /proc/sys/lustre/. */ unsigned int obd_debug_peer_on_timeout; +EXPORT_SYMBOL(obd_debug_peer_on_timeout); unsigned int obd_dump_on_timeout; +EXPORT_SYMBOL(obd_dump_on_timeout); unsigned int obd_dump_on_eviction; +EXPORT_SYMBOL(obd_dump_on_eviction); unsigned int obd_max_dirty_pages = 256; +EXPORT_SYMBOL(obd_max_dirty_pages); +cfs_atomic_t obd_dirty_pages; +EXPORT_SYMBOL(obd_dirty_pages); unsigned int obd_timeout = OBD_TIMEOUT_DEFAULT; /* seconds */ +EXPORT_SYMBOL(obd_timeout); unsigned int ldlm_timeout = LDLM_TIMEOUT_DEFAULT; /* seconds */ +EXPORT_SYMBOL(ldlm_timeout); +unsigned int obd_timeout_set; +EXPORT_SYMBOL(obd_timeout_set); +unsigned int ldlm_timeout_set; +EXPORT_SYMBOL(ldlm_timeout_set); /* Adaptive timeout defs here instead of ptlrpc module for /proc/sys/ access */ unsigned int at_min = 0; +EXPORT_SYMBOL(at_min); unsigned int at_max = 600; +EXPORT_SYMBOL(at_max); unsigned int at_history = 600; +EXPORT_SYMBOL(at_history); int at_early_margin = 5; +EXPORT_SYMBOL(at_early_margin); int at_extra = 30; +EXPORT_SYMBOL(at_extra); -cfs_atomic_t obd_dirty_pages; cfs_atomic_t obd_dirty_transit_pages; +EXPORT_SYMBOL(obd_dirty_transit_pages); -cfs_waitq_t obd_race_waitq; -int obd_race_state; +char obd_jobid_var[JOBSTATS_JOBID_VAR_MAX_LEN + 1] = JOBSTATS_DISABLE; +EXPORT_SYMBOL(obd_jobid_var); -#ifdef __KERNEL__ -unsigned long obd_print_fail_loc(void) +/* Get jobid of current process by reading the environment variable + * stored in between the "env_start" & "env_end" of task struct. + * + * TODO: + * It's better to cache the jobid for later use if there is any + * efficient way, the cl_env code probably could be reused for this + * purpose. + * + * If some job scheduler doesn't store jobid in the "env_start/end", + * then an upcall could be issued here to get the jobid by utilizing + * the userspace tools/api. Then, the jobid must be cached. + */ +int lustre_get_jobid(char *jobid) { - CWARN("obd_fail_loc = %lx\n", obd_fail_loc); - return obd_fail_loc; -} +#ifdef __KERNEL__ + int jobid_len = JOBSTATS_JOBID_SIZE; +#endif + int ret = 0; + ENTRY; + + memset(jobid, 0, JOBSTATS_JOBID_SIZE); + /* Jobstats isn't enabled */ + if (!memcmp(obd_jobid_var, JOBSTATS_DISABLE, + strlen(JOBSTATS_DISABLE))) { + RETURN(0); + } + + /* Use process name + fsuid as jobid */ + if (!memcmp(obd_jobid_var, JOBSTATS_PROCNAME_UID, + strlen(JOBSTATS_PROCNAME_UID))) { + snprintf(jobid, JOBSTATS_JOBID_SIZE, "%s_%u", + cfs_curproc_comm(), cfs_curproc_fsuid()); + RETURN(0); + } + +#ifdef __KERNEL__ + ret = cfs_get_environ(obd_jobid_var, jobid, &jobid_len); + if (ret) { + CDEBUG((ret != -ENOENT && ret != -EINVAL && ret != -EDEADLK) ? + D_ERROR : D_INFO, "Get jobid for (%s) failed: rc = %d\n", + obd_jobid_var, ret); + } #endif + RETURN(ret); +} +EXPORT_SYMBOL(lustre_get_jobid); static inline void obd_data2conn(struct lustre_handle *conn, struct obd_ioctl_data *data) @@ -159,7 +213,7 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg) CDEBUG(D_IOCTL, "cmd = %x\n", cmd); if (obd_ioctl_getdata(&buf, &len, (void *)arg)) { CERROR("OBD ioctl: data error\n"); - GOTO(out, err = -EINVAL); + RETURN(-EINVAL); } data = (struct obd_ioctl_data *)buf; @@ -353,83 +407,12 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg) RETURN(err); } /* class_handle_ioctl */ - - #ifdef __KERNEL__ extern cfs_psdev_t obd_psdev; #else void *obd_psdev = NULL; #endif -EXPORT_SYMBOL(obd_devs); -EXPORT_SYMBOL(obd_print_fail_loc); -EXPORT_SYMBOL(obd_race_waitq); -EXPORT_SYMBOL(obd_race_state); -EXPORT_SYMBOL(obd_debug_peer_on_timeout); -EXPORT_SYMBOL(obd_dump_on_timeout); -EXPORT_SYMBOL(obd_dump_on_eviction); -EXPORT_SYMBOL(obd_timeout); -EXPORT_SYMBOL(ldlm_timeout); -EXPORT_SYMBOL(obd_max_dirty_pages); -EXPORT_SYMBOL(obd_dirty_pages); -EXPORT_SYMBOL(obd_dirty_transit_pages); -EXPORT_SYMBOL(at_min); -EXPORT_SYMBOL(at_max); -EXPORT_SYMBOL(at_extra); -EXPORT_SYMBOL(at_early_margin); -EXPORT_SYMBOL(at_history); -EXPORT_SYMBOL(ptlrpc_put_connection_superhack); - -EXPORT_SYMBOL(proc_lustre_root); - -EXPORT_SYMBOL(class_register_type); -EXPORT_SYMBOL(class_unregister_type); -EXPORT_SYMBOL(class_get_type); -EXPORT_SYMBOL(class_put_type); -EXPORT_SYMBOL(class_name2dev); -EXPORT_SYMBOL(class_name2obd); -EXPORT_SYMBOL(class_uuid2dev); -EXPORT_SYMBOL(class_uuid2obd); -EXPORT_SYMBOL(class_find_client_obd); -EXPORT_SYMBOL(class_devices_in_group); -EXPORT_SYMBOL(class_conn2export); -EXPORT_SYMBOL(class_exp2obd); -EXPORT_SYMBOL(class_conn2obd); -EXPORT_SYMBOL(class_exp2cliimp); -EXPORT_SYMBOL(class_conn2cliimp); -EXPORT_SYMBOL(class_disconnect); -EXPORT_SYMBOL(class_num2obd); - -/* uuid.c */ -EXPORT_SYMBOL(class_uuid_unparse); -EXPORT_SYMBOL(lustre_uuid_to_peer); - -EXPORT_SYMBOL(class_handle_hash); -EXPORT_SYMBOL(class_handle_unhash); -EXPORT_SYMBOL(class_handle_hash_back); -EXPORT_SYMBOL(class_handle2object); -EXPORT_SYMBOL(class_handle_free_cb); - -/* obd_config.c */ -EXPORT_SYMBOL(class_incref); -EXPORT_SYMBOL(class_decref); -EXPORT_SYMBOL(class_get_profile); -EXPORT_SYMBOL(class_del_profile); -EXPORT_SYMBOL(class_del_profiles); -EXPORT_SYMBOL(class_process_config); -EXPORT_SYMBOL(class_process_proc_param); -EXPORT_SYMBOL(class_config_parse_llog); -EXPORT_SYMBOL(class_config_dump_llog); -EXPORT_SYMBOL(class_attach); -EXPORT_SYMBOL(class_setup); -EXPORT_SYMBOL(class_cleanup); -EXPORT_SYMBOL(class_detach); -EXPORT_SYMBOL(class_manual_cleanup); - -/* mea.c */ -EXPORT_SYMBOL(mea_name2idx); -EXPORT_SYMBOL(raw_name2idx); - #define OBD_INIT_CHECK #ifdef OBD_INIT_CHECK int obd_init_checks(void) @@ -521,16 +504,14 @@ int init_obdclass(void) CFS_INIT_LIST_HEAD(&capa_list[i]); #endif - LCONSOLE_INFO("OBD class driver, http://www.lustre.org/\n"); - LCONSOLE_INFO(" Lustre Version: "LUSTRE_VERSION_STRING"\n"); - LCONSOLE_INFO(" Build Version: "BUILD_VERSION"\n"); + LCONSOLE_INFO("Lustre: Build Version: "BUILD_VERSION"\n"); cfs_spin_lock_init(&obd_types_lock); - cfs_waitq_init(&obd_race_waitq); obd_zombie_impexp_init(); #ifdef LPROCFS obd_memory = lprocfs_alloc_stats(OBD_STATS_NUM, - LPROCFS_STATS_FLAG_NONE); + LPROCFS_STATS_FLAG_NONE | + LPROCFS_STATS_FLAG_IRQ_SAFE); if (obd_memory == NULL) { CERROR("kmalloc of 'obd_memory' failed\n"); RETURN(-ENOMEM); @@ -552,7 +533,6 @@ int init_obdclass(void) if (err) return err; - cfs_spin_lock_init(&obd_dev_lock); CFS_INIT_LIST_HEAD(&obd_types); err = cfs_psdev_register(&obd_psdev); @@ -586,6 +566,10 @@ int init_obdclass(void) if (err) return err; + err = llog_info_init(); + if (err) + return err; + #ifdef __KERNEL__ err = lustre_register_fs(); #endif @@ -616,6 +600,7 @@ static void cleanup_obdclass(void) OBP(obd, detach)(obd); } } + llog_info_fini(); lu_global_fini(); obd_cleanup_caches();