Browse Source

libceph: factor out logic from ceph_osdc_start_request()

Factor out logic from ceph_osdc_start_request() into a new helper,
__ceph_osdc_start_request().  ceph_osdc_start_request() now amounts to
taking locks and calling __ceph_osdc_start_request().

Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
Ilya Dryomov 11 years ago
parent
commit
0bbfdfe8d2
1 changed files with 39 additions and 23 deletions
  1. 39 23
      net/ceph/osd_client.c

+ 39 - 23
net/ceph/osd_client.c

@@ -1426,6 +1426,40 @@ static void __send_queued(struct ceph_osd_client *osdc)
 		__send_request(osdc, req);
 		__send_request(osdc, req);
 }
 }
 
 
+/*
+ * Caller should hold map_sem for read and request_mutex.
+ */
+static int __ceph_osdc_start_request(struct ceph_osd_client *osdc,
+				     struct ceph_osd_request *req,
+				     bool nofail)
+{
+	int rc;
+
+	__register_request(osdc, req);
+	req->r_sent = 0;
+	req->r_got_reply = 0;
+	rc = __map_request(osdc, req, 0);
+	if (rc < 0) {
+		if (nofail) {
+			dout("osdc_start_request failed map, "
+				" will retry %lld\n", req->r_tid);
+			rc = 0;
+		} else {
+			__unregister_request(osdc, req);
+		}
+		return rc;
+	}
+
+	if (req->r_osd == NULL) {
+		dout("send_request %p no up osds in pg\n", req);
+		ceph_monc_request_next_osdmap(&osdc->client->monc);
+	} else {
+		__send_queued(osdc);
+	}
+
+	return 0;
+}
+
 /*
 /*
  * Timeout callback, called every N seconds when 1 or more osd
  * Timeout callback, called every N seconds when 1 or more osd
  * requests has been active for more than N seconds.  When this
  * requests has been active for more than N seconds.  When this
@@ -2351,34 +2385,16 @@ int ceph_osdc_start_request(struct ceph_osd_client *osdc,
 			    struct ceph_osd_request *req,
 			    struct ceph_osd_request *req,
 			    bool nofail)
 			    bool nofail)
 {
 {
-	int rc = 0;
+	int rc;
 
 
 	down_read(&osdc->map_sem);
 	down_read(&osdc->map_sem);
 	mutex_lock(&osdc->request_mutex);
 	mutex_lock(&osdc->request_mutex);
-	__register_request(osdc, req);
-	req->r_sent = 0;
-	req->r_got_reply = 0;
-	rc = __map_request(osdc, req, 0);
-	if (rc < 0) {
-		if (nofail) {
-			dout("osdc_start_request failed map, "
-				" will retry %lld\n", req->r_tid);
-			rc = 0;
-		} else {
-			__unregister_request(osdc, req);
-		}
-		goto out_unlock;
-	}
-	if (req->r_osd == NULL) {
-		dout("send_request %p no up osds in pg\n", req);
-		ceph_monc_request_next_osdmap(&osdc->client->monc);
-	} else {
-		__send_queued(osdc);
-	}
-	rc = 0;
-out_unlock:
+
+	rc = __ceph_osdc_start_request(osdc, req, nofail);
+
 	mutex_unlock(&osdc->request_mutex);
 	mutex_unlock(&osdc->request_mutex);
 	up_read(&osdc->map_sem);
 	up_read(&osdc->map_sem);
+
 	return rc;
 	return rc;
 }
 }
 EXPORT_SYMBOL(ceph_osdc_start_request);
 EXPORT_SYMBOL(ceph_osdc_start_request);