Skip to content

Commit 1361737

Browse files
Alexander Aringteigland
authored andcommitted
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: Alexander Aring <[email protected]> Signed-off-by: David Teigland <[email protected]>
1 parent 46d6e72 commit 1361737

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

fs/dlm/dlm_internal.h

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ struct dlm_lkb {
235235
uint32_t lkb_id; /* our lock ID */
236236
uint32_t lkb_remid; /* lock ID on remote partner */
237237
uint32_t lkb_exflags; /* external flags from caller */
238-
uint32_t lkb_sbflags; /* lksb flags */
238+
unsigned long lkb_sbflags; /* lksb flags */
239239
unsigned long lkb_dflags; /* distributed flags */
240240
unsigned long lkb_iflags; /* internal flags */
241241
uint32_t lkb_lvbseq; /* lvb sequence number */
@@ -760,6 +760,26 @@ static inline uint32_t dlm_dflags_val(const struct dlm_lkb *lkb)
760760
__DLM_DFL_MAX_BIT);
761761
}
762762

763+
/* coming from UAPI header
764+
*
765+
* TODO:
766+
* Move this to UAPI header and let other values point to them and use BIT()
767+
*/
768+
#define DLM_SBF_DEMOTED_BIT 0
769+
#define __DLM_SBF_MIN_BIT DLM_SBF_DEMOTED_BIT
770+
#define DLM_SBF_VALNOTVALID_BIT 1
771+
#define DLM_SBF_ALTMODE_BIT 2
772+
#define __DLM_SBF_MAX_BIT DLM_SBF_ALTMODE_BIT
773+
774+
static inline uint32_t dlm_sbflags_val(const struct dlm_lkb *lkb)
775+
{
776+
/* be sure the next person updates this */
777+
BUILD_BUG_ON(BIT(__DLM_SBF_MAX_BIT) != DLM_SBF_ALTMODE);
778+
779+
return dlm_flags_val(&lkb->lkb_sbflags, __DLM_SBF_MIN_BIT,
780+
__DLM_SBF_MAX_BIT);
781+
}
782+
763783
static inline void dlm_set_flags_val(unsigned long *addr, uint32_t val,
764784
uint32_t min, uint32_t max)
765785
{
@@ -779,6 +799,12 @@ static inline void dlm_set_dflags_val(struct dlm_lkb *lkb, uint32_t val)
779799
__DLM_DFL_MAX_BIT);
780800
}
781801

802+
static inline void dlm_set_sbflags_val(struct dlm_lkb *lkb, uint32_t val)
803+
{
804+
dlm_set_flags_val(&lkb->lkb_sbflags, val, __DLM_SBF_MIN_BIT,
805+
__DLM_SBF_MAX_BIT);
806+
}
807+
782808
int dlm_plock_init(void);
783809
void dlm_plock_exit(void);
784810

fs/dlm/lock.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,12 @@ static inline int force_blocking_asts(struct dlm_lkb *lkb)
228228

229229
static inline int is_demoted(struct dlm_lkb *lkb)
230230
{
231-
return (lkb->lkb_sbflags & DLM_SBF_DEMOTED);
231+
return test_bit(DLM_SBF_DEMOTED_BIT, &lkb->lkb_sbflags);
232232
}
233233

234234
static inline int is_altmode(struct dlm_lkb *lkb)
235235
{
236-
return (lkb->lkb_sbflags & DLM_SBF_ALTMODE);
236+
return test_bit(DLM_SBF_ALTMODE_BIT, &lkb->lkb_sbflags);
237237
}
238238

239239
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)
298298
test_and_clear_bit(DLM_IFL_DEADLOCK_CANCEL_BIT, &lkb->lkb_iflags))
299299
rv = -EDEADLK;
300300

301-
dlm_add_cb(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, lkb->lkb_sbflags);
301+
dlm_add_cb(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, dlm_sbflags_val(lkb));
302302
}
303303

304304
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)
17701770
}
17711771

