Merge remote-tracking branch 'staging/staging-next'
[deliverable/linux.git] / drivers / staging / lustre / lustre / fld / fld_internal.h
CommitLineData
d7e09d03
PT
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
6a5b99a4 18 * http://www.gnu.org/licenses/gpl-2.0.html
d7e09d03 19 *
d7e09d03
PT
20 * GPL HEADER END
21 */
22/*
23 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
25 *
1dc563a6 26 * Copyright (c) 2012, 2015, Intel Corporation.
d7e09d03
PT
27 */
28/*
29 * This file is part of Lustre, http://www.lustre.org/
30 * Lustre is a trademark of Sun Microsystems, Inc.
31 *
32 * lustre/fld/fld_internal.h
33 *
aa08b0e3
PF
34 * Subsystem Description:
35 * FLD is FID Location Database, which stores where (IE, on which MDT)
36 * FIDs are located.
37 * The database is basically a record file, each record consists of a FID
38 * sequence range, MDT/OST index, and flags. The FLD for the whole FS
39 * is only stored on the sequence controller(MDT0) right now, but each target
40 * also has its local FLD, which only stores the local sequence.
41 *
42 * The FLD subsystem usually has two tasks:
43 * 1. maintain the database, i.e. when the sequence controller allocates
44 * new sequence ranges to some nodes, it will call the FLD API to insert the
45 * location information <sequence_range, node_index> in FLDB.
46 *
47 * 2. Handle requests from other nodes, i.e. if client needs to know where
48 * the FID is located, if it can not find the information in the local cache,
49 * it will send a FLD lookup RPC to the FLD service, and the FLD service will
50 * look up the FLDB entry and return the location information to client.
51 *
52 *
d7e09d03
PT
53 * Author: Yury Umanets <umka@clusterfs.com>
54 * Author: Tom WangDi <wangdi@clusterfs.com>
55 */
56#ifndef __FLD_INTERNAL_H
57#define __FLD_INTERNAL_H
58
0e9ad0ef 59#include "../include/lustre/lustre_idl.h"
d7e09d03 60
9fdaf8c0 61#include "../../include/linux/libcfs/libcfs.h"
0e9ad0ef
GKH
62#include "../include/lustre_req_layout.h"
63#include "../include/lustre_fld.h"
d7e09d03
PT
64
65enum {
66 LUSTRE_FLD_INIT = 1 << 0,
67 LUSTRE_FLD_RUN = 1 << 1
68};
69
70struct fld_stats {
71 __u64 fst_count;
72 __u64 fst_cache;
73 __u64 fst_inflight;
74};
75
d7e09d03
PT
76struct lu_fld_hash {
77 const char *fh_name;
8111e432
OD
78 int (*fh_hash_func)(struct lu_client_fld *, __u64);
79 struct lu_fld_target *(*fh_scan_func)(struct lu_client_fld *, __u64);
d7e09d03
PT
80};
81
82struct fld_cache_entry {
83 struct list_head fce_lru;
84 struct list_head fce_list;
52581b89 85 /** fld cache entries are sorted on range->lsr_start field. */
d7e09d03
PT
86 struct lu_seq_range fce_range;
87};
88
89struct fld_cache {
90 /**
91 * Cache guard, protects fci_hash mostly because others immutable after
92 * init is finished.
93 */
94 rwlock_t fci_lock;
95
52581b89 96 /** Cache shrink threshold */
d7e09d03
PT
97 int fci_threshold;
98
52581b89 99 /** Preferred number of cached entries */
d7e09d03
PT
100 int fci_cache_size;
101
52581b89 102 /** Current number of cached entries. Protected by \a fci_lock */
d7e09d03
PT
103 int fci_cache_count;
104
52581b89 105 /** LRU list fld entries. */
d7e09d03
PT
106 struct list_head fci_lru;
107
52581b89 108 /** sorted fld entries. */
d7e09d03
PT
109 struct list_head fci_entries_head;
110
52581b89 111 /** Cache statistics. */
d7e09d03
PT
112 struct fld_stats fci_stat;
113
52581b89 114 /** Cache name used for debug and messages. */
37604896 115 char fci_name[LUSTRE_MDT_MAXNAMELEN];
d7e09d03
PT
116 unsigned int fci_no_shrink:1;
117};
118
d7e09d03
PT
119enum {
120 /* 4M of FLD cache will not hurt client a lot. */
121 FLD_SERVER_CACHE_SIZE = (4 * 0x100000),
122
123 /* 1M of FLD cache will not hurt client a lot. */
124 FLD_CLIENT_CACHE_SIZE = (1 * 0x100000)
125};
126
127enum {
128 /* Cache threshold is 10 percent of size. */
129 FLD_SERVER_CACHE_THRESHOLD = 10,
130
131 /* Cache threshold is 10 percent of size. */
132 FLD_CLIENT_CACHE_THRESHOLD = 10
133};
134
135extern struct lu_fld_hash fld_hash[];
136
d7e09d03 137int fld_client_rpc(struct obd_export *exp,
b78c2b9b 138 struct lu_seq_range *range, __u32 fld_op,
139 struct ptlrpc_request **reqp);
d7e09d03 140
82765049 141extern struct lprocfs_vars fld_client_debugfs_list[];
d7e09d03
PT
142
143struct fld_cache *fld_cache_init(const char *name,
144 int cache_size, int cache_threshold);
145
146void fld_cache_fini(struct fld_cache *cache);
147
148void fld_cache_flush(struct fld_cache *cache);
149
150int fld_cache_insert(struct fld_cache *cache,
151 const struct lu_seq_range *range);
152
153struct fld_cache_entry
154*fld_cache_entry_create(const struct lu_seq_range *range);
155
d7e09d03 156int fld_cache_lookup(struct fld_cache *cache,
114acca8 157 const u64 seq, struct lu_seq_range *range);
d7e09d03
PT
158
159struct fld_cache_entry*
160fld_cache_entry_lookup(struct fld_cache *cache, struct lu_seq_range *range);
d7e09d03
PT
161
162struct fld_cache_entry
163*fld_cache_entry_lookup_nolock(struct fld_cache *cache,
164 struct lu_seq_range *range);
d7e09d03
PT
165
166static inline const char *
167fld_target_name(struct lu_fld_target *tar)
168{
6ac49ca5 169 if (tar->ft_srv)
d7e09d03
PT
170 return tar->ft_srv->lsf_name;
171
172 return (const char *)tar->ft_exp->exp_obd->obd_name;
173}
174
d7e09d03 175#endif /* __FLD_INTERNAL_H */
This page took 0.457564 seconds and 5 git commands to generate.