diff mbox

[v3,3/4] libceph: add ceph_monc_wait_osdmap()

Message ID 1400777408-7016-4-git-send-email-ilya.dryomov@inktank.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ilya Dryomov May 22, 2014, 4:50 p.m. UTC
Add ceph_monc_wait_osdmap(), which will block until the osdmap with the
specified epoch is received or timeout occurs.

Export both of these as they are going to be needed by rbd.

Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
---
 include/linux/ceph/mon_client.h |    2 ++
 net/ceph/mon_client.c           |   27 +++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

Comments

Sage Weil June 3, 2014, 8:59 p.m. UTC | #1
Reviewed-by:

On Thu, 22 May 2014, Ilya Dryomov wrote:

> Add ceph_monc_wait_osdmap(), which will block until the osdmap with the
> specified epoch is received or timeout occurs.
> 
> Export both of these as they are going to be needed by rbd.
> 
> Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
> ---
>  include/linux/ceph/mon_client.h |    2 ++
>  net/ceph/mon_client.c           |   27 +++++++++++++++++++++++++++
>  2 files changed, 29 insertions(+)
> 
> diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h
> index 585ef9450e9d..deb47e45ac7c 100644
> --- a/include/linux/ceph/mon_client.h
> +++ b/include/linux/ceph/mon_client.h
> @@ -104,6 +104,8 @@ extern int ceph_monc_got_mdsmap(struct ceph_mon_client *monc, u32 have);
>  extern int ceph_monc_got_osdmap(struct ceph_mon_client *monc, u32 have);
>  
>  extern void ceph_monc_request_next_osdmap(struct ceph_mon_client *monc);
> +extern int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
> +				 unsigned long timeout);
>  
>  extern int ceph_monc_do_statfs(struct ceph_mon_client *monc,
>  			       struct ceph_statfs *buf);
> diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
> index 6b46f1205ceb..ecfd65c05f49 100644
> --- a/net/ceph/mon_client.c
> +++ b/net/ceph/mon_client.c
> @@ -296,6 +296,33 @@ void ceph_monc_request_next_osdmap(struct ceph_mon_client *monc)
>  		__send_subscribe(monc);
>  	mutex_unlock(&monc->mutex);
>  }
> +EXPORT_SYMBOL(ceph_monc_request_next_osdmap);
> +
> +int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
> +			  unsigned long timeout)
> +{
> +	unsigned long started = jiffies;
> +	int ret;
> +
> +	mutex_lock(&monc->mutex);
> +	while (monc->have_osdmap < epoch) {
> +		mutex_unlock(&monc->mutex);
> +
> +		if (timeout != 0 && time_after_eq(jiffies, started + timeout))
> +			return -ETIMEDOUT;
> +
> +		ret = wait_event_interruptible_timeout(monc->client->auth_wq,
> +					 monc->have_osdmap >= epoch, timeout);
> +		if (ret < 0)
> +			return ret;
> +
> +		mutex_lock(&monc->mutex);
> +	}
> +
> +	mutex_unlock(&monc->mutex);
> +	return 0;
> +}
> +EXPORT_SYMBOL(ceph_monc_wait_osdmap);
>  
>  /*
>   *
> -- 
> 1.7.10.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h
index 585ef9450e9d..deb47e45ac7c 100644
--- a/include/linux/ceph/mon_client.h
+++ b/include/linux/ceph/mon_client.h
@@ -104,6 +104,8 @@  extern int ceph_monc_got_mdsmap(struct ceph_mon_client *monc, u32 have);
 extern int ceph_monc_got_osdmap(struct ceph_mon_client *monc, u32 have);
 
 extern void ceph_monc_request_next_osdmap(struct ceph_mon_client *monc);
+extern int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
+				 unsigned long timeout);
 
 extern int ceph_monc_do_statfs(struct ceph_mon_client *monc,
 			       struct ceph_statfs *buf);
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
index 6b46f1205ceb..ecfd65c05f49 100644
--- a/net/ceph/mon_client.c
+++ b/net/ceph/mon_client.c
@@ -296,6 +296,33 @@  void ceph_monc_request_next_osdmap(struct ceph_mon_client *monc)
 		__send_subscribe(monc);
 	mutex_unlock(&monc->mutex);
 }
+EXPORT_SYMBOL(ceph_monc_request_next_osdmap);
+
+int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
+			  unsigned long timeout)
+{
+	unsigned long started = jiffies;
+	int ret;
+
+	mutex_lock(&monc->mutex);
+	while (monc->have_osdmap < epoch) {
+		mutex_unlock(&monc->mutex);
+
+		if (timeout != 0 && time_after_eq(jiffies, started + timeout))
+			return -ETIMEDOUT;
+
+		ret = wait_event_interruptible_timeout(monc->client->auth_wq,
+					 monc->have_osdmap >= epoch, timeout);
+		if (ret < 0)
+			return ret;
+
+		mutex_lock(&monc->mutex);
+	}
+
+	mutex_unlock(&monc->mutex);
+	return 0;
+}
+EXPORT_SYMBOL(ceph_monc_wait_osdmap);
 
 /*
  *