diff options
author | sr | 2012-08-25 16:14:20 +0200 |
---|---|---|
committer | sr | 2012-08-25 16:14:20 +0200 |
commit | 965c7ff9a9d64bb53dd7a808f3193b36ab7b014d (patch) | |
tree | 242cc32bf8f8dace2195a91ab286af970fc0d7a5 /src/kernel/blk.c | |
parent | ... (diff) | |
download | dnbd3-965c7ff9a9d64bb53dd7a808f3193b36ab7b014d.tar.gz dnbd3-965c7ff9a9d64bb53dd7a808f3193b36ab7b014d.tar.xz dnbd3-965c7ff9a9d64bb53dd7a808f3193b36ab7b014d.zip |
[*] Fix bug in serializer_get_*
[CLIENT/KERNEL] Change ioctl to handle volume names instead if vids
[*] Make protocol endian safe
[CLIENT] Display ioctl errorcode on failure
Diffstat (limited to 'src/kernel/blk.c')
-rw-r--r-- | src/kernel/blk.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c index 1177f3a..b0b0912 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -123,12 +123,17 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u } copy_from_user(imgname, msg->imgname, msg->imgnamelen); imgname[msg->imgnamelen] = '\0'; + //printk("IOCTL Image name of len %d is %s\n", (int)msg->imgnamelen, imgname); } switch (cmd) { case IOCTL_OPEN: - if (imgname == NULL) + if (dev->imgname != NULL) + { + result = -EBUSY; + } + else if (imgname == NULL) { result = -EINVAL; } @@ -138,10 +143,18 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u dev->cur_server.port = msg->port; dev->cur_server.hostaddrtype = msg->addrtype; dev->imgname = imgname; - imgname = NULL; dev->rid = msg->rid; blk_queue->backing_dev_info.ra_pages = (msg->read_ahead_kb * 1024) / PAGE_CACHE_SIZE; - result = dnbd3_net_connect(dev); + if (dnbd3_net_connect(dev) == 0) + { + result = 0; + imgname = NULL; // Prevent kfree at the end + } + else + { + result = -ENOENT; + dev->imgname = NULL; + } } break; @@ -149,6 +162,11 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u set_capacity(dev->disk, 0); result = dnbd3_net_disconnect(dev); dnbd3_blk_fail_all_requests(dev); + if (dev->imgname) + { + kfree(dev->imgname); + dev->imgname = NULL; + } break; case IOCTL_SWITCH: |