Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2611898 authored by Josef Bacik's avatar Josef Bacik Committed by Jens Axboe
Browse files

nbd: don't shutdown sock with irq's disabled



We hit a warning when shutting down the nbd connection because we have irq's
disabled.  We don't really need to do the shutdown under the lock, just clear
the nbd->sock.  So do the shutdown outside of the irq.  This gets rid of the
warning.

Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent fd8383fd
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -161,6 +161,8 @@ static void nbd_end_request(struct nbd_cmd *cmd)
 */
static void sock_shutdown(struct nbd_device *nbd)
{
	struct socket *sock;

	spin_lock_irq(&nbd->sock_lock);

	if (!nbd->sock) {
@@ -168,18 +170,21 @@ static void sock_shutdown(struct nbd_device *nbd)
		return;
	}

	sock = nbd->sock;
	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)
{
	struct nbd_device *nbd = (struct nbd_device *)arg;
	struct socket *sock = NULL;
	unsigned long flags;

	if (!atomic_read(&nbd->outstanding_cmds))
@@ -189,10 +194,16 @@ static void nbd_xmit_timeout(unsigned long arg)

	nbd->timedout = true;

	if (nbd->sock)
		kernel_sock_shutdown(nbd->sock, SHUT_RDWR);
	if (nbd->sock) {
		sock = nbd->sock;
		get_file(sock->file);
	}

	spin_unlock_irqrestore(&nbd->sock_lock, flags);
	if (sock) {
		kernel_sock_shutdown(sock, SHUT_RDWR);
		sockfd_put(sock);
	}

	dev_err(nbd_to_dev(nbd), "Connection timed out, shutting down connection\n");
}