Commit | Line | Data |
---|---|---|
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 | |
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) 2007, 2010, Oracle and/or its affiliates. All rights reserved. | |
28 | * Use is subject to license terms. | |
29 | * | |
30 | * Copyright (c) 2012, 2013, 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 | * lustre/fld/lproc_fld.c | |
37 | * | |
38 | * FLD (FIDs Location Database) | |
39 | * | |
40 | * Author: Yury Umanets <umka@clusterfs.com> | |
41 | * Di Wang <di.wang@whamcloud.com> | |
42 | */ | |
43 | ||
44 | #define DEBUG_SUBSYSTEM S_FLD | |
45 | ||
46 | # include <linux/libcfs/libcfs.h> | |
47 | # include <linux/module.h> | |
48 | ||
49 | #include <obd.h> | |
50 | #include <obd_class.h> | |
51 | #include <dt_object.h> | |
52 | #include <md_object.h> | |
53 | #include <obd_support.h> | |
54 | #include <lustre_req_layout.h> | |
55 | #include <lustre_fld.h> | |
56 | #include <lustre_fid.h> | |
57 | #include "fld_internal.h" | |
58 | ||
59 | #ifdef LPROCFS | |
60 | static int | |
73bb1da6 | 61 | fld_proc_targets_seq_show(struct seq_file *m, void *unused) |
d7e09d03 | 62 | { |
73bb1da6 | 63 | struct lu_client_fld *fld = (struct lu_client_fld *)m->private; |
d7e09d03 | 64 | struct lu_fld_target *target; |
d7e09d03 PT |
65 | |
66 | LASSERT(fld != NULL); | |
67 | ||
68 | spin_lock(&fld->lcf_lock); | |
69 | list_for_each_entry(target, | |
70 | &fld->lcf_targets, ft_chain) | |
73bb1da6 | 71 | seq_printf(m, "%s\n", fld_target_name(target)); |
d7e09d03 | 72 | spin_unlock(&fld->lcf_lock); |
73bb1da6 | 73 | |
0a3bdb00 | 74 | return 0; |
d7e09d03 PT |
75 | } |
76 | ||
77 | static int | |
73bb1da6 | 78 | fld_proc_hash_seq_show(struct seq_file *m, void *unused) |
d7e09d03 | 79 | { |
73bb1da6 | 80 | struct lu_client_fld *fld = (struct lu_client_fld *)m->private; |
d7e09d03 PT |
81 | |
82 | LASSERT(fld != NULL); | |
83 | ||
84 | spin_lock(&fld->lcf_lock); | |
73bb1da6 | 85 | seq_printf(m, "%s\n", fld->lcf_hash->fh_name); |
d7e09d03 PT |
86 | spin_unlock(&fld->lcf_lock); |
87 | ||
0a3bdb00 | 88 | return 0; |
d7e09d03 PT |
89 | } |
90 | ||
73bb1da6 PT |
91 | static ssize_t |
92 | fld_proc_hash_seq_write(struct file *file, const char *buffer, | |
93 | size_t count, loff_t *off) | |
d7e09d03 | 94 | { |
73bb1da6 | 95 | struct lu_client_fld *fld = ((struct seq_file *)file->private_data)->private; |
d7e09d03 PT |
96 | struct lu_fld_hash *hash = NULL; |
97 | int i; | |
d7e09d03 PT |
98 | |
99 | LASSERT(fld != NULL); | |
100 | ||
101 | for (i = 0; fld_hash[i].fh_name != NULL; i++) { | |
102 | if (count != strlen(fld_hash[i].fh_name)) | |
103 | continue; | |
104 | ||
105 | if (!strncmp(fld_hash[i].fh_name, buffer, count)) { | |
106 | hash = &fld_hash[i]; | |
107 | break; | |
108 | } | |
109 | } | |
110 | ||
111 | if (hash != NULL) { | |
112 | spin_lock(&fld->lcf_lock); | |
113 | fld->lcf_hash = hash; | |
114 | spin_unlock(&fld->lcf_lock); | |
115 | ||
116 | CDEBUG(D_INFO, "%s: Changed hash to \"%s\"\n", | |
117 | fld->lcf_name, hash->fh_name); | |
118 | } | |
119 | ||
0a3bdb00 | 120 | return count; |
d7e09d03 PT |
121 | } |
122 | ||
73bb1da6 PT |
123 | static ssize_t |
124 | fld_proc_cache_flush_write(struct file *file, const char __user *buffer, | |
125 | size_t count, loff_t *pos) | |
d7e09d03 | 126 | { |
73bb1da6 | 127 | struct lu_client_fld *fld = file->private_data; |
d7e09d03 PT |
128 | |
129 | LASSERT(fld != NULL); | |
130 | ||
131 | fld_cache_flush(fld->lcf_cache); | |
132 | ||
133 | CDEBUG(D_INFO, "%s: Lookup cache is flushed\n", fld->lcf_name); | |
134 | ||
0a3bdb00 | 135 | return count; |
d7e09d03 PT |
136 | } |
137 | ||
73bb1da6 PT |
138 | static int fld_proc_cache_flush_open(struct inode *inode, struct file *file) |
139 | { | |
140 | file->private_data = PDE_DATA(inode); | |
141 | return 0; | |
142 | } | |
143 | ||
144 | static int fld_proc_cache_flush_release(struct inode *inode, struct file *file) | |
145 | { | |
146 | file->private_data = NULL; | |
147 | return 0; | |
148 | } | |
149 | ||
150 | struct file_operations fld_proc_cache_flush_fops = { | |
151 | .owner = THIS_MODULE, | |
152 | .open = fld_proc_cache_flush_open, | |
153 | .write = fld_proc_cache_flush_write, | |
154 | .release = fld_proc_cache_flush_release, | |
155 | }; | |
156 | ||
73bb1da6 PT |
157 | LPROC_SEQ_FOPS_RO(fld_proc_targets); |
158 | LPROC_SEQ_FOPS(fld_proc_hash); | |
159 | ||
d7e09d03 | 160 | struct lprocfs_vars fld_client_proc_list[] = { |
73bb1da6 PT |
161 | { "targets", &fld_proc_targets_fops }, |
162 | { "hash", &fld_proc_hash_fops }, | |
163 | { "cache_flush", &fld_proc_cache_flush_fops }, | |
d7e09d03 PT |
164 | { NULL }}; |
165 | ||
e62e5d92 | 166 | #endif /* LPROCFS */ |