diff options
author | Yan, Zheng <zyan@redhat.com> | 2016-09-14 04:39:51 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-10-03 10:13:50 -0400 |
commit | fcff415c9421b417ef91d48f546f3c4566ddc358 (patch) | |
tree | 113ffb525972f94538f057cebdbbfcca834cc6d5 | |
parent | ce2728aaa82bbebae7d20345324af3f0f49eeb20 (diff) |
ceph: handle CEPH_SESSION_REJECT message
Signed-off-by: Yan, Zheng <zyan@redhat.com>
-rw-r--r-- | fs/ceph/mds_client.c | 27 | ||||
-rw-r--r-- | fs/ceph/mds_client.h | 1 | ||||
-rw-r--r-- | fs/ceph/strings.c | 2 | ||||
-rw-r--r-- | include/linux/ceph/ceph_fs.h | 1 |
4 files changed, 26 insertions, 5 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index f72d4ae303b2..277ac9c5c99c 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -370,6 +370,7 @@ const char *ceph_session_state_name(int s) | |||
370 | case CEPH_MDS_SESSION_CLOSING: return "closing"; | 370 | case CEPH_MDS_SESSION_CLOSING: return "closing"; |
371 | case CEPH_MDS_SESSION_RESTARTING: return "restarting"; | 371 | case CEPH_MDS_SESSION_RESTARTING: return "restarting"; |
372 | case CEPH_MDS_SESSION_RECONNECTING: return "reconnecting"; | 372 | case CEPH_MDS_SESSION_RECONNECTING: return "reconnecting"; |
373 | case CEPH_MDS_SESSION_REJECTED: return "rejected"; | ||
373 | default: return "???"; | 374 | default: return "???"; |
374 | } | 375 | } |
375 | } | 376 | } |
@@ -1378,7 +1379,7 @@ static int request_close_session(struct ceph_mds_client *mdsc, | |||
1378 | if (!msg) | 1379 | if (!msg) |
1379 | return -ENOMEM; | 1380 | return -ENOMEM; |
1380 | ceph_con_send(&session->s_con, msg); | 1381 | ceph_con_send(&session->s_con, msg); |
1381 | return 0; | 1382 | return 1; |
1382 | } | 1383 | } |
1383 | 1384 | ||
1384 | /* | 1385 | /* |
@@ -2131,6 +2132,10 @@ static int __do_request(struct ceph_mds_client *mdsc, | |||
2131 | ceph_session_state_name(session->s_state)); | 2132 | ceph_session_state_name(session->s_state)); |
2132 | if (session->s_state != CEPH_MDS_SESSION_OPEN && | 2133 | if (session->s_state != CEPH_MDS_SESSION_OPEN && |
2133 | session->s_state != CEPH_MDS_SESSION_HUNG) { | 2134 | session->s_state != CEPH_MDS_SESSION_HUNG) { |
2135 | if (session->s_state == CEPH_MDS_SESSION_REJECTED) { | ||
2136 | err = -EACCES; | ||
2137 | goto out_session; | ||
2138 | } | ||
2134 | if (session->s_state == CEPH_MDS_SESSION_NEW || | 2139 | if (session->s_state == CEPH_MDS_SESSION_NEW || |
2135 | session->s_state == CEPH_MDS_SESSION_CLOSING) | 2140 | session->s_state == CEPH_MDS_SESSION_CLOSING) |
2136 | __open_session(mdsc, session); | 2141 | __open_session(mdsc, session); |
@@ -2652,6 +2657,15 @@ static void handle_session(struct ceph_mds_session *session, | |||
2652 | wake_up_session_caps(session, 0); | 2657 | wake_up_session_caps(session, 0); |
2653 | break; | 2658 | break; |
2654 | 2659 | ||
2660 | case CEPH_SESSION_REJECT: | ||
2661 | WARN_ON(session->s_state != CEPH_MDS_SESSION_OPENING); | ||
2662 | pr_info("mds%d rejected session\n", session->s_mds); | ||
2663 | session->s_state = CEPH_MDS_SESSION_REJECTED; | ||
2664 | cleanup_session_requests(mdsc, session); | ||
2665 | remove_session_caps(session); | ||
2666 | wake = 2; /* for good measure */ | ||
2667 | break; | ||
2668 | |||
2655 | default: | 2669 | default: |
2656 | pr_err("mdsc_handle_session bad op %d mds%d\n", op, mds); | 2670 | pr_err("mdsc_handle_session bad op %d mds%d\n", op, mds); |
2657 | WARN_ON(1); | 2671 | WARN_ON(1); |
@@ -3557,11 +3571,11 @@ void ceph_mdsc_sync(struct ceph_mds_client *mdsc) | |||
3557 | /* | 3571 | /* |
3558 | * true if all sessions are closed, or we force unmount | 3572 | * true if all sessions are closed, or we force unmount |
3559 | */ | 3573 | */ |
3560 | static bool done_closing_sessions(struct ceph_mds_client *mdsc) | 3574 | static bool done_closing_sessions(struct ceph_mds_client *mdsc, int skipped) |
3561 | { | 3575 | { |
3562 | if (ACCESS_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) | 3576 | if (ACCESS_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) |
3563 | return true; | 3577 | return true; |
3564 | return atomic_read(&mdsc->num_sessions) == 0; | 3578 | return atomic_read(&mdsc->num_sessions) <= skipped; |
3565 | } | 3579 | } |
3566 | 3580 | ||
3567 | /* | 3581 | /* |
@@ -3572,6 +3586,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc) | |||
3572 | struct ceph_options *opts = mdsc->fsc->client->options; | 3586 | struct ceph_options *opts = mdsc->fsc->client->options; |
3573 | struct ceph_mds_session *session; | 3587 | struct ceph_mds_session *session; |
3574 | int i; | 3588 | int i; |
3589 | int skipped = 0; | ||
3575 | 3590 | ||
3576 | dout("close_sessions\n"); | 3591 | dout("close_sessions\n"); |
3577 | 3592 | ||
@@ -3583,7 +3598,8 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc) | |||
3583 | continue; | 3598 | continue; |
3584 | mutex_unlock(&mdsc->mutex); | 3599 | mutex_unlock(&mdsc->mutex); |
3585 | mutex_lock(&session->s_mutex); | 3600 | mutex_lock(&session->s_mutex); |
3586 | __close_session(mdsc, session); | 3601 | if (__close_session(mdsc, session) <= 0) |
3602 | skipped++; | ||
3587 | mutex_unlock(&session->s_mutex); | 3603 | mutex_unlock(&session->s_mutex); |
3588 | ceph_put_mds_session(session); | 3604 | ceph_put_mds_session(session); |
3589 | mutex_lock(&mdsc->mutex); | 3605 | mutex_lock(&mdsc->mutex); |
@@ -3591,7 +3607,8 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc) | |||
3591 | mutex_unlock(&mdsc->mutex); | 3607 | mutex_unlock(&mdsc->mutex); |
3592 | 3608 | ||
3593 | dout("waiting for sessions to close\n"); | 3609 | dout("waiting for sessions to close\n"); |
3594 | wait_event_timeout(mdsc->session_close_wq, done_closing_sessions(mdsc), | 3610 | wait_event_timeout(mdsc->session_close_wq, |
3611 | done_closing_sessions(mdsc, skipped), | ||
3595 | ceph_timeout_jiffies(opts->mount_timeout)); | 3612 | ceph_timeout_jiffies(opts->mount_timeout)); |
3596 | 3613 | ||
3597 | /* tear down remaining sessions */ | 3614 | /* tear down remaining sessions */ |
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index 6b3679737d4a..3c6f77b7bb02 100644 --- a/fs/ceph/mds_client.h +++ b/fs/ceph/mds_client.h | |||
@@ -121,6 +121,7 @@ enum { | |||
121 | CEPH_MDS_SESSION_CLOSING = 5, | 121 | CEPH_MDS_SESSION_CLOSING = 5, |
122 | CEPH_MDS_SESSION_RESTARTING = 6, | 122 | CEPH_MDS_SESSION_RESTARTING = 6, |
123 | CEPH_MDS_SESSION_RECONNECTING = 7, | 123 | CEPH_MDS_SESSION_RECONNECTING = 7, |
124 | CEPH_MDS_SESSION_REJECTED = 8, | ||
124 | }; | 125 | }; |
125 | 126 | ||
126 | struct ceph_mds_session { | 127 | struct ceph_mds_session { |
diff --git a/fs/ceph/strings.c b/fs/ceph/strings.c index 89e6bc321df3..913dea163d5c 100644 --- a/fs/ceph/strings.c +++ b/fs/ceph/strings.c | |||
@@ -43,6 +43,8 @@ const char *ceph_session_op_name(int op) | |||
43 | case CEPH_SESSION_RECALL_STATE: return "recall_state"; | 43 | case CEPH_SESSION_RECALL_STATE: return "recall_state"; |
44 | case CEPH_SESSION_FLUSHMSG: return "flushmsg"; | 44 | case CEPH_SESSION_FLUSHMSG: return "flushmsg"; |
45 | case CEPH_SESSION_FLUSHMSG_ACK: return "flushmsg_ack"; | 45 | case CEPH_SESSION_FLUSHMSG_ACK: return "flushmsg_ack"; |
46 | case CEPH_SESSION_FORCE_RO: return "force_ro"; | ||
47 | case CEPH_SESSION_REJECT: return "reject"; | ||
46 | } | 48 | } |
47 | return "???"; | 49 | return "???"; |
48 | } | 50 | } |
diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h index c086e63dcee1..f96de8de4fa7 100644 --- a/include/linux/ceph/ceph_fs.h +++ b/include/linux/ceph/ceph_fs.h | |||
@@ -281,6 +281,7 @@ enum { | |||
281 | CEPH_SESSION_FLUSHMSG, | 281 | CEPH_SESSION_FLUSHMSG, |
282 | CEPH_SESSION_FLUSHMSG_ACK, | 282 | CEPH_SESSION_FLUSHMSG_ACK, |
283 | CEPH_SESSION_FORCE_RO, | 283 | CEPH_SESSION_FORCE_RO, |
284 | CEPH_SESSION_REJECT, | ||
284 | }; | 285 | }; |
285 | 286 | ||
286 | extern const char *ceph_session_op_name(int op); | 287 | extern const char *ceph_session_op_name(int op); |