--- Gnu-Mach/linux/dev/glue/block.c 2020/09/02 04:41:39 1.1 +++ Gnu-Mach/linux/dev/glue/block.c 2020/09/02 04:43:25 1.1.1.2 @@ -308,7 +308,7 @@ alloc_buffer (int size) if (! linux_auto_config) { - while ((m = vm_page_grab ()) == 0) + while ((m = vm_page_grab (FALSE)) == 0) VM_PAGE_WAIT (0); d = current_thread ()->pcb->data; assert (d); @@ -333,7 +333,7 @@ free_buffer (void *p, int size) d = current_thread ()->pcb->data; assert (d); queue_iterate (&d->pages, m, vm_page_t, pageq) - { + { if (m->phys_addr == (vm_offset_t) p) { queue_remove (&d->pages, m, vm_page_t, pageq); @@ -1492,7 +1492,7 @@ 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 ()) == 0) + while ((m = vm_page_grab (FALSE)) == 0) VM_PAGE_WAIT (0); assert (! m->active && ! m->inactive); m->busy = TRUE; @@ -1632,6 +1632,43 @@ device_get_status (void *d, dev_flavor_t *status_count = DEV_GET_SIZE_COUNT; break; + case DEV_GET_RECORDS: + if (disk_major (MAJOR (bd->dev))) + { + assert (bd->ds->gd); + + if (bd->part >= 0) + { + struct disklabel *lp; + + assert (bd->ds->labels); + lp = bd->ds->labels[MINOR (bd->dev)]; + assert (lp); + (status[DEV_GET_RECORDS_DEVICE_RECORDS] + = lp->d_partitions[bd->part].p_size); + } + else + (status[DEV_GET_RECORDS_DEVICE_RECORDS] + = bd->ds->gd->part[MINOR (bd->dev)].nr_sects); + } + else + { + assert (blk_size[MAJOR (bd->dev)]); + (status[DEV_GET_RECORDS_DEVICE_RECORDS] + = blk_size[MAJOR (bd->dev)][MINOR (bd->dev)]); + } + /* It would be nice to return the block size as reported by + the driver, but a lot of user level code assumes the sector + size to be 512. */ + status[DEV_GET_SIZE_RECORD_SIZE] = 512; + /* Always return DEV_GET_RECORDS_COUNT. This is what all native + Mach drivers do, and makes it possible to detect the absence + of the call by setting it to a different value on input. MiG + makes sure that we will never return more integers than the + user asked for. */ + *status_count = DEV_GET_RECORDS_COUNT; + break; + case V_GETPARMS: if (*status_count < (sizeof (struct disk_parms) / sizeof (int))) return D_INVALID_OPERATION; @@ -1657,16 +1694,16 @@ device_get_status (void *d, dev_flavor_t 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; }