Merge tag 'dlm-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm
Pull dlm updates from David Teigland: - Remove some unused features (related to lock timeouts) that have been previously scheduled for removal - Fix a bug where the pending callback flag would be incorrectly cleared, which could potentially result in missing a completion callback - Use an unbound workqueue for dlm socket handling so that socket operations can be processed with less delay - Fix possible lockspace join connection errors with large clusters (e.g. over 16 nodes) caused by a small socket backlog setting - Use atomic bit ops for internal flags to help avoid mistakes copying flag values from messages - Fix recently introduced bug where memory for lvb data could be unnecessarily allocated for a lock * tag 'dlm-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm: fs: dlm: stop unnecessarily filling zero ms_extra bytes fs: dlm: switch lkb_sbflags to atomic ops fs: dlm: rsb hash table flag value to atomic ops fs: dlm: move internal flags to atomic ops fs: dlm: change dflags to use atomic bits fs: dlm: store lkb distributed flags into own value fs: dlm: remove DLM_IFL_LOCAL_MS flag fs: dlm: rename stub to local message flag fs: dlm: remove deprecated code parts DLM: increase socket backlog to avoid hangs with 16 nodes fs: dlm: add unbound flag to dlm_io workqueue fs: dlm: fix DLM_IFL_CB_PENDING gets overwritten
This commit is contained in:
@@ -8,15 +8,6 @@ menuconfig DLM
|
||||
A general purpose distributed lock manager for kernel or userspace
|
||||
applications.
|
||||
|
||||
config DLM_DEPRECATED_API
|
||||
bool "DLM deprecated API"
|
||||
depends on DLM
|
||||
help
|
||||
Enables deprecated DLM timeout features that will be removed in
|
||||
later Linux kernel releases.
|
||||
|
||||
If you are unsure, say N.
|
||||
|
||||
config DLM_DEBUG
|
||||
bool "DLM debugging"
|
||||
depends on DLM
|
||||
|
||||
@@ -17,6 +17,5 @@ dlm-y := ast.o \
|
||||
requestqueue.o \
|
||||
user.o \
|
||||
util.o
|
||||
dlm-$(CONFIG_DLM_DEPRECATED_API) += netlink.o
|
||||
dlm-$(CONFIG_DLM_DEBUG) += debug_fs.o
|
||||
|
||||
|
||||
+5
-6
@@ -45,7 +45,7 @@ void dlm_purge_lkb_callbacks(struct dlm_lkb *lkb)
|
||||
kref_put(&cb->ref, dlm_release_callback);
|
||||
}
|
||||
|
||||
lkb->lkb_flags &= ~DLM_IFL_CB_PENDING;
|
||||
clear_bit(DLM_IFL_CB_PENDING_BIT, &lkb->lkb_iflags);
|
||||
|
||||
/* invalidate */
|
||||
dlm_callback_set_last_ptr(&lkb->lkb_last_cast, NULL);
|
||||
@@ -103,10 +103,9 @@ int dlm_enqueue_lkb_callback(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
cb->sb_status = status;
|
||||
cb->sb_flags = (sbflags & 0x000000FF);
|
||||
kref_init(&cb->ref);
|
||||
if (!(lkb->lkb_flags & DLM_IFL_CB_PENDING)) {
|
||||
lkb->lkb_flags |= DLM_IFL_CB_PENDING;
|
||||
if (!test_and_set_bit(DLM_IFL_CB_PENDING_BIT, &lkb->lkb_iflags))
|
||||
rv = DLM_ENQUEUE_CALLBACK_NEED_SCHED;
|
||||
}
|
||||
|
||||
list_add_tail(&cb->list, &lkb->lkb_callbacks);
|
||||
|
||||
if (flags & DLM_CB_CAST)
|
||||
@@ -140,7 +139,7 @@ void dlm_add_cb(struct dlm_lkb *lkb, uint32_t flags, int mode, int status,
|
||||
struct dlm_ls *ls = lkb->lkb_resource->res_ls;
|
||||
int rv;
|
||||
|
||||
if (lkb->lkb_flags & DLM_IFL_USER) {
|
||||
if (test_bit(DLM_DFL_USER_BIT, &lkb->lkb_dflags)) {
|
||||
dlm_user_add_ast(lkb, flags, mode, status, sbflags);
|
||||
return;
|
||||
}
|
||||
@@ -209,7 +208,7 @@ void dlm_callback_work(struct work_struct *work)
|
||||
spin_lock(&lkb->lkb_cb_lock);
|
||||
rv = dlm_dequeue_lkb_callback(lkb, &cb);
|
||||
if (rv == DLM_DEQUEUE_CALLBACK_EMPTY) {
|
||||
lkb->lkb_flags &= ~DLM_IFL_CB_PENDING;
|
||||
clear_bit(DLM_IFL_CB_PENDING_BIT, &lkb->lkb_iflags);
|
||||
spin_unlock(&lkb->lkb_cb_lock);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -75,9 +75,6 @@ struct dlm_cluster {
|
||||
unsigned int cl_log_info;
|
||||
unsigned int cl_protocol;
|
||||
unsigned int cl_mark;
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
unsigned int cl_timewarn_cs;
|
||||
#endif
|
||||
unsigned int cl_new_rsb_count;
|
||||
unsigned int cl_recover_callbacks;
|
||||
char cl_cluster_name[DLM_LOCKSPACE_LEN];
|
||||
@@ -103,9 +100,6 @@ enum {
|
||||
CLUSTER_ATTR_LOG_INFO,
|
||||
CLUSTER_ATTR_PROTOCOL,
|
||||
CLUSTER_ATTR_MARK,
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
CLUSTER_ATTR_TIMEWARN_CS,
|
||||
#endif
|
||||
CLUSTER_ATTR_NEW_RSB_COUNT,
|
||||
CLUSTER_ATTR_RECOVER_CALLBACKS,
|
||||
CLUSTER_ATTR_CLUSTER_NAME,
|
||||
@@ -226,9 +220,6 @@ CLUSTER_ATTR(log_debug, NULL);
|
||||
CLUSTER_ATTR(log_info, NULL);
|
||||
CLUSTER_ATTR(protocol, dlm_check_protocol_and_dlm_running);
|
||||
CLUSTER_ATTR(mark, NULL);
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
CLUSTER_ATTR(timewarn_cs, dlm_check_zero);
|
||||
#endif
|
||||
CLUSTER_ATTR(new_rsb_count, NULL);
|
||||
CLUSTER_ATTR(recover_callbacks, NULL);
|
||||
|
||||
@@ -243,9 +234,6 @@ static struct configfs_attribute *cluster_attrs[] = {
|
||||
[CLUSTER_ATTR_LOG_INFO] = &cluster_attr_log_info,
|
||||
[CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol,
|
||||
[CLUSTER_ATTR_MARK] = &cluster_attr_mark,
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
[CLUSTER_ATTR_TIMEWARN_CS] = &cluster_attr_timewarn_cs,
|
||||
#endif
|
||||
[CLUSTER_ATTR_NEW_RSB_COUNT] = &cluster_attr_new_rsb_count,
|
||||
[CLUSTER_ATTR_RECOVER_CALLBACKS] = &cluster_attr_recover_callbacks,
|
||||
[CLUSTER_ATTR_CLUSTER_NAME] = &cluster_attr_cluster_name,
|
||||
@@ -436,9 +424,6 @@ static struct config_group *make_cluster(struct config_group *g,
|
||||
cl->cl_log_debug = dlm_config.ci_log_debug;
|
||||
cl->cl_log_info = dlm_config.ci_log_info;
|
||||
cl->cl_protocol = dlm_config.ci_protocol;
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
cl->cl_timewarn_cs = dlm_config.ci_timewarn_cs;
|
||||
#endif
|
||||
cl->cl_new_rsb_count = dlm_config.ci_new_rsb_count;
|
||||
cl->cl_recover_callbacks = dlm_config.ci_recover_callbacks;
|
||||
memcpy(cl->cl_cluster_name, dlm_config.ci_cluster_name,
|
||||
@@ -959,9 +944,6 @@ int dlm_our_addr(struct sockaddr_storage *addr, int num)
|
||||
#define DEFAULT_LOG_INFO 1
|
||||
#define DEFAULT_PROTOCOL DLM_PROTO_TCP
|
||||
#define DEFAULT_MARK 0
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
#define DEFAULT_TIMEWARN_CS 500 /* 5 sec = 500 centiseconds */
|
||||
#endif
|
||||
#define DEFAULT_NEW_RSB_COUNT 128
|
||||
#define DEFAULT_RECOVER_CALLBACKS 0
|
||||
#define DEFAULT_CLUSTER_NAME ""
|
||||
@@ -977,9 +959,6 @@ struct dlm_config_info dlm_config = {
|
||||
.ci_log_info = DEFAULT_LOG_INFO,
|
||||
.ci_protocol = DEFAULT_PROTOCOL,
|
||||
.ci_mark = DEFAULT_MARK,
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
.ci_timewarn_cs = DEFAULT_TIMEWARN_CS,
|
||||
#endif
|
||||
.ci_new_rsb_count = DEFAULT_NEW_RSB_COUNT,
|
||||
.ci_recover_callbacks = DEFAULT_RECOVER_CALLBACKS,
|
||||
.ci_cluster_name = DEFAULT_CLUSTER_NAME
|
||||
|
||||
@@ -37,9 +37,6 @@ struct dlm_config_info {
|
||||
int ci_log_info;
|
||||
int ci_protocol;
|
||||
int ci_mark;
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
int ci_timewarn_cs;
|
||||
#endif
|
||||
int ci_new_rsb_count;
|
||||
int ci_recover_callbacks;
|
||||
char ci_cluster_name[DLM_LOCKSPACE_LEN];
|
||||
|
||||
+4
-4
@@ -170,7 +170,7 @@ static void print_format2_lock(struct seq_file *s, struct dlm_lkb *lkb,
|
||||
u64 xid = 0;
|
||||
u64 us;
|
||||
|
||||
if (lkb->lkb_flags & DLM_IFL_USER) {
|
||||
if (test_bit(DLM_DFL_USER_BIT, &lkb->lkb_dflags)) {
|
||||
if (lkb->lkb_ua)
|
||||
xid = lkb->lkb_ua->xid;
|
||||
}
|
||||
@@ -188,7 +188,7 @@ static void print_format2_lock(struct seq_file *s, struct dlm_lkb *lkb,
|
||||
lkb->lkb_ownpid,
|
||||
(unsigned long long)xid,
|
||||
lkb->lkb_exflags,
|
||||
lkb->lkb_flags,
|
||||
dlm_iflags_val(lkb),
|
||||
lkb->lkb_status,
|
||||
lkb->lkb_grmode,
|
||||
lkb->lkb_rqmode,
|
||||
@@ -230,7 +230,7 @@ static void print_format3_lock(struct seq_file *s, struct dlm_lkb *lkb,
|
||||
{
|
||||
u64 xid = 0;
|
||||
|
||||
if (lkb->lkb_flags & DLM_IFL_USER) {
|
||||
if (test_bit(DLM_DFL_USER_BIT, &lkb->lkb_dflags)) {
|
||||
if (lkb->lkb_ua)
|
||||
xid = lkb->lkb_ua->xid;
|
||||
}
|
||||
@@ -242,7 +242,7 @@ static void print_format3_lock(struct seq_file *s, struct dlm_lkb *lkb,
|
||||
lkb->lkb_ownpid,
|
||||
(unsigned long long)xid,
|
||||
lkb->lkb_exflags,
|
||||
lkb->lkb_flags,
|
||||
dlm_iflags_val(lkb),
|
||||
lkb->lkb_status,
|
||||
lkb->lkb_grmode,
|
||||
lkb->lkb_rqmode,
|
||||
|
||||
+96
-56
@@ -99,13 +99,13 @@ do { \
|
||||
}
|
||||
|
||||
|
||||
#define DLM_RTF_SHRINK 0x00000001
|
||||
#define DLM_RTF_SHRINK_BIT 0
|
||||
|
||||
struct dlm_rsbtable {
|
||||
struct rb_root keep;
|
||||
struct rb_root toss;
|
||||
spinlock_t lock;
|
||||
uint32_t flags;
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
|
||||
@@ -145,9 +145,6 @@ struct dlm_args {
|
||||
void (*bastfn) (void *astparam, int mode);
|
||||
int mode;
|
||||
struct dlm_lksb *lksb;
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
unsigned long timeout;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -197,31 +194,25 @@ struct dlm_args {
|
||||
#define DLM_LKSTS_GRANTED 2
|
||||
#define DLM_LKSTS_CONVERT 3
|
||||
|
||||
/* lkb_flags */
|
||||
/* lkb_iflags */
|
||||
|
||||
#define DLM_IFL_MSTCPY 0x00010000
|
||||
#define DLM_IFL_RESEND 0x00020000
|
||||
#define DLM_IFL_DEAD 0x00040000
|
||||
#define DLM_IFL_OVERLAP_UNLOCK 0x00080000
|
||||
#define DLM_IFL_OVERLAP_CANCEL 0x00100000
|
||||
#define DLM_IFL_ENDOFLIFE 0x00200000
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
#define DLM_IFL_WATCH_TIMEWARN 0x00400000
|
||||
#define DLM_IFL_TIMEOUT_CANCEL 0x00800000
|
||||
#endif
|
||||
#define DLM_IFL_DEADLOCK_CANCEL 0x01000000
|
||||
#define DLM_IFL_STUB_MS 0x02000000 /* magic number for m_flags */
|
||||
#define DLM_IFL_CB_PENDING 0x04000000
|
||||
/* least significant 2 bytes are message changed, they are full transmitted
|
||||
* but at receive side only the 2 bytes LSB will be set.
|
||||
*
|
||||
* Even wireshark dlm dissector does only evaluate the lower bytes and note
|
||||
* that they may not be used on transceiver side, we assume the higher bytes
|
||||
* are for internal use or reserved so long they are not parsed on receiver
|
||||
* side.
|
||||
*/
|
||||
#define DLM_IFL_USER 0x00000001
|
||||
#define DLM_IFL_ORPHAN 0x00000002
|
||||
#define DLM_IFL_MSTCPY_BIT 16
|
||||
#define __DLM_IFL_MIN_BIT DLM_IFL_MSTCPY_BIT
|
||||
#define DLM_IFL_RESEND_BIT 17
|
||||
#define DLM_IFL_DEAD_BIT 18
|
||||
#define DLM_IFL_OVERLAP_UNLOCK_BIT 19
|
||||
#define DLM_IFL_OVERLAP_CANCEL_BIT 20
|
||||
#define DLM_IFL_ENDOFLIFE_BIT 21
|
||||
#define DLM_IFL_DEADLOCK_CANCEL_BIT 24
|
||||
#define DLM_IFL_CB_PENDING_BIT 25
|
||||
#define __DLM_IFL_MAX_BIT DLM_IFL_CB_PENDING_BIT
|
||||
|
||||
/* lkb_dflags */
|
||||
|
||||
#define DLM_DFL_USER_BIT 0
|
||||
#define __DLM_DFL_MIN_BIT DLM_DFL_USER_BIT
|
||||
#define DLM_DFL_ORPHAN_BIT 1
|
||||
#define __DLM_DFL_MAX_BIT DLM_DFL_ORPHAN_BIT
|
||||
|
||||
#define DLM_CB_CAST 0x00000001
|
||||
#define DLM_CB_BAST 0x00000002
|
||||
@@ -244,8 +235,9 @@ struct dlm_lkb {
|
||||
uint32_t lkb_id; /* our lock ID */
|
||||
uint32_t lkb_remid; /* lock ID on remote partner */
|
||||
uint32_t lkb_exflags; /* external flags from caller */
|
||||
uint32_t lkb_sbflags; /* lksb flags */
|
||||
uint32_t lkb_flags; /* internal flags */
|
||||
unsigned long lkb_sbflags; /* lksb flags */
|
||||
unsigned long lkb_dflags; /* distributed flags */
|
||||
unsigned long lkb_iflags; /* internal flags */
|
||||
uint32_t lkb_lvbseq; /* lvb sequence number */
|
||||
|
||||
int8_t lkb_status; /* granted, waiting, convert */
|
||||
@@ -263,11 +255,6 @@ struct dlm_lkb {
|
||||
struct list_head lkb_ownqueue; /* list of locks for a process */
|
||||
ktime_t lkb_timestamp;
|
||||
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
struct list_head lkb_time_list;
|
||||
unsigned long lkb_timeout_cs;
|
||||
#endif
|
||||
|
||||
spinlock_t lkb_cb_lock;
|
||||
struct work_struct lkb_cb_work;
|
||||
struct list_head lkb_cb_list; /* for ls_cb_delay or proc->asts */
|
||||
@@ -583,11 +570,6 @@ struct dlm_ls {
|
||||
struct mutex ls_orphans_mutex;
|
||||
struct list_head ls_orphans;
|
||||
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
struct mutex ls_timeout_mutex;
|
||||
struct list_head ls_timeout;
|
||||
#endif
|
||||
|
||||
spinlock_t ls_new_rsb_spin;
|
||||
int ls_new_rsb_count;
|
||||
struct list_head ls_new_rsb; /* new rsb structs */
|
||||
@@ -607,9 +589,9 @@ struct dlm_ls {
|
||||
int ls_slots_size;
|
||||
struct dlm_slot *ls_slots;
|
||||
|
||||
struct dlm_rsb ls_stub_rsb; /* for returning errors */
|
||||
struct dlm_lkb ls_stub_lkb; /* for returning errors */
|
||||
struct dlm_message ls_stub_ms; /* for faking a reply */
|
||||
struct dlm_rsb ls_local_rsb; /* for returning errors */
|
||||
struct dlm_lkb ls_local_lkb; /* for returning errors */
|
||||
struct dlm_message ls_local_ms; /* for faking a reply */
|
||||
|
||||
struct dentry *ls_debug_rsb_dentry; /* debugfs */
|
||||
struct dentry *ls_debug_waiters_dentry; /* debugfs */
|
||||
@@ -701,9 +683,6 @@ struct dlm_ls {
|
||||
#define LSFL_RCOM_READY 5
|
||||
#define LSFL_RCOM_WAIT 6
|
||||
#define LSFL_UEVENT_WAIT 7
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
#define LSFL_TIMEWARN 8
|
||||
#endif
|
||||
#define LSFL_CB_DELAY 9
|
||||
#define LSFL_NODIR 10
|
||||
|
||||
@@ -756,15 +735,76 @@ static inline int dlm_no_directory(struct dlm_ls *ls)
|
||||
return test_bit(LSFL_NODIR, &ls->ls_flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
int dlm_netlink_init(void);
|
||||
void dlm_netlink_exit(void);
|
||||
void dlm_timeout_warn(struct dlm_lkb *lkb);
|
||||
#else
|
||||
static inline int dlm_netlink_init(void) { return 0; }
|
||||
static inline void dlm_netlink_exit(void) { };
|
||||
static inline void dlm_timeout_warn(struct dlm_lkb *lkb) { };
|
||||
#endif
|
||||
/* takes a snapshot from dlm atomic flags */
|
||||
static inline uint32_t dlm_flags_val(const unsigned long *addr,
|
||||
uint32_t min, uint32_t max)
|
||||
{
|
||||
uint32_t bit = min, val = 0;
|
||||
|
||||
for_each_set_bit_from(bit, addr, max + 1) {
|
||||
val |= BIT(bit);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint32_t dlm_iflags_val(const struct dlm_lkb *lkb)
|
||||
{
|
||||
return dlm_flags_val(&lkb->lkb_iflags, __DLM_IFL_MIN_BIT,
|
||||
__DLM_IFL_MAX_BIT);
|
||||
}
|
||||
|
||||
static inline uint32_t dlm_dflags_val(const struct dlm_lkb *lkb)
|
||||
{
|
||||
return dlm_flags_val(&lkb->lkb_dflags, __DLM_DFL_MIN_BIT,
|
||||
__DLM_DFL_MAX_BIT);
|
||||
}
|
||||
|
||||
/* coming from UAPI header
|
||||
*
|
||||
* TODO:
|
||||
* Move this to UAPI header and let other values point to them and use BIT()
|
||||
*/
|
||||
#define DLM_SBF_DEMOTED_BIT 0
|
||||
#define __DLM_SBF_MIN_BIT DLM_SBF_DEMOTED_BIT
|
||||
#define DLM_SBF_VALNOTVALID_BIT 1
|
||||
#define DLM_SBF_ALTMODE_BIT 2
|
||||
#define __DLM_SBF_MAX_BIT DLM_SBF_ALTMODE_BIT
|
||||
|
||||
static inline uint32_t dlm_sbflags_val(const struct dlm_lkb *lkb)
|
||||
{
|
||||
/* be sure the next person updates this */
|
||||
BUILD_BUG_ON(BIT(__DLM_SBF_MAX_BIT) != DLM_SBF_ALTMODE);
|
||||
|
||||
return dlm_flags_val(&lkb->lkb_sbflags, __DLM_SBF_MIN_BIT,
|
||||
__DLM_SBF_MAX_BIT);
|
||||
}
|
||||
|
||||
static inline void dlm_set_flags_val(unsigned long *addr, uint32_t val,
|
||||
uint32_t min, uint32_t max)
|
||||
{
|
||||
uint32_t bit;
|
||||
|
||||
for (bit = min; bit < (max + 1); bit++) {
|
||||
if (val & BIT(bit))
|
||||
set_bit(bit, addr);
|
||||
else
|
||||
clear_bit(bit, addr);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void dlm_set_dflags_val(struct dlm_lkb *lkb, uint32_t val)
|
||||
{
|
||||
dlm_set_flags_val(&lkb->lkb_dflags, val, __DLM_DFL_MIN_BIT,
|
||||
__DLM_DFL_MAX_BIT);
|
||||
}
|
||||
|
||||
static inline void dlm_set_sbflags_val(struct dlm_lkb *lkb, uint32_t val)
|
||||
{
|
||||
dlm_set_flags_val(&lkb->lkb_sbflags, val, __DLM_SBF_MIN_BIT,
|
||||
__DLM_SBF_MAX_BIT);
|
||||
}
|
||||
|
||||
int dlm_plock_init(void);
|
||||
void dlm_plock_exit(void);
|
||||
|
||||
|
||||
+169
-364
File diff suppressed because it is too large
Load Diff
@@ -25,14 +25,6 @@ void dlm_scan_rsbs(struct dlm_ls *ls);
|
||||
int dlm_lock_recovery_try(struct dlm_ls *ls);
|
||||
void dlm_unlock_recovery(struct dlm_ls *ls);
|
||||
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
void dlm_scan_timeout(struct dlm_ls *ls);
|
||||
void dlm_adjust_timeouts(struct dlm_ls *ls);
|
||||
#else
|
||||
static inline void dlm_scan_timeout(struct dlm_ls *ls) { }
|
||||
static inline void dlm_adjust_timeouts(struct dlm_ls *ls) { }
|
||||
#endif
|
||||
|
||||
int dlm_master_lookup(struct dlm_ls *ls, int nodeid, char *name, int len,
|
||||
unsigned int flags, int *r_nodeid, int *result);
|
||||
|
||||
@@ -47,19 +39,10 @@ void dlm_recover_waiters_pre(struct dlm_ls *ls);
|
||||
int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc);
|
||||
int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc);
|
||||
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, int mode,
|
||||
uint32_t flags, void *name, unsigned int namelen,
|
||||
unsigned long timeout_cs);
|
||||
int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp,
|
||||
int mode, uint32_t flags, uint32_t lkid, char *lvb_in,
|
||||
unsigned long timeout_cs);
|
||||
#else
|
||||
int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, int mode,
|
||||
uint32_t flags, void *name, unsigned int namelen);
|
||||
int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp,
|
||||
int mode, uint32_t flags, uint32_t lkid, char *lvb_in);
|
||||
#endif
|
||||
int dlm_user_adopt_orphan(struct dlm_ls *ls, struct dlm_user_args *ua_tmp,
|
||||
int mode, uint32_t flags, void *name, unsigned int namelen,
|
||||
uint32_t *lkid);
|
||||
|
||||
+3
-26
@@ -273,7 +273,6 @@ static int dlm_scand(void *data)
|
||||
if (dlm_lock_recovery_try(ls)) {
|
||||
ls->ls_scan_time = jiffies;
|
||||
dlm_scan_rsbs(ls);
|
||||
dlm_scan_timeout(ls);
|
||||
dlm_unlock_recovery(ls);
|
||||
} else {
|
||||
ls->ls_scan_time += HZ;
|
||||
@@ -488,28 +487,10 @@ static int new_lockspace(const char *name, const char *cluster,
|
||||
ls->ls_ops_arg = ops_arg;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
if (flags & DLM_LSFL_TIMEWARN) {
|
||||
pr_warn_once("===============================================================\n"
|
||||
"WARNING: the dlm DLM_LSFL_TIMEWARN flag is being deprecated and\n"
|
||||
" will be removed in v6.2!\n"
|
||||
" Inclusive DLM_LSFL_TIMEWARN define in UAPI header!\n"
|
||||
"===============================================================\n");
|
||||
|
||||
set_bit(LSFL_TIMEWARN, &ls->ls_flags);
|
||||
}
|
||||
|
||||
/* ls_exflags are forced to match among nodes, and we don't
|
||||
* need to require all nodes to have some flags set
|
||||
*/
|
||||
ls->ls_exflags = (flags & ~(DLM_LSFL_TIMEWARN | DLM_LSFL_FS |
|
||||
DLM_LSFL_NEWEXCL));
|
||||
#else
|
||||
/* ls_exflags are forced to match among nodes, and we don't
|
||||
* need to require all nodes to have some flags set
|
||||
*/
|
||||
ls->ls_exflags = (flags & ~(DLM_LSFL_FS | DLM_LSFL_NEWEXCL));
|
||||
#endif
|
||||
|
||||
size = READ_ONCE(dlm_config.ci_rsbtbl_size);
|
||||
ls->ls_rsbtbl_size = size;
|
||||
@@ -537,10 +518,6 @@ static int new_lockspace(const char *name, const char *cluster,
|
||||
mutex_init(&ls->ls_waiters_mutex);
|
||||
INIT_LIST_HEAD(&ls->ls_orphans);
|
||||
mutex_init(&ls->ls_orphans_mutex);
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
INIT_LIST_HEAD(&ls->ls_timeout);
|
||||
mutex_init(&ls->ls_timeout_mutex);
|
||||
#endif
|
||||
|
||||
INIT_LIST_HEAD(&ls->ls_new_rsb);
|
||||
spin_lock_init(&ls->ls_new_rsb_spin);
|
||||
@@ -552,8 +529,8 @@ static int new_lockspace(const char *name, const char *cluster,
|
||||
ls->ls_total_weight = 0;
|
||||
ls->ls_node_array = NULL;
|
||||
|
||||
memset(&ls->ls_stub_rsb, 0, sizeof(struct dlm_rsb));
|
||||
ls->ls_stub_rsb.res_ls = ls;
|
||||
memset(&ls->ls_local_rsb, 0, sizeof(struct dlm_rsb));
|
||||
ls->ls_local_rsb.res_ls = ls;
|
||||
|
||||
ls->ls_debug_rsb_dentry = NULL;
|
||||
ls->ls_debug_waiters_dentry = NULL;
|
||||
@@ -764,7 +741,7 @@ static int lkb_idr_free(int id, void *p, void *data)
|
||||
{
|
||||
struct dlm_lkb *lkb = p;
|
||||
|
||||
if (lkb->lkb_lvbptr && lkb->lkb_flags & DLM_IFL_MSTCPY)
|
||||
if (lkb->lkb_lvbptr && test_bit(DLM_IFL_MSTCPY_BIT, &lkb->lkb_iflags))
|
||||
dlm_free_lvb(lkb->lkb_lvbptr);
|
||||
|
||||
dlm_free_lkb(lkb);
|
||||
|
||||
+3
-3
@@ -1717,8 +1717,8 @@ static void work_stop(void)
|
||||
|
||||
static int work_start(void)
|
||||
{
|
||||
io_workqueue = alloc_workqueue("dlm_io", WQ_HIGHPRI | WQ_MEM_RECLAIM,
|
||||
0);
|
||||
io_workqueue = alloc_workqueue("dlm_io", WQ_HIGHPRI | WQ_MEM_RECLAIM |
|
||||
WQ_UNBOUND, 0);
|
||||
if (!io_workqueue) {
|
||||
log_print("can't start dlm_io");
|
||||
return -ENOMEM;
|
||||
@@ -1814,7 +1814,7 @@ static int dlm_listen_for_all(void)
|
||||
sock->sk->sk_data_ready = lowcomms_listen_data_ready;
|
||||
release_sock(sock->sk);
|
||||
|
||||
result = sock->ops->listen(sock, 5);
|
||||
result = sock->ops->listen(sock, 128);
|
||||
if (result < 0) {
|
||||
dlm_close_sock(&listen_con.sock);
|
||||
return result;
|
||||
|
||||
+1
-8
@@ -46,20 +46,14 @@ static int __init init_dlm(void)
|
||||
if (error)
|
||||
goto out_debug;
|
||||
|
||||
error = dlm_netlink_init();
|
||||
if (error)
|
||||
goto out_user;
|
||||
|
||||
error = dlm_plock_init();
|
||||
if (error)
|
||||
goto out_netlink;
|
||||
goto out_user;
|
||||
|
||||
printk("DLM installed\n");
|
||||
|
||||
return 0;
|
||||
|
||||
out_netlink:
|
||||
dlm_netlink_exit();
|
||||
out_user:
|
||||
dlm_user_exit();
|
||||
out_debug:
|
||||
@@ -77,7 +71,6 @@ static int __init init_dlm(void)
|
||||
static void __exit exit_dlm(void)
|
||||
{
|
||||
dlm_plock_exit();
|
||||
dlm_netlink_exit();
|
||||
dlm_user_exit();
|
||||
dlm_config_exit();
|
||||
dlm_memory_exit();
|
||||
|
||||
+1
-1
@@ -118,7 +118,7 @@ struct dlm_lkb *dlm_allocate_lkb(struct dlm_ls *ls)
|
||||
|
||||
void dlm_free_lkb(struct dlm_lkb *lkb)
|
||||
{
|
||||
if (lkb->lkb_flags & DLM_IFL_USER) {
|
||||
if (test_bit(DLM_DFL_USER_BIT, &lkb->lkb_dflags)) {
|
||||
struct dlm_user_args *ua;
|
||||
ua = lkb->lkb_ua;
|
||||
if (ua) {
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2007 Red Hat, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <net/genetlink.h>
|
||||
#include <linux/dlm.h>
|
||||
#include <linux/dlm_netlink.h>
|
||||
#include <linux/gfp.h>
|
||||
|
||||
#include "dlm_internal.h"
|
||||
|
||||
static uint32_t dlm_nl_seqnum;
|
||||
static uint32_t listener_nlportid;
|
||||
|
||||
static struct genl_family family;
|
||||
|
||||
static int prepare_data(u8 cmd, struct sk_buff **skbp, size_t size)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
void *data;
|
||||
|
||||
skb = genlmsg_new(size, GFP_NOFS);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
/* add the message headers */
|
||||
data = genlmsg_put(skb, 0, dlm_nl_seqnum++, &family, 0, cmd);
|
||||
if (!data) {
|
||||
nlmsg_free(skb);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*skbp = skb;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dlm_lock_data *mk_data(struct sk_buff *skb)
|
||||
{
|
||||
struct nlattr *ret;
|
||||
|
||||
ret = nla_reserve(skb, DLM_TYPE_LOCK, sizeof(struct dlm_lock_data));
|
||||
if (!ret)
|
||||
return NULL;
|
||||
return nla_data(ret);
|
||||
}
|
||||
|
||||
static int send_data(struct sk_buff *skb)
|
||||
{
|
||||
struct genlmsghdr *genlhdr = nlmsg_data((struct nlmsghdr *)skb->data);
|
||||
void *data = genlmsg_data(genlhdr);
|
||||
|
||||
genlmsg_end(skb, data);
|
||||
|
||||
return genlmsg_unicast(&init_net, skb, listener_nlportid);
|
||||
}
|
||||
|
||||
static int user_cmd(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
listener_nlportid = info->snd_portid;
|
||||
printk("user_cmd nlpid %u\n", listener_nlportid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct genl_small_ops dlm_nl_ops[] = {
|
||||
{
|
||||
.cmd = DLM_CMD_HELLO,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = user_cmd,
|
||||
},
|
||||
};
|
||||
|
||||
static struct genl_family family __ro_after_init = {
|
||||
.name = DLM_GENL_NAME,
|
||||
.version = DLM_GENL_VERSION,
|
||||
.small_ops = dlm_nl_ops,
|
||||
.n_small_ops = ARRAY_SIZE(dlm_nl_ops),
|
||||
.resv_start_op = DLM_CMD_HELLO + 1,
|
||||
.module = THIS_MODULE,
|
||||
};
|
||||
|
||||
int __init dlm_netlink_init(void)
|
||||
{
|
||||
return genl_register_family(&family);
|
||||
}
|
||||
|
||||
void dlm_netlink_exit(void)
|
||||
{
|
||||
genl_unregister_family(&family);
|
||||
}
|
||||
|
||||
static void fill_data(struct dlm_lock_data *data, struct dlm_lkb *lkb)
|
||||
{
|
||||
struct dlm_rsb *r = lkb->lkb_resource;
|
||||
|
||||
memset(data, 0, sizeof(struct dlm_lock_data));
|
||||
|
||||
data->version = DLM_LOCK_DATA_VERSION;
|
||||
data->nodeid = lkb->lkb_nodeid;
|
||||
data->ownpid = lkb->lkb_ownpid;
|
||||
data->id = lkb->lkb_id;
|
||||
data->remid = lkb->lkb_remid;
|
||||
data->status = lkb->lkb_status;
|
||||
data->grmode = lkb->lkb_grmode;
|
||||
data->rqmode = lkb->lkb_rqmode;
|
||||
if (lkb->lkb_ua)
|
||||
data->xid = lkb->lkb_ua->xid;
|
||||
if (r) {
|
||||
data->lockspace_id = r->res_ls->ls_global_id;
|
||||
data->resource_namelen = r->res_length;
|
||||
memcpy(data->resource_name, r->res_name, r->res_length);
|
||||
}
|
||||
}
|
||||
|
||||
void dlm_timeout_warn(struct dlm_lkb *lkb)
|
||||
{
|
||||
struct sk_buff *send_skb;
|
||||
struct dlm_lock_data *data;
|
||||
size_t size;
|
||||
int rv;
|
||||
|
||||
size = nla_total_size(sizeof(struct dlm_lock_data)) +
|
||||
nla_total_size(0); /* why this? */
|
||||
|
||||
rv = prepare_data(DLM_CMD_TIMEOUT, &send_skb, size);
|
||||
if (rv < 0)
|
||||
return;
|
||||
|
||||
data = mk_data(send_skb);
|
||||
if (!data) {
|
||||
nlmsg_free(send_skb);
|
||||
return;
|
||||
}
|
||||
|
||||
fill_data(data, lkb);
|
||||
|
||||
send_data(send_skb);
|
||||
}
|
||||
|
||||
+1
-1
@@ -415,7 +415,7 @@ static void pack_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb,
|
||||
rl->rl_ownpid = cpu_to_le32(lkb->lkb_ownpid);
|
||||
rl->rl_lkid = cpu_to_le32(lkb->lkb_id);
|
||||
rl->rl_exflags = cpu_to_le32(lkb->lkb_exflags);
|
||||
rl->rl_flags = cpu_to_le32(lkb->lkb_flags);
|
||||
rl->rl_flags = cpu_to_le32(dlm_dflags_val(lkb));
|
||||
rl->rl_lvbseq = cpu_to_le32(lkb->lkb_lvbseq);
|
||||
rl->rl_rqmode = lkb->lkb_rqmode;
|
||||
rl->rl_grmode = lkb->lkb_grmode;
|
||||
|
||||
+1
-1
@@ -403,7 +403,7 @@ static void set_lock_master(struct list_head *queue, int nodeid)
|
||||
struct dlm_lkb *lkb;
|
||||
|
||||
list_for_each_entry(lkb, queue, lkb_statequeue) {
|
||||
if (!(lkb->lkb_flags & DLM_IFL_MSTCPY)) {
|
||||
if (!test_bit(DLM_IFL_MSTCPY_BIT, &lkb->lkb_iflags)) {
|
||||
lkb->lkb_nodeid = nodeid;
|
||||
lkb->lkb_remid = 0;
|
||||
}
|
||||
|
||||
@@ -214,8 +214,6 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
|
||||
|
||||
dlm_clear_members_gone(ls);
|
||||
|
||||
dlm_adjust_timeouts(ls);
|
||||
|
||||
dlm_callback_resume(ls);
|
||||
|
||||
error = enable_locking(ls, rv->seq);
|
||||
|
||||
+7
-27
@@ -183,7 +183,8 @@ void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
struct dlm_user_proc *proc;
|
||||
int rv;
|
||||
|
||||
if (lkb->lkb_flags & (DLM_IFL_ORPHAN | DLM_IFL_DEAD))
|
||||
if (test_bit(DLM_DFL_ORPHAN_BIT, &lkb->lkb_dflags) ||
|
||||
test_bit(DLM_IFL_DEAD_BIT, &lkb->lkb_iflags))
|
||||
return;
|
||||
|
||||
ls = lkb->lkb_resource->res_ls;
|
||||
@@ -195,7 +196,8 @@ void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
for cases where a completion ast is received for an operation that
|
||||
began before clear_proc_locks did its cancel/unlock. */
|
||||
|
||||
if (lkb->lkb_flags & (DLM_IFL_ORPHAN | DLM_IFL_DEAD))
|
||||
if (test_bit(DLM_DFL_ORPHAN_BIT, &lkb->lkb_dflags) ||
|
||||
test_bit(DLM_IFL_DEAD_BIT, &lkb->lkb_iflags))
|
||||
goto out;
|
||||
|
||||
DLM_ASSERT(lkb->lkb_ua, dlm_print_lkb(lkb););
|
||||
@@ -206,7 +208,7 @@ void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
goto out;
|
||||
|
||||
if ((flags & DLM_CB_CAST) && lkb_is_endoflife(mode, status))
|
||||
lkb->lkb_flags |= DLM_IFL_ENDOFLIFE;
|
||||
set_bit(DLM_IFL_ENDOFLIFE_BIT, &lkb->lkb_iflags);
|
||||
|
||||
spin_lock(&proc->asts_spin);
|
||||
|
||||
@@ -229,7 +231,7 @@ void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
}
|
||||
spin_unlock(&proc->asts_spin);
|
||||
|
||||
if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) {
|
||||
if (test_bit(DLM_IFL_ENDOFLIFE_BIT, &lkb->lkb_iflags)) {
|
||||
/* N.B. spin_lock locks_spin, not asts_spin */
|
||||
spin_lock(&proc->locks_spin);
|
||||
if (!list_empty(&lkb->lkb_ownqueue)) {
|
||||
@@ -259,14 +261,6 @@ static int device_user_lock(struct dlm_user_proc *proc,
|
||||
goto out;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
if (params->timeout)
|
||||
pr_warn_once("========================================================\n"
|
||||
"WARNING: the lkb timeout feature is being deprecated and\n"
|
||||
" will be removed in v6.2!\n"
|
||||
"========================================================\n");
|
||||
#endif
|
||||
|
||||
ua = kzalloc(sizeof(struct dlm_user_args), GFP_NOFS);
|
||||
if (!ua)
|
||||
goto out;
|
||||
@@ -279,16 +273,9 @@ static int device_user_lock(struct dlm_user_proc *proc,
|
||||
ua->xid = params->xid;
|
||||
|
||||
if (params->flags & DLM_LKF_CONVERT) {
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
error = dlm_user_convert(ls, ua,
|
||||
params->mode, params->flags,
|
||||
params->lkid, params->lvb,
|
||||
(unsigned long) params->timeout);
|
||||
#else
|
||||
error = dlm_user_convert(ls, ua,
|
||||
params->mode, params->flags,
|
||||
params->lkid, params->lvb);
|
||||
#endif
|
||||
} else if (params->flags & DLM_LKF_ORPHAN) {
|
||||
error = dlm_user_adopt_orphan(ls, ua,
|
||||
params->mode, params->flags,
|
||||
@@ -297,16 +284,9 @@ static int device_user_lock(struct dlm_user_proc *proc,
|
||||
if (!error)
|
||||
error = lkid;
|
||||
} else {
|
||||
#ifdef CONFIG_DLM_DEPRECATED_API
|
||||
error = dlm_user_request(ls, ua,
|
||||
params->mode, params->flags,
|
||||
params->name, params->namelen,
|
||||
(unsigned long) params->timeout);
|
||||
#else
|
||||
error = dlm_user_request(ls, ua,
|
||||
params->mode, params->flags,
|
||||
params->name, params->namelen);
|
||||
#endif
|
||||
if (!error)
|
||||
error = ua->lksb.sb_lkid;
|
||||
}
|
||||
@@ -884,7 +864,7 @@ static ssize_t device_read(struct file *file, char __user *buf, size_t count,
|
||||
goto try_another;
|
||||
case DLM_DEQUEUE_CALLBACK_LAST:
|
||||
list_del_init(&lkb->lkb_cb_list);
|
||||
lkb->lkb_flags &= ~DLM_IFL_CB_PENDING;
|
||||
clear_bit(DLM_IFL_CB_PENDING_BIT, &lkb->lkb_iflags);
|
||||
break;
|
||||
case DLM_DEQUEUE_CALLBACK_SUCCESS:
|
||||
break;
|
||||
|
||||
@@ -53,9 +53,6 @@ struct dlm_lockspace_ops {
|
||||
* The dlm should not use a resource directory, but statically assign
|
||||
* resource mastery to nodes based on the name hash that is otherwise
|
||||
* used to select the directory node. Must be the same on all nodes.
|
||||
* DLM_LSFL_TIMEWARN
|
||||
* The dlm should emit netlink messages if locks have been waiting
|
||||
* for a configurable amount of time. (Unused.)
|
||||
* DLM_LSFL_NEWEXCL
|
||||
* dlm_new_lockspace() should return -EEXIST if the lockspace exists.
|
||||
*
|
||||
|
||||
@@ -47,16 +47,8 @@
|
||||
{ DLM_SBF_ALTMODE, "ALTMODE" })
|
||||
|
||||
#define show_lkb_flags(flags) __print_flags(flags, "|", \
|
||||
{ DLM_IFL_MSTCPY, "MSTCPY" }, \
|
||||
{ DLM_IFL_RESEND, "RESEND" }, \
|
||||
{ DLM_IFL_DEAD, "DEAD" }, \
|
||||
{ DLM_IFL_OVERLAP_UNLOCK, "OVERLAP_UNLOCK" }, \
|
||||
{ DLM_IFL_OVERLAP_CANCEL, "OVERLAP_CANCEL" }, \
|
||||
{ DLM_IFL_ENDOFLIFE, "ENDOFLIFE" }, \
|
||||
{ DLM_IFL_DEADLOCK_CANCEL, "DEADLOCK_CANCEL" }, \
|
||||
{ DLM_IFL_STUB_MS, "STUB_MS" }, \
|
||||
{ DLM_IFL_USER, "USER" }, \
|
||||
{ DLM_IFL_ORPHAN, "ORPHAN" })
|
||||
{ BIT(DLM_DFL_USER_BIT), "USER" }, \
|
||||
{ BIT(DLM_DFL_ORPHAN_BIT), "ORPHAN" })
|
||||
|
||||
#define show_header_cmd(cmd) __print_symbolic(cmd, \
|
||||
{ DLM_MSG, "MSG"}, \
|
||||
|
||||
@@ -68,6 +68,7 @@ struct dlm_lksb {
|
||||
|
||||
/* dlm_new_lockspace() flags */
|
||||
|
||||
/* DLM_LSFL_TIMEWARN is deprecated and reserved. DO NOT USE! */
|
||||
#define DLM_LSFL_TIMEWARN 0x00000002
|
||||
#define DLM_LSFL_NEWEXCL 0x00000008
|
||||
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* Copyright (C) 2007 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_NETLINK_H
|
||||
#define _DLM_NETLINK_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/dlmconstants.h>
|
||||
|
||||
enum {
|
||||
DLM_STATUS_WAITING = 1,
|
||||
DLM_STATUS_GRANTED = 2,
|
||||
DLM_STATUS_CONVERT = 3,
|
||||
};
|
||||
|
||||
#define DLM_LOCK_DATA_VERSION 1
|
||||
|
||||
struct dlm_lock_data {
|
||||
__u16 version;
|
||||
__u32 lockspace_id;
|
||||
int nodeid;
|
||||
int ownpid;
|
||||
__u32 id;
|
||||
__u32 remid;
|
||||
__u64 xid;
|
||||
__s8 status;
|
||||
__s8 grmode;
|
||||
__s8 rqmode;
|
||||
unsigned long timestamp;
|
||||
int resource_namelen;
|
||||
char resource_name[DLM_RESNAME_MAXLEN];
|
||||
};
|
||||
|
||||
enum {
|
||||
DLM_CMD_UNSPEC = 0,
|
||||
DLM_CMD_HELLO, /* user->kernel */
|
||||
DLM_CMD_TIMEOUT, /* kernel->user */
|
||||
__DLM_CMD_MAX,
|
||||
};
|
||||
|
||||
#define DLM_CMD_MAX (__DLM_CMD_MAX - 1)
|
||||
|
||||
enum {
|
||||
DLM_TYPE_UNSPEC = 0,
|
||||
DLM_TYPE_LOCK,
|
||||
__DLM_TYPE_MAX,
|
||||
};
|
||||
|
||||
#define DLM_TYPE_MAX (__DLM_TYPE_MAX - 1)
|
||||
|
||||
#define DLM_GENL_VERSION 0x1
|
||||
#define DLM_GENL_NAME "DLM"
|
||||
|
||||
#endif /* _DLM_NETLINK_H */
|
||||
@@ -87,7 +87,6 @@
|
||||
* DLM_LKF_NODLCKWT
|
||||
*
|
||||
* Do not cancel the lock if it gets into conversion deadlock.
|
||||
* Exclude this lock from being monitored due to DLM_LSFL_TIMEWARN.
|
||||
*
|
||||
* DLM_LKF_NODLCKBLK
|
||||
*
|
||||
@@ -132,6 +131,10 @@
|
||||
* Unlock the lock even if it is converting or waiting or has sublocks.
|
||||
* Only really for use by the userland device.c code.
|
||||
*
|
||||
* DLM_LKF_TIMEOUT
|
||||
*
|
||||
* This value is deprecated and reserved. DO NOT USE!
|
||||
*
|
||||
*/
|
||||
|
||||
#define DLM_LKF_NOQUEUE 0x00000001
|
||||
|
||||
Reference in New Issue
Block a user