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

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

nbd: protect cmd->status with cmd->lock



We already do this for the most part, except in timeout and clear_req.
For the timeout case we take the lock after we grab a ref on the config,
but that isn't really necessary because we're safe to touch the cmd at
this point, so just move the order around.

For the clear_req cause this is initiated by the user, so again is safe.

Reviewed-by: default avatarMike Christie <mchristi@redhat.com>
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 2b2ed975
Loading
Loading
Loading
Loading
+7 −5
Original line number Original line Diff line number Diff line
@@ -385,17 +385,16 @@ static enum blk_eh_timer_return nbd_xmit_timeout(struct request *req,
	struct nbd_device *nbd = cmd->nbd;
	struct nbd_device *nbd = cmd->nbd;
	struct nbd_config *config;
	struct nbd_config *config;


	if (!mutex_trylock(&cmd->lock))
		return BLK_EH_RESET_TIMER;

	if (!refcount_inc_not_zero(&nbd->config_refs)) {
	if (!refcount_inc_not_zero(&nbd->config_refs)) {
		cmd->status = BLK_STS_TIMEOUT;
		cmd->status = BLK_STS_TIMEOUT;
		mutex_unlock(&cmd->lock);
		goto done;
		goto done;
	}
	}
	config = nbd->config;
	config = nbd->config;


	if (!mutex_trylock(&cmd->lock)) {
		nbd_config_put(nbd);
		return BLK_EH_RESET_TIMER;
	}

	if (config->num_connections > 1) {
	if (config->num_connections > 1) {
		dev_err_ratelimited(nbd_to_dev(nbd),
		dev_err_ratelimited(nbd_to_dev(nbd),
				    "Connection timed out, retrying (%d/%d alive)\n",
				    "Connection timed out, retrying (%d/%d alive)\n",
@@ -792,7 +791,10 @@ static bool nbd_clear_req(struct request *req, void *data, bool reserved)
{
{
	struct nbd_cmd *cmd = blk_mq_rq_to_pdu(req);
	struct nbd_cmd *cmd = blk_mq_rq_to_pdu(req);


	mutex_lock(&cmd->lock);
	cmd->status = BLK_STS_IOERR;
	cmd->status = BLK_STS_IOERR;
	mutex_unlock(&cmd->lock);

	blk_mq_complete_request(req);
	blk_mq_complete_request(req);
	return true;
	return true;
}
}