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 /fs/ceph | |
| parent | ce2728aaa82bbebae7d20345324af3f0f49eeb20 (diff) | |
ceph: handle CEPH_SESSION_REJECT message
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph')
| -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 |
3 files changed, 25 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 | } |
