{
        if (smc_link_downing(&lnk->state)) {
                trace_smcr_link_down(lnk, __builtin_return_address(0));
-               schedule_work(&lnk->link_down_wrk);
+               smcr_link_hold(lnk); /* smcr_link_put in link_down_wrk */
+               if (!schedule_work(&lnk->link_down_wrk))
+                       smcr_link_put(lnk);
        }
 }
 
        struct smc_link_group *lgr = link->lgr;
 
        if (list_empty(&lgr->list))
-               return;
+               goto out;
        wake_up_all(&lgr->llc_msg_waiter);
        down_write(&lgr->llc_conf_mutex);
        smcr_link_down(link);
        up_write(&lgr->llc_conf_mutex);
+
+out:
+       smcr_link_put(link); /* smcr_link_hold by schedulers of link_down_work */
 }
 
 static int smc_vlan_by_tcpsk_walk(struct net_device *lower_dev,