1 /* 2 * GPL HEADER START 3 * 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 only, 8 * as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License version 2 for more details (a copy is included 14 * in the LICENSE file that accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License 17 * version 2 along with this program; If not, see 18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf 19 * 20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 21 * CA 95054 USA or visit www.sun.com if you need additional information or 22 * have any questions. 23 * 24 * GPL HEADER END 25 */ 26 /* 27 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 28 * Use is subject to license terms. 29 * 30 * Copyright (c) 2012, Intel Corporation. 31 */ 32 /* 33 * This file is part of Lustre, http://www.lustre.org/ 34 * Lustre is a trademark of Sun Microsystems, Inc. 35 * 36 * Internal cl interfaces. 37 * 38 * Author: Nikita Danilov <nikita.danilov@sun.com> 39 */ 40 #ifndef _CL_INTERNAL_H 41 #define _CL_INTERNAL_H 42 43 #define CLT_PVEC_SIZE (14) 44 45 /** 46 * Possible levels of the nesting. Currently this is 2: there are "top" 47 * entities (files, extent locks), and "sub" entities (stripes and stripe 48 * locks). This is used only for debugging counters right now. 49 */ 50 enum clt_nesting_level { 51 CNL_TOP, 52 CNL_SUB, 53 CNL_NR 54 }; 55 56 /** 57 * Counters used to check correctness of cl_lock interface usage. 58 */ 59 struct cl_thread_counters { 60 /** 61 * Number of outstanding calls to cl_lock_mutex_get() made by the 62 * current thread. For debugging. 63 */ 64 int ctc_nr_locks_locked; 65 /** List of locked locks. */ 66 struct lu_ref ctc_locks_locked; 67 /** Number of outstanding holds on locks. */ 68 int ctc_nr_held; 69 /** Number of outstanding uses on locks. */ 70 int ctc_nr_used; 71 /** Number of held extent locks. */ 72 int ctc_nr_locks_acquired; 73 }; 74 75 /** 76 * Thread local state internal for generic cl-code. 77 */ 78 struct cl_thread_info { 79 /* 80 * Common fields. 81 */ 82 struct cl_io clt_io; 83 struct cl_2queue clt_queue; 84 85 /* 86 * Fields used by cl_lock.c 87 */ 88 struct cl_lock_descr clt_descr; 89 struct cl_page_list clt_list; 90 /** 91 * Counters for every level of lock nesting. 92 */ 93 struct cl_thread_counters clt_counters[CNL_NR]; 94 /** @} debugging */ 95 96 /* 97 * Fields used by cl_page.c 98 */ 99 struct cl_page *clt_pvec[CLT_PVEC_SIZE]; 100 101 /* 102 * Fields used by cl_io.c 103 */ 104 /** 105 * Pointer to the topmost ongoing IO in this thread. 106 */ 107 struct cl_io *clt_current_io; 108 /** 109 * Used for submitting a sync io. 110 */ 111 struct cl_sync_io clt_anchor; 112 /** 113 * Fields used by cl_lock_discard_pages(). 114 */ 115 pgoff_t clt_next_index; 116 pgoff_t clt_fn_index; /* first non-overlapped index */ 117 }; 118 119 struct cl_thread_info *cl_env_info(const struct lu_env *env); 120 121 #endif /* _CL_INTERNAL_H */ 122