Hi Markus,
On Thu, May 12, 2016 at 3:13 PM, Markus Pargmann <m...@pengutronix.de> wrote: > spinlocked ranges should be small and not contain calls into huge > subfunctions. Fix my mistake and just get the pointer to the socket > instead of doing everything with spinlock held. > > Reported-by: Mikulas Patocka <miku...@twibright.com> > Signed-off-by: Markus Pargmann <m...@pengutronix.de> > --- > drivers/block/nbd.c | 18 ++++++++++-------- > 1 file changed, 10 insertions(+), 8 deletions(-) > > diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c > index 0b892eed06a0..157bf3da876e 100644 > --- a/drivers/block/nbd.c > +++ b/drivers/block/nbd.c > @@ -173,20 +173,22 @@ static void nbd_end_request(struct nbd_device *nbd, > struct request *req) > */ > static void sock_shutdown(struct nbd_device *nbd) > { > + struct socket *sock; > + > spin_lock_irq(&nbd->sock_lock); > + sock = nbd->sock; > + nbd->sock = NULL; > + spin_unlock_irq(&nbd->sock_lock); > > - if (!nbd->sock) { > - spin_unlock_irq(&nbd->sock_lock); > + if (!sock) > return; > - } > + > + del_timer(&nbd->timeout_timer); > > dev_warn(disk_to_dev(nbd->disk), "shutting down socket\n"); > - kernel_sock_shutdown(nbd->sock, SHUT_RDWR); > - sockfd_put(nbd->sock); > - nbd->sock = NULL; > - spin_unlock_irq(&nbd->sock_lock); > + kernel_sock_shutdown(sock, SHUT_RDWR); > + sockfd_put(sock); > > - del_timer(&nbd->timeout_timer); > } > > static void nbd_xmit_timeout(unsigned long arg) I was concerned about nbd_xmit_timeout as well. There's also a call to kernel_sock_shutdown, while holding the spin_lock in the timeout. The above is ok for sock_shutdown but some kind of change is also required in nbd_xmit_timeout as well. My patch addressed both these. Can you have a look at that again. > -- > 2.8.0.rc3 > -- ---P.K.S