module_put(type->typ_ops->o_owner);
}
-int class_register_type(struct obd_ops *ops, struct lprocfs_vars *vars,
- char *name)
+int class_register_type(struct obd_ops *ops, struct md_ops *md_ops,
+ struct lprocfs_vars *vars, char *name)
{
struct obd_type *type;
int rc = 0;
OBD_ALLOC(type->typ_ops, sizeof(*type->typ_ops));
OBD_ALLOC(type->typ_name, strlen(name) + 1);
- if (type->typ_ops == NULL || type->typ_name == NULL)
+ if (md_ops)
+ OBD_ALLOC(type->typ_md_ops, sizeof(*type->typ_md_ops));
+ if (type->typ_ops == NULL || type->typ_name == NULL ||
+ (md_ops && type->typ_md_ops == NULL))
GOTO (failed, rc);
*(type->typ_ops) = *ops;
+ if (md_ops)
+ *(type->typ_md_ops) = *md_ops;
+ else
+ type->typ_md_ops = NULL;
strcpy(type->typ_name, name);
#ifdef LPROCFS
OBD_FREE(type->typ_name, strlen(name) + 1);
if (type->typ_ops != NULL)
OBD_FREE (type->typ_ops, sizeof (*type->typ_ops));
+ if (type->typ_md_ops != NULL)
+ OBD_FREE (type->typ_md_ops, sizeof (*type->typ_md_ops));
OBD_FREE(type, sizeof(*type));
RETURN(rc);
}
OBD_FREE(type->typ_name, strlen(name) + 1);
if (type->typ_ops != NULL)
OBD_FREE(type->typ_ops, sizeof(*type->typ_ops));
+ if (type->typ_md_ops != NULL)
+ OBD_FREE (type->typ_md_ops, sizeof (*type->typ_md_ops));
OBD_FREE(type, sizeof(*type));
RETURN(0);
} /* class_unregister_type */
/* Search for a client OBD connected to tgt_uuid. If grp_uuid is
specified, then only the client with that uuid is returned,
- otherwise any client connected to the tgt is returned. */
+ otherwise any client connected to the tgt is returned.
+ If tgt_uuid is NULL, the lov with grp_uuid is returned. */
struct obd_device * class_find_client_obd(struct obd_uuid *tgt_uuid,
char * typ_name,
struct obd_uuid *grp_uuid)
strlen(typ_name)) == 0)) {
struct client_obd *cli = &obd->u.cli;
struct obd_import *imp = cli->cl_import;
+ if (tgt_uuid == NULL) {
+ LASSERT(grp_uuid);
+ if (obd_uuid_equals(grp_uuid, &obd->obd_uuid))
+ return obd;
+ continue;
+ }
if (obd_uuid_equals(tgt_uuid, &imp->imp_target_uuid) &&
((grp_uuid)? obd_uuid_equals(grp_uuid,
&obd->obd_uuid) : 1)) {
if (obd->obd_set_up) {
atomic_dec(&obd->obd_refcount);
wake_up(&obd->obd_refcount_waitq);
+ } else {
+ CERROR("removing export %p from obd %s (%p) -- OBD "
+ "not set up (refcount = %d)\n", exp,
+ obd->obd_name, obd,
+ atomic_read(&obd->obd_refcount));
}
}
}
export->exp_conn_cnt = 0;
atomic_set(&export->exp_refcount, 2);
+ atomic_set(&export->exp_rpc_count, 0);
export->exp_obd = obd;
INIT_LIST_HEAD(&export->exp_outstanding_replies);
/* XXX this should be in LDLM init */
init_waitqueue_head(&imp->imp_recovery_waitq);
atomic_set(&imp->imp_refcount, 2);
+ atomic_set(&imp->imp_inflight, 0);
atomic_set(&imp->imp_replay_inflight, 0);
INIT_LIST_HEAD(&imp->imp_handle.h_link);
class_handle_hash(&imp->imp_handle, import_handle_addref);
void class_destroy_import(struct obd_import *import)
{
LASSERT(import != NULL);
- LASSERT((unsigned long)import != 0x5a5a5a5a);
+ LASSERT(import != LP_POISON);
class_handle_unhash(&import->imp_handle);
CDEBUG(D_IOCTL, "disconnect: cookie "LPX64"\n",
export->exp_handle.h_cookie);
- class_unlink_export(export);
- class_export_put(export);
+ if (export->exp_handle.h_cookie == 0x5a5a5a5a5a5a5a5a) {
+ CERROR("disconnecting freed export %p, ignoring\n", export);
+ } else {
+ class_unlink_export(export);
+ class_export_put(export);
+ }
RETURN(0);
}
CDEBUG(D_HA,
"exp %p export uuid == obd uuid, don't discon\n",
exp);
+ /* Need to delete this now so we don't end up pointing
+ * to work_list later when this export is cleaned up. */
+ list_del_init(&exp->exp_obd_chain);
class_export_put(exp);
continue;
}