struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode,
__u32 *flags);
void ldlm_lock_cancel(struct ldlm_lock *lock);
-void ldlm_cancel_locks_for_export(struct obd_export *export);
void ldlm_reprocess_all(struct ldlm_resource *res);
void ldlm_reprocess_all_ns(struct ldlm_namespace *ns);
void ldlm_lock_dump(int level, struct ldlm_lock *lock, int pos);
int priority);
int client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid);
int import_set_conn_priority(struct obd_import *imp, struct obd_uuid *uuid);
+int server_disconnect_export(struct obd_export *exp);
/* ptlrpc/pinger.c */
enum timeout_event {
void ldlm_lock_touch_in_lru(struct ldlm_lock *lock);
void ldlm_lock_destroy_nolock(struct ldlm_lock *lock);
+void ldlm_cancel_locks_for_export(struct obd_export *export);
+
/* ldlm_lockd.c */
int ldlm_bl_to_thread_lock(struct ldlm_namespace *ns, struct ldlm_lock_desc *ld,
struct ldlm_lock *lock);
RETURN(rc);
}
+int server_disconnect_export(struct obd_export *exp)
+{
+ int rc;
+ ENTRY;
+
+ /* Disconnect early so that clients can't keep using export */
+ rc = class_disconnect(exp);
+
+ /* close import for avoid sending any requests */
+ if (exp->exp_imp_reverse)
+ ptlrpc_cleanup_imp(exp->exp_imp_reverse);
+
+ if (exp->exp_obd->obd_namespace != NULL)
+ ldlm_cancel_locks_for_export(exp);
+
+ /* complete all outstanding replies */
+ spin_lock(&exp->exp_lock);
+ while (!list_empty(&exp->exp_outstanding_replies)) {
+ struct ptlrpc_reply_state *rs =
+ list_entry(exp->exp_outstanding_replies.next,
+ struct ptlrpc_reply_state, rs_exp_list);
+ struct ptlrpc_service *svc = rs->rs_service;
+
+ spin_lock(&svc->srv_lock);
+ list_del_init(&rs->rs_exp_list);
+ ptlrpc_schedule_difficult_reply(rs);
+ spin_unlock(&svc->srv_lock);
+ }
+ spin_unlock(&exp->exp_lock);
+
+ /* release nid stat refererence */
+ lprocfs_exp_cleanup(exp);
+
+ RETURN(rc);
+}
+
/* --------------------------------------------------------------------------
* from old lib/target.c
* -------------------------------------------------------------------------- */
}
ldlm_del_waiting_lock(lock);
-
/* Releases res lock */
ldlm_cancel_callback(lock);
/* Yes, second time, just in case it was added again while we were
running with no res lock in ldlm_cancel_callback */
ldlm_del_waiting_lock(lock);
+
ldlm_resource_unlink_lock(lock);
ldlm_lock_destroy_nolock(lock);
EXPORT_SYMBOL(ldlm_it2str);
EXPORT_SYMBOL(ldlm_lock_dump);
EXPORT_SYMBOL(ldlm_lock_dump_handle);
-EXPORT_SYMBOL(ldlm_cancel_locks_for_export);
EXPORT_SYMBOL(ldlm_reprocess_all_ns);
EXPORT_SYMBOL(ldlm_lock_allow_match);
EXPORT_SYMBOL(client_obd_cleanup);
EXPORT_SYMBOL(client_connect_import);
EXPORT_SYMBOL(client_disconnect_export);
+EXPORT_SYMBOL(server_disconnect_export);
EXPORT_SYMBOL(target_abort_recovery);
EXPORT_SYMBOL(target_cleanup_recovery);
EXPORT_SYMBOL(target_handle_connect);
LASSERT(exp);
class_export_get(exp);
- /* Disconnect early so that clients can't keep using export */
- rc = class_disconnect(exp);
- if (exp->exp_obd->obd_namespace != NULL)
- ldlm_cancel_locks_for_export(exp);
-
- /* release nid stat refererence */
- lprocfs_exp_cleanup(exp);
+ rc = server_disconnect_export(exp);
rc = mds_cleanup_mfd(exp);
class_export_get(exp);
mgs_counter_incr(exp, LPROC_MGS_DISCONNECT);
- /* Disconnect early so that clients can't keep using export */
- rc = class_disconnect(exp);
- ldlm_cancel_locks_for_export(exp);
-
- lprocfs_exp_cleanup(exp);
-
- /* complete all outstanding replies */
- spin_lock(&exp->exp_lock);
- while (!list_empty(&exp->exp_outstanding_replies)) {
- struct ptlrpc_reply_state *rs =
- list_entry(exp->exp_outstanding_replies.next,
- struct ptlrpc_reply_state, rs_exp_list);
- struct ptlrpc_service *svc = rs->rs_service;
-
- spin_lock(&svc->srv_lock);
- list_del_init(&rs->rs_exp_list);
- ptlrpc_schedule_difficult_reply(rs);
- spin_unlock(&svc->srv_lock);
- }
- spin_unlock(&exp->exp_lock);
+ rc = server_disconnect_export(exp);
class_export_put(exp);
RETURN(rc);
{
LASSERT (exp != NULL);
- ldlm_cancel_locks_for_export(exp);
-
- /* complete all outstanding replies */
- spin_lock(&exp->exp_lock);
- while (!list_empty(&exp->exp_outstanding_replies)) {
- struct ptlrpc_reply_state *rs =
- list_entry(exp->exp_outstanding_replies.next,
- struct ptlrpc_reply_state, rs_exp_list);
- struct ptlrpc_service *svc = rs->rs_service;
-
- spin_lock(&svc->srv_lock);
- list_del_init(&rs->rs_exp_list);
- ptlrpc_schedule_difficult_reply(rs);
- spin_unlock(&svc->srv_lock);
- }
- spin_unlock(&exp->exp_lock);
-
- return class_disconnect(exp);
+ return server_disconnect_export(exp);
}
static int echo_init_export(struct obd_export *exp)
lquota_clearinfo(filter_quota_interface_ref, exp, exp->exp_obd);
- /* Disconnect early so that clients can't keep using export */
- rc = class_disconnect(exp);
- if (exp->exp_obd->obd_namespace != NULL)
- ldlm_cancel_locks_for_export(exp);
+ rc = server_disconnect_export(exp);
- lprocfs_exp_cleanup(exp);
class_export_put(exp);
RETURN(rc);
}