struct obd_uuid *cluuid);
int class_disconnect(struct obd_export *exp);
void class_fail_export(struct obd_export *exp);
+int class_connected_export(struct obd_export *exp);
void class_disconnect_exports(struct obd_device *obddev);
void class_set_export_delayed(struct obd_export *exp);
void class_handle_stale_exports(struct obd_device *obddev);
spin_unlock(&export->exp_lock);
GOTO(out, rc = -EALREADY);
}
+ LASSERT(lustre_msg_get_conn_cnt(req->rq_reqmsg) > 0);
export->exp_conn_cnt = lustre_msg_get_conn_cnt(req->rq_reqmsg);
export->exp_abort_active_req = 0;
RETURN(rc);
}
- /* XXX identical to OST */
if (lustre_msg_get_opc(req->rq_reqmsg) != MDS_CONNECT) {
struct mds_export_data *med;
int recovering;
- if (req->rq_export == NULL) {
+ if (!class_connected_export(req->rq_export)) {
CERROR("operation %d on unconnected MDS from %s\n",
lustre_msg_get_opc(req->rq_reqmsg),
libcfs_id2str(req->rq_peer));
LASSERT(current->journal_info == NULL);
opc = lustre_msg_get_opc(req->rq_reqmsg);
if (opc != MGS_CONNECT) {
- if (req->rq_export == NULL) {
+ if (!class_connected_export(req->rq_export)) {
CERROR("lustre_mgs: operation %d on unconnected MGS\n",
opc);
req->rq_status = -ENOTCONN;
RETURN(0);
}
+/* Return non-zero for a fully connected export */
+int class_connected_export(struct obd_export *exp)
+{
+ if (exp) {
+ int connected;
+ spin_lock(&exp->exp_lock);
+ connected = (exp->exp_conn_cnt > 0);
+ spin_unlock(&exp->exp_lock);
+ return connected;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(class_connected_export);
+
static void class_disconnect_export_list(struct list_head *list,
enum obd_option flags)
{
int class_handle_init(void)
{
struct handle_bucket *bucket;
+ struct timeval tv;
+ int seed[2];
LASSERT(handle_hash == NULL);
spin_lock_init(&bucket->lock);
}
+ /** bug 21430: add randomness to the initial base */
+ ll_get_random_bytes(seed, sizeof(seed));
+ do_gettimeofday(&tv);
+ ll_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]);
+
ll_get_random_bytes(&handle_base, sizeof(handle_base));
LASSERT(handle_base != 0ULL);
ENTRY;
LASSERT(current->journal_info == NULL);
- /* XXX identical to MDS */
if (lustre_msg_get_opc(req->rq_reqmsg) != OST_CONNECT) {
int recovering;
- if (req->rq_export == NULL) {
+ if (!class_connected_export(req->rq_export)) {
CDEBUG(D_HA,"operation %d on unconnected OST from %s\n",
lustre_msg_get_opc(req->rq_reqmsg),
libcfs_id2str(req->rq_peer));