patch-2.4.4 linux/drivers/block/nbd.c
Next file: linux/drivers/block/paride/Config.in
Previous file: linux/drivers/block/loop.c
Back to the patch index
Back to the overall index
- Lines: 188
- Date:
Wed Apr 11 19:02:30 2001
- Orig file:
v2.4.3/linux/drivers/block/nbd.c
- Orig date:
Tue Mar 6 19:19:21 2001
diff -u --recursive --new-file v2.4.3/linux/drivers/block/nbd.c linux/drivers/block/nbd.c
@@ -26,12 +26,11 @@
* structure with userland
*/
-#undef NBD_PLUGGABLE
#define PARANOIA
#include <linux/major.h>
#include <linux/module.h>
-
+#include <linux/init.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/stat.h>
@@ -68,8 +67,6 @@
static int requests_out;
#endif
-static void nbd_plug_device(request_queue_t *q, kdev_t dev) { }
-
static int nbd_open(struct inode *inode, struct file *file)
{
int dev;
@@ -88,7 +85,7 @@
/*
* Send or receive packet.
*/
-static int nbd_xmit(int send, struct socket *sock, char *buf, int size)
+static int nbd_xmit(int send, struct socket *sock, char *buf, int size, int msg_flags)
{
mm_segment_t oldfs;
int result;
@@ -118,7 +115,7 @@
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_namelen = 0;
- msg.msg_flags = 0;
+ msg.msg_flags = msg_flags | MSG_NOSIGNAL;
if (send)
result = sock_sendmsg(sock, &msg, size);
@@ -151,23 +148,28 @@
{
int result;
struct nbd_request request;
+ unsigned long size = req->nr_sectors << 9;
DEBUG("NBD: sending control, ");
request.magic = htonl(NBD_REQUEST_MAGIC);
request.type = htonl(req->cmd);
request.from = cpu_to_be64( (u64) req->sector << 9);
- request.len = htonl(req->current_nr_sectors << 9);
+ request.len = htonl(size);
memcpy(request.handle, &req, sizeof(req));
- result = nbd_xmit(1, sock, (char *) &request, sizeof(request));
+ result = nbd_xmit(1, sock, (char *) &request, sizeof(request), req->cmd == WRITE ? MSG_MORE : 0);
if (result <= 0)
FAIL("Sendmsg failed for control.");
if (req->cmd == WRITE) {
+ struct buffer_head *bh = req->bh;
DEBUG("data, ");
- result = nbd_xmit(1, sock, req->buffer, req->current_nr_sectors << 9);
- if (result <= 0)
- FAIL("Send data failed.");
+ do {
+ result = nbd_xmit(1, sock, bh->b_data, bh->b_size, bh->b_reqnext == NULL ? 0 : MSG_MORE);
+ if (result <= 0)
+ FAIL("Send data failed.");
+ bh = bh->b_reqnext;
+ } while(bh);
}
return;
@@ -185,7 +187,7 @@
DEBUG("reading control, ");
reply.magic = 0;
- result = nbd_xmit(0, lo->sock, (char *) &reply, sizeof(reply));
+ result = nbd_xmit(0, lo->sock, (char *) &reply, sizeof(reply), MSG_WAITALL);
if (result <= 0)
HARDFAIL("Recv control failed.");
memcpy(&xreq, reply.handle, sizeof(xreq));
@@ -200,10 +202,14 @@
if (ntohl(reply.error))
FAIL("Other side returned error.");
if (req->cmd == READ) {
+ struct buffer_head *bh = req->bh;
DEBUG("data, ");
- result = nbd_xmit(0, lo->sock, req->buffer, req->current_nr_sectors << 9);
- if (result <= 0)
- HARDFAIL("Recv data failed.");
+ do {
+ result = nbd_xmit(0, lo->sock, bh->b_data, bh->b_size, MSG_WAITALL);
+ if (result <= 0)
+ HARDFAIL("Recv data failed.");
+ bh = bh->b_reqnext;
+ } while(bh);
}
DEBUG("done.\n");
return req;
@@ -217,7 +223,6 @@
void nbd_do_it(struct nbd_device *lo)
{
struct request *req;
- int dequeued;
down (&lo->queue_lock);
while (1) {
@@ -245,11 +250,9 @@
list_del(&req->queue);
up (&lo->queue_lock);
- dequeued = nbd_end_request(req);
+ nbd_end_request(req);
down (&lo->queue_lock);
- if (!dequeued)
- list_add(&req->queue, &lo->queue_head);
}
out:
up (&lo->queue_lock);
@@ -258,7 +261,6 @@
void nbd_clear_que(struct nbd_device *lo)
{
struct request *req;
- int dequeued;
#ifdef PARANOIA
if (lo->magic != LO_MAGIC) {
@@ -283,11 +285,9 @@
list_del(&req->queue);
up(&lo->queue_lock);
- dequeued = nbd_end_request(req);
+ nbd_end_request(req);
down(&lo->queue_lock);
- if (!dequeued)
- list_add(&req->queue, &lo->queue_head);
}
}
@@ -477,11 +477,7 @@
* (Just smiley confuses emacs :-)
*/
-#ifdef MODULE
-#define nbd_init init_module
-#endif
-
-int nbd_init(void)
+static int __init nbd_init(void)
{
int i;
@@ -501,9 +497,6 @@
blksize_size[MAJOR_NR] = nbd_blksizes;
blk_size[MAJOR_NR] = nbd_sizes;
blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_nbd_request);
-#ifndef NBD_PLUGGABLE
- blk_queue_pluggable(BLK_DEFAULT_QUEUE(MAJOR_NR), nbd_plug_device);
-#endif
blk_queue_headactive(BLK_DEFAULT_QUEUE(MAJOR_NR), 0);
for (i = 0; i < MAX_NBD; i++) {
nbd_dev[i].refcnt = 0;
@@ -528,8 +521,7 @@
return 0;
}
-#ifdef MODULE
-void cleanup_module(void)
+static void __exit nbd_cleanup(void)
{
devfs_unregister (devfs_handle);
blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
@@ -539,4 +531,9 @@
else
printk("nbd: module cleaned up.\n");
}
-#endif
+
+module_init(nbd_init);
+module_exit(nbd_cleanup);
+
+MODULE_DESCRIPTION("Network Block Device");
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)