Whamcloud - gitweb
LU-8901 misc: update Intel copyright messages for 2016
[fs/lustre-release.git] / lustre / mdc / lproc_mdc.c
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.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2011, 2016, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  * Lustre is a trademark of Sun Microsystems, Inc.
31  */
32 #define DEBUG_SUBSYSTEM S_CLASS
33
34 #include <linux/version.h>
35 #include <linux/vfs.h>
36 #include <obd_class.h>
37 #include <lprocfs_status.h>
38
39 #include "mdc_internal.h"
40
41 #ifdef CONFIG_PROC_FS
42 static int mdc_active_seq_show(struct seq_file *m, void *v)
43 {
44         struct obd_device *dev = m->private;
45
46         LPROCFS_CLIMP_CHECK(dev);
47         seq_printf(m, "%d\n", !dev->u.cli.cl_import->imp_deactive);
48         LPROCFS_CLIMP_EXIT(dev);
49         return 0;
50 }
51
52 static ssize_t mdc_active_seq_write(struct file *file,
53                                     const char __user *buffer,
54                                     size_t count, loff_t *off)
55 {
56         struct obd_device *dev;
57         int rc;
58         __s64 val;
59
60         dev = ((struct seq_file *)file->private_data)->private;
61         rc = lprocfs_str_to_s64(buffer, count, &val);
62         if (rc)
63                 return rc;
64         if (val < 0 || val > 1)
65                 return -ERANGE;
66
67         /* opposite senses */
68         if (dev->u.cli.cl_import->imp_deactive == val)
69                 rc = ptlrpc_set_import_active(dev->u.cli.cl_import, val);
70         else
71                 CDEBUG(D_CONFIG, "activate %llu: ignoring repeat request\n",
72                        val);
73
74         return count;
75 }
76 LPROC_SEQ_FOPS(mdc_active);
77
78 static int mdc_max_rpcs_in_flight_seq_show(struct seq_file *m, void *v)
79 {
80         struct obd_device *dev = m->private;
81         __u32 max;
82
83         max = obd_get_max_rpcs_in_flight(&dev->u.cli);
84         seq_printf(m, "%u\n", max);
85
86         return 0;
87 }
88
89 static ssize_t mdc_max_rpcs_in_flight_seq_write(struct file *file,
90                                                 const char __user *buffer,
91                                                 size_t count,
92                                                 loff_t *off)
93 {
94         struct obd_device *dev = ((struct seq_file *)file->private_data)->private;
95         __s64 val;
96         int rc;
97
98         rc = lprocfs_str_to_s64(buffer, count, &val);
99         if (rc)
100                 return rc;
101
102         if (val < 0 || val > UINT_MAX)
103                 return -ERANGE;
104
105         rc = obd_set_max_rpcs_in_flight(&dev->u.cli, val);
106         if (rc)
107                 return rc;
108
109         return count;
110 }
111 LPROC_SEQ_FOPS(mdc_max_rpcs_in_flight);
112
113
114 static int mdc_max_mod_rpcs_in_flight_seq_show(struct seq_file *m, void *v)
115 {
116         struct obd_device *dev = m->private;
117         __u16 max;
118
119         max = obd_get_max_mod_rpcs_in_flight(&dev->u.cli);
120         seq_printf(m, "%hu\n", max);
121
122         return 0;
123 }
124
125 static ssize_t mdc_max_mod_rpcs_in_flight_seq_write(struct file *file,
126                                                     const char __user *buffer,
127                                                     size_t count,
128                                                     loff_t *off)
129 {
130         struct obd_device *dev =
131                         ((struct seq_file *)file->private_data)->private;
132         __s64 val;
133         int rc;
134
135         rc = lprocfs_str_to_s64(buffer, count, &val);
136         if (rc)
137                 return rc;
138
139         if (val < 0 || val > USHRT_MAX)
140                 return -ERANGE;
141
142         rc = obd_set_max_mod_rpcs_in_flight(&dev->u.cli, val);
143         if (rc)
144                 count = rc;
145
146         return count;
147 }
148 LPROC_SEQ_FOPS(mdc_max_mod_rpcs_in_flight);
149
150
151 static int mdc_rpc_stats_seq_show(struct seq_file *seq, void *v)
152 {
153         struct obd_device *dev = seq->private;
154
155         return obd_mod_rpc_stats_seq_show(&dev->u.cli, seq);
156 }
157
158
159 static ssize_t mdc_rpc_stats_seq_write(struct file *file,
160                                        const char __user *buf,
161                                        size_t len, loff_t *off)
162 {
163         struct seq_file *seq = file->private_data;
164         struct obd_device *dev = seq->private;
165         struct client_obd *cli = &dev->u.cli;
166
167         lprocfs_oh_clear(&cli->cl_mod_rpcs_hist);
168
169         return len;
170 }
171 LPROC_SEQ_FOPS(mdc_rpc_stats);
172
173
174 LPROC_SEQ_FOPS_WO_TYPE(mdc, ping);
175
176 LPROC_SEQ_FOPS_RO_TYPE(mdc, uuid);
177 LPROC_SEQ_FOPS_RO_TYPE(mdc, connect_flags);
178 LPROC_SEQ_FOPS_RO_TYPE(mdc, blksize);
179 LPROC_SEQ_FOPS_RO_TYPE(mdc, kbytestotal);
180 LPROC_SEQ_FOPS_RO_TYPE(mdc, kbytesfree);
181 LPROC_SEQ_FOPS_RO_TYPE(mdc, kbytesavail);
182 LPROC_SEQ_FOPS_RO_TYPE(mdc, filestotal);
183 LPROC_SEQ_FOPS_RO_TYPE(mdc, filesfree);
184 LPROC_SEQ_FOPS_RO_TYPE(mdc, server_uuid);
185 LPROC_SEQ_FOPS_RO_TYPE(mdc, conn_uuid);
186 LPROC_SEQ_FOPS_RO_TYPE(mdc, timeouts);
187 LPROC_SEQ_FOPS_RO_TYPE(mdc, state);
188
189 static int mdc_obd_max_pages_per_rpc_seq_show(struct seq_file *m, void *v)
190 {
191         return lprocfs_obd_max_pages_per_rpc_seq_show(m, m->private);
192 }
193 LPROC_SEQ_FOPS_RO(mdc_obd_max_pages_per_rpc);
194
195 LPROC_SEQ_FOPS_RW_TYPE(mdc, import);
196 LPROC_SEQ_FOPS_RW_TYPE(mdc, pinger_recov);
197
198 struct lprocfs_vars lprocfs_mdc_obd_vars[] = {
199         { .name =       "uuid",
200           .fops =       &mdc_uuid_fops          },
201         { .name =       "ping",
202           .fops =       &mdc_ping_fops,
203           .proc_mode =  0222                    },
204         { .name =       "connect_flags",
205           .fops =       &mdc_connect_flags_fops },
206         { .name =       "blocksize",
207           .fops =       &mdc_blksize_fops       },
208         { .name =       "kbytestotal",
209           .fops =       &mdc_kbytestotal_fops   },
210         { .name =       "kbytesfree",
211           .fops =       &mdc_kbytesfree_fops    },
212         { .name =       "kbytesavail",
213           .fops =       &mdc_kbytesavail_fops   },
214         { .name =       "filestotal",
215           .fops =       &mdc_filestotal_fops    },
216         { .name =       "filesfree",
217           .fops =       &mdc_filesfree_fops     },
218         { .name =       "mds_server_uuid",
219           .fops =       &mdc_server_uuid_fops   },
220         { .name =       "mds_conn_uuid",
221           .fops =       &mdc_conn_uuid_fops     },
222         /*
223          * FIXME: below proc entry is provided, but not in used, instead
224          * sbi->sb_md_brw_size is used, the per obd variable should be used
225          * when CMD is enabled, and dir pages are managed in MDC layer.
226          * Remember to enable proc write function.
227          */
228         { .name =       "max_pages_per_rpc",
229           .fops =       &mdc_obd_max_pages_per_rpc_fops },
230         { .name =       "max_rpcs_in_flight",
231           .fops =       &mdc_max_rpcs_in_flight_fops    },
232         { .name =       "max_mod_rpcs_in_flight",
233           .fops =       &mdc_max_mod_rpcs_in_flight_fops        },
234         { .name =       "timeouts",
235           .fops =       &mdc_timeouts_fops              },
236         { .name =       "import",
237           .fops =       &mdc_import_fops                },
238         { .name =       "state",
239           .fops =       &mdc_state_fops                 },
240         { .name =       "pinger_recov",
241           .fops =       &mdc_pinger_recov_fops          },
242         { .name =       "rpc_stats",
243           .fops =       &mdc_rpc_stats_fops             },
244         { .name =       "active",
245           .fops =       &mdc_active_fops                },
246         { NULL }
247 };
248 #endif /* CONFIG_PROC_FS */