aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2015-01-09 04:00:42 -0500
committerIlya Dryomov <idryomov@gmail.com>2015-02-19 05:31:38 -0500
commit86d8f67b26a8b30228b5177b7e594bbc89798a23 (patch)
tree8d2c95e94f1718806d0aed91854394ec5cfabe5b /fs
parentc4d4a582c538e890f09c338bc3063c28dfdc9ae5 (diff)
ceph: avoid block operation when !TASK_RUNNING (ceph_mdsc_close_sessions)
use an atomic variable to track number of sessions, this can avoid block operation inside wait loops. Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/ceph/mds_client.c13
-rw-r--r--fs/ceph/mds_client.h1
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 */
3480static bool done_closing_sessions(struct ceph_mds_client *mdsc) 3483static 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