aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2016-09-14 04:39:51 -0400
committerIlya Dryomov <idryomov@gmail.com>2016-10-03 10:13:50 -0400
commitfcff415c9421b417ef91d48f546f3c4566ddc358 (patch)
tree113ffb525972f94538f057cebdbbfcca834cc6d5
parentce2728aaa82bbebae7d20345324af3f0f49eeb20 (diff)
ceph: handle CEPH_SESSION_REJECT message
Signed-off-by: Yan, Zheng <zyan@redhat.com>
-rw-r--r--fs/ceph/mds_client.c27
-rw-r--r--fs/ceph/mds_client.h1
-rw-r--r--fs/ceph/strings.c2
-rw-r--r--include/linux/ceph/ceph_fs.h1
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 */
3560static bool done_closing_sessions(struct ceph_mds_client *mdsc) 3574static 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
126struct ceph_mds_session { 127struct 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
286extern const char *ceph_session_op_name(int op); 287extern const char *ceph_session_op_name(int op);