"client?\n");
GOTO(out, rc = -EPROTO);
}
+ if (req->rq_export->exp_connect_flags & OBD_CONNECT_IBITS &&
+ dlm_req->lock_desc.l_resource.lr_type == LDLM_PLAIN) {
+ DEBUG_REQ(D_ERROR, req, "Plain lock request from ibita-aware "
+ "client?\n");
+ GOTO(out, rc = -EPROTO);
+ }
+
/* INODEBITS_INTEROP: Perform conversion from plain lock to
* inodebits lock if client does not support them.
else if (lock->l_granted_mode == lock->l_req_mode)
ldlm_add_waiting_lock(lock);
}
- if ((dlm_req->lock_desc.l_resource.lr_type == LDLM_PLAIN) &&
+ if ((dlm_req->lock_desc.l_resource.lr_type == LDLM_PLAIN ||
+ dlm_req->lock_desc.l_resource.lr_type == LDLM_IBITS) &&
req->rq_export->exp_libclient) {
if (!(lock->l_flags & LDLM_FL_CANCEL_ON_BLOCK) ||
!(dlm_rep->lock_flags & LDLM_FL_CANCEL_ON_BLOCK)) {
data->ocd_connect_flags &= MDS_CONNECT_SUPPORTED;
data->ocd_ibits_known &= MDS_INODELOCK_FULL;
+ /* If no known bits (which should not happen, probably,
+ as everybody should support LOOKUP and UPDATE bits at least)
+ revert to compat mode with plain locks. */
+ if (!data->ocd_ibits_known &&
+ data->ocd_connect_flags & OBD_CONNECT_IBITS)
+ data->ocd_connect_flags &= ~OBD_CONNECT_IBITS;
+
if (!obd->u.mds.mds_fl_acl)
data->ocd_connect_flags &= ~OBD_CONNECT_ACL;
ocd->ocd_connect_flags);
imp->imp_connect_data = *ocd;
+ if (!ocd->ocd_ibits_known &&
+ ocd->ocd_connect_flags & OBD_CONNECT_IBITS)
+ CERROR("Inodebits aware server returned zero compatible"
+ " bits?\n");
+
exp = class_conn2export(&imp->imp_dlm_handle);
LASSERT(exp);
exp->exp_connect_flags = ocd->ocd_connect_flags;