diff options
Diffstat (limited to 'drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c')
-rw-r--r-- | drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c b/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c index 131fc6d9646e..38923418669f 100644 --- a/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c +++ b/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c @@ -45,6 +45,42 @@ extern spinlock_t ptlrpc_last_xid_lock; extern spinlock_t ptlrpc_rs_debug_lock; #endif +DEFINE_MUTEX(ptlrpc_startup); +static int ptlrpc_active = 0; + +int ptlrpc_inc_ref(void) +{ + int rc = 0; + + mutex_lock(&ptlrpc_startup); + if (ptlrpc_active++ == 0) { + ptlrpc_put_connection_superhack = ptlrpc_connection_put; + + rc = ptlrpc_init_portals(); + if (!rc) { + rc= ptlrpc_start_pinger(); + if (rc) + ptlrpc_exit_portals(); + } + if (rc) + ptlrpc_active--; + } + mutex_unlock(&ptlrpc_startup); + return rc; +} +EXPORT_SYMBOL(ptlrpc_inc_ref); + +void ptlrpc_dec_ref(void) +{ + mutex_lock(&ptlrpc_startup); + if (--ptlrpc_active == 0) { + ptlrpc_stop_pinger(); + ptlrpc_exit_portals(); + } + mutex_unlock(&ptlrpc_startup); +} +EXPORT_SYMBOL(ptlrpc_dec_ref); + static int __init ptlrpc_init(void) { int rc, cleanup_phase = 0; @@ -71,24 +107,12 @@ static int __init ptlrpc_init(void) if (rc) goto cleanup; - cleanup_phase = 2; - rc = ptlrpc_init_portals(); - if (rc) - goto cleanup; - cleanup_phase = 3; rc = ptlrpc_connection_init(); if (rc) goto cleanup; - cleanup_phase = 4; - ptlrpc_put_connection_superhack = ptlrpc_connection_put; - - rc = ptlrpc_start_pinger(); - if (rc) - goto cleanup; - cleanup_phase = 5; rc = ldlm_init(); if (rc) @@ -122,15 +146,9 @@ cleanup: ldlm_exit(); /* Fall through */ case 5: - ptlrpc_stop_pinger(); - /* Fall through */ - case 4: ptlrpc_connection_fini(); /* Fall through */ case 3: - ptlrpc_exit_portals(); - /* Fall through */ - case 2: ptlrpc_request_cache_fini(); /* Fall through */ case 1: @@ -150,8 +168,6 @@ static void __exit ptlrpc_exit(void) ptlrpc_nrs_fini(); sptlrpc_fini(); ldlm_exit(); - ptlrpc_stop_pinger(); - ptlrpc_exit_portals(); ptlrpc_request_cache_fini(); ptlrpc_hr_fini(); ptlrpc_connection_fini(); |