17721772
if (rsb_flag(r, RSB_VALNOTVALID))
1773-
lkb->lkb_sbflags |= DLM_SBF_VALNOTVALID;
1773+
set_bit(DLM_SBF_VALNOTVALID_BIT, &lkb->lkb_sbflags);
17741774
}
17751775

17761776
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,
22422242
conversion_deadlock_detect(r, lkb)) {
22432243
if (lkb->lkb_exflags & DLM_LKF_CONVDEADLK) {
22442244
lkb->lkb_grmode = DLM_LOCK_NL;
2245-
lkb->lkb_sbflags |= DLM_SBF_DEMOTED;
2245+
set_bit(DLM_SBF_DEMOTED_BIT, &lkb->lkb_sbflags);
22462246
} else if (err) {
22472247
*err = -EDEADLK;
22482248
} else {
@@ -2269,7 +2269,7 @@ static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now,
22692269
lkb->lkb_rqmode = alt;
22702270
rv = _can_be_granted(r, lkb, now, 0);
22712271
if (rv)
2272-
lkb->lkb_sbflags |= DLM_SBF_ALTMODE;
2272+
set_bit(DLM_SBF_ALTMODE_BIT, &lkb->lkb_sbflags);
22732273
else
22742274
lkb->lkb_rqmode = rqmode;
22752275
}
@@ -2685,7 +2685,7 @@ static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
26852685
}
26862686

26872687
lkb->lkb_exflags = args->flags;
2688-
lkb->lkb_sbflags = 0;
2688+
dlm_set_sbflags_val(lkb, 0);
26892689
lkb->lkb_astfn = args->astfn;
26902690
lkb->lkb_astparam = args->astparam;
26912691
lkb->lkb_bastfn = args->bastfn;
@@ -2836,7 +2836,7 @@ static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args)
28362836
out_ok:
28372837
/* an overlapping op shouldn't blow away exflags from other op */
28382838
lkb->lkb_exflags |= args->flags;
2839-
lkb->lkb_sbflags = 0;
2839+
dlm_set_sbflags_val(lkb, 0);
28402840
lkb->lkb_astparam = args->astparam;
28412841
rv = 0;
28422842
out:
@@ -3408,7 +3408,7 @@ static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb,
34083408
ms->m_lkid = cpu_to_le32(lkb->lkb_id);
34093409
ms->m_remid = cpu_to_le32(lkb->lkb_remid);
34103410
ms->m_exflags = cpu_to_le32(lkb->lkb_exflags);
3411-
ms->m_sbflags = cpu_to_le32(lkb->lkb_sbflags);
3411+
ms->m_sbflags = cpu_to_le32(dlm_sbflags_val(lkb));
34123412
ms->m_flags = cpu_to_le32(dlm_dflags_val(lkb));
34133413
ms->m_lvbseq = cpu_to_le32(lkb->lkb_lvbseq);
34143414
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,
36733673
static void receive_flags(struct dlm_lkb *lkb, struct dlm_message *ms)
36743674
{
36753675
lkb->lkb_exflags = le32_to_cpu(ms->m_exflags);
3676-
lkb->lkb_sbflags = le32_to_cpu(ms->m_sbflags);
3676+
dlm_set_sbflags_val(lkb, le32_to_cpu(ms->m_sbflags));
36773677
dlm_set_dflags_val(lkb, le32_to_cpu(ms->m_flags));
36783678
}
36793679

@@ -3683,7 +3683,7 @@ static void receive_flags_reply(struct dlm_lkb *lkb, struct dlm_message *ms,
36833683
if (local)
36843684
return;
36853685

3686-
lkb->lkb_sbflags = le32_to_cpu(ms->m_sbflags);
3686+
dlm_set_sbflags_val(lkb, le32_to_cpu(ms->m_sbflags));
36873687
dlm_set_dflags_val(lkb, le32_to_cpu(ms->m_flags));
36883688
}
36893689

0 commit comments

Comments
 (0)