[PATCH 1/2] No MDS mount error fix

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



For http://tracker.ceph.com/issues/4386

It determines situation, when a user is trying to mount CephFS
with no MDS present. Return ECOMM from
open_root_dentry which can be analyzed then by ceph.mount

Signed-off-by: Mikhail Campos Guadamuz <plageat90@xxxxxxxxx>
---
 fs/ceph/mdsmap.c            | 19 ++++++++++++++++---
 fs/ceph/super.c             | 10 +++++++++-
 include/linux/ceph/mdsmap.h |  1 +
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
index 132b64e..3a6ba8a 100644
--- a/fs/ceph/mdsmap.c
+++ b/fs/ceph/mdsmap.c
@@ -12,6 +12,20 @@
 
 #include "super.h"
 
+/*
+ * count active mds's
+ */
+int ceph_mdsmap_active_mds_count(struct ceph_mdsmap *m)
+{
+    int n = 0;
+    int i;
+    
+    for(i = 0; i < m->m_max_mds; ++i)
+	if(m->m_info[i].state > 0)
+	    ++n;
+    
+    return  n;
+}
 
 /*
  * choose a random mds that is "up" (i.e. has a state > 0), or -1.
@@ -26,9 +40,8 @@ int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m)
 		return 0;
 
 	/* count */
-	for (i = 0; i < m->m_max_mds; i++)
-		if (m->m_info[i].state > 0)
-			n++;
+	n = ceph_mdsmap_active_mds_count(m);
+	
 	if (n == 0)
 		return -1;
 
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index 6627b26..4d33d68 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -674,7 +674,15 @@ static struct dentry *open_root_dentry(struct ceph_fs_client *fsc,
 	struct ceph_mds_request *req = NULL;
 	int err;
 	struct dentry *root;
-
+	
+	/* check for mds*/
+	if( 0 == ceph_mdsmap_active_mds_count(mdsc->mdsmap) )
+	{    
+	    pr_info("active mds not found, possible not exist\n");
+	    root = ERR_PTR( -ECOMM );
+	    return root;
+	}
+	
 	/* open dir */
 	dout("open_root_inode opening '%s'\n", path);
 	req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_GETATTR, USE_ANY_MDS);
diff --git a/include/linux/ceph/mdsmap.h b/include/linux/ceph/mdsmap.h
index 87ed09f..4d7d502 100644
--- a/include/linux/ceph/mdsmap.h
+++ b/include/linux/ceph/mdsmap.h
@@ -56,6 +56,7 @@ static inline bool ceph_mdsmap_is_laggy(struct ceph_mdsmap *m, int w)
 	return false;
 }
 
+extern int ceph_mdsmap_active_mds_count(struct ceph_mdsmap *m);
 extern int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m);
 extern struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end);
 extern void ceph_mdsmap_destroy(struct ceph_mdsmap *m);
-- 
1.8.3.1

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




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux