Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ceph: handle CEPH_SESSION_REJECT message

Signed-off-by: Yan, Zheng <zyan@redhat.com>

authored by

Yan, Zheng and committed by
Ilya Dryomov
fcff415c ce2728aa

+26 -5
+22 -5
fs/ceph/mds_client.c
··· 370 370 case CEPH_MDS_SESSION_CLOSING: return "closing"; 371 371 case CEPH_MDS_SESSION_RESTARTING: return "restarting"; 372 372 case CEPH_MDS_SESSION_RECONNECTING: return "reconnecting"; 373 + case CEPH_MDS_SESSION_REJECTED: return "rejected"; 373 374 default: return "???"; 374 375 } 375 376 } ··· 1379 1378 if (!msg) 1380 1379 return -ENOMEM; 1381 1380 ceph_con_send(&session->s_con, msg); 1382 - return 0; 1381 + return 1; 1383 1382 } 1384 1383 1385 1384 /* ··· 2132 2131 ceph_session_state_name(session->s_state)); 2133 2132 if (session->s_state != CEPH_MDS_SESSION_OPEN && 2134 2133 session->s_state != CEPH_MDS_SESSION_HUNG) { 2134 + if (session->s_state == CEPH_MDS_SESSION_REJECTED) { 2135 + err = -EACCES; 2136 + goto out_session; 2137 + } 2135 2138 if (session->s_state == CEPH_MDS_SESSION_NEW || 2136 2139 session->s_state == CEPH_MDS_SESSION_CLOSING) 2137 2140 __open_session(mdsc, session); ··· 2655 2650 session->s_readonly = true; 2656 2651 spin_unlock(&session->s_cap_lock); 2657 2652 wake_up_session_caps(session, 0); 2653 + break; 2654 + 2655 + case CEPH_SESSION_REJECT: 2656 + WARN_ON(session->s_state != CEPH_MDS_SESSION_OPENING); 2657 + pr_info("mds%d rejected session\n", session->s_mds); 2658 + session->s_state = CEPH_MDS_SESSION_REJECTED; 2659 + cleanup_session_requests(mdsc, session); 2660 + remove_session_caps(session); 2661 + wake = 2; /* for good measure */ 2658 2662 break; 2659 2663 2660 2664 default: ··· 3571 3557 /* 3572 3558 * true if all sessions are closed, or we force unmount 3573 3559 */ 3574 - static bool done_closing_sessions(struct ceph_mds_client *mdsc) 3560 + static bool done_closing_sessions(struct ceph_mds_client *mdsc, int skipped) 3575 3561 { 3576 3562 if (ACCESS_ONCE(mdsc->fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) 3577 3563 return true; 3578 - return atomic_read(&mdsc->num_sessions) == 0; 3564 + return atomic_read(&mdsc->num_sessions) <= skipped; 3579 3565 } 3580 3566 3581 3567 /* ··· 3586 3572 struct ceph_options *opts = mdsc->fsc->client->options; 3587 3573 struct ceph_mds_session *session; 3588 3574 int i; 3575 + int skipped = 0; 3589 3576 3590 3577 dout("close_sessions\n"); 3591 3578 ··· 3598 3583 continue; 3599 3584 mutex_unlock(&mdsc->mutex); 3600 3585 mutex_lock(&session->s_mutex); 3601 - __close_session(mdsc, session); 3586 + if (__close_session(mdsc, session) <= 0) 3587 + skipped++; 3602 3588 mutex_unlock(&session->s_mutex); 3603 3589 ceph_put_mds_session(session); 3604 3590 mutex_lock(&mdsc->mutex); ··· 3607 3591 mutex_unlock(&mdsc->mutex); 3608 3592 3609 3593 dout("waiting for sessions to close\n"); 3610 - wait_event_timeout(mdsc->session_close_wq, done_closing_sessions(mdsc), 3594 + wait_event_timeout(mdsc->session_close_wq, 3595 + done_closing_sessions(mdsc, skipped), 3611 3596 ceph_timeout_jiffies(opts->mount_timeout)); 3612 3597 3613 3598 /* tear down remaining sessions */
+1
fs/ceph/mds_client.h
··· 121 121 CEPH_MDS_SESSION_CLOSING = 5, 122 122 CEPH_MDS_SESSION_RESTARTING = 6, 123 123 CEPH_MDS_SESSION_RECONNECTING = 7, 124 + CEPH_MDS_SESSION_REJECTED = 8, 124 125 }; 125 126 126 127 struct ceph_mds_session {
+2
fs/ceph/strings.c
··· 43 43 case CEPH_SESSION_RECALL_STATE: return "recall_state"; 44 44 case CEPH_SESSION_FLUSHMSG: return "flushmsg"; 45 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 49 return "???"; 48 50 }
+1
include/linux/ceph/ceph_fs.h
··· 281 281 CEPH_SESSION_FLUSHMSG, 282 282 CEPH_SESSION_FLUSHMSG_ACK, 283 283 CEPH_SESSION_FORCE_RO, 284 + CEPH_SESSION_REJECT, 284 285 }; 285 286 286 287 extern const char *ceph_session_op_name(int op);