subscr: Make the subscr_put_channel work with the subscr

The active channel might or might not be gone when the transaction
has been released. Instead of passing an invalid subscriber conn
we will pass the subscr that is ref-counted and guranteed to be
valid at this point. subscr_put_channel could search the connections
for an active connection if that is ever needed.
diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h
index 29317e8..1318ae8 100644
--- a/openbsc/include/openbsc/gsm_subscriber.h
+++ b/openbsc/include/openbsc/gsm_subscriber.h
@@ -80,7 +80,7 @@
 struct gsm_subscriber *subscr_get_or_create(struct gsm_network *net,
 					const char *imsi);
 int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
-void subscr_put_channel(struct gsm_subscriber_connection *conn);
+void subscr_put_channel(struct gsm_subscriber *subscr);
 void subscr_get_channel(struct gsm_subscriber *subscr,
                         int type, gsm_cbfn *cbfn, void *param);
 struct gsm_subscriber *subscr_active_by_tmsi(struct gsm_network *net,
diff --git a/openbsc/src/gsm_04_11.c b/openbsc/src/gsm_04_11.c
index 6c17492..bb43196 100644
--- a/openbsc/src/gsm_04_11.c
+++ b/openbsc/src/gsm_04_11.c
@@ -139,7 +139,7 @@
 	if (!conn)
 		return;
 
-	subscr_put_channel(conn);
+	subscr_put_channel(conn->subscr);
 }
 
 struct msgb *gsm411_msgb_alloc(void)
@@ -1186,8 +1186,10 @@
 
 void gsm411_sapi_n_reject(struct gsm_subscriber_connection *conn)
 {
+	struct gsm_subscriber *subscr;
 	struct gsm_trans *trans, *tmp;
 
+	subscr = subscr_get(conn->subscr);
 	llist_for_each_entry_safe(trans, tmp, &conn->bts->network->trans_list, entry)
 		if (trans->conn == conn) {
 			struct gsm_sms *sms = trans->sms.sms;
@@ -1202,6 +1204,7 @@
 			trans_free(trans);
 		}
 
-	gsm411_release_conn(conn);
+	subscr_put_channel(subscr);
+	subscr_put(subscr);
 }
 
diff --git a/openbsc/src/gsm_subscriber.c b/openbsc/src/gsm_subscriber.c
index e44029c..34163da 100644
--- a/openbsc/src/gsm_subscriber.c
+++ b/openbsc/src/gsm_subscriber.c
@@ -208,7 +208,7 @@
 	}
 }
 
-void subscr_put_channel(struct gsm_subscriber_connection *conn)
+void subscr_put_channel(struct gsm_subscriber *subscr)
 {
 	/*
 	 * FIXME: Continue with other requests now... by checking
@@ -228,8 +228,8 @@
 	 * will listen to the paging requests before we timeout
 	 */
 
-	if (conn->subscr && !llist_empty(&conn->subscr->requests))
-		subscr_send_paging_request(conn->subscr);
+	if (subscr && !llist_empty(&subscr->requests))
+		subscr_send_paging_request(subscr);
 }