diff options
author | Yan, Zheng <zyan@redhat.com> | 2015-03-24 08:15:36 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2015-04-20 11:55:37 -0400 |
commit | 1c841a96b5f369cbb0b169d13825c7ff7d0fba8d (patch) | |
tree | 23949a63a1b45871a2d47cf428c9bb159d7b5740 /fs/ceph | |
parent | a9f6eb61850e1599f9aa5141f25ccc1d8248e174 (diff) |
ceph: cleanup unsafe requests when reconnecting is denied
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/mds_client.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index c3bac611a097..fd5585b8d382 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -1021,6 +1021,33 @@ static void cleanup_cap_releases(struct ceph_mds_session *session) | |||
1021 | spin_unlock(&session->s_cap_lock); | 1021 | spin_unlock(&session->s_cap_lock); |
1022 | } | 1022 | } |
1023 | 1023 | ||
1024 | static void cleanup_session_requests(struct ceph_mds_client *mdsc, | ||
1025 | struct ceph_mds_session *session) | ||
1026 | { | ||
1027 | struct ceph_mds_request *req; | ||
1028 | struct rb_node *p; | ||
1029 | |||
1030 | dout("cleanup_session_requests mds%d\n", session->s_mds); | ||
1031 | mutex_lock(&mdsc->mutex); | ||
1032 | while (!list_empty(&session->s_unsafe)) { | ||
1033 | req = list_first_entry(&session->s_unsafe, | ||
1034 | struct ceph_mds_request, r_unsafe_item); | ||
1035 | list_del_init(&req->r_unsafe_item); | ||
1036 | pr_info(" dropping unsafe request %llu\n", req->r_tid); | ||
1037 | __unregister_request(mdsc, req); | ||
1038 | } | ||
1039 | /* zero r_attempts, so kick_requests() will re-send requests */ | ||
1040 | p = rb_first(&mdsc->request_tree); | ||
1041 | while (p) { | ||
1042 | req = rb_entry(p, struct ceph_mds_request, r_node); | ||
1043 | p = rb_next(p); | ||
1044 | if (req->r_session && | ||
1045 | req->r_session->s_mds == session->s_mds) | ||
1046 | req->r_attempts = 0; | ||
1047 | } | ||
1048 | mutex_unlock(&mdsc->mutex); | ||
1049 | } | ||
1050 | |||
1024 | /* | 1051 | /* |
1025 | * Helper to safely iterate over all caps associated with a session, with | 1052 | * Helper to safely iterate over all caps associated with a session, with |
1026 | * special care taken to handle a racing __ceph_remove_cap(). | 1053 | * special care taken to handle a racing __ceph_remove_cap(). |
@@ -2589,6 +2616,7 @@ static void handle_session(struct ceph_mds_session *session, | |||
2589 | case CEPH_SESSION_CLOSE: | 2616 | case CEPH_SESSION_CLOSE: |
2590 | if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) | 2617 | if (session->s_state == CEPH_MDS_SESSION_RECONNECTING) |
2591 | pr_info("mds%d reconnect denied\n", session->s_mds); | 2618 | pr_info("mds%d reconnect denied\n", session->s_mds); |
2619 | cleanup_session_requests(mdsc, session); | ||
2592 | remove_session_caps(session); | 2620 | remove_session_caps(session); |
2593 | wake = 2; /* for good measure */ | 2621 | wake = 2; /* for good measure */ |
2594 | wake_up_all(&mdsc->session_close_wq); | 2622 | wake_up_all(&mdsc->session_close_wq); |