patch-2.1.101 linux/drivers/block/ll_rw_blk.c
Next file: linux/drivers/block/md.c
Previous file: linux/drivers/block/ide.h
Back to the patch index
Back to the overall index
- Lines: 118
- Date:
Fri May 8 18:12:30 1998
- Orig file:
v2.1.100/linux/drivers/block/ll_rw_blk.c
- Orig date:
Tue Apr 14 14:29:20 1998
diff -u --recursive --new-file v2.1.100/linux/drivers/block/ll_rw_blk.c linux/drivers/block/ll_rw_blk.c
@@ -435,7 +435,7 @@
/* look for a free request. */
/* Loop uses two requests, 1 for loop and 1 for the real device.
* Cut max_req in half to avoid running out and deadlocking. */
- if (major == LOOP_MAJOR)
+ if ((major == LOOP_MAJOR) || (major == NBD_MAJOR))
max_req >>= 1;
/*
@@ -452,7 +452,7 @@
if (!req) {
/* MD and loop can't handle plugging without deadlocking */
if (major != MD_MAJOR && major != LOOP_MAJOR &&
- major != DDV_MAJOR)
+ major != DDV_MAJOR && major != NBD_MAJOR)
plug_device(blk_dev + major); /* is atomic */
} else switch (major) {
case IDE0_MAJOR: /* same as HD_MAJOR */
@@ -669,7 +669,7 @@
}
buffersize = PAGE_SIZE / nb;
- if (major == LOOP_MAJOR)
+ if ((major == LOOP_MAJOR) || (major == NBD_MAJOR))
max_req >>= 1;
for (j=0, i=0; i<nb;)
{
@@ -716,6 +716,58 @@
}
}
+/*
+ * First step of what used to be end_request
+ *
+ * 0 means continue with end_that_request_last,
+ * 1 means we are done
+ */
+
+int
+end_that_request_first( struct request *req, int uptodate, char *name )
+{
+ struct buffer_head * bh;
+ int nsect;
+
+ req->errors = 0;
+ if (!uptodate) {
+ printk("end_request: I/O error, dev %s (%s), sector %lu\n",
+ kdevname(req->rq_dev), name, req->sector);
+ if ((bh = req->bh) != NULL) {
+ nsect = bh->b_size >> 9;
+ req->nr_sectors--;
+ req->nr_sectors &= ~(nsect - 1);
+ req->sector += nsect;
+ req->sector &= ~(nsect - 1);
+ }
+ }
+
+ if ((bh = req->bh) != NULL) {
+ req->bh = bh->b_reqnext;
+ bh->b_reqnext = NULL;
+ bh->b_end_io(bh, uptodate);
+ if ((bh = req->bh) != NULL) {
+ req->current_nr_sectors = bh->b_size >> 9;
+ if (req->nr_sectors < req->current_nr_sectors) {
+ req->nr_sectors = req->current_nr_sectors;
+ printk("end_request: buffer-list destroyed\n");
+ }
+ req->buffer = bh->b_data;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void
+end_that_request_last( struct request *req )
+{
+ if (req->sem != NULL)
+ up(req->sem);
+ req->rq_status = RQ_INACTIVE;
+ wake_up(&wait_for_request);
+}
+
__initfunc(int blk_dev_init(void))
{
struct request * req;
@@ -771,10 +823,17 @@
#ifdef CONFIG_MAC_FLOPPY
swim3_init();
#endif
+#ifdef CONFIG_AMIGA_FLOPPY
+ amiga_floppy_init();
+#endif
+#ifdef CONFIG_ATARI_FLOPPY
+ atari_floppy_init();
+#endif
#ifdef CONFIG_BLK_DEV_FD
floppy_init();
#else
-#if !defined (__mc68000__) && !defined(CONFIG_PMAC) && !defined(__sparc__)
+#if !defined (__mc68000__) && !defined(CONFIG_PMAC) && !defined(__sparc__)\
+ && !defined(CONFIG_APUS)
outb_p(0xc, 0x3f2);
#endif
#endif
@@ -820,7 +879,12 @@
#ifdef CONFIG_DDV
ddv_init();
#endif
+#ifdef CONFIG_BLK_DEV_NBD
+ nbd_init();
+#endif
return 0;
};
EXPORT_SYMBOL(io_request_lock);
+EXPORT_SYMBOL(end_that_request_first);
+EXPORT_SYMBOL(end_that_request_last);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov