From 278fcb346fa53d94ad018cdd2f80dfd8b99335c2 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Wed, 17 Jul 2019 15:24:49 +0200 Subject: fixed various bugs --- src/kernel/core.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) (limited to 'src/kernel/core.c') diff --git a/src/kernel/core.c b/src/kernel/core.c index 9d930cb..bf316d4 100644 --- a/src/kernel/core.c +++ b/src/kernel/core.c @@ -67,8 +67,8 @@ int major; static void dnbd3_requeue_cmd(struct dnbd3_cmd *cmd) { struct request *req = blk_mq_rq_from_pdu(cmd); - - if (!test_and_set_bit(DNBD3_CMD_REQUEUED, &cmd->flags)) { + if (!cmd->requed) { + cmd->requed = true; blk_mq_requeue_request(req, true); } } @@ -115,9 +115,9 @@ static int dnbd3_handle_cmd(struct dnbd3_cmd *cmd, int index) cmd->status = BLK_STS_OK; - mutex_lock(&sock->lock); + mutex_lock(&sock->tx_lock); if (unlikely(!sock->sock)) { - mutex_unlock(&sock->lock); + mutex_unlock(&sock->tx_lock); warn_sock(sock, "not connected"); return -EIO; } @@ -136,7 +136,7 @@ static int dnbd3_handle_cmd(struct dnbd3_cmd *cmd, int index) ret = 0; } out: - mutex_unlock(&sock->lock); + mutex_unlock(&sock->tx_lock); return ret; } @@ -144,18 +144,14 @@ static blk_status_t dnbd3_queue_rq(struct blk_mq_hw_ctx *hctx, const struct blk_ { struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(bd->rq); int ret; - struct dnbd3_device *dev = cmd->dnbd3; - - debug_dev(dev, "queue request"); mutex_lock(&cmd->lock); - clear_bit(DNBD3_CMD_REQUEUED, &cmd->flags); - + cmd->requed = false; ret = dnbd3_handle_cmd(cmd, hctx->queue_num); if (ret < 0) { ret = BLK_STS_IOERR; - } else if (!ret) { + } else if (ret >= 0) { ret = BLK_STS_OK; } mutex_unlock(&cmd->lock); @@ -167,7 +163,7 @@ static int dnbd3_init_request(struct blk_mq_tag_set *set, struct request *rq, un { struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(rq); cmd->dnbd3 = set->driver_data; - cmd->flags = 0; + cmd->requed = false; mutex_init(&cmd->lock); return 0; } @@ -482,25 +478,26 @@ static int dnbd3_exit_cb(int id, void *ptr, void *data) return 0; } -static void dnbd3_dev_remove(struct dnbd3_device *dnbd3) +static void dnbd3_dev_remove(struct dnbd3_device *dev) { - struct gendisk *disk = dnbd3->disk; + struct gendisk *disk = dev->disk; struct request_queue *q; + dnbd3_net_disconnect(dev); + if (disk) { q = disk->queue; del_gendisk(disk); blk_cleanup_queue(q); - blk_mq_free_tag_set(&dnbd3->tag_set); - dnbd3_net_disconnect(dnbd3); + blk_mq_free_tag_set(&dev->tag_set); disk->private_data = NULL; put_disk(disk); - if (dnbd3->imgname) { - kfree(dnbd3->imgname); - dnbd3->imgname = NULL; - } } - mutex_destroy(&dnbd3->device_lock); + if (dev->imgname) { + kfree(dev->imgname); + dev->imgname = NULL; + } + mutex_destroy(&dev->device_lock); } static void dnbd3_put(struct dnbd3_device *dnbd3) -- cgit v1.2.3-55-g7522