Commit 1361737f authored by Alexander Aring's avatar Alexander Aring Committed by David Teigland

fs: dlm: switch lkb_sbflags to atomic ops

This patch moves lkb_sbflags handling to atomic bits ops. This should
prepare for a possible manipulating of lkb_sbflags flags at the same
time by concurrent execution.
Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent 46d6e722
...@@ -235,7 +235,7 @@ struct dlm_lkb { ...@@ -235,7 +235,7 @@ struct dlm_lkb {
uint32_t lkb_id; /* our lock ID */ uint32_t lkb_id; /* our lock ID */
uint32_t lkb_remid; /* lock ID on remote partner */ uint32_t lkb_remid; /* lock ID on remote partner */
uint32_t lkb_exflags; /* external flags from caller */ uint32_t lkb_exflags; /* external flags from caller */
uint32_t lkb_sbflags; /* lksb flags */ unsigned long lkb_sbflags; /* lksb flags */
unsigned long lkb_dflags; /* distributed flags */ unsigned long lkb_dflags; /* distributed flags */
unsigned long lkb_iflags; /* internal flags */ unsigned long lkb_iflags; /* internal flags */
uint32_t lkb_lvbseq; /* lvb sequence number */ uint32_t lkb_lvbseq; /* lvb sequence number */
...@@ -760,6 +760,26 @@ static inline uint32_t dlm_dflags_val(const struct dlm_lkb *lkb) ...@@ -760,6 +760,26 @@ static inline uint32_t dlm_dflags_val(const struct dlm_lkb *lkb)
__DLM_DFL_MAX_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, static inline void dlm_set_flags_val(unsigned long *addr, uint32_t val,
uint32_t min, uint32_t max) uint32_t min, uint32_t max)
{ {
...@@ -779,6 +799,12 @@ static inline void dlm_set_dflags_val(struct dlm_lkb *lkb, uint32_t val) ...@@ -779,6 +799,12 @@ static inline void dlm_set_dflags_val(struct dlm_lkb *lkb, uint32_t val)
__DLM_DFL_MAX_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); int dlm_plock_init(void);
void dlm_plock_exit(void); void dlm_plock_exit(void);
......
...@@ -228,12 +228,12 @@ static inline int force_blocking_asts(struct dlm_lkb *lkb) ...@@ -228,12 +228,12 @@ static inline int force_blocking_asts(struct dlm_lkb *lkb)
static inline int is_demoted(struct dlm_lkb *lkb) static inline int is_demoted(struct dlm_lkb *lkb)
{ {
return (lkb->lkb_sbflags & DLM_SBF_DEMOTED); return test_bit(DLM_SBF_DEMOTED_BIT, &lkb->lkb_sbflags);
} }
static inline int is_altmode(struct dlm_lkb *lkb) static inline int is_altmode(struct dlm_lkb *lkb)
{ {
return (lkb->lkb_sbflags & DLM_SBF_ALTMODE); return test_bit(DLM_SBF_ALTMODE_BIT, &lkb->lkb_sbflags);
} }
static inline int is_granted(struct dlm_lkb *lkb) static inline int is_granted(struct dlm_lkb *lkb)
...@@ -298,7 +298,7 @@ static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) ...@@ -298,7 +298,7 @@ static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv)
test_and_clear_bit(DLM_IFL_DEADLOCK_CANCEL_BIT, &lkb->lkb_iflags)) test_and_clear_bit(DLM_IFL_DEADLOCK_CANCEL_BIT, &lkb->lkb_iflags))
rv = -EDEADLK; rv = -EDEADLK;
dlm_add_cb(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, lkb->lkb_sbflags); dlm_add_cb(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, dlm_sbflags_val(lkb));
} }
static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb)
...@@ -1770,7 +1770,7 @@ static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) ...@@ -1770,7 +1770,7 @@ static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
} }
if (rsb_flag(r, RSB_VALNOTVALID)) if (rsb_flag(r, RSB_VALNOTVALID))
lkb->lkb_sbflags |= DLM_SBF_VALNOTVALID; set_bit(DLM_SBF_VALNOTVALID_BIT, &lkb->lkb_sbflags);
} }
static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb)
...@@ -2242,7 +2242,7 @@ static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, ...@@ -2242,7 +2242,7 @@ static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now,
conversion_deadlock_detect(r, lkb)) { conversion_deadlock_detect(r, lkb)) {
if (lkb->lkb_exflags & DLM_LKF_CONVDEADLK) { if (lkb->lkb_exflags & DLM_LKF_CONVDEADLK) {
lkb->lkb_grmode = DLM_LOCK_NL; lkb->lkb_grmode = DLM_LOCK_NL;
lkb->lkb_sbflags |= DLM_SBF_DEMOTED; set_bit(DLM_SBF_DEMOTED_BIT, &lkb->lkb_sbflags);
} else if (err) { } else if (err) {
*err = -EDEADLK; *err = -EDEADLK;
} else { } else {
...@@ -2269,7 +2269,7 @@ static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, ...@@ -2269,7 +2269,7 @@ static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now,
lkb->lkb_rqmode = alt; lkb->lkb_rqmode = alt;
rv = _can_be_granted(r, lkb, now, 0); rv = _can_be_granted(r, lkb, now, 0);
if (rv) if (rv)
lkb->lkb_sbflags |= DLM_SBF_ALTMODE; set_bit(DLM_SBF_ALTMODE_BIT, &lkb->lkb_sbflags);
else else
lkb->lkb_rqmode = rqmode; lkb->lkb_rqmode = rqmode;
} }
...@@ -2685,7 +2685,7 @@ static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, ...@@ -2685,7 +2685,7 @@ static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
} }
lkb->lkb_exflags = args->flags; lkb->lkb_exflags = args->flags;
lkb->lkb_sbflags = 0; dlm_set_sbflags_val(lkb, 0);
lkb->lkb_astfn = args->astfn; lkb->lkb_astfn = args->astfn;
lkb->lkb_astparam = args->astparam; lkb->lkb_astparam = args->astparam;
lkb->lkb_bastfn = args->bastfn; lkb->lkb_bastfn = args->bastfn;
...@@ -2836,7 +2836,7 @@ static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args) ...@@ -2836,7 +2836,7 @@ static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args)
out_ok: out_ok:
/* an overlapping op shouldn't blow away exflags from other op */ /* an overlapping op shouldn't blow away exflags from other op */
lkb->lkb_exflags |= args->flags; lkb->lkb_exflags |= args->flags;
lkb->lkb_sbflags = 0; dlm_set_sbflags_val(lkb, 0);
lkb->lkb_astparam = args->astparam; lkb->lkb_astparam = args->astparam;
rv = 0; rv = 0;
out: out:
...@@ -3408,7 +3408,7 @@ static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, ...@@ -3408,7 +3408,7 @@ static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb,
ms->m_lkid = cpu_to_le32(lkb->lkb_id); ms->m_lkid = cpu_to_le32(lkb->lkb_id);
ms->m_remid = cpu_to_le32(lkb->lkb_remid); ms->m_remid = cpu_to_le32(lkb->lkb_remid);
ms->m_exflags = cpu_to_le32(lkb->lkb_exflags); ms->m_exflags = cpu_to_le32(lkb->lkb_exflags);
ms->m_sbflags = cpu_to_le32(lkb->lkb_sbflags); ms->m_sbflags = cpu_to_le32(dlm_sbflags_val(lkb));
ms->m_flags = cpu_to_le32(dlm_dflags_val(lkb)); ms->m_flags = cpu_to_le32(dlm_dflags_val(lkb));
ms->m_lvbseq = cpu_to_le32(lkb->lkb_lvbseq); ms->m_lvbseq = cpu_to_le32(lkb->lkb_lvbseq);
ms->m_status = cpu_to_le32(lkb->lkb_status); ms->m_status = cpu_to_le32(lkb->lkb_status);
...@@ -3673,7 +3673,7 @@ static int send_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms_in, ...@@ -3673,7 +3673,7 @@ static int send_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms_in,
static void receive_flags(struct dlm_lkb *lkb, struct dlm_message *ms) static void receive_flags(struct dlm_lkb *lkb, struct dlm_message *ms)
{ {
lkb->lkb_exflags = le32_to_cpu(ms->m_exflags); lkb->lkb_exflags = le32_to_cpu(ms->m_exflags);
lkb->lkb_sbflags = le32_to_cpu(ms->m_sbflags); dlm_set_sbflags_val(lkb, le32_to_cpu(ms->m_sbflags));
dlm_set_dflags_val(lkb, le32_to_cpu(ms->m_flags)); dlm_set_dflags_val(lkb, le32_to_cpu(ms->m_flags));
} }
...@@ -3683,7 +3683,7 @@ static void receive_flags_reply(struct dlm_lkb *lkb, struct dlm_message *ms, ...@@ -3683,7 +3683,7 @@ static void receive_flags_reply(struct dlm_lkb *lkb, struct dlm_message *ms,
if (local) if (local)
return; return;
lkb->lkb_sbflags = le32_to_cpu(ms->m_sbflags); dlm_set_sbflags_val(lkb, le32_to_cpu(ms->m_sbflags));
dlm_set_dflags_val(lkb, le32_to_cpu(ms->m_flags)); dlm_set_dflags_val(lkb, le32_to_cpu(ms->m_flags));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment