summaryrefslogtreecommitdiffstats
path: root/src/kernel/blk.c
diff options
context:
space:
mode:
authorsr2012-09-09 23:01:00 +0200
committersr2012-09-09 23:01:00 +0200
commit3e8cd5b2284fd68206cd7ea9943e892fcce037f8 (patch)
tree3b4a67620bf6bedf678b8b70bf4cf3e7822edf89 /src/kernel/blk.c
parent[SERVER] Automatically assign and connect a dnbd3 device to a relayed image (diff)
downloaddnbd3-3e8cd5b2284fd68206cd7ea9943e892fcce037f8.tar.gz
dnbd3-3e8cd5b2284fd68206cd7ea9943e892fcce037f8.tar.xz
dnbd3-3e8cd5b2284fd68206cd7ea9943e892fcce037f8.zip
[SERVER] Automatically connect a dnbd3 device for a relayed image
[SERVER] Automatically disconnect dnbd3 device if local cache copy is complete [SERVER] Pre-allocate disk space for cache file [KERNEL] Refuse connection if server reports disk size < 4096 bytes
Diffstat (limited to 'src/kernel/blk.c')
-rw-r--r--src/kernel/blk.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index 388f8b6..938a0e8 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -99,34 +99,39 @@ struct block_device_operations dnbd3_blk_ops =
int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
{
- int result = 0;
+ int result = -100;
dnbd3_device_t *dev = bdev->bd_disk->private_data;
struct request_queue *blk_queue = dev->disk->queue;
char *imgname = NULL;
- dnbd3_ioctl_t *msg = kmalloc(sizeof(*msg), GFP_KERNEL);
- unsigned long irqflags;
+ dnbd3_ioctl_t *msg = NULL;
+ //unsigned long irqflags;
- if (msg == NULL) return -ENOMEM;
- copy_from_user((char *)msg, (char *)arg, 2);
- if (msg->len != sizeof(*msg))
+ if (arg != 0)
{
- result = -ENOEXEC;
- goto cleanup_return;
- }
- copy_from_user((char *)msg, (char *)arg, sizeof(*msg));
- if (msg->imgname != NULL && msg->imgnamelen > 0)
- {
- imgname = kmalloc(msg->imgnamelen + 1, GFP_KERNEL);
- if (imgname == NULL)
+ msg = kmalloc(sizeof(*msg), GFP_KERNEL);
+ if (msg == NULL) return -ENOMEM;
+ copy_from_user((char *)msg, (char *)arg, 2);
+ if (msg->len != sizeof(*msg))
{
- result = -ENOMEM;
+ result = -ENOEXEC;
goto cleanup_return;
}
- 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);
+ copy_from_user((char *)msg, (char *)arg, sizeof(*msg));
+ if (msg->imgname != NULL && msg->imgnamelen > 0)
+ {
+ imgname = kmalloc(msg->imgnamelen + 1, GFP_KERNEL);
+ if (imgname == NULL)
+ {
+ result = -ENOMEM;
+ goto cleanup_return;
+ }
+ 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:
@@ -196,7 +201,6 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
}
else
{
- spin_lock_irqsave(&dev->blk_lock, irqflags);
if (dev->new_servers_num >= NUMBER_SERVERS)
result = -EAGAIN;
else
@@ -206,11 +210,11 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
++dev->new_servers_num;
result = 0;
}
- spin_unlock_irqrestore(&dev->blk_lock, irqflags);
}
break;
case BLKFLSBUF:
+ result = 0;
break;
default: