• Anton Altaparmakov's avatar
    [PATCH] a_ops-based loop I/O · f3f28e49
    Anton Altaparmakov authored
    Implements fallback to file_operations->write in the case that
    aops->{prepare,commit}_write are not present on the backing filesystem.
    
    The fallback happens in two different ways:
    
    - For normal loop devices, i.e.  ones which do not do transformation on
      the data but simply pass it along, we simply call fops->write.  This
      should be pretty much just as fast as using aops->{prepare,commit}_write
      directly.
    
    - For all other loop devices (e.g.  xor and cryptoloop), i.e.  all the
      ones which may be doing transformations on the data, we allocate and map
      a page (once for each bio), then for each bio vec we copy the bio vec
      page data to our mapped page, apply the loop transformation, and use
      fops->write to write out the transformed data from our page.  Once all
      bio vecs from the bio are done, we unmap and free the page.
    
    This approach is the absolute minimum of overhead I could come up with and
    for performance hungry people, as you can see I left the address space
    operations method in place for filesystems which implement
    aops->{prepare,commit}_write.
    
    I have tested this patch with normal loop devices using
    aops->{prepare,commit}_write on the backing filesystem, with normal loop
    devices using the fops->write code path and with cryptoloop devices using
    the double buffering + fops->write code path.
    Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    f3f28e49
loop.c 32.5 KB