Whamcloud - gitweb
LU-3963 libcfs: convert ptlrpc,quota plus others to linux atomics
[fs/lustre-release.git] / lustre / ptlrpc / sec_lproc.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.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 /*
31  * This file is part of Lustre, http://www.lustre.org/
32  * Lustre is a trademark of Sun Microsystems, Inc.
33  *
34  * lustre/ptlrpc/sec_lproc.c
35  *
36  * Author: Eric Mei <ericm@clusterfs.com>
37  */
38
39 #define DEBUG_SUBSYSTEM S_SEC
40
41 #include <libcfs/libcfs.h>
42 #ifndef __KERNEL__
43 #include <liblustre.h>
44 #include <libcfs/list.h>
45 #else
46 #include <linux/crypto.h>
47 #endif
48
49 #include <obd.h>
50 #include <obd_class.h>
51 #include <obd_support.h>
52 #include <lustre_net.h>
53 #include <lustre_import.h>
54 #include <lustre_dlm.h>
55 #include <lustre_sec.h>
56
57 #include "ptlrpc_internal.h"
58
59 #ifdef __KERNEL__
60
61 struct proc_dir_entry *sptlrpc_proc_root = NULL;
62 EXPORT_SYMBOL(sptlrpc_proc_root);
63
64 char *sec_flags2str(unsigned long flags, char *buf, int bufsize)
65 {
66         buf[0] = '\0';
67
68         if (flags & PTLRPC_SEC_FL_REVERSE)
69                 strlcat(buf, "reverse,", bufsize);
70         if (flags & PTLRPC_SEC_FL_ROOTONLY)
71                 strlcat(buf, "rootonly,", bufsize);
72         if (flags & PTLRPC_SEC_FL_UDESC)
73                 strlcat(buf, "udesc,", bufsize);
74         if (flags & PTLRPC_SEC_FL_BULK)
75                 strlcat(buf, "bulk,", bufsize);
76         if (buf[0] == '\0')
77                 strlcat(buf, "-,", bufsize);
78
79         return buf;
80 }
81
82 static int sptlrpc_info_lprocfs_seq_show(struct seq_file *seq, void *v)
83 {
84         struct obd_device *dev = seq->private;
85         struct client_obd *cli = &dev->u.cli;
86         struct ptlrpc_sec *sec = NULL;
87         char               str[32];
88
89         LASSERT(strcmp(dev->obd_type->typ_name, LUSTRE_OSC_NAME) == 0 ||
90                 strcmp(dev->obd_type->typ_name, LUSTRE_MDC_NAME) == 0 ||
91                 strcmp(dev->obd_type->typ_name, LUSTRE_MGC_NAME) == 0);
92
93         if (cli->cl_import)
94                 sec = sptlrpc_import_sec_ref(cli->cl_import);
95         if (sec == NULL)
96                 goto out;
97
98         sec_flags2str(sec->ps_flvr.sf_flags, str, sizeof(str));
99
100         seq_printf(seq, "rpc flavor:    %s\n",
101                    sptlrpc_flavor2name_base(sec->ps_flvr.sf_rpc));
102         seq_printf(seq, "bulk flavor:   %s\n",
103                    sptlrpc_flavor2name_bulk(&sec->ps_flvr, str, sizeof(str)));
104         seq_printf(seq, "flags:         %s\n",
105                    sec_flags2str(sec->ps_flvr.sf_flags, str, sizeof(str)));
106         seq_printf(seq, "id:            %d\n", sec->ps_id);
107         seq_printf(seq, "refcount:      %d\n",
108                    atomic_read(&sec->ps_refcount));
109         seq_printf(seq, "nctx:  %d\n", atomic_read(&sec->ps_nctx));
110         seq_printf(seq, "gc internal    %ld\n", sec->ps_gc_interval);
111         seq_printf(seq, "gc next        %ld\n",
112                    sec->ps_gc_interval ?
113                    sec->ps_gc_next - cfs_time_current_sec() : 0);
114
115         sptlrpc_sec_put(sec);
116 out:
117         return 0;
118 }
119 LPROC_SEQ_FOPS_RO(sptlrpc_info_lprocfs);
120
121 static int sptlrpc_ctxs_lprocfs_seq_show(struct seq_file *seq, void *v)
122 {
123         struct obd_device *dev = seq->private;
124         struct client_obd *cli = &dev->u.cli;
125         struct ptlrpc_sec *sec = NULL;
126
127         LASSERT(strcmp(dev->obd_type->typ_name, LUSTRE_OSC_NAME) == 0 ||
128                 strcmp(dev->obd_type->typ_name, LUSTRE_MDC_NAME) == 0 ||
129                 strcmp(dev->obd_type->typ_name, LUSTRE_MGC_NAME) == 0);
130
131         if (cli->cl_import)
132                 sec = sptlrpc_import_sec_ref(cli->cl_import);
133         if (sec == NULL)
134                 goto out;
135
136         if (sec->ps_policy->sp_cops->display)
137                 sec->ps_policy->sp_cops->display(sec, seq);
138
139         sptlrpc_sec_put(sec);
140 out:
141         return 0;
142 }
143 LPROC_SEQ_FOPS_RO(sptlrpc_ctxs_lprocfs);
144
145 int sptlrpc_lprocfs_cliobd_attach(struct obd_device *dev)
146 {
147         int     rc;
148
149         if (strcmp(dev->obd_type->typ_name, LUSTRE_OSC_NAME) != 0 &&
150             strcmp(dev->obd_type->typ_name, LUSTRE_MDC_NAME) != 0 &&
151             strcmp(dev->obd_type->typ_name, LUSTRE_MGC_NAME) != 0) {
152                 CERROR("can't register lproc for obd type %s\n",
153                        dev->obd_type->typ_name);
154                 return -EINVAL;
155         }
156
157         rc = lprocfs_obd_seq_create(dev, "srpc_info", 0444,
158                                     &sptlrpc_info_lprocfs_fops, dev);
159         if (rc) {
160                 CERROR("create proc entry srpc_info for %s: %d\n",
161                        dev->obd_name, rc);
162                 return rc;
163         }
164
165         rc = lprocfs_obd_seq_create(dev, "srpc_contexts", 0444,
166                                     &sptlrpc_ctxs_lprocfs_fops, dev);
167         if (rc) {
168                 CERROR("create proc entry srpc_contexts for %s: %d\n",
169                        dev->obd_name, rc);
170                 return rc;
171         }
172
173         return 0;
174 }
175 EXPORT_SYMBOL(sptlrpc_lprocfs_cliobd_attach);
176
177 LPROC_SEQ_FOPS_RO(sptlrpc_proc_enc_pool);
178 static struct lprocfs_seq_vars sptlrpc_lprocfs_vars[] = {
179         { .name =       "encrypt_page_pools",
180           .fops =       &sptlrpc_proc_enc_pool_fops     },
181         { NULL }
182 };
183
184 int sptlrpc_lproc_init(void)
185 {
186         int rc;
187
188         LASSERT(sptlrpc_proc_root == NULL);
189
190         sptlrpc_proc_root = lprocfs_seq_register("sptlrpc", proc_lustre_root,
191                                                  sptlrpc_lprocfs_vars, NULL);
192         if (IS_ERR(sptlrpc_proc_root)) {
193                 rc = PTR_ERR(sptlrpc_proc_root);
194                 sptlrpc_proc_root = NULL;
195                 return rc;
196         }
197         return 0;
198 }
199
200 void sptlrpc_lproc_fini(void)
201 {
202         if (sptlrpc_proc_root) {
203                 lprocfs_remove(&sptlrpc_proc_root);
204                 sptlrpc_proc_root = NULL;
205         }
206 }
207
208 #else /* !__KERNEL__ */
209
210 int sptlrpc_lprocfs_cliobd_attach(struct obd_device *dev)
211 {
212         return 0;
213 }
214
215 int sptlrpc_lproc_init(void)
216 {
217         return 0;
218 }
219
220 void sptlrpc_lproc_fini(void)
221 {
222 }
223
224 #endif