GOTO(out, rc = -ENODEV);
}
- spin_lock(&target->obd_dev_lock);
-
- target->obd_conn_inprogress++;
+ atomic_inc(&target->obd_conn_inprogress);
if (target->obd_stopping || !target->obd_set_up) {
- spin_unlock(&target->obd_dev_lock);
-
deuuidify(str, NULL, &target_start, &target_len);
LCONSOLE_INFO("%.*s: Not available for connect from %s (%s)\n",
target_len, target_start,
}
if (target->obd_no_conn) {
- spin_unlock(&target->obd_dev_lock);
-
CDEBUG(D_INFO,
"%s: Temporarily refusing client connection from %s\n",
target->obd_name, libcfs_nidstr(&req->rq_peer.nid));
GOTO(out, rc = -EAGAIN);
}
- spin_unlock(&target->obd_dev_lock);
-
str = req_capsule_client_get(&req->rq_pill, &RMF_CLUUID);
if (str == NULL) {
DEBUG_REQ(D_ERROR, req, "bad client UUID for connect");
class_export_put(export);
}
- if (target != NULL) {
- spin_lock(&target->obd_dev_lock);
- target->obd_conn_inprogress--;
- spin_unlock(&target->obd_dev_lock);
+ if (target) {
+ if (atomic_dec_and_test(&target->obd_conn_inprogress))
+ wake_up_var(&target->obd_conn_inprogress);
class_decref(target, "find", current);
}
if (pcon)
lu_ref_init(&newdev->obd_reference);
lu_ref_add(&newdev->obd_reference, "newdev", newdev);
- newdev->obd_conn_inprogress = 0;
+ atomic_set(&newdev->obd_conn_inprogress, 0);
strncpy(newdev->obd_uuid.uuid, uuid, UUID_MAX);
spin_unlock(&obd->obd_dev_lock);
/* wait for already-arrived-connections to finish. */
- while (obd->obd_conn_inprogress > 0)
- yield();
+ wait_var_event(&obd->obd_conn_inprogress,
+ atomic_read(&obd->obd_conn_inprogress) == 0);
smp_rmb();
if (lcfg->lcfg_bufcount >= 2 && LUSTRE_CFG_BUFLEN(lcfg, 1) > 0) {