OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [lockd/] [mon.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * linux/fs/lockd/mon.c
3
 *
4
 * The kernel statd client.
5
 *
6
 * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
7
 */
8
 
9
#include <linux/types.h>
10
#include <linux/utsname.h>
11
#include <linux/kernel.h>
12
#include <linux/sunrpc/clnt.h>
13
#include <linux/sunrpc/xprtsock.h>
14
#include <linux/sunrpc/svc.h>
15
#include <linux/lockd/lockd.h>
16
#include <linux/lockd/sm_inter.h>
17
 
18
 
19
#define NLMDBG_FACILITY         NLMDBG_MONITOR
20
 
21
static struct rpc_clnt *        nsm_create(void);
22
 
23
static struct rpc_program       nsm_program;
24
 
25
/*
26
 * Local NSM state
27
 */
28
int                             nsm_local_state;
29
 
30
/*
31
 * Common procedure for SM_MON/SM_UNMON calls
32
 */
33
static int
34
nsm_mon_unmon(struct nsm_handle *nsm, u32 proc, struct nsm_res *res)
35
{
36
        struct rpc_clnt *clnt;
37
        int             status;
38
        struct nsm_args args;
39
        struct rpc_message msg = {
40
                .rpc_argp       = &args,
41
                .rpc_resp       = res,
42
        };
43
 
44
        clnt = nsm_create();
45
        if (IS_ERR(clnt)) {
46
                status = PTR_ERR(clnt);
47
                goto out;
48
        }
49
 
50
        memset(&args, 0, sizeof(args));
51
        args.mon_name = nsm->sm_name;
52
        args.addr = nsm->sm_addr.sin_addr.s_addr;
53
        args.prog = NLM_PROGRAM;
54
        args.vers = 3;
55
        args.proc = NLMPROC_NSM_NOTIFY;
56
        memset(res, 0, sizeof(*res));
57
 
58
        msg.rpc_proc = &clnt->cl_procinfo[proc];
59
        status = rpc_call_sync(clnt, &msg, 0);
60
        if (status < 0)
61
                printk(KERN_DEBUG "nsm_mon_unmon: rpc failed, status=%d\n",
62
                        status);
63
        else
64
                status = 0;
65
        rpc_shutdown_client(clnt);
66
 out:
67
        return status;
68
}
69
 
70
/*
71
 * Set up monitoring of a remote host
72
 */
73
int
74
nsm_monitor(struct nlm_host *host)
75
{
76
        struct nsm_handle *nsm = host->h_nsmhandle;
77
        struct nsm_res  res;
78
        int             status;
79
 
80
        dprintk("lockd: nsm_monitor(%s)\n", host->h_name);
81
        BUG_ON(nsm == NULL);
82
 
83
        if (nsm->sm_monitored)
84
                return 0;
85
 
86
        status = nsm_mon_unmon(nsm, SM_MON, &res);
87
 
88
        if (status < 0 || res.status != 0)
89
                printk(KERN_NOTICE "lockd: cannot monitor %s\n", host->h_name);
90
        else
91
                nsm->sm_monitored = 1;
92
        return status;
93
}
94
 
95
/*
96
 * Cease to monitor remote host
97
 */
98
int
99
nsm_unmonitor(struct nlm_host *host)
100
{
101
        struct nsm_handle *nsm = host->h_nsmhandle;
102
        struct nsm_res  res;
103
        int             status = 0;
104
 
105
        if (nsm == NULL)
106
                return 0;
107
        host->h_nsmhandle = NULL;
108
 
109
        if (atomic_read(&nsm->sm_count) == 1
110
         && nsm->sm_monitored && !nsm->sm_sticky) {
111
                dprintk("lockd: nsm_unmonitor(%s)\n", host->h_name);
112
 
113
                status = nsm_mon_unmon(nsm, SM_UNMON, &res);
114
                if (status < 0)
115
                        printk(KERN_NOTICE "lockd: cannot unmonitor %s\n",
116
                                        host->h_name);
117
                else
118
                        nsm->sm_monitored = 0;
119
        }
120
        nsm_release(nsm);
121
        return status;
122
}
123
 
124
/*
125
 * Create NSM client for the local host
126
 */
127
static struct rpc_clnt *
128
nsm_create(void)
129
{
130
        struct sockaddr_in      sin = {
131
                .sin_family     = AF_INET,
132
                .sin_addr.s_addr = htonl(INADDR_LOOPBACK),
133
                .sin_port       = 0,
134
        };
135
        struct rpc_create_args args = {
136
                .protocol       = XPRT_TRANSPORT_UDP,
137
                .address        = (struct sockaddr *)&sin,
138
                .addrsize       = sizeof(sin),
139
                .servername     = "localhost",
140
                .program        = &nsm_program,
141
                .version        = SM_VERSION,
142
                .authflavor     = RPC_AUTH_NULL,
143
        };
144
 
145
        return rpc_create(&args);
146
}
147
 
148
/*
149
 * XDR functions for NSM.
150
 */
151
 
152
static __be32 *
153
xdr_encode_common(struct rpc_rqst *rqstp, __be32 *p, struct nsm_args *argp)
154
{
155
        char    buffer[20], *name;
156
 
157
        /*
158
         * Use the dotted-quad IP address of the remote host as
159
         * identifier. Linux statd always looks up the canonical
160
         * hostname first for whatever remote hostname it receives,
161
         * so this works alright.
162
         */
163
        if (nsm_use_hostnames) {
164
                name = argp->mon_name;
165
        } else {
166
                sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(argp->addr));
167
                name = buffer;
168
        }
169
        if (!(p = xdr_encode_string(p, name))
170
         || !(p = xdr_encode_string(p, utsname()->nodename)))
171
                return ERR_PTR(-EIO);
172
        *p++ = htonl(argp->prog);
173
        *p++ = htonl(argp->vers);
174
        *p++ = htonl(argp->proc);
175
 
176
        return p;
177
}
178
 
