diff --git a/net/smc/smc_rx.c b/net/smc/smc_rx.c index 3468c58bbeeb..33b5bcafdec7 100644 --- a/net/smc/smc_rx.c +++ b/net/smc/smc_rx.c @@ -145,7 +145,12 @@ static const struct pipe_buf_operations smc_pipe_ops = { static void smc_rx_spd_release(struct splice_pipe_desc *spd, unsigned int i) { + struct smc_spd_priv *priv = (struct smc_spd_priv *)spd->partial[i].private; + struct sock *sk = &priv->smc->sk; + + kfree(priv); put_page(spd->pages[i]); + sock_put(sk); } static int smc_rx_splice(struct pipe_inode_info *pipe, char *src, size_t len, @@ -165,6 +170,8 @@ static int smc_rx_splice(struct pipe_inode_info *pipe, char *src, size_t len, partial.len = len; partial.private = (unsigned long)priv; + get_page(smc->conn.rmb_desc->pages); + sock_hold(&smc->sk); spd.nr_pages_max = 1; spd.nr_pages = 1; spd.pages = &smc->conn.rmb_desc->pages; @@ -173,11 +180,8 @@ static int smc_rx_splice(struct pipe_inode_info *pipe, char *src, size_t len, spd.spd_release = smc_rx_spd_release; bytes = splice_to_pipe(pipe, &spd); - if (bytes > 0) { - sock_hold(&smc->sk); - get_page(smc->conn.rmb_desc->pages); + if (bytes > 0) atomic_add(bytes, &smc->conn.splice_pending); - } return bytes; }