enum obd_notify_event ev, void *data)
{
int rc = 0;
+ struct lov_obd *lov = &obd->u.lov;
ENTRY;
+ down_read(&lov->lov_notify_lock);
+ if (!lov->lov_connects) {
+ up_read(&lov->lov_notify_lock);
+ RETURN(rc);
+ }
+
if (ev == OBD_NOTIFY_ACTIVE || ev == OBD_NOTIFY_INACTIVE ||
ev == OBD_NOTIFY_ACTIVATE || ev == OBD_NOTIFY_DEACTIVATE) {
struct obd_uuid *uuid;
LASSERT(watched);
if (strcmp(watched->obd_type->typ_name, LUSTRE_OSC_NAME)) {
+ up_read(&lov->lov_notify_lock);
CERROR("unexpected notification of %s %s!\n",
watched->obd_type->typ_name,
watched->obd_name);
*/
rc = lov_set_osc_active(obd, uuid, ev);
if (rc < 0) {
+ up_read(&lov->lov_notify_lock);
CERROR("event(%d) of %s failed: %d\n", ev,
obd_uuid2str(uuid), rc);
RETURN(rc);
obd_putref(obd);
}
+ up_read(&lov->lov_notify_lock);
RETURN(rc);
}
RETURN(-EINVAL);
}
+ /* to make sure there's no ongoing lov_notify() now */
+ down_write(&lov->lov_notify_lock);
obd_getref(obd);
if (!lov->lov_tgts[index]) {
/* we really delete it from obd_putref */
out:
obd_putref(obd);
+ up_write(&lov->lov_notify_lock);
RETURN(rc);
}
cfs_atomic_set(&lov->lov_refcount, 0);
lov->lov_sp_me = LUSTRE_SP_CLI;
+ init_rwsem(&lov->lov_notify_lock);
+
lov->lov_pools_hash_body = cfs_hash_create("POOLS", HASH_POOLS_CUR_BITS,
HASH_POOLS_MAX_BITS,
HASH_POOLS_BKT_BITS, 0,