if ((req_bits | *try_bits) == 0)
RETURN(0);
+ /* Group lock could be only DOM */
+ if (unlikely(req_mode == LCK_GROUP &&
+ (req_bits | *try_bits) != MDS_INODELOCK_DOM))
+ RETURN(-EPROTO);
+
list_for_each(tmp, queue) {
struct list_head *mode_tail;
if (*ldlm_flags & LDLM_FL_BLOCK_NOWAIT)
RETURN(-EWOULDBLOCK);
+ /* Combined DOM lock came across GROUP
+ * DOM lock, it makes the thread to be
+ * blocked for a long time, not allowed,
+ * the trybits to be used instead.
+ * Not combined DOM lock is requested by
+ * client, and have to wait for long
+ * until re-worked to a non-intent
+ * request). */
+ if ((req_bits & MDS_INODELOCK_DOM) &&
+ (req_bits & ~MDS_INODELOCK_DOM))
+ RETURN(-EPROTO);
+
goto skip_work_list;
}
enum {
NO_DOM_LOCK_ON_OPEN = 0,
TRYLOCK_DOM_ON_OPEN = 1,
+ /* not used anymore, left here for compatibility */
ALWAYS_DOM_LOCK_ON_OPEN = 2,
NUM_DOM_LOCK_ON_OPEN_MODES
};
lhc = &info->mti_lh[MDT_LH_LOCAL];
} else if (dom_lock) {
lm = (open_flags & MDS_FMODE_WRITE) ? LCK_PW : LCK_PR;
- if (dom_lock == TRYLOCK_DOM_ON_OPEN) {
- trybits |= MDS_INODELOCK_DOM |
- MDS_INODELOCK_LAYOUT;
- } else {
- /* dom_lock == ALWAYS_DOM_LOCK_ON_OPEN */
- *ibits = MDS_INODELOCK_DOM;
- if (info->mti_mdt->mdt_opts.mo_dom_read_open)
- trybits |= MDS_INODELOCK_LAYOUT;
- }
+ trybits |= MDS_INODELOCK_DOM | MDS_INODELOCK_LAYOUT;
}
CDEBUG(D_INODE, "normal open:"DFID" lease count: %d, lm: %d\n",