--- Gnu-Mach/linux/dev/glue/block.c 2020/09/02 04:45:59 1.1.1.3 +++ Gnu-Mach/linux/dev/glue/block.c 2020/09/02 04:54:52 1.1.1.6 @@ -50,6 +50,7 @@ #include #include +#include #include #include @@ -97,7 +98,7 @@ struct temp_data struct inode inode; struct file file; struct request req; - queue_head_t pages; + struct list pages; }; /* One of these exists for each @@ -302,11 +303,11 @@ alloc_buffer (int size) if (! linux_auto_config) { - while ((m = vm_page_grab (FALSE)) == 0) + while ((m = vm_page_grab ()) == 0) VM_PAGE_WAIT (0); d = current_thread ()->pcb->data; assert (d); - queue_enter (&d->pages, m, vm_page_t, pageq); + list_insert_tail (&d->pages, &m->node); return (void *) phystokv(m->phys_addr); } return (void *) __get_free_pages (GFP_KERNEL, 0, ~0UL); @@ -317,7 +318,7 @@ static void free_buffer (void *p, int size) { struct temp_data *d; - vm_page_t m; + vm_page_t m, tmp; assert (size <= PAGE_SIZE); @@ -325,11 +326,11 @@ free_buffer (void *p, int size) { d = current_thread ()->pcb->data; assert (d); - queue_iterate (&d->pages, m, vm_page_t, pageq) + list_for_each_entry_safe (&d->pages, m, tmp, node) { if (phystokv(m->phys_addr) == (vm_offset_t) p) { - queue_remove (&d->pages, m, vm_page_t, pageq); + list_remove (&m->node); VM_PAGE_FREE (m); return; } @@ -384,7 +385,7 @@ bread (kdev_t dev, int block, int size) bh = getblk (dev, block, size); if (bh) { - ll_rw_block (READ, 1, &bh); + ll_rw_block (READ, 1, &bh, 0); wait_on_buffer (bh); if (! buffer_uptodate (bh)) { @@ -444,7 +445,7 @@ enqueue_request (struct request *req) /* Perform the I/O operation RW on the buffer list BH containing NR buffers. */ void -ll_rw_block (int rw, int nr, struct buffer_head **bh) +ll_rw_block (int rw, int nr, struct buffer_head **bh, int quiet) { int i, bshift, bsize; unsigned major; @@ -476,6 +477,7 @@ ll_rw_block (int rw, int nr, struct buff r->rq_dev = bh[0]->b_dev; r->cmd = rw; r->errors = 0; + r->quiet = quiet; r->sector = bh[0]->b_blocknr << (bshift - 9); r->current_nr_sectors = bh[0]->b_size >> 9; r->buffer = bh[0]->b_data; @@ -528,7 +530,7 @@ rdwr_partial (int rw, kdev_t dev, loff_t bh->b_data = alloc_buffer (bh->b_size); if (! bh->b_data) return -ENOMEM; - ll_rw_block (READ, 1, &bh); + ll_rw_block (READ, 1, &bh, 0); wait_on_buffer (bh); if (buffer_uptodate (bh)) { @@ -542,7 +544,7 @@ rdwr_partial (int rw, kdev_t dev, loff_t { memcpy (bh->b_data + o, *buf, c); bh->b_state = (1 << BH_Dirty) | (1 << BH_Lock); - ll_rw_block (WRITE, 1, &bh); + ll_rw_block (WRITE, 1, &bh, 0); wait_on_buffer (bh); if (! buffer_uptodate (bh)) { @@ -623,7 +625,8 @@ rdwr_full (int rw, kdev_t dev, loff_t *o } if (! err) { - ll_rw_block (rw, i, bhp); + assert (i > 0); + ll_rw_block (rw, i, bhp, 0); wait_on_buffer (bhp[i - 1]); } for (bh = bhead, cc = 0, j = 0; j < i; cc += bh->b_size, bh++, j++) @@ -990,7 +993,7 @@ check: #define DECL_DATA struct temp_data td #define INIT_DATA() \ { \ - queue_init (&td.pages); \ + list_init (&td.pages); \ td.inode.i_rdev = bd->dev; \ td.file.f_mode = bd->mode; \ td.file.f_flags = bd->flags; \ @@ -1044,7 +1047,7 @@ device_open (ipc_port_t reply_port, mach minor <<= gd->minor_shift; dev = MKDEV (major, minor); - queue_init (&td.pages); + list_init (&td.pages); current_thread ()->pcb->data = &td; /* Check partition. */ @@ -1155,7 +1158,7 @@ out: { ipc_kobject_set (bd->port, IKO_NULL, IKOT_NONE); ipc_port_dealloc_kernel (bd->port); - *devp = IP_NULL; + *devp = (device_t) IP_NULL; } kfree ((vm_offset_t) bd, sizeof (struct block_data)); bd = NULL; @@ -1415,7 +1418,7 @@ device_read (void *d, ipc_port_t reply_p boolean_t dirty; int resid, amt; io_return_t err = 0; - queue_head_t pages; + struct list pages; vm_map_copy_t copy; vm_offset_t addr, offset, alloc_offset, o; vm_object_t object; @@ -1458,7 +1461,7 @@ device_read (void *d, ipc_port_t reply_p if (err) goto out; - queue_init (&pages); + list_init (&pages); while (resid) { @@ -1469,7 +1472,7 @@ device_read (void *d, ipc_port_t reply_p /* Map any pages left from previous operation. */ o = trunc_page (offset); - queue_iterate (&pages, m, vm_page_t, pageq) + list_for_each_entry (&pages, m, node) { pmap_enter (vm_map_pmap (device_io_map), addr + o - trunc_page (offset), @@ -1481,11 +1484,11 @@ device_read (void *d, ipc_port_t reply_p /* Allocate and map pages. */ while (alloc_offset < trunc_page (offset) + len) { - while ((m = vm_page_grab (FALSE)) == 0) + while ((m = vm_page_grab ()) == 0) VM_PAGE_WAIT (0); assert (! m->active && ! m->inactive); m->busy = TRUE; - queue_enter (&pages, m, vm_page_t, pageq); + list_insert_tail (&pages, &m->node); pmap_enter (vm_map_pmap (device_io_map), addr + alloc_offset - trunc_page (offset), m->phys_addr, VM_PROT_READ|VM_PROT_WRITE, TRUE); @@ -1527,9 +1530,9 @@ device_read (void *d, ipc_port_t reply_p vm_object_lock (object); while (o < trunc_page (offset)) { - m = (vm_page_t) queue_first (&pages); - assert (! queue_end (&pages, (queue_entry_t) m)); - queue_remove (&pages, m, vm_page_t, pageq); + m = list_first_entry (&pages, struct vm_page, node); + assert (! list_end (&pages, &m->node)); + list_remove (&m->node); assert (m->busy); vm_page_lock_queues (); if (dirty) @@ -1555,7 +1558,7 @@ device_read (void *d, ipc_port_t reply_p /* Delete kernel buffer. */ vm_map_remove (device_io_map, addr, addr + size); - assert (queue_empty (&pages)); + assert (list_empty (&pages)); out: if (! err) @@ -1659,41 +1662,6 @@ device_get_status (void *d, dev_flavor_t *status_count = DEV_GET_RECORDS_COUNT; break; - case V_GETPARMS: - if (*status_count < (sizeof (struct disk_parms) / sizeof (int))) - return D_INVALID_OPERATION; - else - { - struct disk_parms *dp = status; - struct hd_geometry hg; - DECL_DATA; - - INIT_DATA(); - - if ((*bd->ds->fops->ioctl) (&td.inode, &td.file, - HDIO_GETGEO, (unsigned long)&hg)) - return D_INVALID_OPERATION; - - dp->dp_type = DPT_WINI; /* XXX: It may be a floppy... */ - dp->dp_heads = hg.heads; - dp->dp_cyls = hg.cylinders; - dp->dp_sectors = hg.sectors; - dp->dp_dosheads = hg.heads; - dp->dp_doscyls = hg.cylinders; - dp->dp_dossectors = hg.sectors; - dp->dp_secsiz = 512; /* XXX */ - dp->dp_ptag = 0; - dp->dp_pflag = 0; - - /* XXX */ - dp->dp_pstartsec = -1; - dp->dp_pnumsec = -1; - - *status_count = sizeof (struct disk_parms) / sizeof (int); - } - - break; - default: return D_INVALID_OPERATION; } @@ -1703,7 +1671,7 @@ device_get_status (void *d, dev_flavor_t static io_return_t device_set_status (void *d, dev_flavor_t flavor, dev_status_t status, - mach_msg_type_number_t *status_count) + mach_msg_type_number_t status_count) { struct block_data *bd = d;