diff options
| -rw-r--r-- | fs/ceph/mds_client.c | 13 | ||||
| -rw-r--r-- | fs/ceph/mds_client.h | 1 |
2 files changed, 5 insertions, 9 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index fdf5cc8737ee..c90ca99331be 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -480,6 +480,7 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc, | |||
| 480 | mdsc->max_sessions = newmax; | 480 | mdsc->max_sessions = newmax; |
| 481 | } | 481 | } |
| 482 | mdsc->sessions[mds] = s; | 482 | mdsc->sessions[mds] = s; |
| 483 | atomic_inc(&mdsc->num_sessions); | ||
| 483 | atomic_inc(&s->s_ref); /* one ref to sessions[], one to caller */ | 484 | atomic_inc(&s->s_ref); /* one ref to sessions[], one to caller */ |
| 484 | 485 | ||
| 485 | ceph_con_open(&s->s_con, CEPH_ENTITY_TYPE_MDS, mds, | 486 | ceph_con_open(&s->s_con, CEPH_ENTITY_TYPE_MDS, mds, |
| @@ -503,6 +504,7 @@ static void __unregister_session(struct ceph_mds_client *mdsc, | |||
| 503 | mdsc->sessions[s->s_mds] = NULL; | 504 | mdsc->sessions[s->s_mds] = NULL; |
| 504 | ceph_con_close(&s->s_con); | 505 | ceph_con_close(&s->s_con); |
| 505 | ceph_put_mds_session(s); | 506 | ceph_put_mds_session(s); |
| 507 | atomic_dec(&mdsc->num_sessions); | ||
| 506 | } | 508 | } |
| 507 | 509 | ||
| 508 | /* | 510 | /* |
| @@ -3328,6 +3330,7 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc) | |||
| 3328 | init_waitqueue_head(&mdsc->session_close_wq); | 3330 | init_waitqueue_head(&mdsc->session_close_wq); |
| 3329 | INIT_LIST_HEAD(&mdsc->waiting_for_map); | 3331 | INIT_LIST_HEAD(&mdsc->waiting_for_map); |
| 3330 | mdsc->sessions = NULL; | 3332 | mdsc->sessions = NULL; |
| 3333 | atomic_set(&mdsc->num_sessions, 0); | ||
| 3331 | mdsc->max_sessions = 0; | 3334 | mdsc->max_sessions = 0; |
| 3332 | mdsc->stopping = 0; | 3335 | mdsc->stopping = 0; |
| 3333 | init_rwsem(&mdsc->snap_rwsem); | 3336 | init_rwsem(&mdsc->snap_rwsem); |
| @@ -3479,17 +3482,9 @@ void ceph_mdsc_sync(struct ceph_mds_client *mdsc) | |||
| 3479 | */ | 3482 | */ |
| 3480 | static bool done_closing_sessions(struct ceph_mds_client *mdsc) | 3483 | static bool done_closing_sessions(struct ceph_mds_client *mdsc) |
| 3481 | { | 3484 | { |
| 3482 | int i, n = 0; | ||
| 3483 | |||
| 3484 | if (mdsc->fsc->mount_state == CEPH_MOUNT_SHUTDOWN) | 3485 | if (mdsc->fsc->mount_state == CEPH_MOUNT_SHUTDOWN) |
| 3485 | return true; | 3486 | return true; |
| 3486 | 3487 | return atomic_read(&mdsc->num_sessions) == 0; | |
| 3487 | mutex_lock(&mdsc->mutex); | ||
| 3488 | for (i = 0; i < mdsc->max_sessions; i++) | ||
| 3489 | if (mdsc->sessions[i]) | ||
| 3490 | n++; | ||
| 3491 | mutex_unlock(&mdsc->mutex); | ||
| 3492 | return n == 0; | ||
| 3493 | } | 3488 | } |
| 3494 | 3489 | ||
| 3495 | /* | 3490 | /* |
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index a87b92f500bb..1875b5d985c6 100644 --- a/fs/ceph/mds_client.h +++ b/fs/ceph/mds_client.h | |||
| @@ -273,6 +273,7 @@ struct ceph_mds_client { | |||
| 273 | struct list_head waiting_for_map; | 273 | struct list_head waiting_for_map; |
| 274 | 274 | ||
| 275 | struct ceph_mds_session **sessions; /* NULL for mds if no session */ | 275 | struct ceph_mds_session **sessions; /* NULL for mds if no session */ |
| 276 | atomic_t num_sessions; | ||
| 276 | int max_sessions; /* len of s_mds_sessions */ | 277 | int max_sessions; /* len of s_mds_sessions */ |
| 277 | int stopping; /* true if shutting down */ | 278 | int stopping; /* true if shutting down */ |
| 278 | 279 | ||
