void end_asynch_io(struct buffer_head *bh, int uptodate) { register int i; ASYNCH_IO *io = (ASYNCH_IO *)bh->b_dev_id; mark_buffer_uptodate(bh, uptodate); unlock_buffer(bh); if (!io) { NWFSPrint("nwfs: aio callback has NULL handle\n"); return; } if (!test_bit(BH_Uptodate, &bh->b_state)) io->ccode = ASIO_IO_ERROR; io->complete++; if (io->complete >= io->count) { for (i=0; i < io->count; i++) put_bh(io->bh[i]); if (io->call_back_routine) (io->call_back_routine)(io); io->signature = 0; #if (PROFILE_AIO) profile_complete(); #endif } return; } ULONG aReadDiskSectors(ULONG disk, ULONG StartingLBA, BYTE *Sector, ULONG sectors, ULONG readAhead, ASYNCH_IO *io) { register ULONG i, j, bytesRead = 0; register ULONG bps; register NWDISK *NWDisk; if (sectors > 8) return 0; NWDisk = SystemDisk[disk]; bps = NWDisk->BytesPerSector; for (i=0; i < sectors; i++) { io->bh[i] = get_bh(); if (!io->bh[i]) { for (j=0; j < i; j++) if (io->bh[j]) put_bh(io->bh[j]); return 0; } } io->ccode = 0; io->count = sectors; io->complete = 0; for (i=0; i < sectors; i++) { io->bh[i]->b_this_page = io->bh[(i + 1) % sectors]; // create circular list io->bh[i]->b_state = 0; io->bh[i]->b_next_free = (struct buffer_head *)NULL; io->bh[i]->b_size = 512; io->bh[i]->b_data = (char *)&Sector[i * bps]; io->bh[i]->b_list = BUF_CLEAN; io->bh[i]->b_dev = (int)NWDisk->PhysicalDiskHandle; io->bh[i]->b_blocknr = (StartingLBA + i); io->bh[i]->b_count = 1; io->bh[i]->b_flushtime = 0; io->bh[i]->b_end_io = end_asynch_io; io->bh[i]->b_dev_id = io; clear_bit(BH_Uptodate, &io->bh[i]->b_state); } lock_kernel(); ll_rw_block(READ, sectors, &io->bh[0]); unlock_kernel(); run_task_queue(&tq_disk); #if (DEBUG_AIO) NWFSPrint("io asynch read disk-%d lba-%d\n", (int)disk, (int)StartingLBA); #endif bytesRead = (sectors * bps); return (bytesRead); } ULONG aWriteDiskSectors(ULONG disk, ULONG StartingLBA, BYTE *Sector, ULONG sectors, ULONG readAhead, ASYNCH_IO *io) { register ULONG i, j, bytesWritten = 0; register ULONG bps; register NWDISK *NWDisk; if (sectors > 8) return 0; NWDisk = SystemDisk[disk]; bps = NWDisk->BytesPerSector; for (i=0; i < sectors; i++) { io->bh[i] = get_bh(); if (!io->bh[i]) { for (j=0; j < i; j++) if (io->bh[j]) put_bh(io->bh[j]); return 0; } } io->ccode = 0; io->count = sectors; io->complete = 0; for (i=0; i < sectors; i++) { io->bh[i]->b_this_page = io->bh[(i + 1) % sectors]; // create circular list io->bh[i]->b_state = 0; io->bh[i]->b_next_free = (struct buffer_head *) NULL; io->bh[i]->b_size = 512; io->bh[i]->b_data = (char *)&Sector[i * bps]; io->bh[i]->b_list = BUF_CLEAN; io->bh[i]->b_dev = (int)NWDisk->PhysicalDiskHandle; io->bh[i]->b_blocknr = (StartingLBA + i); io->bh[i]->b_count = 1; io->bh[i]->b_flushtime = 0; io->bh[i]->b_end_io = end_asynch_io; io->bh[i]->b_dev_id = io; set_bit(BH_Uptodate, &io->bh[i]->b_state); set_bit(BH_Dirty, &io->bh[i]->b_state); } lock_kernel(); ll_rw_block(WRITE, sectors, &io->bh[0]); unlock_kernel(); run_task_queue(&tq_disk); #if (DEBUG_AIO) NWFSPrint("io asynch write disk-%d lba-%d\n", (int)disk, (int)StartingLBA); #endif bytesWritten = (sectors * bps); return (bytesWritten); } ULONG aZeroFillDiskSectors(ULONG disk, ULONG StartingLBA, ULONG sectors, ULONG readAhead, ASYNCH_IO *io) { register ULONG i, j, bytesWritten = 0; register ULONG bps; register NWDISK *NWDisk; if (sectors > 8) return 0; NWDisk = SystemDisk[disk]; bps = NWDisk->BytesPerSector; for (i=0; i < sectors; i++) { io->bh[i] = get_bh(); if (!io->bh[i]) { for (j=0; j < i; j++) if (io->bh[j]) put_bh(io->bh[j]); return 0; } } io->ccode = 0; io->count = sectors; io->complete = 0; for (i=0; i < sectors; i++) { io->bh[i]->b_this_page = io->bh[(i + 1) % sectors]; // create circular list io->bh[i]->b_state = 0; io->bh[i]->b_next_free = (struct buffer_head *) NULL; io->bh[i]->b_size = 512; io->bh[i]->b_data = (char *) ZeroBuffer; io->bh[i]->b_list = BUF_CLEAN; io->bh[i]->b_dev = (int)NWDisk->PhysicalDiskHandle; io->bh[i]->b_blocknr = (StartingLBA + i); io->bh[i]->b_count = 1; io->bh[i]->b_flushtime = 0; io->bh[i]->b_end_io = end_asynch_io; io->bh[i]->b_dev_id = io; set_bit(BH_Uptodate, &io->bh[i]->b_state); set_bit(BH_Dirty, &io->bh[i]->b_state); } lock_kernel(); ll_rw_block(WRITE, sectors, &io->bh[0]); unlock_kernel(); run_task_queue(&tq_disk); #if (DEBUG_AIO) NWFSPrint("io asynch fill disk-%d lba-%d\n", (int)disk, (int)StartingLBA); #endif bytesWritten = (sectors * bps); return (bytesWritten); }