We don't need to use up entropy to choose an mds,
so use prandom_u32() to get a pseudo-random number.

Also, we don't need to choose a random mds if only
one mds is available, so add special casing for the
common case.

Fixes http://tracker.ceph.com/issues/3579

Signed-off-by: Sam Lang <[email protected]>
---
 fs/ceph/mdsmap.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
index 0d3c924..9278dec 100644
--- a/fs/ceph/mdsmap.c
+++ b/fs/ceph/mdsmap.c
@@ -20,7 +20,10 @@ int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m)
 {
        int n = 0;
        int i;
-       char r;
+
+       /* special case for one mds */
+       if (1 == m->m_max_mds && m->m_info[0].state > 0)
+               return 0;
 
        /* count */
        for (i = 0; i < m->m_max_mds; i++)
@@ -30,8 +33,7 @@ int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m)
                return -1;
 
        /* pick */
-       get_random_bytes(&r, 1);
-       n = r % n;
+       n = prandom_u32() % n;
        i = 0;
        for (i = 0; n > 0; i++, n--)
                while (m->m_info[i].state <= 0)
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to