/* * fs/direct-io.c * * Copyright (C) 2002, Linus Torvalds. * * O_DIRECT * * 04Jul2002 Andrew Morton * Initial version * 11Sep2002 janetinc@us.ibm.com * added readv/writev support. * 29Oct2002 Andrew Morton * rewrote bio_add_page() support. * 30Oct2002 pbadari@us.ibm.com * added support for non-aligned IO. * 06Nov2002 pbadari@us.ibm.com * added asynchronous IO support. * 21Jul2003 nathans@sgi.com * added IO completion notifier. */#include<linux/kernel.h>#include<linux/module.h>#include<linux/types.h>#include<linux/fs.h>#include<linux/mm.h>#include<linux/slab.h>#include<linux/highmem.h>#include<linux/pagemap.h>#include<linux/task_io_accounting_ops.h>#include<linux/bio.h>#include<linux/wait.h>#include<linux/err.h>#include<linux/blkdev.h>#include<linux/buffer_head.h>#include<linux/rwsem.h>#include<linux/uio.h>#include<linux/atomic.h>#include<linux/prefetch.h>#include<linux/aio.h>/* * How many user pages to map in one call to get_user_pages(). This determines * the size of a structure in the slab cache */#define DIO_PAGES 64/* * This code generally works in units of "dio_blocks". A dio_block is * somewhere between the hard sector size and the filesystem block size. it * is determined on a per-invocation basis. When talking to the filesystem * we need to convert dio_blocks to fs_blocks by scaling the dio_block quantity * down by dio->blkfactor. Similarly, fs-blocksize quantities are converted * to bio_block quantities by shifting left by blkfactor. * * If blkfactor is zero then the user's request was aligned to the filesystem's * blocksize. *//* dio_state only used in the submission path */structdio_submit{structbio*bio;/* bio under assembly */unsignedblkbits;/* doesn't change */unsignedblkfactor;/* When we're using an alignment which is finer than the filesystem's soft blocksize, this specifies how much finer. blkfactor=2 means 1/4-block alignment. Does not change */unsignedstart_zero_done;/* flag: sub-blocksize zeroing has been performed at the start of a write */intpages_in_io;/* approximate total IO pages */size_tsize;/* total request size (doesn't change)*/sector_tblock_in_file;/* Current offset into the underlying file in dio_block units. */unsignedblocks_available;/* At block_in_file. changes */intreap_counter;/* rate limit reaping */sector_tfinal_block_in_request;/* doesn't change */unsignedfirst_block_in_page;/* doesn't change, Used only once */intboundary;/* prev block is at a boundary */get_block_t*get_block;/* block mapping function */dio_submit_t*submit_io;/* IO submition function */loff_tlogical_offset_in_bio;/* current first logical block in bio */sector_tfinal_block_in_bio;/* current final block in bio + 1 */sector_tnext_block_for_io;/* next block to be put under IO, in dio_blocks units *//* * Deferred addition of a page to the dio. These variables are * private to dio_send_cur_page(), submit_page_section() and * dio_bio_add_page(). */structpage