void end_asynch_io_brc(struct buffer_head *bh, int uptodate) { register int i; ASYNCH_IO *io = (ASYNCH_IO *)bh->b_next_free; mark_buffer_uptodate(bh, uptodate); unlock_buffer(bh); 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++) { NWFSCopy(&io->buffer[i * 512], io->bh[i]->b_data, 512); brelse(io->bh[i]); } if (io->call_back_routine) (io->call_back_routine)(io); io->signature = 0; #if (PROFILE_AIO) profile_complete(); #endif } return; } void end_asynch_io_bwc(struct buffer_head *bh, int uptodate) { register int i; ASYNCH_IO *io = (ASYNCH_IO *)bh->b_next_free; mark_buffer_uptodate(bh, uptodate); unlock_buffer(bh); 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++) brelse(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, bytesRead = 0; register ULONG bps; register NWDISK *NWDisk; NWDisk = SystemDisk[disk]; bps = NWDisk->BytesPerSector; io->ccode = 0; io->count = sectors; io->complete = 0; lock_kernel(); for (i=0; i < sectors; i++) { if (!(io->bh[i] = getblk((ULONG)NWDisk->PhysicalDiskHandle, (StartingLBA + i), bps))) { for (i=0; i < sectors; i++) if (io->bh[i]) brelse(io->bh[i]); unlock_kernel(); return 0; } io->bh[i]->b_end_io = end_asynch_io_brc; io->bh[i]->b_dev_id = io; } ll_rw_block(READ, sectors, &io->bh[0]); unlock_kernel(); run_task_queue(&tq_disk); #if (PROFILE_AIO) profile_complete(); #endif bytesRead = sectors * bps; return (bytesRead); } ULONG aWriteDiskSectors(ULONG disk, ULONG StartingLBA, BYTE *Sector, ULONG sectors, ULONG readAhead, ASYNCH_IO *io) { register ULONG i, bytesWritten = 0; register ULONG bps; register NWDISK *NWDisk; NWDisk = SystemDisk[disk]; bps = NWDisk->BytesPerSector; io->ccode = 0; io->count = sectors; io->complete = 0; lock_kernel(); for (i=0; i < sectors; i++) { if (!(io->bh[i] = getblk((ULONG)NWDisk->PhysicalDiskHandle, (StartingLBA + i), bps))) { for (i=0; i < sectors; i++) if (io->bh[i]) brelse(io->bh[i]); unlock_kernel(); return 0; } io->bh[i]->b_end_io = end_asynch_io_bwc; io->bh[i]->b_dev_id = io; NWFSCopy(io->bh[i]->b_data, &Sector[i * bps], bps); mark_buffer_uptodate(io->bh[i], 1); mark_buffer_dirty(io->bh[i], 0); bytesWritten += bps; } ll_rw_block(WRITE, sectors, &io->bh[0]); unlock_kernel(); run_task_queue(&tq_disk); #if (PROFILE_AIO) profile_complete(); #endif bytesWritten = sectors * bps; return (bytesWritten); } ULONG aZeroFillDiskSectors(ULONG disk, ULONG StartingLBA, ULONG sectors, ULONG readAhead, ASYNCH_IO *io) { register ULONG i, bytesWritten = 0; register ULONG bps; register NWDISK *NWDisk; io->ccode = 0; io->count = sectors; io->complete = 0; NWDisk = SystemDisk[disk]; bps = NWDisk->BytesPerSector; lock_kernel(); for (i=0; i < sectors; i++) { if (!(io->bh[i] = getblk((ULONG)NWDisk->PhysicalDiskHandle, (StartingLBA + i), bps))) { for (i=0; i < sectors; i++) if (io->bh[i]) brelse(io->bh[i]); unlock_kernel(); return 0; } io->bh[i]->b_end_io = end_asynch_io_bwc; io->bh[i]->b_dev_id = io; NWFSSet(io->bh[i]->b_data, 0, bps); mark_buffer_uptodate(io->bh[i], 1); mark_buffer_dirty(io->bh[i], 0); bytesWritten += bps; } ll_rw_block(WRITE, sectors, &io->bh[0]); unlock_kernel(); run_task_queue(&tq_disk); #if (PROFILE_AIO) profile_complete(); #endif bytesWritten = (sectors * bps); return (bytesWritten); } #endif