blob: 1ce908c2232c38bf0e6fd71d7ec15a4fa60251c2 [file] [log] [blame]
David Teigland597d0ca2006-07-12 16:44:04 -05001/*
David Teigland7fe2b312010-02-24 11:08:18 -06002 * Copyright (C) 2006-2010 Red Hat, Inc. All rights reserved.
David Teigland597d0ca2006-07-12 16:44:04 -05003 *
4 * This copyrighted material is made available to anyone wishing to use,
5 * modify, copy, or redistribute it subject to the terms and conditions
6 * of the GNU General Public License v.2.
7 */
8
9#include <linux/miscdevice.h>
10#include <linux/init.h>
11#include <linux/wait.h>
David Teigland597d0ca2006-07-12 16:44:04 -050012#include <linux/file.h>
13#include <linux/fs.h>
14#include <linux/poll.h>
15#include <linux/signal.h>
16#include <linux/spinlock.h>
17#include <linux/dlm.h>
18#include <linux/dlm_device.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090019#include <linux/slab.h>
David Teigland597d0ca2006-07-12 16:44:04 -050020
21#include "dlm_internal.h"
22#include "lockspace.h"
23#include "lock.h"
24#include "lvb_table.h"
Adrian Bunk84c6e8c2007-02-26 00:18:42 +010025#include "user.h"
David Teigland8304d6f2011-02-21 14:58:21 -060026#include "ast.h"
David Teigland597d0ca2006-07-12 16:44:04 -050027
Denis Cheng0fe410d2008-01-29 13:50:16 +080028static const char name_prefix[] = "dlm";
Arjan van de Ven00977a52007-02-12 00:55:34 -080029static const struct file_operations device_fops;
David Teiglanddc68c7e2008-08-18 11:43:30 -050030static atomic_t dlm_monitor_opened;
31static int dlm_monitor_unused = 1;
David Teigland597d0ca2006-07-12 16:44:04 -050032
33#ifdef CONFIG_COMPAT
34
35struct dlm_lock_params32 {
36 __u8 mode;
37 __u8 namelen;
David Teiglandd7db9232007-05-18 09:00:32 -050038 __u16 unused;
39 __u32 flags;
David Teigland597d0ca2006-07-12 16:44:04 -050040 __u32 lkid;
41 __u32 parent;
David Teiglandd7db9232007-05-18 09:00:32 -050042 __u64 xid;
43 __u64 timeout;
David Teigland597d0ca2006-07-12 16:44:04 -050044 __u32 castparam;
45 __u32 castaddr;
46 __u32 bastparam;
47 __u32 bastaddr;
48 __u32 lksb;
David Teigland597d0ca2006-07-12 16:44:04 -050049 char lvb[DLM_USER_LVB_LEN];
50 char name[0];
51};
52
53struct dlm_write_request32 {
54 __u32 version[3];
55 __u8 cmd;
56 __u8 is64bit;
57 __u8 unused[2];
58
59 union {
60 struct dlm_lock_params32 lock;
61 struct dlm_lspace_params lspace;
David Teigland72c2be72007-03-30 15:06:16 -050062 struct dlm_purge_params purge;
David Teigland597d0ca2006-07-12 16:44:04 -050063 } i;
64};
65
66struct dlm_lksb32 {
67 __u32 sb_status;
68 __u32 sb_lkid;
69 __u8 sb_flags;
70 __u32 sb_lvbptr;
71};
72
73struct dlm_lock_result32 {
David Teiglandd7db9232007-05-18 09:00:32 -050074 __u32 version[3];
David Teigland597d0ca2006-07-12 16:44:04 -050075 __u32 length;
76 __u32 user_astaddr;
77 __u32 user_astparam;
78 __u32 user_lksb;
79 struct dlm_lksb32 lksb;
80 __u8 bast_mode;
81 __u8 unused[3];
82 /* Offsets may be zero if no data is present */
83 __u32 lvb_offset;
84};
85
86static void compat_input(struct dlm_write_request *kb,
Patrick Caulfeld2a792892008-01-17 10:25:28 +000087 struct dlm_write_request32 *kb32,
David Teigland1fecb1c2009-03-04 11:17:23 -060088 int namelen)
David Teigland597d0ca2006-07-12 16:44:04 -050089{
90 kb->version[0] = kb32->version[0];
91 kb->version[1] = kb32->version[1];
92 kb->version[2] = kb32->version[2];
93
94 kb->cmd = kb32->cmd;
95 kb->is64bit = kb32->is64bit;
96 if (kb->cmd == DLM_USER_CREATE_LOCKSPACE ||
97 kb->cmd == DLM_USER_REMOVE_LOCKSPACE) {
98 kb->i.lspace.flags = kb32->i.lspace.flags;
99 kb->i.lspace.minor = kb32->i.lspace.minor;
David Teigland1fecb1c2009-03-04 11:17:23 -0600100 memcpy(kb->i.lspace.name, kb32->i.lspace.name, namelen);
David Teigland72c2be72007-03-30 15:06:16 -0500101 } else if (kb->cmd == DLM_USER_PURGE) {
102 kb->i.purge.nodeid = kb32->i.purge.nodeid;
103 kb->i.purge.pid = kb32->i.purge.pid;
David Teigland597d0ca2006-07-12 16:44:04 -0500104 } else {
105 kb->i.lock.mode = kb32->i.lock.mode;
106 kb->i.lock.namelen = kb32->i.lock.namelen;
107 kb->i.lock.flags = kb32->i.lock.flags;
108 kb->i.lock.lkid = kb32->i.lock.lkid;
109 kb->i.lock.parent = kb32->i.lock.parent;
David Teiglandd7db9232007-05-18 09:00:32 -0500110 kb->i.lock.xid = kb32->i.lock.xid;
111 kb->i.lock.timeout = kb32->i.lock.timeout;
David Teigland597d0ca2006-07-12 16:44:04 -0500112 kb->i.lock.castparam = (void *)(long)kb32->i.lock.castparam;
113 kb->i.lock.castaddr = (void *)(long)kb32->i.lock.castaddr;
114 kb->i.lock.bastparam = (void *)(long)kb32->i.lock.bastparam;
115 kb->i.lock.bastaddr = (void *)(long)kb32->i.lock.bastaddr;
116 kb->i.lock.lksb = (void *)(long)kb32->i.lock.lksb;
117 memcpy(kb->i.lock.lvb, kb32->i.lock.lvb, DLM_USER_LVB_LEN);
David Teigland1fecb1c2009-03-04 11:17:23 -0600118 memcpy(kb->i.lock.name, kb32->i.lock.name, namelen);
David Teigland597d0ca2006-07-12 16:44:04 -0500119 }
120}
121
122static void compat_output(struct dlm_lock_result *res,
123 struct dlm_lock_result32 *res32)
124{
David Teiglandd7db9232007-05-18 09:00:32 -0500125 res32->version[0] = res->version[0];
126 res32->version[1] = res->version[1];
127 res32->version[2] = res->version[2];
128
David Teigland597d0ca2006-07-12 16:44:04 -0500129 res32->user_astaddr = (__u32)(long)res->user_astaddr;
130 res32->user_astparam = (__u32)(long)res->user_astparam;
131 res32->user_lksb = (__u32)(long)res->user_lksb;
132 res32->bast_mode = res->bast_mode;
133
134 res32->lvb_offset = res->lvb_offset;
135 res32->length = res->length;
136
137 res32->lksb.sb_status = res->lksb.sb_status;
138 res32->lksb.sb_flags = res->lksb.sb_flags;
139 res32->lksb.sb_lkid = res->lksb.sb_lkid;
140 res32->lksb.sb_lvbptr = (__u32)(long)res->lksb.sb_lvbptr;
141}
142#endif
143
David Teigland84d8cd62007-05-29 08:44:23 -0500144/* Figure out if this lock is at the end of its life and no longer
145 available for the application to use. The lkb still exists until
146 the final ast is read. A lock becomes EOL in three situations:
147 1. a noqueue request fails with EAGAIN
148 2. an unlock completes with EUNLOCK
149 3. a cancel of a waiting request completes with ECANCEL/EDEADLK
150 An EOL lock needs to be removed from the process's list of locks.
151 And we can't allow any new operation on an EOL lock. This is
152 not related to the lifetime of the lkb struct which is managed
153 entirely by refcount. */
154
David Teigland8304d6f2011-02-21 14:58:21 -0600155static int lkb_is_endoflife(int mode, int status)
David Teigland84d8cd62007-05-29 08:44:23 -0500156{
David Teigland8304d6f2011-02-21 14:58:21 -0600157 switch (status) {
David Teigland84d8cd62007-05-29 08:44:23 -0500158 case -DLM_EUNLOCK:
159 return 1;
160 case -DLM_ECANCEL:
161 case -ETIMEDOUT:
David Teigland8b4021f2007-05-29 08:46:00 -0500162 case -EDEADLK:
David Teigland84d8cd62007-05-29 08:44:23 -0500163 case -EAGAIN:
David Teigland8304d6f2011-02-21 14:58:21 -0600164 if (mode == DLM_LOCK_IV)
David Teigland84d8cd62007-05-29 08:44:23 -0500165 return 1;
166 break;
167 }
168 return 0;
169}
170
David Teiglandef0c2bb2007-03-28 09:56:46 -0500171/* we could possibly check if the cancel of an orphan has resulted in the lkb
172 being removed and then remove that lkb from the orphans list and free it */
David Teigland597d0ca2006-07-12 16:44:04 -0500173
David Teigland8304d6f2011-02-21 14:58:21 -0600174void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode,
175 int status, uint32_t sbflags, uint64_t seq)
David Teigland597d0ca2006-07-12 16:44:04 -0500176{
177 struct dlm_ls *ls;
178 struct dlm_user_args *ua;
179 struct dlm_user_proc *proc;
David Teigland8304d6f2011-02-21 14:58:21 -0600180 int rv;
David Teigland597d0ca2006-07-12 16:44:04 -0500181
David Teiglandef0c2bb2007-03-28 09:56:46 -0500182 if (lkb->lkb_flags & (DLM_IFL_ORPHAN | DLM_IFL_DEAD))
David Teigland597d0ca2006-07-12 16:44:04 -0500183 return;
David Teigland597d0ca2006-07-12 16:44:04 -0500184
185 ls = lkb->lkb_resource->res_ls;
186 mutex_lock(&ls->ls_clear_proc_locks);
187
188 /* If ORPHAN/DEAD flag is set, it means the process is dead so an ast
189 can't be delivered. For ORPHAN's, dlm_clear_proc_locks() freed
David Teiglandef0c2bb2007-03-28 09:56:46 -0500190 lkb->ua so we can't try to use it. This second check is necessary
191 for cases where a completion ast is received for an operation that
192 began before clear_proc_locks did its cancel/unlock. */
David Teigland597d0ca2006-07-12 16:44:04 -0500193
David Teiglandef0c2bb2007-03-28 09:56:46 -0500194 if (lkb->lkb_flags & (DLM_IFL_ORPHAN | DLM_IFL_DEAD))
David Teigland597d0ca2006-07-12 16:44:04 -0500195 goto out;
David Teigland597d0ca2006-07-12 16:44:04 -0500196
David Teiglandd292c0c2008-02-06 23:27:04 -0600197 DLM_ASSERT(lkb->lkb_ua, dlm_print_lkb(lkb););
198 ua = lkb->lkb_ua;
David Teigland597d0ca2006-07-12 16:44:04 -0500199 proc = ua->proc;
200
David Teigland8304d6f2011-02-21 14:58:21 -0600201 if ((flags & DLM_CB_BAST) && ua->bastaddr == NULL)
David Teigland597d0ca2006-07-12 16:44:04 -0500202 goto out;
203
David Teigland8304d6f2011-02-21 14:58:21 -0600204 if ((flags & DLM_CB_CAST) && lkb_is_endoflife(mode, status))
205 lkb->lkb_flags |= DLM_IFL_ENDOFLIFE;
206
David Teigland597d0ca2006-07-12 16:44:04 -0500207 spin_lock(&proc->asts_spin);
David Teiglandef0c2bb2007-03-28 09:56:46 -0500208
David Teigland8304d6f2011-02-21 14:58:21 -0600209 rv = dlm_add_lkb_callback(lkb, flags, mode, status, sbflags, seq);
210 if (rv < 0) {
211 spin_unlock(&proc->asts_spin);
212 goto out;
213 }
David Teiglandef0c2bb2007-03-28 09:56:46 -0500214
David Teigland23e8e1a2011-04-05 13:16:24 -0500215 if (list_empty(&lkb->lkb_cb_list)) {
David Teigland597d0ca2006-07-12 16:44:04 -0500216 kref_get(&lkb->lkb_ref);
David Teigland23e8e1a2011-04-05 13:16:24 -0500217 list_add_tail(&lkb->lkb_cb_list, &proc->asts);
David Teigland597d0ca2006-07-12 16:44:04 -0500218 wake_up_interruptible(&proc->wait);
219 }
David Teigland597d0ca2006-07-12 16:44:04 -0500220 spin_unlock(&proc->asts_spin);
David Teigland34e22be2006-07-18 11:24:04 -0500221
David Teigland8304d6f2011-02-21 14:58:21 -0600222 if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) {
223 /* N.B. spin_lock locks_spin, not asts_spin */
David Teiglandce5246b2008-01-14 15:48:58 -0600224 spin_lock(&proc->locks_spin);
David Teiglandef0c2bb2007-03-28 09:56:46 -0500225 if (!list_empty(&lkb->lkb_ownqueue)) {
226 list_del_init(&lkb->lkb_ownqueue);
227 dlm_put_lkb(lkb);
228 }
David Teiglandce5246b2008-01-14 15:48:58 -0600229 spin_unlock(&proc->locks_spin);
David Teigland34e22be2006-07-18 11:24:04 -0500230 }
David Teigland597d0ca2006-07-12 16:44:04 -0500231 out:
232 mutex_unlock(&ls->ls_clear_proc_locks);
233}
234
235static int device_user_lock(struct dlm_user_proc *proc,
236 struct dlm_lock_params *params)
237{
238 struct dlm_ls *ls;
239 struct dlm_user_args *ua;
David Teigland2ab4bd82014-10-17 11:05:50 -0500240 uint32_t lkid;
David Teigland597d0ca2006-07-12 16:44:04 -0500241 int error = -ENOMEM;
242
243 ls = dlm_find_lockspace_local(proc->lockspace);
244 if (!ls)
245 return -ENOENT;
246
247 if (!params->castaddr || !params->lksb) {
248 error = -EINVAL;
249 goto out;
250 }
251
David Teigland573c24c2009-11-30 16:34:43 -0600252 ua = kzalloc(sizeof(struct dlm_user_args), GFP_NOFS);
David Teigland597d0ca2006-07-12 16:44:04 -0500253 if (!ua)
254 goto out;
255 ua->proc = proc;
256 ua->user_lksb = params->lksb;
257 ua->castparam = params->castparam;
258 ua->castaddr = params->castaddr;
259 ua->bastparam = params->bastparam;
260 ua->bastaddr = params->bastaddr;
David Teiglandd7db9232007-05-18 09:00:32 -0500261 ua->xid = params->xid;
David Teigland597d0ca2006-07-12 16:44:04 -0500262
David Teigland2ab4bd82014-10-17 11:05:50 -0500263 if (params->flags & DLM_LKF_CONVERT) {
David Teigland597d0ca2006-07-12 16:44:04 -0500264 error = dlm_user_convert(ls, ua,
265 params->mode, params->flags,
David Teiglandd7db9232007-05-18 09:00:32 -0500266 params->lkid, params->lvb,
267 (unsigned long) params->timeout);
David Teigland2ab4bd82014-10-17 11:05:50 -0500268 } else if (params->flags & DLM_LKF_ORPHAN) {
269 error = dlm_user_adopt_orphan(ls, ua,
270 params->mode, params->flags,
271 params->name, params->namelen,
272 (unsigned long) params->timeout,
273 &lkid);
274 if (!error)
275 error = lkid;
276 } else {
David Teigland597d0ca2006-07-12 16:44:04 -0500277 error = dlm_user_request(ls, ua,
278 params->mode, params->flags,
279 params->name, params->namelen,
David Teiglandd7db9232007-05-18 09:00:32 -0500280 (unsigned long) params->timeout);
David Teigland597d0ca2006-07-12 16:44:04 -0500281 if (!error)
282 error = ua->lksb.sb_lkid;
283 }
284 out:
285 dlm_put_lockspace(ls);
286 return error;
287}
288
289static int device_user_unlock(struct dlm_user_proc *proc,
290 struct dlm_lock_params *params)
291{
292 struct dlm_ls *ls;
293 struct dlm_user_args *ua;
294 int error = -ENOMEM;
295
296 ls = dlm_find_lockspace_local(proc->lockspace);
297 if (!ls)
298 return -ENOENT;
299
David Teigland573c24c2009-11-30 16:34:43 -0600300 ua = kzalloc(sizeof(struct dlm_user_args), GFP_NOFS);
David Teigland597d0ca2006-07-12 16:44:04 -0500301 if (!ua)
302 goto out;
303 ua->proc = proc;
304 ua->user_lksb = params->lksb;
305 ua->castparam = params->castparam;
306 ua->castaddr = params->castaddr;
307
308 if (params->flags & DLM_LKF_CANCEL)
309 error = dlm_user_cancel(ls, ua, params->flags, params->lkid);
310 else
311 error = dlm_user_unlock(ls, ua, params->flags, params->lkid,
312 params->lvb);
313 out:
314 dlm_put_lockspace(ls);
315 return error;
316}
317
David Teigland8b4021f2007-05-29 08:46:00 -0500318static int device_user_deadlock(struct dlm_user_proc *proc,
319 struct dlm_lock_params *params)
320{
321 struct dlm_ls *ls;
322 int error;
323
324 ls = dlm_find_lockspace_local(proc->lockspace);
325 if (!ls)
326 return -ENOENT;
327
328 error = dlm_user_deadlock(ls, params->flags, params->lkid);
329
330 dlm_put_lockspace(ls);
331 return error;
332}
333
David Teigland0f8e0d92008-08-06 13:30:24 -0500334static int dlm_device_register(struct dlm_ls *ls, char *name)
Patrick Caulfield254da032007-03-21 09:23:53 +0000335{
336 int error, len;
337
David Teigland0f8e0d92008-08-06 13:30:24 -0500338 /* The device is already registered. This happens when the
339 lockspace is created multiple times from userspace. */
340 if (ls->ls_device.name)
341 return 0;
342
Patrick Caulfield254da032007-03-21 09:23:53 +0000343 error = -ENOMEM;
344 len = strlen(name) + strlen(name_prefix) + 2;
David Teigland573c24c2009-11-30 16:34:43 -0600345 ls->ls_device.name = kzalloc(len, GFP_NOFS);
Patrick Caulfield254da032007-03-21 09:23:53 +0000346 if (!ls->ls_device.name)
347 goto fail;
348
349 snprintf((char *)ls->ls_device.name, len, "%s_%s", name_prefix,
350 name);
351 ls->ls_device.fops = &device_fops;
352 ls->ls_device.minor = MISC_DYNAMIC_MINOR;
353
354 error = misc_register(&ls->ls_device);
355 if (error) {
356 kfree(ls->ls_device.name);
357 }
358fail:
359 return error;
360}
361
David Teigland0f8e0d92008-08-06 13:30:24 -0500362int dlm_device_deregister(struct dlm_ls *ls)
363{
David Teigland0f8e0d92008-08-06 13:30:24 -0500364 /* The device is not registered. This happens when the lockspace
365 was never used from userspace, or when device_create_lockspace()
366 calls dlm_release_lockspace() after the register fails. */
367 if (!ls->ls_device.name)
368 return 0;
369
Greg Kroah-Hartmanf368ed62015-07-30 15:59:57 -0700370 misc_deregister(&ls->ls_device);
371 kfree(ls->ls_device.name);
372 return 0;
David Teigland0f8e0d92008-08-06 13:30:24 -0500373}
374
David Teigland72c2be72007-03-30 15:06:16 -0500375static int device_user_purge(struct dlm_user_proc *proc,
376 struct dlm_purge_params *params)
377{
378 struct dlm_ls *ls;
379 int error;
380
381 ls = dlm_find_lockspace_local(proc->lockspace);
382 if (!ls)
383 return -ENOENT;
384
385 error = dlm_user_purge(ls, proc, params->nodeid, params->pid);
386
387 dlm_put_lockspace(ls);
388 return error;
389}
390
David Teigland597d0ca2006-07-12 16:44:04 -0500391static int device_create_lockspace(struct dlm_lspace_params *params)
392{
393 dlm_lockspace_t *lockspace;
394 struct dlm_ls *ls;
Patrick Caulfield254da032007-03-21 09:23:53 +0000395 int error;
David Teigland597d0ca2006-07-12 16:44:04 -0500396
397 if (!capable(CAP_SYS_ADMIN))
398 return -EPERM;
399
David Teigland60f98d12011-11-02 14:30:58 -0500400 error = dlm_new_lockspace(params->name, NULL, params->flags,
401 DLM_USER_LVB_LEN, NULL, NULL, NULL,
402 &lockspace);
David Teigland597d0ca2006-07-12 16:44:04 -0500403 if (error)
404 return error;
405
406 ls = dlm_find_lockspace_local(lockspace);
407 if (!ls)
408 return -ENOENT;
409
David Teigland0f8e0d92008-08-06 13:30:24 -0500410 error = dlm_device_register(ls, params->name);
David Teigland597d0ca2006-07-12 16:44:04 -0500411 dlm_put_lockspace(ls);
David Teigland597d0ca2006-07-12 16:44:04 -0500412
Patrick Caulfield254da032007-03-21 09:23:53 +0000413 if (error)
414 dlm_release_lockspace(lockspace, 0);
415 else
416 error = ls->ls_device.minor;
417
David Teigland597d0ca2006-07-12 16:44:04 -0500418 return error;
419}
420
421static int device_remove_lockspace(struct dlm_lspace_params *params)
422{
423 dlm_lockspace_t *lockspace;
424 struct dlm_ls *ls;
David Teiglandc6e6f0b2006-08-30 10:50:18 -0500425 int error, force = 0;
David Teigland597d0ca2006-07-12 16:44:04 -0500426
427 if (!capable(CAP_SYS_ADMIN))
428 return -EPERM;
429
430 ls = dlm_find_lockspace_device(params->minor);
431 if (!ls)
432 return -ENOENT;
433
David Teiglandc6e6f0b2006-08-30 10:50:18 -0500434 if (params->flags & DLM_USER_LSFLG_FORCEFREE)
435 force = 2;
436
David Teigland597d0ca2006-07-12 16:44:04 -0500437 lockspace = ls->ls_local_handle;
David Teigland597d0ca2006-07-12 16:44:04 -0500438 dlm_put_lockspace(ls);
David Teigland0f8e0d92008-08-06 13:30:24 -0500439
440 /* The final dlm_release_lockspace waits for references to go to
441 zero, so all processes will need to close their device for the
442 ls before the release will proceed. release also calls the
443 device_deregister above. Converting a positive return value
444 from release to zero means that userspace won't know when its
445 release was the final one, but it shouldn't need to know. */
446
David Teiglandc6e6f0b2006-08-30 10:50:18 -0500447 error = dlm_release_lockspace(lockspace, force);
David Teigland0f8e0d92008-08-06 13:30:24 -0500448 if (error > 0)
449 error = 0;
David Teigland597d0ca2006-07-12 16:44:04 -0500450 return error;
451}
452
453/* Check the user's version matches ours */
454static int check_version(struct dlm_write_request *req)
455{
456 if (req->version[0] != DLM_DEVICE_VERSION_MAJOR ||
457 (req->version[0] == DLM_DEVICE_VERSION_MAJOR &&
458 req->version[1] > DLM_DEVICE_VERSION_MINOR)) {
459
460 printk(KERN_DEBUG "dlm: process %s (%d) version mismatch "
461 "user (%d.%d.%d) kernel (%d.%d.%d)\n",
462 current->comm,
Pavel Emelyanovba25f9d2007-10-18 23:40:40 -0700463 task_pid_nr(current),
David Teigland597d0ca2006-07-12 16:44:04 -0500464 req->version[0],
465 req->version[1],
466 req->version[2],
467 DLM_DEVICE_VERSION_MAJOR,
468 DLM_DEVICE_VERSION_MINOR,
469 DLM_DEVICE_VERSION_PATCH);
470 return -EINVAL;
471 }
472 return 0;
473}
474
475/*
476 * device_write
477 *
478 * device_user_lock
479 * dlm_user_request -> request_lock
480 * dlm_user_convert -> convert_lock
481 *
482 * device_user_unlock
483 * dlm_user_unlock -> unlock_lock
484 * dlm_user_cancel -> cancel_lock
485 *
486 * device_create_lockspace
487 * dlm_new_lockspace
488 *
489 * device_remove_lockspace
490 * dlm_release_lockspace
491 */
492
493/* a write to a lockspace device is a lock or unlock request, a write
494 to the control device is to create/remove a lockspace */
495
496static ssize_t device_write(struct file *file, const char __user *buf,
497 size_t count, loff_t *ppos)
498{
499 struct dlm_user_proc *proc = file->private_data;
500 struct dlm_write_request *kbuf;
David Teigland597d0ca2006-07-12 16:44:04 -0500501 int error;
502
503#ifdef CONFIG_COMPAT
504 if (count < sizeof(struct dlm_write_request32))
505#else
506 if (count < sizeof(struct dlm_write_request))
507#endif
508 return -EINVAL;
509
David Teiglandd4b0bcf2013-02-04 15:31:22 -0600510 /*
511 * can't compare against COMPAT/dlm_write_request32 because
512 * we don't yet know if is64bit is zero
513 */
Sasha Levin2b75bc92012-09-09 16:16:58 +0200514 if (count > sizeof(struct dlm_write_request) + DLM_RESNAME_MAXLEN)
Sasha Levin2b75bc92012-09-09 16:16:58 +0200515 return -EINVAL;
516
Al Viro16e5c1f2015-12-24 00:06:05 -0500517 kbuf = memdup_user_nul(buf, count);
Al Viro117aa412016-01-21 17:41:23 -0500518 if (IS_ERR(kbuf))
Al Viro16e5c1f2015-12-24 00:06:05 -0500519 return PTR_ERR(kbuf);
David Teigland597d0ca2006-07-12 16:44:04 -0500520
521 if (check_version(kbuf)) {
522 error = -EBADE;
523 goto out_free;
524 }
525
526#ifdef CONFIG_COMPAT
527 if (!kbuf->is64bit) {
528 struct dlm_write_request32 *k32buf;
David Teigland1fecb1c2009-03-04 11:17:23 -0600529 int namelen = 0;
530
531 if (count > sizeof(struct dlm_write_request32))
532 namelen = count - sizeof(struct dlm_write_request32);
533
David Teigland597d0ca2006-07-12 16:44:04 -0500534 k32buf = (struct dlm_write_request32 *)kbuf;
David Teigland1fecb1c2009-03-04 11:17:23 -0600535
536 /* add 1 after namelen so that the name string is terminated */
537 kbuf = kzalloc(sizeof(struct dlm_write_request) + namelen + 1,
David Teigland573c24c2009-11-30 16:34:43 -0600538 GFP_NOFS);
David Teiglandcb980d92008-07-29 15:21:19 -0500539 if (!kbuf) {
540 kfree(k32buf);
David Teigland597d0ca2006-07-12 16:44:04 -0500541 return -ENOMEM;
David Teiglandcb980d92008-07-29 15:21:19 -0500542 }
David Teigland597d0ca2006-07-12 16:44:04 -0500543
544 if (proc)
545 set_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags);
David Teigland1fecb1c2009-03-04 11:17:23 -0600546
547 compat_input(kbuf, k32buf, namelen);
David Teigland597d0ca2006-07-12 16:44:04 -0500548 kfree(k32buf);
549 }
550#endif
551
552 /* do we really need this? can a write happen after a close? */
553 if ((kbuf->cmd == DLM_USER_LOCK || kbuf->cmd == DLM_USER_UNLOCK) &&
David Teiglandcb980d92008-07-29 15:21:19 -0500554 (proc && test_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags))) {
555 error = -EINVAL;
556 goto out_free;
557 }
David Teigland597d0ca2006-07-12 16:44:04 -0500558
David Teigland597d0ca2006-07-12 16:44:04 -0500559 error = -EINVAL;
560
561 switch (kbuf->cmd)
562 {
563 case DLM_USER_LOCK:
564 if (!proc) {
565 log_print("no locking on control device");
David Teiglandc6ca7bc2013-08-12 15:22:43 -0500566 goto out_free;
David Teigland597d0ca2006-07-12 16:44:04 -0500567 }
568 error = device_user_lock(proc, &kbuf->i.lock);
569 break;
570
571 case DLM_USER_UNLOCK:
572 if (!proc) {
573 log_print("no locking on control device");
David Teiglandc6ca7bc2013-08-12 15:22:43 -0500574 goto out_free;
David Teigland597d0ca2006-07-12 16:44:04 -0500575 }
576 error = device_user_unlock(proc, &kbuf->i.lock);
577 break;
578
David Teigland8b4021f2007-05-29 08:46:00 -0500579 case DLM_USER_DEADLOCK:
580 if (!proc) {
581 log_print("no locking on control device");
David Teiglandc6ca7bc2013-08-12 15:22:43 -0500582 goto out_free;
David Teigland8b4021f2007-05-29 08:46:00 -0500583 }
584 error = device_user_deadlock(proc, &kbuf->i.lock);
585 break;
586
David Teigland597d0ca2006-07-12 16:44:04 -0500587 case DLM_USER_CREATE_LOCKSPACE:
588 if (proc) {
589 log_print("create/remove only on control device");
David Teiglandc6ca7bc2013-08-12 15:22:43 -0500590 goto out_free;
David Teigland597d0ca2006-07-12 16:44:04 -0500591 }
592 error = device_create_lockspace(&kbuf->i.lspace);
593 break;
594
595 case DLM_USER_REMOVE_LOCKSPACE:
596 if (proc) {
597 log_print("create/remove only on control device");
David Teiglandc6ca7bc2013-08-12 15:22:43 -0500598 goto out_free;
David Teigland597d0ca2006-07-12 16:44:04 -0500599 }
600 error = device_remove_lockspace(&kbuf->i.lspace);
601 break;
602
David Teigland72c2be72007-03-30 15:06:16 -0500603 case DLM_USER_PURGE:
604 if (!proc) {
605 log_print("no locking on control device");
David Teiglandc6ca7bc2013-08-12 15:22:43 -0500606 goto out_free;
David Teigland72c2be72007-03-30 15:06:16 -0500607 }
608 error = device_user_purge(proc, &kbuf->i.purge);
609 break;
610
David Teigland597d0ca2006-07-12 16:44:04 -0500611 default:
612 log_print("Unknown command passed to DLM device : %d\n",
613 kbuf->cmd);
614 }
615
David Teigland597d0ca2006-07-12 16:44:04 -0500616 out_free:
617 kfree(kbuf);
618 return error;
619}
620
621/* Every process that opens the lockspace device has its own "proc" structure
622 hanging off the open file that's used to keep track of locks owned by the
623 process and asts that need to be delivered to the process. */
624
625static int device_open(struct inode *inode, struct file *file)
626{
627 struct dlm_user_proc *proc;
628 struct dlm_ls *ls;
629
630 ls = dlm_find_lockspace_device(iminor(inode));
David Teiglandf9f2ed42008-09-04 12:51:20 -0500631 if (!ls)
David Teigland597d0ca2006-07-12 16:44:04 -0500632 return -ENOENT;
633
David Teigland573c24c2009-11-30 16:34:43 -0600634 proc = kzalloc(sizeof(struct dlm_user_proc), GFP_NOFS);
David Teigland597d0ca2006-07-12 16:44:04 -0500635 if (!proc) {
636 dlm_put_lockspace(ls);
637 return -ENOMEM;
638 }
639
640 proc->lockspace = ls->ls_local_handle;
641 INIT_LIST_HEAD(&proc->asts);
642 INIT_LIST_HEAD(&proc->locks);
David Teiglanda1bc86e2007-01-15 10:34:52 -0600643 INIT_LIST_HEAD(&proc->unlocking);
David Teigland597d0ca2006-07-12 16:44:04 -0500644 spin_lock_init(&proc->asts_spin);
645 spin_lock_init(&proc->locks_spin);
646 init_waitqueue_head(&proc->wait);
647 file->private_data = proc;
648
649 return 0;
650}
651
652static int device_close(struct inode *inode, struct file *file)
653{
654 struct dlm_user_proc *proc = file->private_data;
655 struct dlm_ls *ls;
David Teigland597d0ca2006-07-12 16:44:04 -0500656
657 ls = dlm_find_lockspace_local(proc->lockspace);
658 if (!ls)
659 return -ENOENT;
660
David Teigland597d0ca2006-07-12 16:44:04 -0500661 set_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags);
662
663 dlm_clear_proc_locks(ls, proc);
664
665 /* at this point no more lkb's should exist for this lockspace,
666 so there's no chance of dlm_user_add_ast() being called and
667 looking for lkb->ua->proc */
668
669 kfree(proc);
670 file->private_data = NULL;
671
672 dlm_put_lockspace(ls);
673 dlm_put_lockspace(ls); /* for the find in device_open() */
674
675 /* FIXME: AUTOFREE: if this ls is no longer used do
676 device_remove_lockspace() */
677
David Teigland597d0ca2006-07-12 16:44:04 -0500678 return 0;
679}
680
David Teigland8304d6f2011-02-21 14:58:21 -0600681static int copy_result_to_user(struct dlm_user_args *ua, int compat,
682 uint32_t flags, int mode, int copy_lvb,
683 char __user *buf, size_t count)
David Teigland597d0ca2006-07-12 16:44:04 -0500684{
685#ifdef CONFIG_COMPAT
686 struct dlm_lock_result32 result32;
687#endif
688 struct dlm_lock_result result;
689 void *resultptr;
690 int error=0;
691 int len;
692 int struct_len;
693
694 memset(&result, 0, sizeof(struct dlm_lock_result));
David Teiglandd7db9232007-05-18 09:00:32 -0500695 result.version[0] = DLM_DEVICE_VERSION_MAJOR;
696 result.version[1] = DLM_DEVICE_VERSION_MINOR;
697 result.version[2] = DLM_DEVICE_VERSION_PATCH;
David Teigland597d0ca2006-07-12 16:44:04 -0500698 memcpy(&result.lksb, &ua->lksb, sizeof(struct dlm_lksb));
699 result.user_lksb = ua->user_lksb;
700
701 /* FIXME: dlm1 provides for the user's bastparam/addr to not be updated
702 in a conversion unless the conversion is successful. See code
703 in dlm_user_convert() for updating ua from ua_tmp. OpenVMS, though,
704 notes that a new blocking AST address and parameter are set even if
705 the conversion fails, so maybe we should just do that. */
706
David Teigland8304d6f2011-02-21 14:58:21 -0600707 if (flags & DLM_CB_BAST) {
David Teigland597d0ca2006-07-12 16:44:04 -0500708 result.user_astaddr = ua->bastaddr;
709 result.user_astparam = ua->bastparam;
David Teigland89d799d2010-03-25 14:23:13 -0500710 result.bast_mode = mode;
David Teigland597d0ca2006-07-12 16:44:04 -0500711 } else {
712 result.user_astaddr = ua->castaddr;
713 result.user_astparam = ua->castparam;
714 }
715
716#ifdef CONFIG_COMPAT
717 if (compat)
718 len = sizeof(struct dlm_lock_result32);
719 else
720#endif
721 len = sizeof(struct dlm_lock_result);
722 struct_len = len;
723
724 /* copy lvb to userspace if there is one, it's been updated, and
725 the user buffer has space for it */
726
David Teigland8304d6f2011-02-21 14:58:21 -0600727 if (copy_lvb && ua->lksb.sb_lvbptr && count >= len + DLM_USER_LVB_LEN) {
David Teigland597d0ca2006-07-12 16:44:04 -0500728 if (copy_to_user(buf+len, ua->lksb.sb_lvbptr,
729 DLM_USER_LVB_LEN)) {
730 error = -EFAULT;
731 goto out;
732 }
733
734 result.lvb_offset = len;
735 len += DLM_USER_LVB_LEN;
736 }
737
738 result.length = len;
739 resultptr = &result;
740#ifdef CONFIG_COMPAT
741 if (compat) {
742 compat_output(&result, &result32);
743 resultptr = &result32;
744 }
745#endif
746
747 if (copy_to_user(buf, resultptr, struct_len))
748 error = -EFAULT;
749 else
750 error = len;
751 out:
752 return error;
753}
754
David Teiglandd7db9232007-05-18 09:00:32 -0500755static int copy_version_to_user(char __user *buf, size_t count)
756{
757 struct dlm_device_version ver;
758
759 memset(&ver, 0, sizeof(struct dlm_device_version));
760 ver.version[0] = DLM_DEVICE_VERSION_MAJOR;
761 ver.version[1] = DLM_DEVICE_VERSION_MINOR;
762 ver.version[2] = DLM_DEVICE_VERSION_PATCH;
763
764 if (copy_to_user(buf, &ver, sizeof(struct dlm_device_version)))
765 return -EFAULT;
766 return sizeof(struct dlm_device_version);
767}
768
David Teigland597d0ca2006-07-12 16:44:04 -0500769/* a read returns a single ast described in a struct dlm_lock_result */
770
771static ssize_t device_read(struct file *file, char __user *buf, size_t count,
772 loff_t *ppos)
773{
774 struct dlm_user_proc *proc = file->private_data;
775 struct dlm_lkb *lkb;
David Teigland597d0ca2006-07-12 16:44:04 -0500776 DECLARE_WAITQUEUE(wait, current);
David Teigland8304d6f2011-02-21 14:58:21 -0600777 struct dlm_callback cb;
778 int rv, resid, copy_lvb = 0;
David Teiglandb96f4652015-08-25 12:51:44 -0500779 int old_mode, new_mode;
David Teigland597d0ca2006-07-12 16:44:04 -0500780
David Teiglandd7db9232007-05-18 09:00:32 -0500781 if (count == sizeof(struct dlm_device_version)) {
David Teigland8304d6f2011-02-21 14:58:21 -0600782 rv = copy_version_to_user(buf, count);
783 return rv;
David Teiglandd7db9232007-05-18 09:00:32 -0500784 }
785
786 if (!proc) {
787 log_print("non-version read from control device %zu", count);
788 return -EINVAL;
789 }
790
David Teigland597d0ca2006-07-12 16:44:04 -0500791#ifdef CONFIG_COMPAT
792 if (count < sizeof(struct dlm_lock_result32))
793#else
794 if (count < sizeof(struct dlm_lock_result))
795#endif
796 return -EINVAL;
797
David Teigland89d799d2010-03-25 14:23:13 -0500798 try_another:
799
David Teigland597d0ca2006-07-12 16:44:04 -0500800 /* do we really need this? can a read happen after a close? */
801 if (test_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags))
802 return -EINVAL;
803
804 spin_lock(&proc->asts_spin);
805 if (list_empty(&proc->asts)) {
806 if (file->f_flags & O_NONBLOCK) {
807 spin_unlock(&proc->asts_spin);
808 return -EAGAIN;
809 }
810
811 add_wait_queue(&proc->wait, &wait);
812
813 repeat:
814 set_current_state(TASK_INTERRUPTIBLE);
815 if (list_empty(&proc->asts) && !signal_pending(current)) {
816 spin_unlock(&proc->asts_spin);
817 schedule();
818 spin_lock(&proc->asts_spin);
819 goto repeat;
820 }
821 set_current_state(TASK_RUNNING);
822 remove_wait_queue(&proc->wait, &wait);
823
824 if (signal_pending(current)) {
825 spin_unlock(&proc->asts_spin);
826 return -ERESTARTSYS;
827 }
828 }
829
David Teigland8304d6f2011-02-21 14:58:21 -0600830 /* if we empty lkb_callbacks, we don't want to unlock the spinlock
David Teigland23e8e1a2011-04-05 13:16:24 -0500831 without removing lkb_cb_list; so empty lkb_cb_list is always
David Teigland8304d6f2011-02-21 14:58:21 -0600832 consistent with empty lkb_callbacks */
David Teigland597d0ca2006-07-12 16:44:04 -0500833
David Teigland23e8e1a2011-04-05 13:16:24 -0500834 lkb = list_entry(proc->asts.next, struct dlm_lkb, lkb_cb_list);
David Teigland597d0ca2006-07-12 16:44:04 -0500835
David Teiglandb96f4652015-08-25 12:51:44 -0500836 /* rem_lkb_callback sets a new lkb_last_cast */
837 old_mode = lkb->lkb_last_cast.mode;
838
David Teigland8304d6f2011-02-21 14:58:21 -0600839 rv = dlm_rem_lkb_callback(lkb->lkb_resource->res_ls, lkb, &cb, &resid);
840 if (rv < 0) {
841 /* this shouldn't happen; lkb should have been removed from
842 list when resid was zero */
843 log_print("dlm_rem_lkb_callback empty %x", lkb->lkb_id);
David Teigland23e8e1a2011-04-05 13:16:24 -0500844 list_del_init(&lkb->lkb_cb_list);
David Teigland8304d6f2011-02-21 14:58:21 -0600845 spin_unlock(&proc->asts_spin);
846 /* removes ref for proc->asts, may cause lkb to be freed */
847 dlm_put_lkb(lkb);
848 goto try_another;
David Teigland89d799d2010-03-25 14:23:13 -0500849 }
David Teigland8304d6f2011-02-21 14:58:21 -0600850 if (!resid)
David Teigland23e8e1a2011-04-05 13:16:24 -0500851 list_del_init(&lkb->lkb_cb_list);
David Teigland597d0ca2006-07-12 16:44:04 -0500852 spin_unlock(&proc->asts_spin);
853
David Teigland8304d6f2011-02-21 14:58:21 -0600854 if (cb.flags & DLM_CB_SKIP) {
855 /* removes ref for proc->asts, may cause lkb to be freed */
856 if (!resid)
857 dlm_put_lkb(lkb);
858 goto try_another;
David Teigland89d799d2010-03-25 14:23:13 -0500859 }
David Teigland597d0ca2006-07-12 16:44:04 -0500860
David Teigland8304d6f2011-02-21 14:58:21 -0600861 if (cb.flags & DLM_CB_CAST) {
David Teigland8304d6f2011-02-21 14:58:21 -0600862 new_mode = cb.mode;
863
864 if (!cb.sb_status && lkb->lkb_lksb->sb_lvbptr &&
865 dlm_lvb_operations[old_mode + 1][new_mode + 1])
866 copy_lvb = 1;
867
868 lkb->lkb_lksb->sb_status = cb.sb_status;
869 lkb->lkb_lksb->sb_flags = cb.sb_flags;
870 }
871
872 rv = copy_result_to_user(lkb->lkb_ua,
873 test_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags),
874 cb.flags, cb.mode, copy_lvb, buf, count);
875
876 /* removes ref for proc->asts, may cause lkb to be freed */
877 if (!resid)
David Teigland597d0ca2006-07-12 16:44:04 -0500878 dlm_put_lkb(lkb);
879
David Teigland8304d6f2011-02-21 14:58:21 -0600880 return rv;
David Teigland597d0ca2006-07-12 16:44:04 -0500881}
882
883static unsigned int device_poll(struct file *file, poll_table *wait)
884{
885 struct dlm_user_proc *proc = file->private_data;
886
887 poll_wait(file, &proc->wait, wait);
888
889 spin_lock(&proc->asts_spin);
890 if (!list_empty(&proc->asts)) {
891 spin_unlock(&proc->asts_spin);
892 return POLLIN | POLLRDNORM;
893 }
894 spin_unlock(&proc->asts_spin);
895 return 0;
896}
897
David Teiglanddc68c7e2008-08-18 11:43:30 -0500898int dlm_user_daemon_available(void)
899{
900 /* dlm_controld hasn't started (or, has started, but not
901 properly populated configfs) */
902
903 if (!dlm_our_nodeid())
904 return 0;
905
906 /* This is to deal with versions of dlm_controld that don't
907 know about the monitor device. We assume that if the
908 dlm_controld was started (above), but the monitor device
909 was never opened, that it's an old version. dlm_controld
910 should open the monitor device before populating configfs. */
911
912 if (dlm_monitor_unused)
913 return 1;
914
915 return atomic_read(&dlm_monitor_opened) ? 1 : 0;
916}
917
David Teigland597d0ca2006-07-12 16:44:04 -0500918static int ctl_device_open(struct inode *inode, struct file *file)
919{
920 file->private_data = NULL;
921 return 0;
922}
923
924static int ctl_device_close(struct inode *inode, struct file *file)
925{
926 return 0;
927}
928
David Teiglanddc68c7e2008-08-18 11:43:30 -0500929static int monitor_device_open(struct inode *inode, struct file *file)
930{
931 atomic_inc(&dlm_monitor_opened);
932 dlm_monitor_unused = 0;
933 return 0;
934}
935
936static int monitor_device_close(struct inode *inode, struct file *file)
937{
938 if (atomic_dec_and_test(&dlm_monitor_opened))
939 dlm_stop_lockspaces();
940 return 0;
941}
942
Arjan van de Ven00977a52007-02-12 00:55:34 -0800943static const struct file_operations device_fops = {
David Teigland597d0ca2006-07-12 16:44:04 -0500944 .open = device_open,
945 .release = device_close,
946 .read = device_read,
947 .write = device_write,
948 .poll = device_poll,
949 .owner = THIS_MODULE,
Arnd Bergmann6038f372010-08-15 18:52:59 +0200950 .llseek = noop_llseek,
David Teigland597d0ca2006-07-12 16:44:04 -0500951};
952
Arjan van de Ven00977a52007-02-12 00:55:34 -0800953static const struct file_operations ctl_device_fops = {
David Teigland597d0ca2006-07-12 16:44:04 -0500954 .open = ctl_device_open,
955 .release = ctl_device_close,
David Teiglandd7db9232007-05-18 09:00:32 -0500956 .read = device_read,
David Teigland597d0ca2006-07-12 16:44:04 -0500957 .write = device_write,
958 .owner = THIS_MODULE,
Arnd Bergmann6038f372010-08-15 18:52:59 +0200959 .llseek = noop_llseek,
David Teigland597d0ca2006-07-12 16:44:04 -0500960};
961
Denis Cheng0fe410d2008-01-29 13:50:16 +0800962static struct miscdevice ctl_device = {
963 .name = "dlm-control",
964 .fops = &ctl_device_fops,
965 .minor = MISC_DYNAMIC_MINOR,
966};
967
David Teiglanddc68c7e2008-08-18 11:43:30 -0500968static const struct file_operations monitor_device_fops = {
969 .open = monitor_device_open,
970 .release = monitor_device_close,
971 .owner = THIS_MODULE,
Arnd Bergmann6038f372010-08-15 18:52:59 +0200972 .llseek = noop_llseek,
David Teiglanddc68c7e2008-08-18 11:43:30 -0500973};
974
975static struct miscdevice monitor_device = {
976 .name = "dlm-monitor",
977 .fops = &monitor_device_fops,
978 .minor = MISC_DYNAMIC_MINOR,
979};
980
Denis Cheng30727172008-02-02 01:53:46 +0800981int __init dlm_user_init(void)
David Teigland597d0ca2006-07-12 16:44:04 -0500982{
983 int error;
984
David Teiglanddc68c7e2008-08-18 11:43:30 -0500985 atomic_set(&dlm_monitor_opened, 0);
David Teigland597d0ca2006-07-12 16:44:04 -0500986
David Teiglanddc68c7e2008-08-18 11:43:30 -0500987 error = misc_register(&ctl_device);
988 if (error) {
989 log_print("misc_register failed for control device");
990 goto out;
991 }
992
993 error = misc_register(&monitor_device);
994 if (error) {
995 log_print("misc_register failed for monitor device");
996 misc_deregister(&ctl_device);
997 }
998 out:
David Teigland597d0ca2006-07-12 16:44:04 -0500999 return error;
1000}
1001
1002void dlm_user_exit(void)
1003{
1004 misc_deregister(&ctl_device);
David Teiglanddc68c7e2008-08-18 11:43:30 -05001005 misc_deregister(&monitor_device);
David Teigland597d0ca2006-07-12 16:44:04 -05001006}
1007