Merge commit 'har/master'
diff --git a/openbsc/include/openbsc/paging.h b/openbsc/include/openbsc/paging.h
index 2f17e24..ab6a274 100644
--- a/openbsc/include/openbsc/paging.h
+++ b/openbsc/include/openbsc/paging.h
@@ -33,8 +33,8 @@
 void paging_init(struct gsm_bts *bts);
 
 /* schedule paging request */
-void paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
-		    int type, gsm_cbfn *cbfn, void *data);
+int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
+		   int type, gsm_cbfn *cbfn, void *data);
 
 /* stop paging requests */
 void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr,
diff --git a/openbsc/src/gsm_04_11.c b/openbsc/src/gsm_04_11.c
index 7a30653..a7f69d1 100644
--- a/openbsc/src/gsm_04_11.c
+++ b/openbsc/src/gsm_04_11.c
@@ -1034,6 +1034,7 @@
 			   struct gsm_sms *sms)
 {
 	struct gsm_lchan *lchan;
+	int rc;
 
 	/* check if we already have an open lchan to the subscriber.
 	 * if yes, send the SMS this way */
@@ -1043,8 +1044,10 @@
 				     rll_ind_cb, sms);
 
 	/* if not, we have to start paging */
-	paging_request(subscr->net, subscr, RSL_CHANNEED_SDCCH,
-			paging_cb_send_sms, sms);
+	rc = paging_request(subscr->net, subscr, RSL_CHANNEED_SDCCH,
+			    paging_cb_send_sms, sms);
+	if (rc < 0)
+		sms_free(sms);
 
 	return 0;
 }
diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c
index 802024a..f7ee81d 100644
--- a/openbsc/src/paging.c
+++ b/openbsc/src/paging.c
@@ -213,7 +213,7 @@
 	paging_remove_request(&req->bts->paging, req);
 }
 
-static void _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
+static int _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
 			    int type, gsm_cbfn *cbfn, void *data)
 {
 	struct gsm_bts_paging_state *bts_entry = &bts->paging;
@@ -221,7 +221,7 @@
 
 	if (paging_pending_request(bts_entry, subscr)) {
 		DEBUGP(DPAG, "Paging request already pending\n");
-		return;
+		return -EEXIST;
 	}
 
 	DEBUGP(DPAG, "Start paging of subscriber %llu on bts %d.\n",
@@ -239,12 +239,15 @@
 
 	if (!bsc_timer_pending(&bts_entry->work_timer))
 		bsc_schedule_timer(&bts_entry->work_timer, 1, 0);
+
+	return 0;
 }
 
-void paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
-		    int type, gsm_cbfn *cbfn, void *data)
+int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
+		   int type, gsm_cbfn *cbfn, void *data)
 {
 	struct gsm_bts *bts = NULL;
+	int rc;
 
 	/* start paging subscriber on all BTS within Location Area */
 	do {
@@ -252,9 +255,13 @@
 		if (!bts)
 			break;
 
-		/* Trigger paging */
-		_paging_request(bts, subscr, type, cbfn, data);
+		/* Trigger paging, pass any error to caller */
+		rc = _paging_request(bts, subscr, type, cbfn, data);
+		if (rc < 0)
+			return rc;
 	} while (1);
+
+	return 0;
 }