/* 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 */
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);
}