179
static int
180
xdr_encode_mon(struct rpc_rqst *rqstp, __be32 *p, struct nsm_args *argp)
181
{
182
        p = xdr_encode_common(rqstp, p, argp);
183
        if (IS_ERR(p))
184
                return PTR_ERR(p);
185
 
186
        /* Surprise - there may even be room for an IPv6 address now */
187
        *p++ = argp->addr;
188
        *p++ = 0;
189
        *p++ = 0;
190
        *p++ = 0;
191
        rqstp->rq_slen = xdr_adjust_iovec(rqstp->rq_svec, p);
192
        return 0;
193
}
194
 
195
static int
196
xdr_encode_unmon(struct rpc_rqst *rqstp, __be32 *p, struct nsm_args *argp)
197
{
198
        p = xdr_encode_common(rqstp, p, argp);
199
        if (IS_ERR(p))
200
                return PTR_ERR(p);
201
        rqstp->rq_slen = xdr_adjust_iovec(rqstp->rq_svec, p);
202
        return 0;
203
}
204
 
205
static int
206
xdr_decode_stat_res(struct rpc_rqst *rqstp, __be32 *p, struct nsm_res *resp)
207
{
208
        resp->status = ntohl(*p++);
209
        resp->state = ntohl(*p++);
210
        dprintk("nsm: xdr_decode_stat_res status %d state %d\n",
211
                        resp->status, resp->state);
212
        return 0;
213
}
214
 
215
static int
216
xdr_decode_stat(struct rpc_rqst *rqstp, __be32 *p, struct nsm_res *resp)
217
{
218
        resp->state = ntohl(*p++);
219
        return 0;
220
}
221
 
222
#define SM_my_name_sz   (1+XDR_QUADLEN(SM_MAXSTRLEN))
223
#define SM_my_id_sz     (3+1+SM_my_name_sz)
224
#define SM_mon_id_sz    (1+XDR_QUADLEN(20)+SM_my_id_sz)
225
#define SM_mon_sz       (SM_mon_id_sz+4)
226
#define SM_monres_sz    2
227
#define SM_unmonres_sz  1
228
 
229
static struct rpc_procinfo      nsm_procedures[] = {
230
[SM_MON] = {
231
                .p_proc         = SM_MON,
232
                .p_encode       = (kxdrproc_t) xdr_encode_mon,
233
                .p_decode       = (kxdrproc_t) xdr_decode_stat_res,
234
                .p_arglen       = SM_mon_sz,
235
                .p_replen       = SM_monres_sz,
236
                .p_statidx      = SM_MON,
237
                .p_name         = "MONITOR",
238
        },
239
[SM_UNMON] = {
240
                .p_proc         = SM_UNMON,
241
                .p_encode       = (kxdrproc_t) xdr_encode_unmon,
242
                .p_decode       = (kxdrproc_t) xdr_decode_stat,
243
                .p_arglen       = SM_mon_id_sz,
244
                .p_replen       = SM_unmonres_sz,
245
                .p_statidx      = SM_UNMON,
246
                .p_name         = "UNMONITOR",
247
        },
248
};
249
 
250
static struct rpc_version       nsm_version1 = {
251
                .number         = 1,
252
                .nrprocs        = ARRAY_SIZE(nsm_procedures),
253
                .procs          = nsm_procedures
254
};
255
 
256
static struct rpc_version *     nsm_version[] = {
257
        [1] = &nsm_version1,
258
};
259
 
260
static struct rpc_stat          nsm_stats;
261
 
262
static struct rpc_program       nsm_program = {
263
                .name           = "statd",
264
                .number         = SM_PROGRAM,
265
                .nrvers         = ARRAY_SIZE(nsm_version),
266
                .version        = nsm_version,
267
                .stats          = &nsm_stats
268
};

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.