summaryrefslogtreecommitdiffstats
path: root/src/kernel/core.c
diff options
context:
space:
mode:
authorFrederic Robra2019-07-17 15:24:49 +0200
committerFrederic Robra2019-07-17 15:24:49 +0200
commit278fcb346fa53d94ad018cdd2f80dfd8b99335c2 (patch)
tree1e59a5dc51a5827f624133e56aec28264123bd2f /src/kernel/core.c
parentdiscovery now connects to new slots (diff)
downloaddnbd3-ng-278fcb346fa53d94ad018cdd2f80dfd8b99335c2.tar.gz
dnbd3-ng-278fcb346fa53d94ad018cdd2f80dfd8b99335c2.tar.xz
dnbd3-ng-278fcb346fa53d94ad018cdd2f80dfd8b99335c2.zip
fixed various bugs
Diffstat (limited to 'src/kernel/core.c')
-rw-r--r--src/kernel/core.c39
1 files changed, 18 insertions, 21 deletions
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)