From e94396f4cf420642f551b8815e031c45bd0aaa7f Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Tue, 8 May 2012 23:40:35 +0200 Subject: [KERNEL] Set proper exit status on connection --- src/client/client.c | 12 ++++++++++++ src/kernel/blk.c | 6 ++---- src/kernel/net.c | 13 +++++++------ src/kernel/net.h | 2 +- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/client/client.c b/src/client/client.c index 4810005..92f5127 100644 --- a/src/client/client.c +++ b/src/client/client.c @@ -158,7 +158,10 @@ int main(int argc, char *argv[]) printf("INFO: Closing device %s\n", dev); if (ioctl(fd, IOCTL_CLOSE, &msg) < 0) + { printf("ERROR: ioctl not successful\n"); + exit(EXIT_FAILURE); + } close(fd); exit(EXIT_SUCCESS); @@ -171,7 +174,10 @@ int main(int argc, char *argv[]) printf("INFO: Switching device %s to %s\n", dev, msg.host); if (ioctl(fd, IOCTL_SWITCH, &msg) < 0) + { printf("ERROR: ioctl not successful\n"); + exit(EXIT_FAILURE); + } close(fd); exit(EXIT_SUCCESS); @@ -184,7 +190,10 @@ int main(int argc, char *argv[]) printf("INFO: Connecting %s to %s:%s vid:%i rid:%i\n", dev, msg.host, msg.port, msg.vid, msg.rid); if (ioctl(fd, IOCTL_OPEN, &msg) < 0) + { printf("ERROR: ioctl not successful\n"); + exit(EXIT_FAILURE); + } close(fd); exit(EXIT_SUCCESS); @@ -218,7 +227,10 @@ int main(int argc, char *argv[]) printf("INFO: Connecting %s to %s:%s vid:%i rid:%i\n", dev, msg.host, msg.port, msg.vid, msg.rid); if (ioctl(fd, IOCTL_OPEN, &msg) < 0) + { printf("ERROR: ioctl not successful\n"); + exit(EXIT_FAILURE); + } close(fd); } diff --git a/src/kernel/blk.c b/src/kernel/blk.c index 7010ef7..369627f 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -112,8 +112,7 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u dev->vid = msg->vid; dev->rid = msg->rid; blk_queue->backing_dev_info.ra_pages = (msg->read_ahead_kb * 1024)/ PAGE_CACHE_SIZE; - dnbd3_net_connect(dev); - break; + return dnbd3_net_connect(dev); case IOCTL_CLOSE: set_capacity(dev->disk, 0); @@ -123,8 +122,7 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u case IOCTL_SWITCH: dnbd3_net_disconnect(dev); strcpy(dev->cur_server.host, msg->host); - dnbd3_net_connect(dev); - break; + return dnbd3_net_connect(dev); case BLKFLSBUF: break; diff --git a/src/kernel/net.c b/src/kernel/net.c index bc2f510..0bfca6f 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -24,7 +24,7 @@ #include -void dnbd3_net_connect(dnbd3_device_t *dev) +int dnbd3_net_connect(dnbd3_device_t *dev) { struct sockaddr_in sin; struct request *req0 = kmalloc(sizeof(struct request), GFP_ATOMIC); @@ -39,18 +39,18 @@ void dnbd3_net_connect(dnbd3_device_t *dev) { printk("FATAL: Kmalloc failed.\n"); memset(dev->cur_server.host, '\0', sizeof(dev->cur_server.host)); - return; + return -1; } if (!dev->cur_server.host || !dev->cur_server.port || (dev->vid == 0)) { printk("FATAL: Host, port or vid not set.\n"); memset(dev->cur_server.host, '\0', sizeof(dev->cur_server.host)); - return; + return -1; } if (dev->cur_server.sock) { printk("ERROR: Device %s is already connected to %s.\n", dev->disk->disk_name, dev->cur_server.host); - return; + return -1; } printk("INFO: Connecting device %s to %s\n", dev->disk->disk_name, dev->cur_server.host); @@ -61,7 +61,7 @@ void dnbd3_net_connect(dnbd3_device_t *dev) printk("ERROR: Couldn't create socket.\n"); dev->cur_server.sock = NULL; memset(dev->cur_server.host, '\0', sizeof(dev->cur_server.host)); - return; + return -1; } kernel_setsockopt(dev->cur_server.sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, sizeof(timeout)); kernel_setsockopt(dev->cur_server.sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(timeout)); @@ -74,7 +74,7 @@ void dnbd3_net_connect(dnbd3_device_t *dev) printk("ERROR: Couldn't connect to host %s:%s\n", dev->cur_server.host, dev->cur_server.port); dev->cur_server.sock = NULL; memset(dev->cur_server.host, '\0', sizeof(dev->cur_server.host)); - return; + return -1; } dev->panic = 0; @@ -113,6 +113,7 @@ void dnbd3_net_connect(dnbd3_device_t *dev) dev->hb_timer.expires = jiffies + TIMER_INTERVAL_HEARTBEAT; add_timer(&dev->hb_timer); + return 0; } void dnbd3_net_disconnect(dnbd3_device_t *dev) diff --git a/src/kernel/net.h b/src/kernel/net.h index 5516b8f..3dfca41 100644 --- a/src/kernel/net.h +++ b/src/kernel/net.h @@ -30,7 +30,7 @@ h.msg_controllen = 0;\ h.msg_flags = MSG_WAITALL | MSG_NOSIGNAL; -void dnbd3_net_connect(dnbd3_device_t *lo); +int dnbd3_net_connect(dnbd3_device_t *lo); void dnbd3_net_disconnect(dnbd3_device_t *lo); -- cgit v1.2.3-55-g7522