OSDN Git Service

Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[uclinux-h8/linux.git] / net / smc / smc_core.c
index 1c9fa7f..35c1cdc 100644 (file)
@@ -149,6 +149,8 @@ static int smc_link_send_delete(struct smc_link *lnk)
        return -ENOTCONN;
 }
 
+static void smc_lgr_free(struct smc_link_group *lgr);
+
 static void smc_lgr_free_work(struct work_struct *work)
 {
        struct smc_link_group *lgr = container_of(to_delayed_work(work),
@@ -171,8 +173,11 @@ free:
        spin_unlock_bh(&smc_lgr_list.lock);
 
        if (!lgr->is_smcd && !lgr->terminating) {
+               struct smc_link *lnk = &lgr->lnk[SMC_SINGLE_LINK];
+
                /* try to send del link msg, on error free lgr immediately */
-               if (!smc_link_send_delete(&lgr->lnk[SMC_SINGLE_LINK])) {
+               if (lnk->state == SMC_LNK_ACTIVE &&
+                   !smc_link_send_delete(lnk)) {
                        /* reschedule in case we never receive a response */
                        smc_lgr_schedule_free_work(lgr);
                        return;
@@ -295,8 +300,13 @@ static void smc_buf_unuse(struct smc_connection *conn,
                conn->sndbuf_desc->used = 0;
        if (conn->rmb_desc) {
                if (!conn->rmb_desc->regerr) {
-                       conn->rmb_desc->reused = 1;
                        conn->rmb_desc->used = 0;
+                       if (!lgr->is_smcd) {
+                               /* unregister rmb with peer */
+                               smc_llc_do_delete_rkey(
+                                               &lgr->lnk[SMC_SINGLE_LINK],
+                                               conn->rmb_desc);
+                       }
                } else {
                        /* buf registration failed, reuse not possible */
                        write_lock_bh(&lgr->rmbs_lock);
@@ -410,7 +420,7 @@ static void smc_lgr_free_bufs(struct smc_link_group *lgr)
 }
 
 /* remove a link group */
-void smc_lgr_free(struct smc_link_group *lgr)
+static void smc_lgr_free(struct smc_link_group *lgr)
 {
        smc_lgr_free_bufs(lgr);
        if (lgr->is_smcd)