Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh...
[pandora-kernel.git] / fs / ceph / auth_none.c
1
2 #include "ceph_debug.h"
3
4 #include <linux/err.h>
5 #include <linux/module.h>
6 #include <linux/random.h>
7 #include <linux/slab.h>
8
9 #include "auth_none.h"
10 #include "auth.h"
11 #include "decode.h"
12
13 static void reset(struct ceph_auth_client *ac)
14 {
15         struct ceph_auth_none_info *xi = ac->private;
16
17         xi->starting = true;
18         xi->built_authorizer = false;
19 }
20
21 static void destroy(struct ceph_auth_client *ac)
22 {
23         kfree(ac->private);
24         ac->private = NULL;
25 }
26
27 static int is_authenticated(struct ceph_auth_client *ac)
28 {
29         struct ceph_auth_none_info *xi = ac->private;
30
31         return !xi->starting;
32 }
33
34 /*
35  * the generic auth code decode the global_id, and we carry no actual
36  * authenticate state, so nothing happens here.
37  */
38 static int handle_reply(struct ceph_auth_client *ac, int result,
39                         void *buf, void *end)
40 {
41         struct ceph_auth_none_info *xi = ac->private;
42
43         xi->starting = false;
44         return result;
45 }
46
47 /*
48  * build an 'authorizer' with our entity_name and global_id.  we can
49  * reuse a single static copy since it is identical for all services
50  * we connect to.
51  */
52 static int ceph_auth_none_create_authorizer(
53         struct ceph_auth_client *ac, int peer_type,
54         struct ceph_authorizer **a,
55         void **buf, size_t *len,
56         void **reply_buf, size_t *reply_len)
57 {
58         struct ceph_auth_none_info *ai = ac->private;
59         struct ceph_none_authorizer *au = &ai->au;
60         void *p, *end;
61         int ret;
62
63         if (!ai->built_authorizer) {
64                 p = au->buf;
65                 end = p + sizeof(au->buf);
66                 ceph_encode_8(&p, 1);
67                 ret = ceph_entity_name_encode(ac->name, &p, end - 8);
68                 if (ret < 0)
69                         goto bad;
70                 ceph_decode_need(&p, end, sizeof(u64), bad2);
71                 ceph_encode_64(&p, ac->global_id);
72                 au->buf_len = p - (void *)au->buf;
73                 ai->built_authorizer = true;
74                 dout("built authorizer len %d\n", au->buf_len);
75         }
76
77         *a = (struct ceph_authorizer *)au;
78         *buf = au->buf;
79         *len = au->buf_len;
80         *reply_buf = au->reply_buf;
81         *reply_len = sizeof(au->reply_buf);
82         return 0;
83
84 bad2:
85         ret = -ERANGE;
86 bad:
87         return ret;
88 }
89
90 static void ceph_auth_none_destroy_authorizer(struct ceph_auth_client *ac,
91                                       struct ceph_authorizer *a)
92 {
93         /* nothing to do */
94 }
95
96 static const struct ceph_auth_client_ops ceph_auth_none_ops = {
97         .name = "none",
98         .reset = reset,
99         .destroy = destroy,
100         .is_authenticated = is_authenticated,
101         .handle_reply = handle_reply,
102         .create_authorizer = ceph_auth_none_create_authorizer,
103         .destroy_authorizer = ceph_auth_none_destroy_authorizer,
104 };
105
106 int ceph_auth_none_init(struct ceph_auth_client *ac)
107 {
108         struct ceph_auth_none_info *xi;
109
110         dout("ceph_auth_none_init %p\n", ac);
111         xi = kzalloc(sizeof(*xi), GFP_NOFS);
112         if (!xi)
113                 return -ENOMEM;
114
115         xi->starting = true;
116         xi->built_authorizer = false;
117
118         ac->protocol = CEPH_AUTH_NONE;
119         ac->private = xi;
120         ac->ops = &ceph_auth_none_ops;
121         return 0;
122 }
123