901025d2f3
Allow processes blocked on plock requests to be interrupted when they are killed. This leaves the problem of cleaning up the lock state in userspace. This has three parts: 1. Add a flag to unlock operations sent to userspace indicating the file is being closed. Userspace will then look for and clear any waiting plock operations that were abandoned by an interrupted process. 2. Queue an unlock-close operation (like in 1) to clean up userspace from an interrupted plock request. This is needed because the vfs will not send a cleanup-unlock if it sees no locks on the file, which it won't if the interrupted operation was the only one. 3. Do not use replies from userspace for unlock-close operations because they are unnecessary (they are just cleaning up for the process which did not make an unlock call). This also simplifies the new unlock-close generated from point 2. Signed-off-by: David Teigland <teigland@redhat.com>
55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
/*
|
|
* Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved.
|
|
*
|
|
* This copyrighted material is made available to anyone wishing to use,
|
|
* modify, copy, or redistribute it subject to the terms and conditions
|
|
* of the GNU General Public License v.2.
|
|
*/
|
|
|
|
#ifndef __DLM_PLOCK_DOT_H__
|
|
#define __DLM_PLOCK_DOT_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
#define DLM_PLOCK_MISC_NAME "dlm_plock"
|
|
|
|
#define DLM_PLOCK_VERSION_MAJOR 1
|
|
#define DLM_PLOCK_VERSION_MINOR 2
|
|
#define DLM_PLOCK_VERSION_PATCH 0
|
|
|
|
enum {
|
|
DLM_PLOCK_OP_LOCK = 1,
|
|
DLM_PLOCK_OP_UNLOCK,
|
|
DLM_PLOCK_OP_GET,
|
|
};
|
|
|
|
#define DLM_PLOCK_FL_CLOSE 1
|
|
|
|
struct dlm_plock_info {
|
|
__u32 version[3];
|
|
__u8 optype;
|
|
__u8 ex;
|
|
__u8 wait;
|
|
__u8 flags;
|
|
__u32 pid;
|
|
__s32 nodeid;
|
|
__s32 rv;
|
|
__u32 fsid;
|
|
__u64 number;
|
|
__u64 start;
|
|
__u64 end;
|
|
__u64 owner;
|
|
};
|
|
|
|
#ifdef __KERNEL__
|
|
int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
|
|
int cmd, struct file_lock *fl);
|
|
int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
|
|
struct file_lock *fl);
|
|
int dlm_posix_get(dlm_lockspace_t *lockspace, u64 number, struct file *file,
|
|
struct file_lock *fl);
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif
|
|
|