b=21430
i=adilger
i=johann
seeds PRNG with current time on server, checks export is connected during
request handling
struct obd_uuid *cluuid);
int class_disconnect(struct obd_export *exp);
void class_fail_export(struct obd_export *exp);
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);
int class_manual_cleanup(struct obd_device *obd);
void class_disconnect_stale_exports(struct obd_device *,
void class_disconnect_exports(struct obd_device *obddev);
int class_manual_cleanup(struct obd_device *obd);
void class_disconnect_stale_exports(struct obd_device *,
GOTO(out, rc = -EALREADY);
}
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;
export->exp_conn_cnt = lustre_msg_get_conn_cnt(req->rq_reqmsg);
export->exp_abort_active_req = 0;
- if (unlikely(req->rq_export == NULL)) {
+ if (unlikely(!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));
CERROR("operation %d on unconnected MDS from %s\n",
lustre_msg_get_opc(req->rq_reqmsg),
libcfs_id2str(req->rq_peer));
GOTO(out, rc = 0);
if (opc != MGS_CONNECT) {
GOTO(out, rc = 0);
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;
CERROR("lustre_mgs: operation %d on unconnected MGS\n",
opc);
req->rq_status = -ENOTCONN;
+/* 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)
{
static void class_disconnect_export_list(struct list_head *list,
enum obd_option flags)
{
int class_handle_init(void)
{
struct handle_bucket *bucket;
int class_handle_init(void)
{
struct handle_bucket *bucket;
+ struct timeval tv;
+ int seed[2];
LASSERT(handle_hash == NULL);
LASSERT(handle_hash == NULL);
CFS_INIT_LIST_HEAD(&bucket->head);
spin_lock_init(&bucket->lock);
}
CFS_INIT_LIST_HEAD(&bucket->head);
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);
ll_get_random_bytes(&handle_base, sizeof(handle_base));
LASSERT(handle_base != 0ULL);
req_capsule_init(&req->rq_pill, req, RCL_SERVER);
req_capsule_init(&req->rq_pill, req, RCL_SERVER);
- /* XXX identical to MDS */
if (lustre_msg_get_opc(req->rq_reqmsg) != OST_CONNECT) {
int recovering;
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));
CDEBUG(D_HA,"operation %d on unconnected OST from %s\n",
lustre_msg_get_opc(req->rq_reqmsg),
libcfs_id2str(req->rq_peer));