10 Sep, 2010

23 commits

  • This patch converts bio-based dm to support REQ_FLUSH/FUA instead of
    now deprecated REQ_HARDBARRIER.

    * -EOPNOTSUPP handling logic dropped.

    * Preflush is handled as before but postflush is dropped and replaced
    with passing down REQ_FUA to member request_queues. This replaces
    one array wide cache flush w/ member specific FUA writes.

    * __split_and_process_bio() now calls __clone_and_map_flush() directly
    for flushes and guarantees all FLUSH bio's going to targets are zero
    ` length.

    * It's now guaranteed that all FLUSH bio's which are passed onto dm
    targets are zero length. bio_empty_barrier() tests are replaced
    with REQ_FLUSH tests.

    * Empty WRITE_BARRIERs are replaced with WRITE_FLUSHes.

    * Dropped unlikely() around REQ_FLUSH tests. Flushes are not unlikely
    enough to be marked with unlikely().

    * Block layer now filters out REQ_FLUSH/FUA bio's if the request_queue
    doesn't support cache flushing. Advertise REQ_FLUSH | REQ_FUA
    capability.

    * Request based dm isn't converted yet. dm_init_request_based_queue()
    resets flush support to 0 for now. To avoid disturbing request
    based dm code, dm->flush_error is added for bio based dm while
    requested based dm continues to use dm->barrier_error.

    Lightly tested linear, stripe, raid1, snap and crypt targets. Please
    proceed with caution as I'm not familiar with the code base.

    Signed-off-by: Tejun Heo
    Cc: dm-devel@redhat.com
    Cc: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Currently __blk_rq_prep_clone() copies only REQ_WRITE and REQ_DISCARD.
    There's no reason to omit other command flags and REQ_FUA needs to be
    copied to implement FUA support in request-based dm.

    REQ_COMMON_MASK which specifies flags to be copied from bio to request
    already identifies all the command flags. Define REQ_CLONE_MASK to be
    the same as REQ_COMMON_MASK for clarity and make __blk_rq_prep_clone()
    copy all flags in the mask.

    Signed-off-by: Tejun Heo
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • This patch converts md to support REQ_FLUSH/FUA instead of now
    deprecated REQ_HARDBARRIER. In the core part (md.c), the following
    changes are notable.

    * Unlike REQ_HARDBARRIER, REQ_FLUSH/FUA don't interfere with
    processing of other requests and thus there is no reason to mark the
    queue congested while FLUSH/FUA is in progress.

    * REQ_FLUSH/FUA failures are final and its users don't need retry
    logic. Retry logic is removed.

    * Preflush needs to be issued to all member devices but FUA writes can
    be handled the same way as other writes - their processing can be
    deferred to request_queue of member devices. md_barrier_request()
    is renamed to md_flush_request() and simplified accordingly.

    For linear, raid0 and multipath, the core changes are enough. raid1,
    5 and 10 need the following conversions.

    * raid1: Handling of FLUSH/FUA bio's can simply be deferred to
    request_queues of member devices. Barrier related logic removed.

    * raid5: Queue draining logic dropped. FUA bit is propagated through
    biodrain and stripe resconstruction such that all the updated parts
    of the stripe are written out with FUA writes if any of the dirtying
    writes was FUA. preread_active_stripes handling in make_request()
    is updated as suggested by Neil Brown.

    * raid10: FUA bit needs to be propagated to write clones.

    linear, raid0, 1, 5 and 10 tested.

    Signed-off-by: Tejun Heo
    Reviewed-by: Neil Brown
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • VIRTIO_F_BARRIER is deprecated. Replace it with VIRTIO_F_FLUSH
    support.

    Signed-off-by: Tejun Heo
    Cc: Rusty Russell
    Cc: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Remove now unused REQ_HARDBARRIER support. virtio_blk already
    supports REQ_FLUSH and the usefulness of REQ_FUA for virtio_blk is
    questionable at this point, so there's nothing else to do to support
    new REQ_FLUSH/FUA interface.

    Signed-off-by: Tejun Heo
    Cc: Michael S. Tsirkin
    Cc: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Deprecate REQ_HARDBARRIER and implement REQ_FLUSH/FUA instead. Also,
    instead of checking file->f_op->fsync() directly, look at the value of
    vfs_fsync() and ignore -EINVAL return.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Update blkdev_issue_flush() to use new REQ_FLUSH interface.

    Signed-off-by: Tejun Heo
    Cc: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Signed-off-by: Christoph Hellwig
    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • rq->rq_disk and bio->bi_bdev->bd_disk may differ if a request has
    passed through remapping drivers. FSEQ_DATA request incorrectly
    followed bio->bi_bdev->bd_disk ending up being issued w/ mismatching
    rq_disk. Make it follow orig_rq->rq_disk.

    Signed-off-by: Tejun Heo
    Reported-by: Kiyoshi Ueda
    Tested-by: Kiyoshi Ueda
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • While completing a request from a REQ_FLUSH/FUA sequence, another
    request can be pushed to the request queue. If a driver tests
    elv_queue_empty() before completing a request and runs the queue again
    only if the queue wasn't empty, this may lead to hang. Please note
    that most drivers either kick the queue unconditionally or test queue
    emptiness after completing the current request and don't have this
    problem.

    This patch removes this possibility by making REQ_FLUSH/FUA sequence
    code kick the queue if the queue was empty before completing a request
    from REQ_FLUSH/FUA sequence.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • init_flush_request() only set REQ_FLUSH when initializing flush
    requests making them READ requests. Use WRITE_FLUSH instead.

    Signed-off-by: Tejun Heo
    Reported-by: Mike Snitzer
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • We need to call blk_rq_init and elv_insert for all cases in queue_next_fseq,
    so take these calls into common code. Also move the end_io initialization
    from queue_flush into queue_next_fseq and rename queue_flush to
    init_flush_request now that it's old name doesn't apply anymore.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • There are a number of make_request based drivers which don't support
    cache flushes. Filter out flush bio's in __generic_make_request() so
    that they don't have to worry about them. All FLUSH/FUA requests with
    data are converted to regular IO requests and empty ones are completed
    immediately.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Now that the backend conversion is complete, export sequenced
    FLUSH/FUA capability through REQ_FLUSH/FUA flags. REQ_FLUSH means the
    device cache should be flushed before executing the request. REQ_FUA
    means that the data in the request should be on non-volatile media on
    completion.

    Block layer will choose the correct way of implementing the semantics
    and execute it. The request may be passed to the device directly if
    the device can handle it; otherwise, it will be sequenced using one or
    more proxy requests. Devices will never see REQ_FLUSH and/or FUA
    which it doesn't support.

    Also, unlike the original REQ_HARDBARRIER, REQ_FLUSH/FUA requests are
    never failed with -EOPNOTSUPP. If the underlying device doesn't
    support FLUSH/FUA, the block layer simply make those noop. IOW, it no
    longer distinguishes between writeback cache which doesn't support
    cache flush and writethrough/no cache. Devices which have WB cache
    w/o flush are very difficult to come by these days and there's nothing
    much we can do anyway, so it doesn't make sense to require everyone to
    implement -EOPNOTSUPP handling. This will simplify filesystems and
    block drivers as they can drop -EOPNOTSUPP retry logic for barriers.

    * QUEUE_ORDERED_* are removed and QUEUE_FSEQ_* are moved into
    blk-flush.c.

    * REQ_FLUSH w/o data can also be directly passed to drivers without
    sequencing but some drivers assume that zero length requests don't
    have rq->bio which isn't true for these requests requiring the use
    of proxy requests.

    * REQ_COMMON_MASK now includes REQ_FLUSH | REQ_FUA so that they are
    copied from bio to request.

    * WRITE_BARRIER is marked deprecated and WRITE_FLUSH, WRITE_FUA and
    WRITE_FLUSH_FUA are added.

    Signed-off-by: Tejun Heo
    Cc: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • With ordering requirements dropped, barrier and ordered are misnomers.
    Now all block layer does is sequencing FLUSH and FUA. Rename them to
    flush.

    Signed-off-by: Tejun Heo
    Cc: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Without ordering requirements, barrier and ordering are minomers.
    Rename block/blk-barrier.c to block/blk-flush.c. Rename of symbols
    will follow.

    Signed-off-by: Tejun Heo
    Cc: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Filesystems will take all the responsibilities for ordering requests
    around commit writes and will only indicate how the commit writes
    themselves should be handled by block layers. This patch drops
    barrier ordering by queue draining from block layer. Ordering by
    draining implementation was somewhat invasive to request handling.
    List of notable changes follow.

    * Each queue has 1 bit color which is flipped on each barrier issue.
    This is used to track whether a given request is issued before the
    current barrier or not. REQ_ORDERED_COLOR flag and coloring
    implementation in __elv_add_request() are removed.

    * Requests which shouldn't be processed yet for draining were stalled
    by returning -EAGAIN from blk_do_ordered() according to the test
    result between blk_ordered_req_seq() and blk_blk_ordered_cur_seq().
    This logic is removed.

    * Draining completion logic in elv_completed_request() removed.

    * All barrier sequence requests were queued to request queue and then
    trckled to lower layer according to progress and thus maintaining
    request orders during requeue was necessary. This is replaced by
    queueing the next request in the barrier sequence only after the
    current one is complete from blk_ordered_complete_seq(), which
    removes the need for multiple proxy requests in struct request_queue
    and the request sorting logic in the ELEVATOR_INSERT_REQUEUE path of
    elv_insert().

    * As barriers no longer have ordering constraints, there's no need to
    dump the whole elevator onto the dispatch queue on each barrier.
    Insert barriers at the front instead.

    * If other barrier requests come to the front of the dispatch queue
    while one is already in progress, they are stored in
    q->pending_barriers and restored to dispatch queue one-by-one after
    each barrier completion from blk_ordered_complete_seq().

    Signed-off-by: Tejun Heo
    Cc: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Make the following cleanups in preparation of barrier/flush update.

    * blk_do_ordered() declaration is moved from include/linux/blkdev.h to
    block/blk.h.

    * blk_do_ordered() now returns pointer to struct request, with %NULL
    meaning "try the next request" and ERR_PTR(-EAGAIN) "try again
    later". The third case will be dropped with further changes.

    * In the initialization of proxy barrier request, data direction is
    already set by init_request_from_bio(). Drop unnecessary explicit
    REQ_WRITE setting and move init_request_from_bio() above REQ_FUA
    flag setting.

    * add_request() is collapsed into __make_request().

    These changes don't make any functional difference.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • REQ_HARDBARRIER is deprecated. Remove spurious uses in the following
    users. Please note that other than osdblk, all other uses were
    already spurious before deprecation.

    * osdblk: osdblk_rq_fn() won't receive any request with
    REQ_HARDBARRIER set. Remove the test for it.

    * pktcdvd: use of REQ_HARDBARRIER in pkt_generic_packet() doesn't mean
    anything. Removed.

    * aic7xxx_old: Setting MSG_ORDERED_Q_TAG on REQ_HARDBARRIER is
    spurious. Removed.

    * sas_scsi_host: Setting TASK_ATTR_ORDERED on REQ_HARDBARRIER is
    spurious. Removed.

    * scsi_tcq: The ordered tag path wasn't being used anyway. Removed.

    Signed-off-by: Tejun Heo
    Acked-by: Boaz Harrosh
    Cc: James Bottomley
    Cc: Peter Osterlund
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Barrier is deemed too heavy and will soon be replaced by FLUSH/FUA
    requests. Deprecate barrier. All REQ_HARDBARRIERs are failed with
    -EOPNOTSUPP and blk_queue_ordered() is replaced with simpler
    blk_queue_flush().

    blk_queue_flush() takes combinations of REQ_FLUSH and FUA. If a
    device has write cache and can flush it, it should set REQ_FLUSH. If
    the device can handle FUA writes, it should also set REQ_FUA.

    All blk_queue_ordered() users are converted.

    * ORDERED_DRAIN is mapped to 0 which is the default value.
    * ORDERED_DRAIN_FLUSH is mapped to REQ_FLUSH.
    * ORDERED_DRAIN_FLUSH_FUA is mapped to REQ_FLUSH | REQ_FUA.

    Signed-off-by: Tejun Heo
    Acked-by: Boaz Harrosh
    Cc: Christoph Hellwig
    Cc: Nick Piggin
    Cc: Michael S. Tsirkin
    Cc: Jeremy Fitzhardinge
    Cc: Chris Wright
    Cc: FUJITA Tomonori
    Cc: Geert Uytterhoeven
    Cc: David S. Miller
    Cc: Alasdair G Kergon
    Cc: Pierre Ossman
    Cc: Stefan Weinhuber
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Nobody is making meaningful use of ORDERED_BY_TAG now and queue
    draining for barrier requests will be removed soon which will render
    the advantage of tag ordering moot. Kill ORDERED_BY_TAG. The
    following users are affected.

    * brd: converted to ORDERED_DRAIN.
    * virtio_blk: ORDERED_TAG path was already marked deprecated. Removed.
    * xen-blkfront: ORDERED_TAG case dropped.

    Signed-off-by: Tejun Heo
    Cc: Christoph Hellwig
    Cc: Nick Piggin
    Cc: Michael S. Tsirkin
    Cc: Jeremy Fitzhardinge
    Cc: Chris Wright
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • loop implements FLUSH using fsync but was incorrectly setting its
    ordered mode to DRAIN. Change it to DRAIN_FLUSH. In practice, this
    doesn't change anything as loop doesn't make use of the block layer
    ordered implementation.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Unplugging from a request function doesn't really help much (it's
    already in the request_fn) and soon block layer will be updated to mix
    barrier sequence with other commands, so there's no need to treat
    queue flushing any differently.

    ide was the only user of blk_queue_flushing(). Remove it.

    Signed-off-by: Tejun Heo
    Cc: Christoph Hellwig
    Acked-by: David S. Miller
    Signed-off-by: Jens Axboe

    Tejun Heo
     

23 Aug, 2010

5 commits


22 Aug, 2010

11 commits


21 Aug, 2010

1 commit

  • Like the mlock() change previously, this makes the stack guard check
    code use vma->vm_prev to see what the mapping below the current stack
    is, rather than have to look it up with find_vma().

    Also, accept an abutting stack segment, since that happens naturally if
    you split the stack with mlock or mprotect.

    Tested-by: Ian Campbell
    Signed-off-by: Linus Torvalds

    Linus Torvalds