diff options
author | Josef Bacik <jbacik@fb.com> | 2017-07-21 16:48:14 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-07-22 19:12:31 +0200 |
commit | b4b2aeccf0f0fa1fd356cc72eeda7a2c66c39904 (patch) | |
tree | 3148eaac6a1f1c885aba52de7271caec8bf2b5fc /drivers | |
parent | nbd: allow multiple disconnects to be sent (diff) | |
download | linux-b4b2aeccf0f0fa1fd356cc72eeda7a2c66c39904.tar.xz linux-b4b2aeccf0f0fa1fd356cc72eeda7a2c66c39904.zip |
nbd: take tx_lock before disconnecting
We need to take the tx_lock so we don't interleave our disconnect
request between real data going down the wire.
Signed-off-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/nbd.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index f91e7ac3fa32..6aefe9fca6ce 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -978,11 +978,15 @@ static void send_disconnects(struct nbd_device *nbd) int i, ret; for (i = 0; i < config->num_connections; i++) { + struct nbd_sock *nsock = config->socks[i]; + iov_iter_kvec(&from, WRITE | ITER_KVEC, &iov, 1, sizeof(request)); + mutex_lock(&nsock->tx_lock); ret = sock_xmit(nbd, i, 1, &from, 0, NULL); if (ret <= 0) dev_err(disk_to_dev(nbd->disk), "Send disconnect failed %d\n", ret); + mutex_unlock(&nsock->tx_lock); } } |